<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>Kinetis Microcontrollersのトピックsha256 wrong with 56+ byte blocks using MMCAU in K64</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/sha256-wrong-with-56-byte-blocks-using-MMCAU-in-K64/m-p/667311#M41018</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I'm running code to do HMAC with sha256 using the MMCAU on a K64F board. My results agree with those of a PC program which communicates with it &lt;EM&gt;&lt;SPAN style="text-decoration: underline;"&gt;except when the length of bytes in a block hits 56&lt;/SPAN&gt;.&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;At 56 bytes (448 bits) of data, I start doing the padding as required, and hash a second block (so 128 bytes total). When I inspect the two blocks in memory after padding and before hash, everything looks correct:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;single 1 bit after the last data byte (0x80 byte)&lt;/LI&gt;&lt;LI&gt;zero bytes (0x00) from there until the last 4 bytes (I don't use the upper 4 bytes of the length, not needed)&lt;/LI&gt;&lt;LI&gt;last 4 bytes (of 128) hold big endian count of total data BITS for ALL bytes hashed (not including the added 1 bit).&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;When I change the limit to 48 bytes, it starts doing the same thing there (i.e. ok with less than 48, breaks at 48). So it seems as soon as I start doing two blocks (and the related padding), things break.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Hopefully somebody can see what stupid mistake I have made. I try not to use code trickery, it all seems straightforward. And obviously, the HashN function works on multiple blocks in general, at least when called without padding, because I successfully use it on hundreds of kB of data, as long as I don't have 56 bytes left at the end.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thank you.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE class="language-none line-numbers"&gt;&lt;CODE&gt;// UNPACK LITTLE ENDIAN data to BIG ENDIAN string
// takes LITTLE ENDIAN 32-bit data value X, put in BIG ENDIAN string *str
#define UNPACK32(x, str)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \
{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \
&amp;nbsp;&amp;nbsp;&amp;nbsp; *((str) + 3) = (uint8_t) ((x)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \
&amp;nbsp;&amp;nbsp;&amp;nbsp; *((str) + 2) = (uint8_t) ((x) &amp;gt;&amp;gt;&amp;nbsp; 8);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \
&amp;nbsp;&amp;nbsp;&amp;nbsp; *((str) + 1) = (uint8_t) ((x) &amp;gt;&amp;gt; 16);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \
&amp;nbsp;&amp;nbsp;&amp;nbsp; *((str) + 0) = (uint8_t) ((x) &amp;gt;&amp;gt; 24);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \
}

//-----------------------------------------------------------------------

#define SHA256_DIGEST_SIZE ( 256 / 8)
#define SHA256_BLOCK_SIZE&amp;nbsp; ( 512 / 8)

//-----------------------------------------------------------------------

typedef struct {
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t tot_len;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// total bytes actually hashed
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t len;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// new bytes stored but not yet hashed (block not full!)
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t block[2 * SHA256_BLOCK_SIZE];
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t h[8];
} sha256_ctx;

//-----------------------------------------------------------------------

// void sha256_final(sha256_ctx *ctx, uint8_t *digest)

// finalizes a hash in progress, and returns digest of bytes

void sha256_final(sha256_ctx *ctx, uint8_t *digest)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t block_nb;
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t padded_len, remaining;
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t bitlen;

&amp;nbsp;&amp;nbsp;&amp;nbsp; int16_t i;

&amp;nbsp;&amp;nbsp;&amp;nbsp; // start with one block
&amp;nbsp;&amp;nbsp;&amp;nbsp; block_nb = 1;

&amp;nbsp;&amp;nbsp;&amp;nbsp; // any pending partial-block bytes
&amp;nbsp;&amp;nbsp;&amp;nbsp; remaining = (ctx-&amp;gt;len) % SHA256_BLOCK_SIZE;

&amp;nbsp;&amp;nbsp;&amp;nbsp; // if more than 55 bytes already taken from block, must do two blocks
&amp;nbsp;&amp;nbsp;&amp;nbsp; // (or can't fit padding!)
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (remaining &amp;gt; (SHA256_BLOCK_SIZE - 9))
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;block_nb++;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// two blocks

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// total length in bits (bytes x 8) to put into padding
&amp;nbsp;&amp;nbsp;&amp;nbsp; // note: this includes both already hashed and pending
&amp;nbsp;&amp;nbsp;&amp;nbsp; bitlen = (ctx-&amp;gt;tot_len + ctx-&amp;gt;len) &amp;lt;&amp;lt; 3;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// total padded length = blocks * 64
&amp;nbsp;&amp;nbsp;&amp;nbsp; padded_len = block_nb &amp;lt;&amp;lt; 6;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// pad with zeroes...
&amp;nbsp;&amp;nbsp;&amp;nbsp; // starting after partial-block bytes
&amp;nbsp;&amp;nbsp;&amp;nbsp; // (note length omits any partial-block bytes)
&amp;nbsp;&amp;nbsp;&amp;nbsp; memset(ctx-&amp;gt;block + ctx-&amp;gt;len, 0, padded_len - ctx-&amp;gt;len);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// set that one extra bit at start of padding
&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx-&amp;gt;block[ctx-&amp;gt;len] = 0x80;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// store TOTAL bit count at end
&amp;nbsp;&amp;nbsp;&amp;nbsp; // (the -4 allows space for the 4-byte bit count to be within the padding)
&amp;nbsp;&amp;nbsp;&amp;nbsp; UNPACK32(bitlen, (ctx-&amp;gt;block + padded_len - 4));

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// now do the hash of 1 or 2 blocks
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MMCAU_SHA256_HashN(ctx-&amp;gt;block, (uint32_t)block_nb, ctx-&amp;gt;h);

&amp;nbsp;&amp;nbsp;&amp;nbsp; // final result is in h[]

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// msb of h[i] goes to first byte
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// lsb goes to 4th byte
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// i.e. output as big endian
&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i = 0 ; i &amp;lt; 8; i++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UNPACK32(ctx-&amp;gt;h[i], &amp;amp;digest[i &amp;lt;&amp;lt; 2]);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}

