diff options
Diffstat (limited to 'sha256.c')
-rw-r--r-- | sha256.c | 26 |
1 files changed, 13 insertions, 13 deletions
@@ -42,13 +42,13 @@ static void sha_compress(struct sha256_ctx *md) { u32 S[8], W[64], t0, t1; int i; - + /* copy state into S */ for (i = 0; i < 8; i++) S[i] = md->state[i]; - + /* copy the state into 512-bits into W[0..15] */ - for (i = 0; i < 16; i++) + for (i = 0; i < 16; i++) W[i] = (((unsigned long) md->buf[(4 * i) + 0]) << 24) | (((unsigned long) md->buf[(4 * i) + 1]) << 16) | (((unsigned long) md->buf[(4 * i) + 2]) << 8) | @@ -57,7 +57,7 @@ static void sha_compress(struct sha256_ctx *md) /* fill W[16..63] */ for (i = 16; i < 64; i++) W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16]; - + /* Compress */ for (i = 0; i < 64; i++) { t0 = S[7] + Sigma1(S[4]) + Ch(S[4], S[5], S[6]) + K[i] + W[i]; @@ -71,7 +71,7 @@ static void sha_compress(struct sha256_ctx *md) S[1] = S[0]; S[0] = t0 + t1; } - + /* feedback */ for (i = 0; i < 8; i++) md->state[i] += S[i]; @@ -111,38 +111,38 @@ void sha256_final(void *ctx, u8 *hash) { struct sha256_ctx *md = ctx; int i; - + /* increase the length of the message */ md->length += md->curlen * 8; - + /* append the '1' bit */ md->buf[md->curlen++] = 0x80; - + /* if the length is currenlly above 56 bytes we append zeros * then compress. Then we can fall back to padding zeros and length * encoding like normal. */ - + if (md->curlen >= 56) { for (; md->curlen < 64;) md->buf[md->curlen++] = 0; sha_compress(md); md->curlen = 0; } - + /* pad upto 56 bytes of zeroes */ for (; md->curlen < 56;) md->buf[md->curlen++] = 0; - + /* since all messages are under 2^32 bits we mark the top bits zero */ for (i = 56; i < 60; i++) md->buf[i] = 0; - + /* append length */ for (i = 60; i < 64; i++) md->buf[i] = (md->length >> ((63 - i) * 8)) & 255; sha_compress(md); - + /* copy output */ for (i = 0; i < 32; i++) hash[i] = (md->state[i >> 2] >> (((3 - i) & 3) << 3)) & 255; |