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