//-----------------------------------------------------------------------
&lt;SPAN class="line-numbers-rows"&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 04 May 2017 16:13:33 GMT</pubDate>
    <dc:creator>eengineer</dc:creator>
    <dc:date>2017-05-04T16:13:33Z</dc:date>
    <item>
      <title>sha256 wrong with 56+ byte blocks using MMCAU in K64</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/sha256-wrong-with-56-byte-blocks-using-MMCAU-in-K64/m-p/667311#M41018</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I'm running code to do HMAC with sha256 using the MMCAU on a K64F board. My results agree with those of a PC program which communicates with it &lt;EM&gt;&lt;SPAN style="text-decoration: underline;"&gt;except when the length of bytes in a block hits 56&lt;/SPAN&gt;.&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;At 56 bytes (448 bits) of data, I start doing the padding as required, and hash a second block (so 128 bytes total). When I inspect the two blocks in memory after padding and before hash, everything looks correct:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;single 1 bit after the last data byte (0x80 byte)&lt;/LI&gt;&lt;LI&gt;zero bytes (0x00) from there until the last 4 bytes (I don't use the upper 4 bytes of the length, not needed)&lt;/LI&gt;&lt;LI&gt;last 4 bytes (of 128) hold big endian count of total data BITS for ALL bytes hashed (not including the added 1 bit).&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;When I change the limit to 48 bytes, it starts doing the same thing there (i.e. ok with less than 48, breaks at 48). So it seems as soon as I start doing two blocks (and the related padding), things break.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Hopefully somebody can see what stupid mistake I have made. I try not to use code trickery, it all seems straightforward. And obviously, the HashN function works on multiple blocks in general, at least when called without padding, because I successfully use it on hundreds of kB of data, as long as I don't have 56 bytes left at the end.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thank you.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE class="language-none line-numbers"&gt;&lt;CODE&gt;// UNPACK LITTLE ENDIAN data to BIG ENDIAN string
