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