Fabcoin Core  0.16.2
P2P Digital Currency
sha256.c
Go to the documentation of this file.
1 /*-
2  * Copyright 2005,2007,2009 Colin Percival
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  */
26 
27 #include <sys/types.h>
28 
29 #include <stdint.h>
30 #include <string.h>
31 
32 #include "sysendian.h"
33 
34 #include "sha256.h"
35 
36 /*
37  * Encode a length len/4 vector of (uint32_t) into a length len vector of
38  * (unsigned char) in big-endian form. Assumes len is a multiple of 4.
39  */
40 static void
41 be32enc_vect(unsigned char *dst, const uint32_t *src, size_t len)
42 {
43  size_t i;
44 
45  for (i = 0; i < len / 4; i++)
46  be32enc(dst + i * 4, src[i]);
47 }
48 
49 /*
50  * Decode a big-endian length len vector of (unsigned char) into a length
51  * len/4 vector of (uint32_t). Assumes len is a multiple of 4.
52  */
53 static void
54 be32dec_vect(uint32_t *dst, const unsigned char *src, size_t len)
55 {
56  size_t i;
57 
58  for (i = 0; i < len / 4; i++)
59  dst[i] = be32dec(src + i * 4);
60 }
61 
62 /* Elementary functions used by SHA256 */
63 #define Ch(x, y, z) ((x & (y ^ z)) ^ z)
64 #define Maj(x, y, z) ((x & (y | z)) | (y & z))
65 #define SHR(x, n) (x >> n)
66 #define ROTR(x, n) ((x >> n) | (x << (32 - n)))
67 #define S0(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22))
68 #define S1(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25))
69 #define s0(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3))
70 #define s1(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10))
71 
72 /* SHA256 round function */
73 #define RND(a, b, c, d, e, f, g, h, k) \
74  t0 = h + S1(e) + Ch(e, f, g) + k; \
75  t1 = S0(a) + Maj(a, b, c); \
76  d += t0; \
77  h = t0 + t1;
78 
79 /* Adjusted round function for rotating state */
80 #define RNDr(S, W, i, k) \
81  RND(S[(64 - i) % 8], S[(65 - i) % 8], \
82  S[(66 - i) % 8], S[(67 - i) % 8], \
83  S[(68 - i) % 8], S[(69 - i) % 8], \
84  S[(70 - i) % 8], S[(71 - i) % 8], \
85  W[i] + k)
86 
87 /*
88  * SHA256 block compression function. The 256-bit state is transformed via
89  * the 512-bit input block to produce a new state.
90  */
91 static void
92 SHA256_Transform(uint32_t * state, const unsigned char block[64])
93 {
94  uint32_t W[64];
95  uint32_t S[8];
96  uint32_t t0, t1;
97  int i;
98 
99  /* 1. Prepare message schedule W. */
100  be32dec_vect(W, block, 64);
101  for (i = 16; i < 64; i++)
102  W[i] = s1(W[i - 2]) + W[i - 7] + s0(W[i - 15]) + W[i - 16];
103 
104  /* 2. Initialize working variables. */
105  memcpy(S, state, 32);
106 
107  /* 3. Mix. */
108  RNDr(S, W, 0, 0x428a2f98);
109  RNDr(S, W, 1, 0x71374491);
110  RNDr(S, W, 2, 0xb5c0fbcf);
111  RNDr(S, W, 3, 0xe9b5dba5);
112  RNDr(S, W, 4, 0x3956c25b);
113  RNDr(S, W, 5, 0x59f111f1);
114  RNDr(S, W, 6, 0x923f82a4);
115  RNDr(S, W, 7, 0xab1c5ed5);
116  RNDr(S, W, 8, 0xd807aa98);
117  RNDr(S, W, 9, 0x12835b01);
118  RNDr(S, W, 10, 0x243185be);
119  RNDr(S, W, 11, 0x550c7dc3);
120  RNDr(S, W, 12, 0x72be5d74);
121  RNDr(S, W, 13, 0x80deb1fe);
122  RNDr(S, W, 14, 0x9bdc06a7);
123  RNDr(S, W, 15, 0xc19bf174);
124  RNDr(S, W, 16, 0xe49b69c1);
125  RNDr(S, W, 17, 0xefbe4786);
126  RNDr(S, W, 18, 0x0fc19dc6);
127  RNDr(S, W, 19, 0x240ca1cc);
128  RNDr(S, W, 20, 0x2de92c6f);
129  RNDr(S, W, 21, 0x4a7484aa);
130  RNDr(S, W, 22, 0x5cb0a9dc);
131  RNDr(S, W, 23, 0x76f988da);
132  RNDr(S, W, 24, 0x983e5152);
133  RNDr(S, W, 25, 0xa831c66d);
134  RNDr(S, W, 26, 0xb00327c8);
135  RNDr(S, W, 27, 0xbf597fc7);
136  RNDr(S, W, 28, 0xc6e00bf3);
137  RNDr(S, W, 29, 0xd5a79147);
138  RNDr(S, W, 30, 0x06ca6351);
139  RNDr(S, W, 31, 0x14292967);
140  RNDr(S, W, 32, 0x27b70a85);
141  RNDr(S, W, 33, 0x2e1b2138);
142  RNDr(S, W, 34, 0x4d2c6dfc);
143  RNDr(S, W, 35, 0x53380d13);
144  RNDr(S, W, 36, 0x650a7354);
145  RNDr(S, W, 37, 0x766a0abb);
146  RNDr(S, W, 38, 0x81c2c92e);
147  RNDr(S, W, 39, 0x92722c85);
148  RNDr(S, W, 40, 0xa2bfe8a1);
149  RNDr(S, W, 41, 0xa81a664b);
150  RNDr(S, W, 42, 0xc24b8b70);
151  RNDr(S, W, 43, 0xc76c51a3);
152  RNDr(S, W, 44, 0xd192e819);
153  RNDr(S, W, 45, 0xd6990624);
154  RNDr(S, W, 46, 0xf40e3585);
155  RNDr(S, W, 47, 0x106aa070);
156  RNDr(S, W, 48, 0x19a4c116);
157  RNDr(S, W, 49, 0x1e376c08);
158  RNDr(S, W, 50, 0x2748774c);
159  RNDr(S, W, 51, 0x34b0bcb5);
160  RNDr(S, W, 52, 0x391c0cb3);
161  RNDr(S, W, 53, 0x4ed8aa4a);
162  RNDr(S, W, 54, 0x5b9cca4f);
163  RNDr(S, W, 55, 0x682e6ff3);
164  RNDr(S, W, 56, 0x748f82ee);
165  RNDr(S, W, 57, 0x78a5636f);
166  RNDr(S, W, 58, 0x84c87814);
167  RNDr(S, W, 59, 0x8cc70208);
168  RNDr(S, W, 60, 0x90befffa);
169  RNDr(S, W, 61, 0xa4506ceb);
170  RNDr(S, W, 62, 0xbef9a3f7);
171  RNDr(S, W, 63, 0xc67178f2);
172 
173  /* 4. Mix local working variables into global state */
174  for (i = 0; i < 8; i++)
175  state[i] += S[i];
176 
177  /* Clean the stack. */
178  memset(W, 0, 256);
179  memset(S, 0, 32);
180  t0 = t1 = 0;
181 }
182 
183 static unsigned char PAD[64] = {
184  0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
185  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
186  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
187  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
188 };
189 
190 /* Add padding and terminating bit-count. */
191 static void
192 SHA256_Pad(SHA256_CTX * ctx)
193 {
194  unsigned char len[8];
195  uint32_t r, plen;
196 
197  /*
198  * Convert length to a vector of bytes -- we do this now rather
199  * than later because the length will change after we pad.
200  */
201  be32enc_vect(len, ctx->count, 8);
202 
203  /* Add 1--64 bytes so that the resulting length is 56 mod 64 */
204  r = (ctx->count[1] >> 3) & 0x3f;
205  plen = (r < 56) ? (56 - r) : (120 - r);
206  libscrypt_SHA256_Update(ctx, PAD, (size_t)plen);
207 
208  /* Add the terminating bit-count */
209  libscrypt_SHA256_Update(ctx, len, 8);
210 }
211 
212 /* SHA-256 initialization. Begins a SHA-256 operation. */
213 void
215 {
216 
217  /* Zero bits processed so far */
218  ctx->count[0] = ctx->count[1] = 0;
219 
220  /* Magic initialization constants */
221  ctx->state[0] = 0x6A09E667;
222  ctx->state[1] = 0xBB67AE85;
223  ctx->state[2] = 0x3C6EF372;
224  ctx->state[3] = 0xA54FF53A;
225  ctx->state[4] = 0x510E527F;
226  ctx->state[5] = 0x9B05688C;
227  ctx->state[6] = 0x1F83D9AB;
228  ctx->state[7] = 0x5BE0CD19;
229 }
230 
231 /* Add bytes into the hash */
232 void
233 libscrypt_SHA256_Update(SHA256_CTX * ctx, const void *in, size_t len)
234 {
235  uint32_t bitlen[2];
236  uint32_t r;
237  const unsigned char *src = in;
238 
239  /* Number of bytes left in the buffer from previous updates */
240  r = (ctx->count[1] >> 3) & 0x3f;
241 
242  /* Convert the length into a number of bits */
243  bitlen[1] = ((uint32_t)len) << 3;
244  bitlen[0] = (uint32_t)(len >> 29);
245 
246  /* Update number of bits */
247  if ((ctx->count[1] += bitlen[1]) < bitlen[1])
248  ctx->count[0]++;
249  ctx->count[0] += bitlen[0];
250 
251  /* Handle the case where we don't need to perform any transforms */
252  if (len < 64 - r) {
253  memcpy(&ctx->buf[r], src, len);
254  return;
255  }
256 
257  /* Finish the current block */
258  memcpy(&ctx->buf[r], src, 64 - r);
259  SHA256_Transform(ctx->state, ctx->buf);
260  src += 64 - r;
261  len -= 64 - r;
262 
263  /* Perform complete blocks */
264  while (len >= 64) {
265  SHA256_Transform(ctx->state, src);
266  src += 64;
267  len -= 64;
268  }
269 
270  /* Copy left over data into buffer */
271  memcpy(ctx->buf, src, len);
272 }
273 
274 /*
275  * SHA-256 finalization. Pads the input data, exports the hash value,
276  * and clears the context state.
277  */
278 void
279 libscrypt_SHA256_Final(unsigned char digest[32], SHA256_CTX * ctx)
280 {
281 
282  /* Add padding */
283  SHA256_Pad(ctx);
284 
285  /* Write the hash */
286  be32enc_vect(digest, ctx->state, 32);
287 
288  /* Clear the context state */
289  memset((void *)ctx, 0, sizeof(*ctx));
290 }
291 
292 /* Initialize an HMAC-SHA256 operation with the given key. */
293 void
294 libscrypt_HMAC_SHA256_Init(HMAC_SHA256_CTX * ctx, const void * _K, size_t Klen)
295 {
296  unsigned char pad[64];
297  unsigned char khash[32];
298  const unsigned char * K = _K;
299  size_t i;
300 
301  /* If Klen > 64, the key is really SHA256(K). */
302  if (Klen > 64) {
304  libscrypt_SHA256_Update(&ctx->ictx, K, Klen);
305  libscrypt_SHA256_Final(khash, &ctx->ictx);
306  K = khash;
307  Klen = 32;
308  }
309 
310  /* Inner SHA256 operation is SHA256(K xor [block of 0x36] || data). */
312  memset(pad, 0x36, 64);
313  for (i = 0; i < Klen; i++)
314  pad[i] ^= K[i];
315  libscrypt_SHA256_Update(&ctx->ictx, pad, 64);
316 
317  /* Outer SHA256 operation is SHA256(K xor [block of 0x5c] || hash). */
319  memset(pad, 0x5c, 64);
320  for (i = 0; i < Klen; i++)
321  pad[i] ^= K[i];
322  libscrypt_SHA256_Update(&ctx->octx, pad, 64);
323 
324  /* Clean the stack. */
325  memset(khash, 0, 32);
326 }
327 
328 /* Add bytes to the HMAC-SHA256 operation. */
329 void
330 libscrypt_HMAC_SHA256_Update(HMAC_SHA256_CTX * ctx, const void *in, size_t len)
331 {
332 
333  /* Feed data to the inner SHA256 operation. */
334  libscrypt_SHA256_Update(&ctx->ictx, in, len);
335 }
336 
337 /* Finish an HMAC-SHA256 operation. */
338 void
339 libscrypt_HMAC_SHA256_Final(unsigned char digest[32], HMAC_SHA256_CTX * ctx)
340 {
341  unsigned char ihash[32];
342 
343  /* Finish the inner SHA256 operation. */
344  libscrypt_SHA256_Final(ihash, &ctx->ictx);
345 
346  /* Feed the inner hash to the outer SHA256 operation. */
347  libscrypt_SHA256_Update(&ctx->octx, ihash, 32);
348 
349  /* Finish the outer SHA256 operation. */
350  libscrypt_SHA256_Final(digest, &ctx->octx);
351 
352  /* Clean the stack. */
353  memset(ihash, 0, 32);
354 }
355 
361 void
362 libscrypt_PBKDF2_SHA256(const uint8_t * passwd, size_t passwdlen, const uint8_t * salt,
363  size_t saltlen, uint64_t c, uint8_t * buf, size_t dkLen)
364 {
365  HMAC_SHA256_CTX PShctx, hctx;
366  size_t i;
367  uint8_t ivec[4];
368  uint8_t U[32];
369  uint8_t T[32];
370  uint64_t j;
371  int k;
372  size_t clen;
373 
374  /* Compute HMAC state after processing P and S. */
375  libscrypt_HMAC_SHA256_Init(&PShctx, passwd, passwdlen);
376  libscrypt_HMAC_SHA256_Update(&PShctx, salt, saltlen);
377 
378  /* Iterate through the blocks. */
379  for (i = 0; i * 32 < dkLen; i++) {
380  /* Generate INT(i + 1). */
381  be32enc(ivec, (uint32_t)(i + 1));
382 
383  /* Compute U_1 = PRF(P, S || INT(i)). */
384  memcpy(&hctx, &PShctx, sizeof(HMAC_SHA256_CTX));
385  libscrypt_HMAC_SHA256_Update(&hctx, ivec, 4);
386  libscrypt_HMAC_SHA256_Final(U, &hctx);
387 
388  /* T_i = U_1 ... */
389  memcpy(T, U, 32);
390 
391  for (j = 2; j <= c; j++) {
392  /* Compute U_j. */
393  libscrypt_HMAC_SHA256_Init(&hctx, passwd, passwdlen);
394  libscrypt_HMAC_SHA256_Update(&hctx, U, 32);
395  libscrypt_HMAC_SHA256_Final(U, &hctx);
396 
397  /* ... xor U_j ... */
398  for (k = 0; k < 32; k++)
399  T[k] ^= U[k];
400  }
401 
402  /* Copy as many bytes as necessary into buf. */
403  clen = dkLen - i * 32;
404  if (clen > 32)
405  clen = 32;
406  memcpy(&buf[i * 32], T, clen);
407  }
408 
409  /* Clean PShctx, since we never called _Final on it. */
410  memset(&PShctx, 0, sizeof(HMAC_SHA256_CTX));
411 }
#define s0(x)
Definition: sha256.c:69
#define T(i, x)
#define c(i)
if(a.IndicesBefore(b, len, lenIndices))
Definition: equihash.cpp:243
uint32_t count[2]
Definition: sha256.h:38
void libscrypt_HMAC_SHA256_Update(HMAC_SHA256_CTX *ctx, const void *in, size_t len)
Definition: sha256.c:330
void libscrypt_HMAC_SHA256_Final(unsigned char digest[32], HMAC_SHA256_CTX *ctx)
Definition: sha256.c:339
void libscrypt_SHA256_Update(SHA256_CTX *ctx, const void *in, size_t len)
Definition: sha256.c:233
#define t1
void libscrypt_PBKDF2_SHA256(const uint8_t *passwd, size_t passwdlen, const uint8_t *salt, size_t saltlen, uint64_t c, uint8_t *buf, size_t dkLen)
PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, c, buf, dkLen): Compute PBKDF2(passwd, salt, c, dkLen) using HMAC-SHA256 as the PRF, and write the output to buf.
Definition: sha256.c:362
#define RNDr(S, W, i, k)
Definition: sha256.c:80
void libscrypt_SHA256_Init(SHA256_CTX *ctx)
Definition: sha256.c:214
void * memcpy(void *a, const void *b, size_t c)
unsigned char buf[64]
Definition: sha256.h:39
#define S(a)
Definition: mars.cpp:50
#define s1(x)
Definition: sha256.c:70
uint32_t state[8]
Definition: sha256.h:37
void libscrypt_SHA256_Final(unsigned char digest[32], SHA256_CTX *ctx)
Definition: sha256.c:279
void libscrypt_HMAC_SHA256_Init(HMAC_SHA256_CTX *ctx, const void *_K, size_t Klen)
Definition: sha256.c:294