// takes LITTLE ENDIAN 32-bit data value X, put in BIG ENDIAN string *str
#define UNPACK32(x, str)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \
{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \
&amp;nbsp;&amp;nbsp;&amp;nbsp; *((str) + 3) = (uint8_t) ((x)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \
&amp;nbsp;&amp;nbsp;&amp;nbsp; *((str) + 2) = (uint8_t) ((x) &amp;gt;&amp;gt;&amp;nbsp; 8);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \
&amp;nbsp;&amp;nbsp;&amp;nbsp; *((str) + 1) = (uint8_t) ((x) &amp;gt;&amp;gt; 16);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \
&amp;nbsp;&amp;nbsp;&amp;nbsp; *((str) + 0) = (uint8_t) ((x) &amp;gt;&amp;gt; 24);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \
}

//-----------------------------------------------------------------------

#define SHA256_DIGEST_SIZE ( 256 / 8)
#define SHA256_BLOCK_SIZE&amp;nbsp; ( 512 / 8)

//-----------------------------------------------------------------------

typedef struct {
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t tot_len;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// total bytes actually hashed
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t len;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// new bytes stored but not yet hashed (block not full!)
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t block[2 * SHA256_BLOCK_SIZE];
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t h[8];
} sha256_ctx;

//-----------------------------------------------------------------------

// void sha256_final(sha256_ctx *ctx, uint8_t *digest)

// finalizes a hash in progress, and returns digest of bytes

void sha256_final(sha256_ctx *ctx, uint8_t *digest)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t block_nb;
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t padded_len, remaining;
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t bitlen;

&amp;nbsp;&amp;nbsp;&amp;nbsp; int16_t i;

&amp;nbsp;&amp;nbsp;&amp;nbsp; // start with one block
&amp;nbsp;&amp;nbsp;&amp;nbsp; block_nb = 1;

&amp;nbsp;&amp;nbsp;&amp;nbsp; // any pending partial-block bytes
&amp;nbsp;&amp;nbsp;&amp;nbsp; remaining = (ctx-&amp;gt;len) % SHA256_BLOCK_SIZE;

&amp;nbsp;&amp;nbsp;&amp;nbsp; // if more than 55 bytes already taken from block, must do two blocks
&amp;nbsp;&amp;nbsp;&amp;nbsp; // (or can't fit padding!)
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (remaining &amp;gt; (SHA256_BLOCK_SIZE - 9))
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;block_nb++;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// two blocks

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// total length in bits (bytes x 8) to put into padding
&amp;nbsp;&amp;nbsp;&amp;nbsp; // note: this includes both already hashed and pending
&amp;nbsp;&amp;nbsp;&amp;nbsp; bitlen = (ctx-&amp;gt;tot_len + ctx-&amp;gt;len) &amp;lt;&amp;lt; 3;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// total padded length = blocks * 64
&amp;nbsp;&amp;nbsp;&amp;nbsp; padded_len = block_nb &amp;lt;&amp;lt; 6;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// pad with zeroes...
&amp;nbsp;&amp;nbsp;&amp;nbsp; // starting after partial-block bytes
&amp;nbsp;&amp;nbsp;&amp;nbsp; // (note length omits any partial-block bytes)
&amp;nbsp;&amp;nbsp;&amp;nbsp; memset(ctx-&amp;gt;block + ctx-&amp;gt;len, 0, padded_len - ctx-&amp;gt;len);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// set that one extra bit at start of padding
&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx-&amp;gt;block[ctx-&amp;gt;len] = 0x80;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// store TOTAL bit count at end
&amp;nbsp;&amp;nbsp;&amp;nbsp; // (the -4 allows space for the 4-byte bit count to be within the padding)
&amp;nbsp;&amp;nbsp;&amp;nbsp; UNPACK32(bitlen, (ctx-&amp;gt;block + padded_len - 4));

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// now do the hash of 1 or 2 blocks
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MMCAU_SHA256_HashN(ctx-&amp;gt;block, (uint32_t)block_nb, ctx-&amp;gt;h);

&amp;nbsp;&amp;nbsp;&amp;nbsp; // final result is in h[]

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// msb of h[i] goes to first byte
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// lsb goes to 4th byte
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// i.e. output as big endian
&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i = 0 ; i &amp;lt; 8; i++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UNPACK32(ctx-&amp;gt;h[i], &amp;amp;digest[i &amp;lt;&amp;lt; 2]);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}

//-----------------------------------------------------------------------
&lt;SPAN class="line-numbers-rows"&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 04 May 2017 16:13:33 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/sha256-wrong-with-56-byte-blocks-using-MMCAU-in-K64/m-p/667311#M41018</guid>
      <dc:creator>eengineer</dc:creator>
      <dc:date>2017-05-04T16:13:33Z</dc:date>
    </item>
  </channel>
</rss>

