xref: /dragonfly/lib/libcrypt/crypt-sha256.c (revision df49ec1e)
1 /*
2  * SHA256-based Unix crypt implementation.
3  * Released into the Public Domain by Ulrich Drepper <drepper@redhat.com>.
4  */
5 #include <errno.h>
6 #include <limits.h>
7 #include <stdint.h>
8 #include <stdbool.h>
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
12 #include <sys/endian.h>
13 #include <sys/param.h>
14 #include <sys/types.h>
15 
16 #include "crypt.h"
17 #include "local.h"
18 
19 #if _BYTE_ORDER == _LITTLE_ENDIAN
20 # define SWAP(n) \
21     (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
22 #else
23 # define SWAP(n) (n)
24 #endif
25 
26 
27 /* This array contains the bytes used to pad the buffer to the next
28    64-byte boundary.  (FIPS 180-2:5.1.1)  */
29 static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ...  */ };
30 
31 
32 /* Constants for SHA256 from FIPS 180-2:4.2.2.  */
33 static const uint32_t K[64] =
34   {
35     0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
36     0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
37     0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
38     0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
39     0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
40     0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
41     0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
42     0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
43     0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
44     0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
45     0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
46     0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
47     0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
48     0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
49     0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
50     0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
51   };
52 
53 
54 /* Process LEN bytes of BUFFER, accumulating context into CTX.
55    It is assumed that LEN % 64 == 0.  */
56 void
57 __crypt__sha256_process_block (const void *buffer, size_t len, struct sha256_ctx *ctx)
58 {
59   const uint32_t *words = buffer;
60   size_t nwords = len / sizeof (uint32_t);
61   uint32_t a = ctx->H[0];
62   uint32_t b = ctx->H[1];
63   uint32_t c = ctx->H[2];
64   uint32_t d = ctx->H[3];
65   uint32_t e = ctx->H[4];
66   uint32_t f = ctx->H[5];
67   uint32_t g = ctx->H[6];
68   uint32_t h = ctx->H[7];
69 
70   /* First increment the byte count.  FIPS 180-2 specifies the possible
71      length of the file up to 2^64 bits.  Here we only compute the
72      number of bytes.  Do a double word increment.  */
73   ctx->total[0] += len;
74   if (ctx->total[0] < len)
75     ++ctx->total[1];
76 
77   /* Process all bytes in the buffer with 64 bytes in each round of
78      the loop.  */
79   while (nwords > 0)
80     {
81       uint32_t W[64];
82       uint32_t a_save = a;
83       uint32_t b_save = b;
84       uint32_t c_save = c;
85       uint32_t d_save = d;
86       uint32_t e_save = e;
87       uint32_t f_save = f;
88       uint32_t g_save = g;
89       uint32_t h_save = h;
90 
91       /* Operators defined in FIPS 180-2:4.1.2.  */
92 #define Ch(x, y, z) ((x & y) ^ (~x & z))
93 #define Maj(x, y, z) ((x & y) ^ (x & z) ^ (y & z))
94 #define S0(x) (CYCLIC (x, 2) ^ CYCLIC (x, 13) ^ CYCLIC (x, 22))
95 #define S1(x) (CYCLIC (x, 6) ^ CYCLIC (x, 11) ^ CYCLIC (x, 25))
96 #define R0(x) (CYCLIC (x, 7) ^ CYCLIC (x, 18) ^ (x >> 3))
97 #define R1(x) (CYCLIC (x, 17) ^ CYCLIC (x, 19) ^ (x >> 10))
98 
99       /* It is unfortunate that C does not provide an operator for
100 	 cyclic rotation.  Hope the C compiler is smart enough.  */
101 #define CYCLIC(w, s) ((w >> s) | (w << (32 - s)))
102 
103       /* Compute the message schedule according to FIPS 180-2:6.2.2 step 2.  */
104       for (unsigned int t = 0; t < 16; ++t)
105 	{
106 	  W[t] = SWAP (*words);
107 	  ++words;
108 	}
109       for (unsigned int t = 16; t < 64; ++t)
110 	W[t] = R1 (W[t - 2]) + W[t - 7] + R0 (W[t - 15]) + W[t - 16];
111 
112       /* The actual computation according to FIPS 180-2:6.2.2 step 3.  */
113       for (unsigned int t = 0; t < 64; ++t)
114 	{
115 	  uint32_t T1 = h + S1 (e) + Ch (e, f, g) + K[t] + W[t];
116 	  uint32_t T2 = S0 (a) + Maj (a, b, c);
117 	  h = g;
118 	  g = f;
119 	  f = e;
120 	  e = d + T1;
121 	  d = c;
122 	  c = b;
123 	  b = a;
124 	  a = T1 + T2;
125 	}
126 
127       /* Add the starting values of the context according to FIPS 180-2:6.2.2
128 	 step 4.  */
129       a += a_save;
130       b += b_save;
131       c += c_save;
132       d += d_save;
133       e += e_save;
134       f += f_save;
135       g += g_save;
136       h += h_save;
137 
138       /* Prepare for the next round.  */
139       nwords -= 16;
140     }
141 
142   /* Put checksum in context given as argument.  */
143   ctx->H[0] = a;
144   ctx->H[1] = b;
145   ctx->H[2] = c;
146   ctx->H[3] = d;
147   ctx->H[4] = e;
148   ctx->H[5] = f;
149   ctx->H[6] = g;
150   ctx->H[7] = h;
151 }
152 
153 
154 /* Initialize structure containing state of computation.
155    (FIPS 180-2:5.3.2)  */
156 void
157 __crypt__sha256_init_ctx (struct sha256_ctx *ctx)
158 {
159   ctx->H[0] = 0x6a09e667;
160   ctx->H[1] = 0xbb67ae85;
161   ctx->H[2] = 0x3c6ef372;
162   ctx->H[3] = 0xa54ff53a;
163   ctx->H[4] = 0x510e527f;
164   ctx->H[5] = 0x9b05688c;
165   ctx->H[6] = 0x1f83d9ab;
166   ctx->H[7] = 0x5be0cd19;
167 
168   ctx->total[0] = ctx->total[1] = 0;
169   ctx->buflen = 0;
170 }
171 
172 
173 /* Process the remaining bytes in the internal buffer and the usual
174    prolog according to the standard and write the result to RESBUF.
175 
176    IMPORTANT: On some systems it is required that RESBUF is correctly
177    aligned for a 32 bits value.  */
178 void *
179 __crypt__sha256_finish_ctx (struct sha256_ctx *ctx, void *resbuf)
180 {
181   /* Take yet unprocessed bytes into account.  */
182   uint32_t bytes = ctx->buflen;
183   size_t pad;
184 
185   /* Now count remaining bytes.  */
186   ctx->total[0] += bytes;
187   if (ctx->total[0] < bytes)
188     ++ctx->total[1];
189 
190   pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes;
191   memcpy (&ctx->buffer[bytes], fillbuf, pad);
192 
193   /* Put the 64-bit file length in *bits* at the end of the buffer.  */
194   *(uint32_t *) &ctx->buffer[bytes + pad + 4] = SWAP (ctx->total[0] << 3);
195   *(uint32_t *) &ctx->buffer[bytes + pad] = SWAP ((ctx->total[1] << 3) |
196 						  (ctx->total[0] >> 29));
197 
198   /* Process last bytes.  */
199   __crypt__sha256_process_block (ctx->buffer, bytes + pad + 8, ctx);
200 
201   /* Put result from CTX in first 32 bytes following RESBUF.  */
202   for (unsigned int i = 0; i < 8; ++i)
203     ((uint32_t *) resbuf)[i] = SWAP (ctx->H[i]);
204 
205   return resbuf;
206 }
207 
208 void
209 __crypt__sha256_process_bytes (const void *buffer, size_t len, struct sha256_ctx *ctx)
210 {
211   /* When we already have some bits in our internal buffer concatenate
212      both inputs first.  */
213   if (ctx->buflen != 0)
214     {
215       size_t left_over = ctx->buflen;
216       size_t add = 128 - left_over > len ? len : 128 - left_over;
217 
218       memcpy (&ctx->buffer[left_over], buffer, add);
219       ctx->buflen += add;
220 
221       if (ctx->buflen > 64)
222 	{
223 	  __crypt__sha256_process_block (ctx->buffer, ctx->buflen & ~63, ctx);
224 
225 	  ctx->buflen &= 63;
226 	  /* The regions in the following copy operation cannot overlap.  */
227 	  memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63],
228 		  ctx->buflen);
229 	}
230 
231       buffer = (const char *) buffer + add;
232       len -= add;
233     }
234 
235   /* Process available complete blocks.  */
236   if (len >= 64)
237     {
238 /* To check alignment gcc has an appropriate operator.  Other
239    compilers don't.  */
240 #if __GNUC__ >= 2
241 # define UNALIGNED_P(p) (((uintptr_t) p) % __alignof__ (uint32_t) != 0)
242 #else
243 # define UNALIGNED_P(p) (((uintptr_t) p) % sizeof (uint32_t) != 0)
244 #endif
245       if (UNALIGNED_P (buffer))
246 	while (len > 64)
247 	  {
248 	    __crypt__sha256_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx);
249 	    buffer = (const char *) buffer + 64;
250 	    len -= 64;
251 	  }
252       else
253 	{
254 	  __crypt__sha256_process_block (buffer, len & ~63, ctx);
255 	  buffer = (const char *) buffer + (len & ~63);
256 	  len &= 63;
257 	}
258     }
259 
260   /* Move remaining bytes into internal buffer.  */
261   if (len > 0)
262     {
263       size_t left_over = ctx->buflen;
264 
265       memcpy (&ctx->buffer[left_over], buffer, len);
266       left_over += len;
267       if (left_over >= 64)
268 	{
269 	  __crypt__sha256_process_block (ctx->buffer, 64, ctx);
270 	  left_over -= 64;
271 	  memcpy (ctx->buffer, &ctx->buffer[64], left_over);
272 	}
273       ctx->buflen = left_over;
274     }
275 }
276 
277 
278 /* Define our magic string to mark salt for SHA256 "encryption"
279    replacement.  */
280 static const char sha256_salt_prefix[] = "$5$";
281 
282 /* Prefix for optional rounds specification.  */
283 static const char sha256_rounds_prefix[] = "rounds=";
284 
285 /* Maximum salt string length.  */
286 #define SALT_LEN_MAX 16
287 /* Default number of rounds if not explicitly specified.  */
288 #define ROUNDS_DEFAULT 5000
289 /* Minimum number of rounds.  */
290 #define ROUNDS_MIN 1000
291 /* Maximum number of rounds.  */
292 #define ROUNDS_MAX 999999999
293 
294 /* Table with characters for base64 transformation.  */
295 static const char b64t[64] =
296 "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
297 
298 
299 static char *
300 crypt_sha256_r (const char *key, const char *salt, char *buffer, int buflen)
301 {
302   unsigned char alt_result[32]
303     __attribute__ ((__aligned__ (__alignof__ (uint32_t))));
304   unsigned char temp_result[32]
305     __attribute__ ((__aligned__ (__alignof__ (uint32_t))));
306   struct sha256_ctx ctx;
307   struct sha256_ctx alt_ctx;
308   size_t salt_len;
309   size_t key_len;
310   size_t cnt;
311   char *cp;
312   char *copied_key = NULL;
313   char *copied_salt = NULL;
314   char *p_bytes;
315   char *s_bytes;
316   /* Default number of rounds.  */
317   size_t rounds = ROUNDS_DEFAULT;
318   bool rounds_custom = false;
319 
320   /* Find beginning of salt string.  The prefix should normally always
321      be present.  Just in case it is not.  */
322   if (strncmp (sha256_salt_prefix, salt, sizeof (sha256_salt_prefix) - 1) == 0)
323     /* Skip salt prefix.  */
324     salt += sizeof (sha256_salt_prefix) - 1;
325 
326   if (strncmp (salt, sha256_rounds_prefix, sizeof (sha256_rounds_prefix) - 1)
327       == 0)
328     {
329       const char *num = salt + sizeof (sha256_rounds_prefix) - 1;
330       char *endp;
331       unsigned long int srounds = strtoul (num, &endp, 10);
332       if (*endp == '$')
333 	{
334 	  salt = endp + 1;
335 	  rounds = MAX (ROUNDS_MIN, MIN (srounds, ROUNDS_MAX));
336 	  rounds_custom = true;
337 	}
338     }
339 
340   salt_len = MIN (strcspn (salt, "$"), SALT_LEN_MAX);
341   key_len = strlen (key);
342 
343   if ((key - (char *) 0) % __alignof__ (uint32_t) != 0)
344     {
345       char *tmp = (char *) alloca (key_len + __alignof__ (uint32_t));
346       key = copied_key =
347 	memcpy (tmp + __alignof__ (uint32_t)
348 		- (tmp - (char *) 0) % __alignof__ (uint32_t),
349 		key, key_len);
350     }
351 
352   if ((salt - (char *) 0) % __alignof__ (uint32_t) != 0)
353     {
354       char *tmp = (char *) alloca (salt_len + __alignof__ (uint32_t));
355       salt = copied_salt =
356 	memcpy (tmp + __alignof__ (uint32_t)
357 		- (tmp - (char *) 0) % __alignof__ (uint32_t),
358 		salt, salt_len);
359     }
360 
361   /* Prepare for the real work.  */
362   __crypt__sha256_init_ctx (&ctx);
363 
364   /* Add the key string.  */
365   __crypt__sha256_process_bytes (key, key_len, &ctx);
366 
367   /* The last part is the salt string.  This must be at most 16
368      characters and it ends at the first `$' character (for
369      compatibility with existing implementations).  */
370   __crypt__sha256_process_bytes (salt, salt_len, &ctx);
371 
372 
373   /* Compute alternate SHA256 sum with input KEY, SALT, and KEY.  The
374      final result will be added to the first context.  */
375   __crypt__sha256_init_ctx (&alt_ctx);
376 
377   /* Add key.  */
378   __crypt__sha256_process_bytes (key, key_len, &alt_ctx);
379 
380   /* Add salt.  */
381   __crypt__sha256_process_bytes (salt, salt_len, &alt_ctx);
382 
383   /* Add key again.  */
384   __crypt__sha256_process_bytes (key, key_len, &alt_ctx);
385 
386   /* Now get result of this (32 bytes) and add it to the other
387      context.  */
388   __crypt__sha256_finish_ctx (&alt_ctx, alt_result);
389 
390   /* Add for any character in the key one byte of the alternate sum.  */
391   for (cnt = key_len; cnt > 32; cnt -= 32)
392     __crypt__sha256_process_bytes (alt_result, 32, &ctx);
393   __crypt__sha256_process_bytes (alt_result, cnt, &ctx);
394 
395   /* Take the binary representation of the length of the key and for every
396      1 add the alternate sum, for every 0 the key.  */
397   for (cnt = key_len; cnt > 0; cnt >>= 1)
398     if ((cnt & 1) != 0)
399       __crypt__sha256_process_bytes (alt_result, 32, &ctx);
400     else
401       __crypt__sha256_process_bytes (key, key_len, &ctx);
402 
403   /* Create intermediate result.  */
404   __crypt__sha256_finish_ctx (&ctx, alt_result);
405 
406   /* Start computation of P byte sequence.  */
407   __crypt__sha256_init_ctx (&alt_ctx);
408 
409   /* For every character in the password add the entire password.  */
410   for (cnt = 0; cnt < key_len; ++cnt)
411     __crypt__sha256_process_bytes (key, key_len, &alt_ctx);
412 
413   /* Finish the digest.  */
414   __crypt__sha256_finish_ctx (&alt_ctx, temp_result);
415 
416   /* Create byte sequence P.  */
417   cp = p_bytes = alloca (key_len);
418   for (cnt = key_len; cnt >= 32; cnt -= 32)
419     cp = mempcpy (cp, temp_result, 32);
420   memcpy (cp, temp_result, cnt);
421 
422   /* Start computation of S byte sequence.  */
423   __crypt__sha256_init_ctx (&alt_ctx);
424 
425   /* For every character in the password add the entire password.  */
426   for (cnt = 0; cnt < 16 + alt_result[0]; ++cnt)
427     __crypt__sha256_process_bytes (salt, salt_len, &alt_ctx);
428 
429   /* Finish the digest.  */
430   __crypt__sha256_finish_ctx (&alt_ctx, temp_result);
431 
432   /* Create byte sequence S.  */
433   cp = s_bytes = alloca (salt_len);
434   for (cnt = salt_len; cnt >= 32; cnt -= 32)
435     cp = mempcpy (cp, temp_result, 32);
436   memcpy (cp, temp_result, cnt);
437 
438   /* Repeatedly run the collected hash value through SHA256 to burn
439      CPU cycles.  */
440   for (cnt = 0; cnt < rounds; ++cnt)
441     {
442       /* New context.  */
443       __crypt__sha256_init_ctx (&ctx);
444 
445       /* Add key or last result.  */
446       if ((cnt & 1) != 0)
447 	__crypt__sha256_process_bytes (p_bytes, key_len, &ctx);
448       else
449 	__crypt__sha256_process_bytes (alt_result, 32, &ctx);
450 
451       /* Add salt for numbers not divisible by 3.  */
452       if (cnt % 3 != 0)
453 	__crypt__sha256_process_bytes (s_bytes, salt_len, &ctx);
454 
455       /* Add key for numbers not divisible by 7.  */
456       if (cnt % 7 != 0)
457 	__crypt__sha256_process_bytes (p_bytes, key_len, &ctx);
458 
459       /* Add key or last result.  */
460       if ((cnt & 1) != 0)
461 	__crypt__sha256_process_bytes (alt_result, 32, &ctx);
462       else
463 	__crypt__sha256_process_bytes (p_bytes, key_len, &ctx);
464 
465       /* Create intermediate result.  */
466       __crypt__sha256_finish_ctx (&ctx, alt_result);
467     }
468 
469   /* Now we can construct the result string.  It consists of three
470      parts.  */
471   cp = stpncpy (buffer, sha256_salt_prefix, MAX (0, buflen));
472   buflen -= sizeof (sha256_salt_prefix) - 1;
473 
474   if (rounds_custom)
475     {
476       int n = snprintf (cp, MAX (0, buflen), "%s%zu$",
477 			sha256_rounds_prefix, rounds);
478       cp += n;
479       buflen -= n;
480     }
481 
482   cp = stpncpy (cp, salt, MIN ((size_t) MAX (0, buflen), salt_len));
483   buflen -= MIN ((size_t) MAX (0, buflen), salt_len);
484 
485   if (buflen > 0)
486     {
487       *cp++ = '$';
488       --buflen;
489     }
490 
491 #define b64_from_24bit(B2, B1, B0, N)					      \
492   do {									      \
493     unsigned int w = ((B2) << 16) | ((B1) << 8) | (B0);			      \
494     int n = (N);							      \
495     while (n-- > 0 && buflen > 0)					      \
496       {									      \
497 	*cp++ = b64t[w & 0x3f];						      \
498 	--buflen;							      \
499 	w >>= 6;							      \
500       }									      \
501   } while (0)
502 
503   b64_from_24bit (alt_result[0], alt_result[10], alt_result[20], 4);
504   b64_from_24bit (alt_result[21], alt_result[1], alt_result[11], 4);
505   b64_from_24bit (alt_result[12], alt_result[22], alt_result[2], 4);
506   b64_from_24bit (alt_result[3], alt_result[13], alt_result[23], 4);
507   b64_from_24bit (alt_result[24], alt_result[4], alt_result[14], 4);
508   b64_from_24bit (alt_result[15], alt_result[25], alt_result[5], 4);
509   b64_from_24bit (alt_result[6], alt_result[16], alt_result[26], 4);
510   b64_from_24bit (alt_result[27], alt_result[7], alt_result[17], 4);
511   b64_from_24bit (alt_result[18], alt_result[28], alt_result[8], 4);
512   b64_from_24bit (alt_result[9], alt_result[19], alt_result[29], 4);
513   b64_from_24bit (0, alt_result[31], alt_result[30], 3);
514   if (buflen <= 0)
515     {
516       errno = ERANGE;
517       buffer = NULL;
518     }
519   else
520     *cp = '\0';		/* Terminate the string.  */
521 
522   /* Clear the buffer for the intermediate result so that people
523      attaching to processes or reading core dumps cannot get any
524      information.  We do it in this way to clear correct_words[]
525      inside the SHA256 implementation as well.  */
526   __crypt__sha256_init_ctx (&ctx);
527   __crypt__sha256_finish_ctx (&ctx, alt_result);
528   memset (temp_result, '\0', sizeof (temp_result));
529   memset (p_bytes, '\0', key_len);
530   memset (s_bytes, '\0', salt_len);
531   memset (&ctx, '\0', sizeof (ctx));
532   memset (&alt_ctx, '\0', sizeof (alt_ctx));
533   if (copied_key != NULL)
534     memset (copied_key, '\0', key_len);
535   if (copied_salt != NULL)
536     memset (copied_salt, '\0', salt_len);
537 
538   return buffer;
539 }
540 
541 
542 /* This entry point is equivalent to the `crypt' function in Unix
543    libcs.  */
544 char *
545 crypt_sha256 (const char *key, const char *salt)
546 {
547   /* We don't want to have an arbitrary limit in the size of the
548      password.  We can compute an upper bound for the size of the
549      result in advance and so we can prepare the buffer we pass to
550      `crypt_sha256_r'.  */
551   static char *buffer;
552   static int buflen;
553   int needed = (sizeof (sha256_salt_prefix) - 1
554 		+ sizeof (sha256_rounds_prefix) + 9 + 1
555 		+ strlen (salt) + 1 + 43 + 1);
556 
557   if (buflen < needed)
558     {
559       char *new_buffer = (char *) realloc (buffer, needed);
560       if (new_buffer == NULL)
561 	return NULL;
562 
563       buffer = new_buffer;
564       buflen = needed;
565     }
566 
567   return crypt_sha256_r (key, salt, buffer, buflen);
568 }
569 
570 
571 #ifdef TEST
572 static const struct
573 {
574   const char *input;
575   const char result[32];
576 } tests[] =
577   {
578     /* Test vectors from FIPS 180-2: appendix B.1.  */
579     { "abc",
580       "\xba\x78\x16\xbf\x8f\x01\xcf\xea\x41\x41\x40\xde\x5d\xae\x22\x23"
581       "\xb0\x03\x61\xa3\x96\x17\x7a\x9c\xb4\x10\xff\x61\xf2\x00\x15\xad" },
582     /* Test vectors from FIPS 180-2: appendix B.2.  */
583     { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
584       "\x24\x8d\x6a\x61\xd2\x06\x38\xb8\xe5\xc0\x26\x93\x0c\x3e\x60\x39"
585       "\xa3\x3c\xe4\x59\x64\xff\x21\x67\xf6\xec\xed\xd4\x19\xdb\x06\xc1" },
586     /* Test vectors from the NESSIE project.  */
587     { "",
588       "\xe3\xb0\xc4\x42\x98\xfc\x1c\x14\x9a\xfb\xf4\xc8\x99\x6f\xb9\x24"
589       "\x27\xae\x41\xe4\x64\x9b\x93\x4c\xa4\x95\x99\x1b\x78\x52\xb8\x55" },
590     { "a",
591       "\xca\x97\x81\x12\xca\x1b\xbd\xca\xfa\xc2\x31\xb3\x9a\x23\xdc\x4d"
592       "\xa7\x86\xef\xf8\x14\x7c\x4e\x72\xb9\x80\x77\x85\xaf\xee\x48\xbb" },
593     { "message digest",
594       "\xf7\x84\x6f\x55\xcf\x23\xe1\x4e\xeb\xea\xb5\xb4\xe1\x55\x0c\xad"
595       "\x5b\x50\x9e\x33\x48\xfb\xc4\xef\xa3\xa1\x41\x3d\x39\x3c\xb6\x50" },
596     { "abcdefghijklmnopqrstuvwxyz",
597       "\x71\xc4\x80\xdf\x93\xd6\xae\x2f\x1e\xfa\xd1\x44\x7c\x66\xc9\x52"
598       "\x5e\x31\x62\x18\xcf\x51\xfc\x8d\x9e\xd8\x32\xf2\xda\xf1\x8b\x73" },
599     { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
600       "\x24\x8d\x6a\x61\xd2\x06\x38\xb8\xe5\xc0\x26\x93\x0c\x3e\x60\x39"
601       "\xa3\x3c\xe4\x59\x64\xff\x21\x67\xf6\xec\xed\xd4\x19\xdb\x06\xc1" },
602     { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
603       "\xdb\x4b\xfc\xbd\x4d\xa0\xcd\x85\xa6\x0c\x3c\x37\xd3\xfb\xd8\x80"
604       "\x5c\x77\xf1\x5f\xc6\xb1\xfd\xfe\x61\x4e\xe0\xa7\xc8\xfd\xb4\xc0" },
605     { "123456789012345678901234567890123456789012345678901234567890"
606       "12345678901234567890",
607       "\xf3\x71\xbc\x4a\x31\x1f\x2b\x00\x9e\xef\x95\x2d\xd8\x3c\xa8\x0e"
608       "\x2b\x60\x02\x6c\x8e\x93\x55\x92\xd0\xf9\xc3\x08\x45\x3c\x81\x3e" }
609   };
610 #define ntests (NELEM(tests))
611 
612 
613 static const struct
614 {
615   const char *salt;
616   const char *input;
617   const char *expected;
618 } tests2[] =
619 {
620   { "$5$saltstring", "Hello world!",
621     "$5$saltstring$5B8vYYiY.CVt1RlTTf8KbXBH3hsxY/GNooZaBBGWEc5" },
622   { "$5$rounds=10000$saltstringsaltstring", "Hello world!",
623     "$5$rounds=10000$saltstringsaltst$3xv.VbSHBb41AL9AvLeujZkZRBAwqFMz2."
624     "opqey6IcA" },
625   { "$5$rounds=5000$toolongsaltstring", "This is just a test",
626     "$5$rounds=5000$toolongsaltstrin$Un/5jzAHMgOGZ5.mWJpuVolil07guHPvOW8"
627     "mGRcvxa5" },
628   { "$5$rounds=1400$anotherlongsaltstring",
629     "a very much longer text to encrypt.  This one even stretches over more"
630     "than one line.",
631     "$5$rounds=1400$anotherlongsalts$Rx.j8H.h8HjEDGomFU8bDkXm3XIUnzyxf12"
632     "oP84Bnq1" },
633   { "$5$rounds=77777$short",
634     "we have a short salt string but not a short password",
635     "$5$rounds=77777$short$JiO1O3ZpDAxGJeaDIuqCoEFysAe1mZNJRs3pw0KQRd/" },
636   { "$5$rounds=123456$asaltof16chars..", "a short string",
637     "$5$rounds=123456$asaltof16chars..$gP3VQ/6X7UUEW3HkBn2w1/Ptq2jxPyzV/"
638     "cZKmF/wJvD" },
639   { "$5$rounds=10$roundstoolow", "the minimum number is still observed",
640     "$5$rounds=1000$roundstoolow$yfvwcWrQ8l/K0DAWyuPMDNHpIVlTQebY9l/gL97"
641     "2bIC" },
642 };
643 #define ntests2 (NELEM(tests2))
644 
645 
646 int
647 main (void)
648 {
649   struct sha256_ctx ctx;
650   char sum[32];
651   int result = 0;
652   int cnt;
653 
654   for (cnt = 0; cnt < (int) ntests; ++cnt)
655     {
656       __crypt__sha256_init_ctx (&ctx);
657       __crypt__sha256_process_bytes (tests[cnt].input, strlen (tests[cnt].input), &ctx);
658       __crypt__sha256_finish_ctx (&ctx, sum);
659       if (memcmp (tests[cnt].result, sum, 32) != 0)
660 	{
661 	  printf ("test %d run %d failed\n", cnt, 1);
662 	  result = 1;
663 	}
664 
665       __crypt__sha256_init_ctx (&ctx);
666       for (int i = 0; tests[cnt].input[i] != '\0'; ++i)
667 	__crypt__sha256_process_bytes (&tests[cnt].input[i], 1, &ctx);
668       __crypt__sha256_finish_ctx (&ctx, sum);
669       if (memcmp (tests[cnt].result, sum, 32) != 0)
670 	{
671 	  printf ("test %d run %d failed\n", cnt, 2);
672 	  result = 1;
673 	}
674     }
675 
676   /* Test vector from FIPS 180-2: appendix B.3.  */
677   char buf[1000];
678   memset (buf, 'a', sizeof (buf));
679   __crypt__sha256_init_ctx (&ctx);
680   for (int i = 0; i < 1000; ++i)
681     __crypt__sha256_process_bytes (buf, sizeof (buf), &ctx);
682   __crypt__sha256_finish_ctx (&ctx, sum);
683   static const char expected[32] =
684     "\xcd\xc7\x6e\x5c\x99\x14\xfb\x92\x81\xa1\xc7\xe2\x84\xd7\x3e\x67"
685     "\xf1\x80\x9a\x48\xa4\x97\x20\x0e\x04\x6d\x39\xcc\xc7\x11\x2c\xd0";
686   if (memcmp (expected, sum, 32) != 0)
687     {
688       printf ("test %d failed\n", cnt);
689       result = 1;
690     }
691 
692   for (cnt = 0; cnt < ntests2; ++cnt)
693     {
694       char *cp = crypt_sha256 (tests2[cnt].input, tests2[cnt].salt);
695 
696       if (strcmp (cp, tests2[cnt].expected) != 0)
697 	{
698 	  printf ("test %d: expected \"%s\", got \"%s\"\n",
699 		  cnt, tests2[cnt].expected, cp);
700 	  result = 1;
701 	}
702     }
703 
704   if (result == 0)
705     puts ("all tests OK");
706 
707   return result;
708 }
709 #endif
710 
711