27 #include <sys/cdefs.h> 28 __FBSDID(
"$FreeBSD$");
30 #include <sys/endian.h> 31 #include <sys/types.h> 37 #if BYTE_ORDER == BIG_ENDIAN 40 #define be32enc_vect(dst, src, len) \ 41 memcpy((void *)dst, (const void *)src, (size_t)len) 44 #define be32dec_vect(dst, src, len) \ 45 memcpy((void *)dst, (const void *)src, (size_t)len) 54 be32enc_vect(
unsigned char *dst,
const uint32_t *src,
size_t len)
58 for (i = 0; i < len / 4; i++)
59 be32enc(dst + i * 4, src[i]);
67 be32dec_vect(uint32_t *dst,
const unsigned char *src,
size_t len)
71 for (i = 0; i < len / 4; i++)
72 dst[i] = be32dec(src + i * 4);
78 #define Ch(x, y, z) ((x & (y ^ z)) ^ z) 79 #define Maj(x, y, z) ((x & (y | z)) | (y & z)) 80 #define SHR(x, n) (x >> n) 81 #define ROTR(x, n) ((x >> n) | (x << (32 - n))) 82 #define S0(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22)) 83 #define S1(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25)) 84 #define s0(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3)) 85 #define s1(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10)) 88 #define RND(a, b, c, d, e, f, g, h, k) \ 89 t0 = h + S1(e) + Ch(e, f, g) + k; \ 90 t1 = S0(a) + Maj(a, b, c); \ 95 #define RNDr(S, W, i, k) \ 96 RND(S[(64 - i) % 8], S[(65 - i) % 8], \ 97 S[(66 - i) % 8], S[(67 - i) % 8], \ 98 S[(68 - i) % 8], S[(69 - i) % 8], \ 99 S[(70 - i) % 8], S[(71 - i) % 8], \ 107 SHA256_Transform(uint32_t * state,
const unsigned char block[64])
115 be32dec_vect(W, block, 64);
116 for (i = 16; i < 64; i++)
117 W[i] = s1(W[i - 2]) + W[i - 7] + s0(W[i - 15]) + W[i - 16];
120 memcpy(S, state, 32);
123 RNDr(S, W, 0, 0x428a2f98);
124 RNDr(S, W, 1, 0x71374491);
125 RNDr(S, W, 2, 0xb5c0fbcf);
126 RNDr(S, W, 3, 0xe9b5dba5);
127 RNDr(S, W, 4, 0x3956c25b);
128 RNDr(S, W, 5, 0x59f111f1);
129 RNDr(S, W, 6, 0x923f82a4);
130 RNDr(S, W, 7, 0xab1c5ed5);
131 RNDr(S, W, 8, 0xd807aa98);
132 RNDr(S, W, 9, 0x12835b01);
133 RNDr(S, W, 10, 0x243185be);
134 RNDr(S, W, 11, 0x550c7dc3);
135 RNDr(S, W, 12, 0x72be5d74);
136 RNDr(S, W, 13, 0x80deb1fe);
137 RNDr(S, W, 14, 0x9bdc06a7);
138 RNDr(S, W, 15, 0xc19bf174);
139 RNDr(S, W, 16, 0xe49b69c1);
140 RNDr(S, W, 17, 0xefbe4786);
141 RNDr(S, W, 18, 0x0fc19dc6);
142 RNDr(S, W, 19, 0x240ca1cc);
143 RNDr(S, W, 20, 0x2de92c6f);
144 RNDr(S, W, 21, 0x4a7484aa);
145 RNDr(S, W, 22, 0x5cb0a9dc);
146 RNDr(S, W, 23, 0x76f988da);
147 RNDr(S, W, 24, 0x983e5152);
148 RNDr(S, W, 25, 0xa831c66d);
149 RNDr(S, W, 26, 0xb00327c8);
150 RNDr(S, W, 27, 0xbf597fc7);
151 RNDr(S, W, 28, 0xc6e00bf3);
152 RNDr(S, W, 29, 0xd5a79147);
153 RNDr(S, W, 30, 0x06ca6351);
154 RNDr(S, W, 31, 0x14292967);
155 RNDr(S, W, 32, 0x27b70a85);
156 RNDr(S, W, 33, 0x2e1b2138);
157 RNDr(S, W, 34, 0x4d2c6dfc);
158 RNDr(S, W, 35, 0x53380d13);
159 RNDr(S, W, 36, 0x650a7354);
160 RNDr(S, W, 37, 0x766a0abb);
161 RNDr(S, W, 38, 0x81c2c92e);
162 RNDr(S, W, 39, 0x92722c85);
163 RNDr(S, W, 40, 0xa2bfe8a1);
164 RNDr(S, W, 41, 0xa81a664b);
165 RNDr(S, W, 42, 0xc24b8b70);
166 RNDr(S, W, 43, 0xc76c51a3);
167 RNDr(S, W, 44, 0xd192e819);
168 RNDr(S, W, 45, 0xd6990624);
169 RNDr(S, W, 46, 0xf40e3585);
170 RNDr(S, W, 47, 0x106aa070);
171 RNDr(S, W, 48, 0x19a4c116);
172 RNDr(S, W, 49, 0x1e376c08);
173 RNDr(S, W, 50, 0x2748774c);
174 RNDr(S, W, 51, 0x34b0bcb5);
175 RNDr(S, W, 52, 0x391c0cb3);
176 RNDr(S, W, 53, 0x4ed8aa4a);
177 RNDr(S, W, 54, 0x5b9cca4f);
178 RNDr(S, W, 55, 0x682e6ff3);
179 RNDr(S, W, 56, 0x748f82ee);
180 RNDr(S, W, 57, 0x78a5636f);
181 RNDr(S, W, 58, 0x84c87814);
182 RNDr(S, W, 59, 0x8cc70208);
183 RNDr(S, W, 60, 0x90befffa);
184 RNDr(S, W, 61, 0xa4506ceb);
185 RNDr(S, W, 62, 0xbef9a3f7);
186 RNDr(S, W, 63, 0xc67178f2);
189 for (i = 0; i < 8; i++)
193 static const unsigned char PAD[64] = {
194 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
195 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
196 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
197 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
204 unsigned char len[8];
211 be64enc(len, ctx->count);
214 r = (ctx->count >> 3) & 0x3f;
215 plen = (r < 56) ? (56 - r) : (120 - r);
216 SHA256_Update(ctx, PAD, (
size_t)plen);
219 SHA256_Update(ctx, len, 8);
231 ctx->state[0] = 0x6A09E667;
232 ctx->state[1] = 0xBB67AE85;
233 ctx->state[2] = 0x3C6EF372;
234 ctx->state[3] = 0xA54FF53A;
235 ctx->state[4] = 0x510E527F;
236 ctx->state[5] = 0x9B05688C;
237 ctx->state[6] = 0x1F83D9AB;
238 ctx->state[7] = 0x5BE0CD19;
243 SHA256_Update(
SHA256_CTX * ctx,
const void *in,
size_t len)
247 const unsigned char *src = in;
250 r = (ctx->count >> 3) & 0x3f;
256 ctx->count += bitlen;
260 memcpy(&ctx->buf[r], src, len);
265 memcpy(&ctx->buf[r], src, 64 - r);
266 SHA256_Transform(ctx->state, ctx->buf);
272 SHA256_Transform(ctx->state, src);
278 memcpy(ctx->buf, src, len);
286 SHA256_Final(
unsigned char digest[32],
SHA256_CTX * ctx)
293 be32enc_vect(digest, ctx->state, 32);
296 memset((
void *)ctx, 0,
sizeof(*ctx));