xref: /dragonfly/lib/libcrypt/crypt-sha512.c (revision 82730a9c)
1 /*
2  * SHA512-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 <stdbool.h>
8 #include <stdint.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 
17 /* Structure to save state of computation between the single steps.  */
18 struct sha512_ctx
19 {
20   uint64_t H[8];
21 
22   uint64_t total[2];
23   uint64_t buflen;
24   char buffer[256];	/* NB: always correctly aligned for uint64_t.  */
25 };
26 
27 
28 #if __BYTE_ORDER == __LITTLE_ENDIAN
29 # define SWAP(n) \
30   (((n) << 56)					\
31    | (((n) & 0xff00) << 40)			\
32    | (((n) & 0xff0000) << 24)			\
33    | (((n) & 0xff000000) << 8)			\
34    | (((n) >> 8) & 0xff000000)			\
35    | (((n) >> 24) & 0xff0000)			\
36    | (((n) >> 40) & 0xff00)			\
37    | ((n) >> 56))
38 #else
39 # define SWAP(n) (n)
40 #endif
41 
42 
43 /* This array contains the bytes used to pad the buffer to the next
44    64-byte boundary.  (FIPS 180-2:5.1.2)  */
45 static const unsigned char fillbuf[128] = { 0x80, 0 /* , 0, 0, ...  */ };
46 
47 
48 /* Constants for SHA512 from FIPS 180-2:4.2.3.  */
49 static const uint64_t K[80] =
50   {
51     UINT64_C (0x428a2f98d728ae22), UINT64_C (0x7137449123ef65cd),
52     UINT64_C (0xb5c0fbcfec4d3b2f), UINT64_C (0xe9b5dba58189dbbc),
53     UINT64_C (0x3956c25bf348b538), UINT64_C (0x59f111f1b605d019),
54     UINT64_C (0x923f82a4af194f9b), UINT64_C (0xab1c5ed5da6d8118),
55     UINT64_C (0xd807aa98a3030242), UINT64_C (0x12835b0145706fbe),
56     UINT64_C (0x243185be4ee4b28c), UINT64_C (0x550c7dc3d5ffb4e2),
57     UINT64_C (0x72be5d74f27b896f), UINT64_C (0x80deb1fe3b1696b1),
58     UINT64_C (0x9bdc06a725c71235), UINT64_C (0xc19bf174cf692694),
59     UINT64_C (0xe49b69c19ef14ad2), UINT64_C (0xefbe4786384f25e3),
60     UINT64_C (0x0fc19dc68b8cd5b5), UINT64_C (0x240ca1cc77ac9c65),
61     UINT64_C (0x2de92c6f592b0275), UINT64_C (0x4a7484aa6ea6e483),
62     UINT64_C (0x5cb0a9dcbd41fbd4), UINT64_C (0x76f988da831153b5),
63     UINT64_C (0x983e5152ee66dfab), UINT64_C (0xa831c66d2db43210),
64     UINT64_C (0xb00327c898fb213f), UINT64_C (0xbf597fc7beef0ee4),
65     UINT64_C (0xc6e00bf33da88fc2), UINT64_C (0xd5a79147930aa725),
66     UINT64_C (0x06ca6351e003826f), UINT64_C (0x142929670a0e6e70),
67     UINT64_C (0x27b70a8546d22ffc), UINT64_C (0x2e1b21385c26c926),
68     UINT64_C (0x4d2c6dfc5ac42aed), UINT64_C (0x53380d139d95b3df),
69     UINT64_C (0x650a73548baf63de), UINT64_C (0x766a0abb3c77b2a8),
70     UINT64_C (0x81c2c92e47edaee6), UINT64_C (0x92722c851482353b),
71     UINT64_C (0xa2bfe8a14cf10364), UINT64_C (0xa81a664bbc423001),
72     UINT64_C (0xc24b8b70d0f89791), UINT64_C (0xc76c51a30654be30),
73     UINT64_C (0xd192e819d6ef5218), UINT64_C (0xd69906245565a910),
74     UINT64_C (0xf40e35855771202a), UINT64_C (0x106aa07032bbd1b8),
75     UINT64_C (0x19a4c116b8d2d0c8), UINT64_C (0x1e376c085141ab53),
76     UINT64_C (0x2748774cdf8eeb99), UINT64_C (0x34b0bcb5e19b48a8),
77     UINT64_C (0x391c0cb3c5c95a63), UINT64_C (0x4ed8aa4ae3418acb),
78     UINT64_C (0x5b9cca4f7763e373), UINT64_C (0x682e6ff3d6b2b8a3),
79     UINT64_C (0x748f82ee5defb2fc), UINT64_C (0x78a5636f43172f60),
80     UINT64_C (0x84c87814a1f0ab72), UINT64_C (0x8cc702081a6439ec),
81     UINT64_C (0x90befffa23631e28), UINT64_C (0xa4506cebde82bde9),
82     UINT64_C (0xbef9a3f7b2c67915), UINT64_C (0xc67178f2e372532b),
83     UINT64_C (0xca273eceea26619c), UINT64_C (0xd186b8c721c0c207),
84     UINT64_C (0xeada7dd6cde0eb1e), UINT64_C (0xf57d4f7fee6ed178),
85     UINT64_C (0x06f067aa72176fba), UINT64_C (0x0a637dc5a2c898a6),
86     UINT64_C (0x113f9804bef90dae), UINT64_C (0x1b710b35131c471b),
87     UINT64_C (0x28db77f523047d84), UINT64_C (0x32caab7b40c72493),
88     UINT64_C (0x3c9ebe0a15c9bebc), UINT64_C (0x431d67c49c100d4c),
89     UINT64_C (0x4cc5d4becb3e42b6), UINT64_C (0x597f299cfc657e2a),
90     UINT64_C (0x5fcb6fab3ad6faec), UINT64_C (0x6c44198c4a475817)
91   };
92 
93 
94 /* Process LEN bytes of BUFFER, accumulating context into CTX.
95    It is assumed that LEN % 128 == 0.  */
96 static void
97 sha512_process_block (const void *buffer, size_t len, struct sha512_ctx *ctx)
98 {
99   const uint64_t *words = buffer;
100   size_t nwords = len / sizeof (uint64_t);
101   uint64_t a = ctx->H[0];
102   uint64_t b = ctx->H[1];
103   uint64_t c = ctx->H[2];
104   uint64_t d = ctx->H[3];
105   uint64_t e = ctx->H[4];
106   uint64_t f = ctx->H[5];
107   uint64_t g = ctx->H[6];
108   uint64_t h = ctx->H[7];
109 
110   /* First increment the byte count.  FIPS 180-2 specifies the possible
111      length of the file up to 2^128 bits.  Here we only compute the
112      number of bytes.  Do a double word increment.  */
113   ctx->total[0] += len;
114   if (ctx->total[0] < len)
115     ++ctx->total[1];
116 
117   /* Process all bytes in the buffer with 128 bytes in each round of
118      the loop.  */
119   while (nwords > 0)
120     {
121       uint64_t W[80];
122       uint64_t a_save = a;
123       uint64_t b_save = b;
124       uint64_t c_save = c;
125       uint64_t d_save = d;
126       uint64_t e_save = e;
127       uint64_t f_save = f;
128       uint64_t g_save = g;
129       uint64_t h_save = h;
130 
131       /* Operators defined in FIPS 180-2:4.1.2.  */
132 #define Ch(x, y, z) ((x & y) ^ (~x & z))
133 #define Maj(x, y, z) ((x & y) ^ (x & z) ^ (y & z))
134 #define S0(x) (CYCLIC (x, 28) ^ CYCLIC (x, 34) ^ CYCLIC (x, 39))
135 #define S1(x) (CYCLIC (x, 14) ^ CYCLIC (x, 18) ^ CYCLIC (x, 41))
136 #define R0(x) (CYCLIC (x, 1) ^ CYCLIC (x, 8) ^ (x >> 7))
137 #define R1(x) (CYCLIC (x, 19) ^ CYCLIC (x, 61) ^ (x >> 6))
138 
139       /* It is unfortunate that C does not provide an operator for
140 	 cyclic rotation.  Hope the C compiler is smart enough.  */
141 #define CYCLIC(w, s) ((w >> s) | (w << (64 - s)))
142 
143       /* Compute the message schedule according to FIPS 180-2:6.3.2 step 2.  */
144       for (unsigned int t = 0; t < 16; ++t)
145 	{
146 	  W[t] = SWAP (*words);
147 	  ++words;
148 	}
149       for (unsigned int t = 16; t < 80; ++t)
150 	W[t] = R1 (W[t - 2]) + W[t - 7] + R0 (W[t - 15]) + W[t - 16];
151 
152       /* The actual computation according to FIPS 180-2:6.3.2 step 3.  */
153       for (unsigned int t = 0; t < 80; ++t)
154 	{
155 	  uint64_t T1 = h + S1 (e) + Ch (e, f, g) + K[t] + W[t];
156 	  uint64_t T2 = S0 (a) + Maj (a, b, c);
157 	  h = g;
158 	  g = f;
159 	  f = e;
160 	  e = d + T1;
161 	  d = c;
162 	  c = b;
163 	  b = a;
164 	  a = T1 + T2;
165 	}
166 
167       /* Add the starting values of the context according to FIPS 180-2:6.3.2
168 	 step 4.  */
169       a += a_save;
170       b += b_save;
171       c += c_save;
172       d += d_save;
173       e += e_save;
174       f += f_save;
175       g += g_save;
176       h += h_save;
177 
178       /* Prepare for the next round.  */
179       nwords -= 16;
180     }
181 
182   /* Put checksum in context given as argument.  */
183   ctx->H[0] = a;
184   ctx->H[1] = b;
185   ctx->H[2] = c;
186   ctx->H[3] = d;
187   ctx->H[4] = e;
188   ctx->H[5] = f;
189   ctx->H[6] = g;
190   ctx->H[7] = h;
191 }
192 
193 
194 /* Initialize structure containing state of computation.
195    (FIPS 180-2:5.3.3)  */
196 static void
197 sha512_init_ctx (struct sha512_ctx *ctx)
198 {
199   ctx->H[0] = UINT64_C (0x6a09e667f3bcc908);
200   ctx->H[1] = UINT64_C (0xbb67ae8584caa73b);
201   ctx->H[2] = UINT64_C (0x3c6ef372fe94f82b);
202   ctx->H[3] = UINT64_C (0xa54ff53a5f1d36f1);
203   ctx->H[4] = UINT64_C (0x510e527fade682d1);
204   ctx->H[5] = UINT64_C (0x9b05688c2b3e6c1f);
205   ctx->H[6] = UINT64_C (0x1f83d9abfb41bd6b);
206   ctx->H[7] = UINT64_C (0x5be0cd19137e2179);
207 
208   ctx->total[0] = ctx->total[1] = 0;
209   ctx->buflen = 0;
210 }
211 
212 
213 /* Process the remaining bytes in the internal buffer and the usual
214    prolog according to the standard and write the result to RESBUF.
215 
216    IMPORTANT: On some systems it is required that RESBUF is correctly
217    aligned for a 32 bits value.  */
218 static void *
219 sha512_finish_ctx (struct sha512_ctx *ctx, void *resbuf)
220 {
221   /* Take yet unprocessed bytes into account.  */
222   uint64_t bytes = ctx->buflen;
223   size_t pad;
224 
225   /* Now count remaining bytes.  */
226   ctx->total[0] += bytes;
227   if (ctx->total[0] < bytes)
228     ++ctx->total[1];
229 
230   pad = bytes >= 112 ? 128 + 112 - bytes : 112 - bytes;
231   memcpy (&ctx->buffer[bytes], fillbuf, pad);
232 
233   /* Put the 128-bit file length in *bits* at the end of the buffer.  */
234   *(uint64_t *) &ctx->buffer[bytes + pad + 8] = SWAP (ctx->total[0] << 3);
235   *(uint64_t *) &ctx->buffer[bytes + pad] = SWAP ((ctx->total[1] << 3) |
236 						  (ctx->total[0] >> 61));
237 
238   /* Process last bytes.  */
239   sha512_process_block (ctx->buffer, bytes + pad + 16, ctx);
240 
241   /* Put result from CTX in first 64 bytes following RESBUF.  */
242   for (unsigned int i = 0; i < 8; ++i)
243     ((uint64_t *) resbuf)[i] = SWAP (ctx->H[i]);
244 
245   return resbuf;
246 }
247 
248 
249 static void
250 sha512_process_bytes (const void *buffer, size_t len, struct sha512_ctx *ctx)
251 {
252   /* When we already have some bits in our internal buffer concatenate
253      both inputs first.  */
254   if (ctx->buflen != 0)
255     {
256       size_t left_over = ctx->buflen;
257       size_t add = 256 - left_over > len ? len : 256 - left_over;
258 
259       memcpy (&ctx->buffer[left_over], buffer, add);
260       ctx->buflen += add;
261 
262       if (ctx->buflen > 128)
263 	{
264 	  sha512_process_block (ctx->buffer, ctx->buflen & ~127, ctx);
265 
266 	  ctx->buflen &= 127;
267 	  /* The regions in the following copy operation cannot overlap.  */
268 	  memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~127],
269 		  ctx->buflen);
270 	}
271 
272       buffer = (const char *) buffer + add;
273       len -= add;
274     }
275 
276   /* Process available complete blocks.  */
277   if (len >= 128)
278     {
279 #if !_STRING_ARCH_unaligned
280 /* To check alignment gcc has an appropriate operator.  Other
281    compilers don't.  */
282 # if __GNUC__ >= 2
283 #  define UNALIGNED_P(p) (((uintptr_t) p) % __alignof__ (uint64_t) != 0)
284 # else
285 #  define UNALIGNED_P(p) (((uintptr_t) p) % sizeof (uint64_t) != 0)
286 # endif
287       if (UNALIGNED_P (buffer))
288 	while (len > 128)
289 	  {
290 	    sha512_process_block (memcpy (ctx->buffer, buffer, 128), 128,
291 				    ctx);
292 	    buffer = (const char *) buffer + 128;
293 	    len -= 128;
294 	  }
295       else
296 #endif
297 	{
298 	  sha512_process_block (buffer, len & ~127, ctx);
299 	  buffer = (const char *) buffer + (len & ~127);
300 	  len &= 127;
301 	}
302     }
303 
304   /* Move remaining bytes into internal buffer.  */
305   if (len > 0)
306     {
307       size_t left_over = ctx->buflen;
308 
309       memcpy (&ctx->buffer[left_over], buffer, len);
310       left_over += len;
311       if (left_over >= 128)
312 	{
313 	  sha512_process_block (ctx->buffer, 128, ctx);
314 	  left_over -= 128;
315 	  memcpy (ctx->buffer, &ctx->buffer[128], left_over);
316 	}
317       ctx->buflen = left_over;
318     }
319 }
320 
321 
322 /* Define our magic string to mark salt for SHA512 "encryption"
323    replacement.  */
324 static const char sha512_salt_prefix[] = "$6$";
325 
326 /* Prefix for optional rounds specification.  */
327 static const char sha512_rounds_prefix[] = "rounds=";
328 
329 /* Maximum salt string length.  */
330 #define SALT_LEN_MAX 16
331 /* Default number of rounds if not explicitly specified.  */
332 #define ROUNDS_DEFAULT 5000
333 /* Minimum number of rounds.  */
334 #define ROUNDS_MIN 1000
335 /* Maximum number of rounds.  */
336 #define ROUNDS_MAX 999999999
337 
338 /* Table with characters for base64 transformation.  */
339 static const char b64t[64] =
340 "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
341 
342 
343 static char *
344 crypt_sha512_r (const char *key, const char *salt, char *buffer, int buflen)
345 {
346   unsigned char alt_result[64]
347     __attribute__ ((__aligned__ (__alignof__ (uint64_t))));
348   unsigned char temp_result[64]
349     __attribute__ ((__aligned__ (__alignof__ (uint64_t))));
350   struct sha512_ctx ctx;
351   struct sha512_ctx alt_ctx;
352   size_t salt_len;
353   size_t key_len;
354   size_t cnt;
355   char *cp;
356   char *copied_key = NULL;
357   char *copied_salt = NULL;
358   char *p_bytes;
359   char *s_bytes;
360   /* Default number of rounds.  */
361   size_t rounds = ROUNDS_DEFAULT;
362   bool rounds_custom = false;
363 
364   /* Find beginning of salt string.  The prefix should normally always
365      be present.  Just in case it is not.  */
366   if (strncmp (sha512_salt_prefix, salt, sizeof (sha512_salt_prefix) - 1) == 0)
367     /* Skip salt prefix.  */
368     salt += sizeof (sha512_salt_prefix) - 1;
369 
370   if (strncmp (salt, sha512_rounds_prefix, sizeof (sha512_rounds_prefix) - 1)
371       == 0)
372     {
373       const char *num = salt + sizeof (sha512_rounds_prefix) - 1;
374       char *endp;
375       unsigned long int srounds = strtoul (num, &endp, 10);
376       if (*endp == '$')
377 	{
378 	  salt = endp + 1;
379 	  rounds = MAX (ROUNDS_MIN, MIN (srounds, ROUNDS_MAX));
380 	  rounds_custom = true;
381 	}
382     }
383 
384   salt_len = MIN (strcspn (salt, "$"), SALT_LEN_MAX);
385   key_len = strlen (key);
386 
387   if ((key - (char *) 0) % __alignof__ (uint64_t) != 0)
388     {
389       char *tmp = (char *) alloca (key_len + __alignof__ (uint64_t));
390       key = copied_key =
391 	memcpy (tmp + __alignof__ (uint64_t)
392 		- (tmp - (char *) 0) % __alignof__ (uint64_t),
393 		key, key_len);
394     }
395 
396   if ((salt - (char *) 0) % __alignof__ (uint64_t) != 0)
397     {
398       char *tmp = (char *) alloca (salt_len + __alignof__ (uint64_t));
399       salt = copied_salt =
400 	memcpy (tmp + __alignof__ (uint64_t)
401 		- (tmp - (char *) 0) % __alignof__ (uint64_t),
402 		salt, salt_len);
403     }
404 
405   /* Prepare for the real work.  */
406   sha512_init_ctx (&ctx);
407 
408   /* Add the key string.  */
409   sha512_process_bytes (key, key_len, &ctx);
410 
411   /* The last part is the salt string.  This must be at most 16
412      characters and it ends at the first `$' character (for
413      compatibility with existing implementations).  */
414   sha512_process_bytes (salt, salt_len, &ctx);
415 
416 
417   /* Compute alternate SHA512 sum with input KEY, SALT, and KEY.  The
418      final result will be added to the first context.  */
419   sha512_init_ctx (&alt_ctx);
420 
421   /* Add key.  */
422   sha512_process_bytes (key, key_len, &alt_ctx);
423 
424   /* Add salt.  */
425   sha512_process_bytes (salt, salt_len, &alt_ctx);
426 
427   /* Add key again.  */
428   sha512_process_bytes (key, key_len, &alt_ctx);
429 
430   /* Now get result of this (64 bytes) and add it to the other
431      context.  */
432   sha512_finish_ctx (&alt_ctx, alt_result);
433 
434   /* Add for any character in the key one byte of the alternate sum.  */
435   for (cnt = key_len; cnt > 64; cnt -= 64)
436     sha512_process_bytes (alt_result, 64, &ctx);
437   sha512_process_bytes (alt_result, cnt, &ctx);
438 
439   /* Take the binary representation of the length of the key and for every
440      1 add the alternate sum, for every 0 the key.  */
441   for (cnt = key_len; cnt > 0; cnt >>= 1)
442     if ((cnt & 1) != 0)
443       sha512_process_bytes (alt_result, 64, &ctx);
444     else
445       sha512_process_bytes (key, key_len, &ctx);
446 
447   /* Create intermediate result.  */
448   sha512_finish_ctx (&ctx, alt_result);
449 
450   /* Start computation of P byte sequence.  */
451   sha512_init_ctx (&alt_ctx);
452 
453   /* For every character in the password add the entire password.  */
454   for (cnt = 0; cnt < key_len; ++cnt)
455     sha512_process_bytes (key, key_len, &alt_ctx);
456 
457   /* Finish the digest.  */
458   sha512_finish_ctx (&alt_ctx, temp_result);
459 
460   /* Create byte sequence P.  */
461   cp = p_bytes = alloca (key_len);
462   for (cnt = key_len; cnt >= 64; cnt -= 64)
463     cp = mempcpy (cp, temp_result, 64);
464   memcpy (cp, temp_result, cnt);
465 
466   /* Start computation of S byte sequence.  */
467   sha512_init_ctx (&alt_ctx);
468 
469   /* For every character in the password add the entire password.  */
470   for (cnt = 0; cnt < 16 + alt_result[0]; ++cnt)
471     sha512_process_bytes (salt, salt_len, &alt_ctx);
472 
473   /* Finish the digest.  */
474   sha512_finish_ctx (&alt_ctx, temp_result);
475 
476   /* Create byte sequence S.  */
477   cp = s_bytes = alloca (salt_len);
478   for (cnt = salt_len; cnt >= 64; cnt -= 64)
479     cp = mempcpy (cp, temp_result, 64);
480   memcpy (cp, temp_result, cnt);
481 
482   /* Repeatedly run the collected hash value through SHA512 to burn
483      CPU cycles.  */
484   for (cnt = 0; cnt < rounds; ++cnt)
485     {
486       /* New context.  */
487       sha512_init_ctx (&ctx);
488 
489       /* Add key or last result.  */
490       if ((cnt & 1) != 0)
491 	sha512_process_bytes (p_bytes, key_len, &ctx);
492       else
493 	sha512_process_bytes (alt_result, 64, &ctx);
494 
495       /* Add salt for numbers not divisible by 3.  */
496       if (cnt % 3 != 0)
497 	sha512_process_bytes (s_bytes, salt_len, &ctx);
498 
499       /* Add key for numbers not divisible by 7.  */
500       if (cnt % 7 != 0)
501 	sha512_process_bytes (p_bytes, key_len, &ctx);
502 
503       /* Add key or last result.  */
504       if ((cnt & 1) != 0)
505 	sha512_process_bytes (alt_result, 64, &ctx);
506       else
507 	sha512_process_bytes (p_bytes, key_len, &ctx);
508 
509       /* Create intermediate result.  */
510       sha512_finish_ctx (&ctx, alt_result);
511     }
512 
513   /* Now we can construct the result string.  It consists of three
514      parts.  */
515   cp = stpncpy (buffer, sha512_salt_prefix, MAX (0, buflen));
516   buflen -= sizeof (sha512_salt_prefix) - 1;
517 
518   if (rounds_custom)
519     {
520       int n = snprintf (cp, MAX (0, buflen), "%s%zu$",
521 			sha512_rounds_prefix, rounds);
522       cp += n;
523       buflen -= n;
524     }
525 
526   cp = stpncpy (cp, salt, MIN ((size_t) MAX (0, buflen), salt_len));
527   buflen -= MIN ((size_t) MAX (0, buflen), salt_len);
528 
529   if (buflen > 0)
530     {
531       *cp++ = '$';
532       --buflen;
533     }
534 
535 #define b64_from_24bit(B2, B1, B0, N)					      \
536   do {									      \
537     unsigned int w = ((B2) << 16) | ((B1) << 8) | (B0);			      \
538     int n = (N);							      \
539     while (n-- > 0 && buflen > 0)					      \
540       {									      \
541 	*cp++ = b64t[w & 0x3f];						      \
542 	--buflen;							      \
543 	w >>= 6;							      \
544       }									      \
545   } while (0)
546 
547   b64_from_24bit (alt_result[0], alt_result[21], alt_result[42], 4);
548   b64_from_24bit (alt_result[22], alt_result[43], alt_result[1], 4);
549   b64_from_24bit (alt_result[44], alt_result[2], alt_result[23], 4);
550   b64_from_24bit (alt_result[3], alt_result[24], alt_result[45], 4);
551   b64_from_24bit (alt_result[25], alt_result[46], alt_result[4], 4);
552   b64_from_24bit (alt_result[47], alt_result[5], alt_result[26], 4);
553   b64_from_24bit (alt_result[6], alt_result[27], alt_result[48], 4);
554   b64_from_24bit (alt_result[28], alt_result[49], alt_result[7], 4);
555   b64_from_24bit (alt_result[50], alt_result[8], alt_result[29], 4);
556   b64_from_24bit (alt_result[9], alt_result[30], alt_result[51], 4);
557   b64_from_24bit (alt_result[31], alt_result[52], alt_result[10], 4);
558   b64_from_24bit (alt_result[53], alt_result[11], alt_result[32], 4);
559   b64_from_24bit (alt_result[12], alt_result[33], alt_result[54], 4);
560   b64_from_24bit (alt_result[34], alt_result[55], alt_result[13], 4);
561   b64_from_24bit (alt_result[56], alt_result[14], alt_result[35], 4);
562   b64_from_24bit (alt_result[15], alt_result[36], alt_result[57], 4);
563   b64_from_24bit (alt_result[37], alt_result[58], alt_result[16], 4);
564   b64_from_24bit (alt_result[59], alt_result[17], alt_result[38], 4);
565   b64_from_24bit (alt_result[18], alt_result[39], alt_result[60], 4);
566   b64_from_24bit (alt_result[40], alt_result[61], alt_result[19], 4);
567   b64_from_24bit (alt_result[62], alt_result[20], alt_result[41], 4);
568   b64_from_24bit (0, 0, alt_result[63], 2);
569 
570   if (buflen <= 0)
571     {
572       errno = ERANGE;
573       buffer = NULL;
574     }
575   else
576     *cp = '\0';		/* Terminate the string.  */
577 
578   /* Clear the buffer for the intermediate result so that people
579      attaching to processes or reading core dumps cannot get any
580      information.  We do it in this way to clear correct_words[]
581      inside the SHA512 implementation as well.  */
582   sha512_init_ctx (&ctx);
583   sha512_finish_ctx (&ctx, alt_result);
584   memset (temp_result, '\0', sizeof (temp_result));
585   memset (p_bytes, '\0', key_len);
586   memset (s_bytes, '\0', salt_len);
587   memset (&ctx, '\0', sizeof (ctx));
588   memset (&alt_ctx, '\0', sizeof (alt_ctx));
589   if (copied_key != NULL)
590     memset (copied_key, '\0', key_len);
591   if (copied_salt != NULL)
592     memset (copied_salt, '\0', salt_len);
593 
594   return buffer;
595 }
596 
597 
598 /* This entry point is equivalent to the `crypt' function in Unix
599    libcs.  */
600 char *
601 crypt_sha512 (const char *key, const char *salt)
602 {
603   /* We don't want to have an arbitrary limit in the size of the
604      password.  We can compute an upper bound for the size of the
605      result in advance and so we can prepare the buffer we pass to
606      `crypt_sha512_r'.  */
607   static char *buffer;
608   static int buflen;
609   int needed = (sizeof (sha512_salt_prefix) - 1
610 		+ sizeof (sha512_rounds_prefix) + 9 + 1
611 		+ strlen (salt) + 1 + 86 + 1);
612 
613   if (buflen < needed)
614     {
615       char *new_buffer = (char *) realloc (buffer, needed);
616       if (new_buffer == NULL)
617 	return NULL;
618 
619       buffer = new_buffer;
620       buflen = needed;
621     }
622 
623   return crypt_sha512_r (key, salt, buffer, buflen);
624 }
625 
626 
627 #ifdef TEST
628 static const struct
629 {
630   const char *input;
631   const char result[64];
632 } tests[] =
633   {
634     /* Test vectors from FIPS 180-2: appendix C.1.  */
635     { "abc",
636       "\xdd\xaf\x35\xa1\x93\x61\x7a\xba\xcc\x41\x73\x49\xae\x20\x41\x31"
637       "\x12\xe6\xfa\x4e\x89\xa9\x7e\xa2\x0a\x9e\xee\xe6\x4b\x55\xd3\x9a"
638       "\x21\x92\x99\x2a\x27\x4f\xc1\xa8\x36\xba\x3c\x23\xa3\xfe\xeb\xbd"
639       "\x45\x4d\x44\x23\x64\x3c\xe8\x0e\x2a\x9a\xc9\x4f\xa5\x4c\xa4\x9f" },
640     /* Test vectors from FIPS 180-2: appendix C.2.  */
641     { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
642       "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
643       "\x8e\x95\x9b\x75\xda\xe3\x13\xda\x8c\xf4\xf7\x28\x14\xfc\x14\x3f"
644       "\x8f\x77\x79\xc6\xeb\x9f\x7f\xa1\x72\x99\xae\xad\xb6\x88\x90\x18"
645       "\x50\x1d\x28\x9e\x49\x00\xf7\xe4\x33\x1b\x99\xde\xc4\xb5\x43\x3a"
646       "\xc7\xd3\x29\xee\xb6\xdd\x26\x54\x5e\x96\xe5\x5b\x87\x4b\xe9\x09" },
647     /* Test vectors from the NESSIE project.  */
648     { "",
649       "\xcf\x83\xe1\x35\x7e\xef\xb8\xbd\xf1\x54\x28\x50\xd6\x6d\x80\x07"
650       "\xd6\x20\xe4\x05\x0b\x57\x15\xdc\x83\xf4\xa9\x21\xd3\x6c\xe9\xce"
651       "\x47\xd0\xd1\x3c\x5d\x85\xf2\xb0\xff\x83\x18\xd2\x87\x7e\xec\x2f"
652       "\x63\xb9\x31\xbd\x47\x41\x7a\x81\xa5\x38\x32\x7a\xf9\x27\xda\x3e" },
653     { "a",
654       "\x1f\x40\xfc\x92\xda\x24\x16\x94\x75\x09\x79\xee\x6c\xf5\x82\xf2"
655       "\xd5\xd7\xd2\x8e\x18\x33\x5d\xe0\x5a\xbc\x54\xd0\x56\x0e\x0f\x53"
656       "\x02\x86\x0c\x65\x2b\xf0\x8d\x56\x02\x52\xaa\x5e\x74\x21\x05\x46"
657       "\xf3\x69\xfb\xbb\xce\x8c\x12\xcf\xc7\x95\x7b\x26\x52\xfe\x9a\x75" },
658     { "message digest",
659       "\x10\x7d\xbf\x38\x9d\x9e\x9f\x71\xa3\xa9\x5f\x6c\x05\x5b\x92\x51"
660       "\xbc\x52\x68\xc2\xbe\x16\xd6\xc1\x34\x92\xea\x45\xb0\x19\x9f\x33"
661       "\x09\xe1\x64\x55\xab\x1e\x96\x11\x8e\x8a\x90\x5d\x55\x97\xb7\x20"
662       "\x38\xdd\xb3\x72\xa8\x98\x26\x04\x6d\xe6\x66\x87\xbb\x42\x0e\x7c" },
663     { "abcdefghijklmnopqrstuvwxyz",
664       "\x4d\xbf\xf8\x6c\xc2\xca\x1b\xae\x1e\x16\x46\x8a\x05\xcb\x98\x81"
665       "\xc9\x7f\x17\x53\xbc\xe3\x61\x90\x34\x89\x8f\xaa\x1a\xab\xe4\x29"
666       "\x95\x5a\x1b\xf8\xec\x48\x3d\x74\x21\xfe\x3c\x16\x46\x61\x3a\x59"
667       "\xed\x54\x41\xfb\x0f\x32\x13\x89\xf7\x7f\x48\xa8\x79\xc7\xb1\xf1" },
668     { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
669       "\x20\x4a\x8f\xc6\xdd\xa8\x2f\x0a\x0c\xed\x7b\xeb\x8e\x08\xa4\x16"
670       "\x57\xc1\x6e\xf4\x68\xb2\x28\xa8\x27\x9b\xe3\x31\xa7\x03\xc3\x35"
671       "\x96\xfd\x15\xc1\x3b\x1b\x07\xf9\xaa\x1d\x3b\xea\x57\x78\x9c\xa0"
672       "\x31\xad\x85\xc7\xa7\x1d\xd7\x03\x54\xec\x63\x12\x38\xca\x34\x45" },
673     { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
674       "\x1e\x07\xbe\x23\xc2\x6a\x86\xea\x37\xea\x81\x0c\x8e\xc7\x80\x93"
675       "\x52\x51\x5a\x97\x0e\x92\x53\xc2\x6f\x53\x6c\xfc\x7a\x99\x96\xc4"
676       "\x5c\x83\x70\x58\x3e\x0a\x78\xfa\x4a\x90\x04\x1d\x71\xa4\xce\xab"
677       "\x74\x23\xf1\x9c\x71\xb9\xd5\xa3\xe0\x12\x49\xf0\xbe\xbd\x58\x94" },
678     { "123456789012345678901234567890123456789012345678901234567890"
679       "12345678901234567890",
680       "\x72\xec\x1e\xf1\x12\x4a\x45\xb0\x47\xe8\xb7\xc7\x5a\x93\x21\x95"
681       "\x13\x5b\xb6\x1d\xe2\x4e\xc0\xd1\x91\x40\x42\x24\x6e\x0a\xec\x3a"
682       "\x23\x54\xe0\x93\xd7\x6f\x30\x48\xb4\x56\x76\x43\x46\x90\x0c\xb1"
683       "\x30\xd2\xa4\xfd\x5d\xd1\x6a\xbb\x5e\x30\xbc\xb8\x50\xde\xe8\x43" }
684   };
685 #define ntests (sizeof (tests) / sizeof (tests[0]))
686 
687 
688 static const struct
689 {
690   const char *salt;
691   const char *input;
692   const char *expected;
693 } tests2[] =
694 {
695   { "$6$saltstring", "Hello world!",
696     "$6$saltstring$svn8UoSVapNtMuq1ukKS4tPQd8iKwSMHWjl/O817G3uBnIFNjnQJu"
697     "esI68u4OTLiBFdcbYEdFCoEOfaS35inz1" },
698   { "$6$rounds=10000$saltstringsaltstring", "Hello world!",
699     "$6$rounds=10000$saltstringsaltst$OW1/O6BYHV6BcXZu8QVeXbDWra3Oeqh0sb"
700     "HbbMCVNSnCM/UrjmM0Dp8vOuZeHBy/YTBmSK6H9qs/y3RnOaw5v." },
701   { "$6$rounds=5000$toolongsaltstring", "This is just a test",
702     "$6$rounds=5000$toolongsaltstrin$lQ8jolhgVRVhY4b5pZKaysCLi0QBxGoNeKQ"
703     "zQ3glMhwllF7oGDZxUhx1yxdYcz/e1JSbq3y6JMxxl8audkUEm0" },
704   { "$6$rounds=1400$anotherlongsaltstring",
705     "a very much longer text to encrypt.  This one even stretches over more"
706     "than one line.",
707     "$6$rounds=1400$anotherlongsalts$POfYwTEok97VWcjxIiSOjiykti.o/pQs.wP"
708     "vMxQ6Fm7I6IoYN3CmLs66x9t0oSwbtEW7o7UmJEiDwGqd8p4ur1" },
709   { "$6$rounds=77777$short",
710     "we have a short salt string but not a short password",
711     "$6$rounds=77777$short$WuQyW2YR.hBNpjjRhpYD/ifIw05xdfeEyQoMxIXbkvr0g"
712     "ge1a1x3yRULJ5CCaUeOxFmtlcGZelFl5CxtgfiAc0" },
713   { "$6$rounds=123456$asaltof16chars..", "a short string",
714     "$6$rounds=123456$asaltof16chars..$BtCwjqMJGx5hrJhZywWvt0RLE8uZ4oPwc"
715     "elCjmw2kSYu.Ec6ycULevoBK25fs2xXgMNrCzIMVcgEJAstJeonj1" },
716   { "$6$rounds=10$roundstoolow", "the minimum number is still observed",
717     "$6$rounds=1000$roundstoolow$kUMsbe306n21p9R.FRkW3IGn.S9NPN0x50YhH1x"
718     "hLsPuWGsUSklZt58jaTfF4ZEQpyUNGc0dqbpBYYBaHHrsX." },
719 };
720 #define ntests2 (sizeof (tests2) / sizeof (tests2[0]))
721 
722 
723 int
724 main (void)
725 {
726   struct sha512_ctx ctx;
727   char sum[64];
728   int result = 0;
729   int cnt;
730 
731   for (cnt = 0; cnt < (int) ntests; ++cnt)
732     {
733       sha512_init_ctx (&ctx);
734       sha512_process_bytes (tests[cnt].input, strlen (tests[cnt].input), &ctx);
735       sha512_finish_ctx (&ctx, sum);
736       if (memcmp (tests[cnt].result, sum, 64) != 0)
737 	{
738 	  printf ("test %d run %d failed\n", cnt, 1);
739 	  result = 1;
740 	}
741 
742       sha512_init_ctx (&ctx);
743       for (int i = 0; tests[cnt].input[i] != '\0'; ++i)
744 	sha512_process_bytes (&tests[cnt].input[i], 1, &ctx);
745       sha512_finish_ctx (&ctx, sum);
746       if (memcmp (tests[cnt].result, sum, 64) != 0)
747 	{
748 	  printf ("test %d run %d failed\n", cnt, 2);
749 	  result = 1;
750 	}
751     }
752 
753   /* Test vector from FIPS 180-2: appendix C.3.  */
754   char buf[1000];
755   memset (buf, 'a', sizeof (buf));
756   sha512_init_ctx (&ctx);
757   for (int i = 0; i < 1000; ++i)
758     sha512_process_bytes (buf, sizeof (buf), &ctx);
759   sha512_finish_ctx (&ctx, sum);
760   static const char expected[64] =
761     "\xe7\x18\x48\x3d\x0c\xe7\x69\x64\x4e\x2e\x42\xc7\xbc\x15\xb4\x63"
762     "\x8e\x1f\x98\xb1\x3b\x20\x44\x28\x56\x32\xa8\x03\xaf\xa9\x73\xeb"
763     "\xde\x0f\xf2\x44\x87\x7e\xa6\x0a\x4c\xb0\x43\x2c\xe5\x77\xc3\x1b"
764     "\xeb\x00\x9c\x5c\x2c\x49\xaa\x2e\x4e\xad\xb2\x17\xad\x8c\xc0\x9b";
765   if (memcmp (expected, sum, 64) != 0)
766     {
767       printf ("test %d failed\n", cnt);
768       result = 1;
769     }
770 
771   for (cnt = 0; cnt < ntests2; ++cnt)
772     {
773       char *cp = crypt_sha512 (tests2[cnt].input, tests2[cnt].salt);
774 
775       if (strcmp (cp, tests2[cnt].expected) != 0)
776 	{
777 	  printf ("test %d: expected \"%s\", got \"%s\"\n",
778 	   	  cnt, tests2[cnt].expected, cp);
779 	  result = 1;
780 	}
781     }
782 
783   if (result == 0)
784     puts ("all tests OK");
785 
786   return result;
787 }
788 #endif
789 
790