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 __GNUC__ >= 2 270 # define UNALIGNED_P(p) (((uintptr_t) p) % __alignof__ (uint64_t) != 0) 271 #else 272 # define UNALIGNED_P(p) (((uintptr_t) p) % sizeof (uint64_t) != 0) 273 #endif 274 if (UNALIGNED_P (buffer)) 275 while (len > 128) 276 { 277 __crypt__sha512_process_block (memcpy (ctx->buffer, buffer, 128), 128, 278 ctx); 279 buffer = (const char *) buffer + 128; 280 len -= 128; 281 } 282 else 283 { 284 __crypt__sha512_process_block (buffer, len & ~127, ctx); 285 buffer = (const char *) buffer + (len & ~127); 286 len &= 127; 287 } 288 } 289 290 /* Move remaining bytes into internal buffer. */ 291 if (len > 0) 292 { 293 size_t left_over = ctx->buflen; 294 295 memcpy (&ctx->buffer[left_over], buffer, len); 296 left_over += len; 297 if (left_over >= 128) 298 { 299 __crypt__sha512_process_block (ctx->buffer, 128, ctx); 300 left_over -= 128; 301 memcpy (ctx->buffer, &ctx->buffer[128], left_over); 302 } 303 ctx->buflen = left_over; 304 } 305 } 306 307 308 /* Define our magic string to mark salt for SHA512 "encryption" 309 replacement. */ 310 static const char sha512_salt_prefix[] = "$6$"; 311 312 /* Prefix for optional rounds specification. */ 313 static const char sha512_rounds_prefix[] = "rounds="; 314 315 /* Maximum salt string length. */ 316 #define SALT_LEN_MAX 16 317 /* Default number of rounds if not explicitly specified. */ 318 #define ROUNDS_DEFAULT 5000 319 /* Minimum number of rounds. */ 320 #define ROUNDS_MIN 1000 321 /* Maximum number of rounds. */ 322 #define ROUNDS_MAX 999999999 323 324 /* Table with characters for base64 transformation. */ 325 static const char b64t[64] = 326 "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 327 328 329 static char * 330 crypt_sha512_r (const char *key, const char *salt, char *buffer, int buflen) 331 { 332 unsigned char alt_result[64] 333 __attribute__ ((__aligned__ (__alignof__ (uint64_t)))); 334 unsigned char temp_result[64] 335 __attribute__ ((__aligned__ (__alignof__ (uint64_t)))); 336 struct sha512_ctx ctx; 337 struct sha512_ctx alt_ctx; 338 size_t salt_len; 339 size_t key_len; 340 size_t cnt; 341 char *cp; 342 char *copied_key = NULL; 343 char *copied_salt = NULL; 344 char *p_bytes; 345 char *s_bytes; 346 /* Default number of rounds. */ 347 size_t rounds = ROUNDS_DEFAULT; 348 bool rounds_custom = false; 349 350 /* Find beginning of salt string. The prefix should normally always 351 be present. Just in case it is not. */ 352 if (strncmp (sha512_salt_prefix, salt, sizeof (sha512_salt_prefix) - 1) == 0) 353 /* Skip salt prefix. */ 354 salt += sizeof (sha512_salt_prefix) - 1; 355 356 if (strncmp (salt, sha512_rounds_prefix, sizeof (sha512_rounds_prefix) - 1) 357 == 0) 358 { 359 const char *num = salt + sizeof (sha512_rounds_prefix) - 1; 360 char *endp; 361 unsigned long int srounds = strtoul (num, &endp, 10); 362 if (*endp == '$') 363 { 364 salt = endp + 1; 365 rounds = MAX (ROUNDS_MIN, MIN (srounds, ROUNDS_MAX)); 366 rounds_custom = true; 367 } 368 } 369 370 salt_len = MIN (strcspn (salt, "$"), SALT_LEN_MAX); 371 key_len = strlen (key); 372 373 if ((key - (char *) 0) % __alignof__ (uint64_t) != 0) 374 { 375 char *tmp = (char *) alloca (key_len + __alignof__ (uint64_t)); 376 key = copied_key = 377 memcpy (tmp + __alignof__ (uint64_t) 378 - (tmp - (char *) 0) % __alignof__ (uint64_t), 379 key, key_len); 380 } 381 382 if ((salt - (char *) 0) % __alignof__ (uint64_t) != 0) 383 { 384 char *tmp = (char *) alloca (salt_len + __alignof__ (uint64_t)); 385 salt = copied_salt = 386 memcpy (tmp + __alignof__ (uint64_t) 387 - (tmp - (char *) 0) % __alignof__ (uint64_t), 388 salt, salt_len); 389 } 390 391 /* Prepare for the real work. */ 392 __crypt__sha512_init_ctx (&ctx); 393 394 /* Add the key string. */ 395 __crypt__sha512_process_bytes (key, key_len, &ctx); 396 397 /* The last part is the salt string. This must be at most 16 398 characters and it ends at the first `$' character (for 399 compatibility with existing implementations). */ 400 __crypt__sha512_process_bytes (salt, salt_len, &ctx); 401 402 403 /* Compute alternate SHA512 sum with input KEY, SALT, and KEY. The 404 final result will be added to the first context. */ 405 __crypt__sha512_init_ctx (&alt_ctx); 406 407 /* Add key. */ 408 __crypt__sha512_process_bytes (key, key_len, &alt_ctx); 409 410 /* Add salt. */ 411 __crypt__sha512_process_bytes (salt, salt_len, &alt_ctx); 412 413 /* Add key again. */ 414 __crypt__sha512_process_bytes (key, key_len, &alt_ctx); 415 416 /* Now get result of this (64 bytes) and add it to the other 417 context. */ 418 __crypt__sha512_finish_ctx (&alt_ctx, alt_result); 419 420 /* Add for any character in the key one byte of the alternate sum. */ 421 for (cnt = key_len; cnt > 64; cnt -= 64) 422 __crypt__sha512_process_bytes (alt_result, 64, &ctx); 423 __crypt__sha512_process_bytes (alt_result, cnt, &ctx); 424 425 /* Take the binary representation of the length of the key and for every 426 1 add the alternate sum, for every 0 the key. */ 427 for (cnt = key_len; cnt > 0; cnt >>= 1) 428 if ((cnt & 1) != 0) 429 __crypt__sha512_process_bytes (alt_result, 64, &ctx); 430 else 431 __crypt__sha512_process_bytes (key, key_len, &ctx); 432 433 /* Create intermediate result. */ 434 __crypt__sha512_finish_ctx (&ctx, alt_result); 435 436 /* Start computation of P byte sequence. */ 437 __crypt__sha512_init_ctx (&alt_ctx); 438 439 /* For every character in the password add the entire password. */ 440 for (cnt = 0; cnt < key_len; ++cnt) 441 __crypt__sha512_process_bytes (key, key_len, &alt_ctx); 442 443 /* Finish the digest. */ 444 __crypt__sha512_finish_ctx (&alt_ctx, temp_result); 445 446 /* Create byte sequence P. */ 447 cp = p_bytes = alloca (key_len); 448 for (cnt = key_len; cnt >= 64; cnt -= 64) 449 cp = mempcpy (cp, temp_result, 64); 450 memcpy (cp, temp_result, cnt); 451 452 /* Start computation of S byte sequence. */ 453 __crypt__sha512_init_ctx (&alt_ctx); 454 455 /* For every character in the password add the entire password. */ 456 for (cnt = 0; cnt < 16 + alt_result[0]; ++cnt) 457 __crypt__sha512_process_bytes (salt, salt_len, &alt_ctx); 458 459 /* Finish the digest. */ 460 __crypt__sha512_finish_ctx (&alt_ctx, temp_result); 461 462 /* Create byte sequence S. */ 463 cp = s_bytes = alloca (salt_len); 464 for (cnt = salt_len; cnt >= 64; cnt -= 64) 465 cp = mempcpy (cp, temp_result, 64); 466 memcpy (cp, temp_result, cnt); 467 468 /* Repeatedly run the collected hash value through SHA512 to burn 469 CPU cycles. */ 470 for (cnt = 0; cnt < rounds; ++cnt) 471 { 472 /* New context. */ 473 __crypt__sha512_init_ctx (&ctx); 474 475 /* Add key or last result. */ 476 if ((cnt & 1) != 0) 477 __crypt__sha512_process_bytes (p_bytes, key_len, &ctx); 478 else 479 __crypt__sha512_process_bytes (alt_result, 64, &ctx); 480 481 /* Add salt for numbers not divisible by 3. */ 482 if (cnt % 3 != 0) 483 __crypt__sha512_process_bytes (s_bytes, salt_len, &ctx); 484 485 /* Add key for numbers not divisible by 7. */ 486 if (cnt % 7 != 0) 487 __crypt__sha512_process_bytes (p_bytes, key_len, &ctx); 488 489 /* Add key or last result. */ 490 if ((cnt & 1) != 0) 491 __crypt__sha512_process_bytes (alt_result, 64, &ctx); 492 else 493 __crypt__sha512_process_bytes (p_bytes, key_len, &ctx); 494 495 /* Create intermediate result. */ 496 __crypt__sha512_finish_ctx (&ctx, alt_result); 497 } 498 499 /* Now we can construct the result string. It consists of three 500 parts. */ 501 cp = stpncpy (buffer, sha512_salt_prefix, MAX (0, buflen)); 502 buflen -= sizeof (sha512_salt_prefix) - 1; 503 504 if (rounds_custom) 505 { 506 int n = snprintf (cp, MAX (0, buflen), "%s%zu$", 507 sha512_rounds_prefix, rounds); 508 cp += n; 509 buflen -= n; 510 } 511 512 cp = stpncpy (cp, salt, MIN ((size_t) MAX (0, buflen), salt_len)); 513 buflen -= MIN ((size_t) MAX (0, buflen), salt_len); 514 515 if (buflen > 0) 516 { 517 *cp++ = '$'; 518 --buflen; 519 } 520 521 #define b64_from_24bit(B2, B1, B0, N) \ 522 do { \ 523 unsigned int w = ((B2) << 16) | ((B1) << 8) | (B0); \ 524 int n = (N); \ 525 while (n-- > 0 && buflen > 0) \ 526 { \ 527 *cp++ = b64t[w & 0x3f]; \ 528 --buflen; \ 529 w >>= 6; \ 530 } \ 531 } while (0) 532 533 b64_from_24bit (alt_result[0], alt_result[21], alt_result[42], 4); 534 b64_from_24bit (alt_result[22], alt_result[43], alt_result[1], 4); 535 b64_from_24bit (alt_result[44], alt_result[2], alt_result[23], 4); 536 b64_from_24bit (alt_result[3], alt_result[24], alt_result[45], 4); 537 b64_from_24bit (alt_result[25], alt_result[46], alt_result[4], 4); 538 b64_from_24bit (alt_result[47], alt_result[5], alt_result[26], 4); 539 b64_from_24bit (alt_result[6], alt_result[27], alt_result[48], 4); 540 b64_from_24bit (alt_result[28], alt_result[49], alt_result[7], 4); 541 b64_from_24bit (alt_result[50], alt_result[8], alt_result[29], 4); 542 b64_from_24bit (alt_result[9], alt_result[30], alt_result[51], 4); 543 b64_from_24bit (alt_result[31], alt_result[52], alt_result[10], 4); 544 b64_from_24bit (alt_result[53], alt_result[11], alt_result[32], 4); 545 b64_from_24bit (alt_result[12], alt_result[33], alt_result[54], 4); 546 b64_from_24bit (alt_result[34], alt_result[55], alt_result[13], 4); 547 b64_from_24bit (alt_result[56], alt_result[14], alt_result[35], 4); 548 b64_from_24bit (alt_result[15], alt_result[36], alt_result[57], 4); 549 b64_from_24bit (alt_result[37], alt_result[58], alt_result[16], 4); 550 b64_from_24bit (alt_result[59], alt_result[17], alt_result[38], 4); 551 b64_from_24bit (alt_result[18], alt_result[39], alt_result[60], 4); 552 b64_from_24bit (alt_result[40], alt_result[61], alt_result[19], 4); 553 b64_from_24bit (alt_result[62], alt_result[20], alt_result[41], 4); 554 b64_from_24bit (0, 0, alt_result[63], 2); 555 556 if (buflen <= 0) 557 { 558 errno = ERANGE; 559 buffer = NULL; 560 } 561 else 562 *cp = '\0'; /* Terminate the string. */ 563 564 /* Clear the buffer for the intermediate result so that people 565 attaching to processes or reading core dumps cannot get any 566 information. We do it in this way to clear correct_words[] 567 inside the SHA512 implementation as well. */ 568 __crypt__sha512_init_ctx (&ctx); 569 __crypt__sha512_finish_ctx (&ctx, alt_result); 570 memset (temp_result, '\0', sizeof (temp_result)); 571 memset (p_bytes, '\0', key_len); 572 memset (s_bytes, '\0', salt_len); 573 memset (&ctx, '\0', sizeof (ctx)); 574 memset (&alt_ctx, '\0', sizeof (alt_ctx)); 575 if (copied_key != NULL) 576 memset (copied_key, '\0', key_len); 577 if (copied_salt != NULL) 578 memset (copied_salt, '\0', salt_len); 579 580 return buffer; 581 } 582 583 584 /* This entry point is equivalent to the `crypt' function in Unix 585 libcs. */ 586 char * 587 crypt_sha512 (const char *key, const char *salt) 588 { 589 /* We don't want to have an arbitrary limit in the size of the 590 password. We can compute an upper bound for the size of the 591 result in advance and so we can prepare the buffer we pass to 592 `crypt_sha512_r'. */ 593 static char *buffer; 594 static int buflen; 595 int needed = (sizeof (sha512_salt_prefix) - 1 596 + sizeof (sha512_rounds_prefix) + 9 + 1 597 + strlen (salt) + 1 + 86 + 1); 598 599 if (buflen < needed) 600 { 601 char *new_buffer = (char *) realloc (buffer, needed); 602 if (new_buffer == NULL) 603 return NULL; 604 605 buffer = new_buffer; 606 buflen = needed; 607 } 608 609 return crypt_sha512_r (key, salt, buffer, buflen); 610 } 611 612 613 #ifdef TEST 614 static const struct 615 { 616 const char *input; 617 const char result[64]; 618 } tests[] = 619 { 620 /* Test vectors from FIPS 180-2: appendix C.1. */ 621 { "abc", 622 "\xdd\xaf\x35\xa1\x93\x61\x7a\xba\xcc\x41\x73\x49\xae\x20\x41\x31" 623 "\x12\xe6\xfa\x4e\x89\xa9\x7e\xa2\x0a\x9e\xee\xe6\x4b\x55\xd3\x9a" 624 "\x21\x92\x99\x2a\x27\x4f\xc1\xa8\x36\xba\x3c\x23\xa3\xfe\xeb\xbd" 625 "\x45\x4d\x44\x23\x64\x3c\xe8\x0e\x2a\x9a\xc9\x4f\xa5\x4c\xa4\x9f" }, 626 /* Test vectors from FIPS 180-2: appendix C.2. */ 627 { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn" 628 "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu", 629 "\x8e\x95\x9b\x75\xda\xe3\x13\xda\x8c\xf4\xf7\x28\x14\xfc\x14\x3f" 630 "\x8f\x77\x79\xc6\xeb\x9f\x7f\xa1\x72\x99\xae\xad\xb6\x88\x90\x18" 631 "\x50\x1d\x28\x9e\x49\x00\xf7\xe4\x33\x1b\x99\xde\xc4\xb5\x43\x3a" 632 "\xc7\xd3\x29\xee\xb6\xdd\x26\x54\x5e\x96\xe5\x5b\x87\x4b\xe9\x09" }, 633 /* Test vectors from the NESSIE project. */ 634 { "", 635 "\xcf\x83\xe1\x35\x7e\xef\xb8\xbd\xf1\x54\x28\x50\xd6\x6d\x80\x07" 636 "\xd6\x20\xe4\x05\x0b\x57\x15\xdc\x83\xf4\xa9\x21\xd3\x6c\xe9\xce" 637 "\x47\xd0\xd1\x3c\x5d\x85\xf2\xb0\xff\x83\x18\xd2\x87\x7e\xec\x2f" 638 "\x63\xb9\x31\xbd\x47\x41\x7a\x81\xa5\x38\x32\x7a\xf9\x27\xda\x3e" }, 639 { "a", 640 "\x1f\x40\xfc\x92\xda\x24\x16\x94\x75\x09\x79\xee\x6c\xf5\x82\xf2" 641 "\xd5\xd7\xd2\x8e\x18\x33\x5d\xe0\x5a\xbc\x54\xd0\x56\x0e\x0f\x53" 642 "\x02\x86\x0c\x65\x2b\xf0\x8d\x56\x02\x52\xaa\x5e\x74\x21\x05\x46" 643 "\xf3\x69\xfb\xbb\xce\x8c\x12\xcf\xc7\x95\x7b\x26\x52\xfe\x9a\x75" }, 644 { "message digest", 645 "\x10\x7d\xbf\x38\x9d\x9e\x9f\x71\xa3\xa9\x5f\x6c\x05\x5b\x92\x51" 646 "\xbc\x52\x68\xc2\xbe\x16\xd6\xc1\x34\x92\xea\x45\xb0\x19\x9f\x33" 647 "\x09\xe1\x64\x55\xab\x1e\x96\x11\x8e\x8a\x90\x5d\x55\x97\xb7\x20" 648 "\x38\xdd\xb3\x72\xa8\x98\x26\x04\x6d\xe6\x66\x87\xbb\x42\x0e\x7c" }, 649 { "abcdefghijklmnopqrstuvwxyz", 650 "\x4d\xbf\xf8\x6c\xc2\xca\x1b\xae\x1e\x16\x46\x8a\x05\xcb\x98\x81" 651 "\xc9\x7f\x17\x53\xbc\xe3\x61\x90\x34\x89\x8f\xaa\x1a\xab\xe4\x29" 652 "\x95\x5a\x1b\xf8\xec\x48\x3d\x74\x21\xfe\x3c\x16\x46\x61\x3a\x59" 653 "\xed\x54\x41\xfb\x0f\x32\x13\x89\xf7\x7f\x48\xa8\x79\xc7\xb1\xf1" }, 654 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 655 "\x20\x4a\x8f\xc6\xdd\xa8\x2f\x0a\x0c\xed\x7b\xeb\x8e\x08\xa4\x16" 656 "\x57\xc1\x6e\xf4\x68\xb2\x28\xa8\x27\x9b\xe3\x31\xa7\x03\xc3\x35" 657 "\x96\xfd\x15\xc1\x3b\x1b\x07\xf9\xaa\x1d\x3b\xea\x57\x78\x9c\xa0" 658 "\x31\xad\x85\xc7\xa7\x1d\xd7\x03\x54\xec\x63\x12\x38\xca\x34\x45" }, 659 { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", 660 "\x1e\x07\xbe\x23\xc2\x6a\x86\xea\x37\xea\x81\x0c\x8e\xc7\x80\x93" 661 "\x52\x51\x5a\x97\x0e\x92\x53\xc2\x6f\x53\x6c\xfc\x7a\x99\x96\xc4" 662 "\x5c\x83\x70\x58\x3e\x0a\x78\xfa\x4a\x90\x04\x1d\x71\xa4\xce\xab" 663 "\x74\x23\xf1\x9c\x71\xb9\xd5\xa3\xe0\x12\x49\xf0\xbe\xbd\x58\x94" }, 664 { "123456789012345678901234567890123456789012345678901234567890" 665 "12345678901234567890", 666 "\x72\xec\x1e\xf1\x12\x4a\x45\xb0\x47\xe8\xb7\xc7\x5a\x93\x21\x95" 667 "\x13\x5b\xb6\x1d\xe2\x4e\xc0\xd1\x91\x40\x42\x24\x6e\x0a\xec\x3a" 668 "\x23\x54\xe0\x93\xd7\x6f\x30\x48\xb4\x56\x76\x43\x46\x90\x0c\xb1" 669 "\x30\xd2\xa4\xfd\x5d\xd1\x6a\xbb\x5e\x30\xbc\xb8\x50\xde\xe8\x43" } 670 }; 671 #define ntests (NELEM(tests)) 672 673 674 static const struct 675 { 676 const char *salt; 677 const char *input; 678 const char *expected; 679 } tests2[] = 680 { 681 { "$6$saltstring", "Hello world!", 682 "$6$saltstring$svn8UoSVapNtMuq1ukKS4tPQd8iKwSMHWjl/O817G3uBnIFNjnQJu" 683 "esI68u4OTLiBFdcbYEdFCoEOfaS35inz1" }, 684 { "$6$rounds=10000$saltstringsaltstring", "Hello world!", 685 "$6$rounds=10000$saltstringsaltst$OW1/O6BYHV6BcXZu8QVeXbDWra3Oeqh0sb" 686 "HbbMCVNSnCM/UrjmM0Dp8vOuZeHBy/YTBmSK6H9qs/y3RnOaw5v." }, 687 { "$6$rounds=5000$toolongsaltstring", "This is just a test", 688 "$6$rounds=5000$toolongsaltstrin$lQ8jolhgVRVhY4b5pZKaysCLi0QBxGoNeKQ" 689 "zQ3glMhwllF7oGDZxUhx1yxdYcz/e1JSbq3y6JMxxl8audkUEm0" }, 690 { "$6$rounds=1400$anotherlongsaltstring", 691 "a very much longer text to encrypt. This one even stretches over more" 692 "than one line.", 693 "$6$rounds=1400$anotherlongsalts$POfYwTEok97VWcjxIiSOjiykti.o/pQs.wP" 694 "vMxQ6Fm7I6IoYN3CmLs66x9t0oSwbtEW7o7UmJEiDwGqd8p4ur1" }, 695 { "$6$rounds=77777$short", 696 "we have a short salt string but not a short password", 697 "$6$rounds=77777$short$WuQyW2YR.hBNpjjRhpYD/ifIw05xdfeEyQoMxIXbkvr0g" 698 "ge1a1x3yRULJ5CCaUeOxFmtlcGZelFl5CxtgfiAc0" }, 699 { "$6$rounds=123456$asaltof16chars..", "a short string", 700 "$6$rounds=123456$asaltof16chars..$BtCwjqMJGx5hrJhZywWvt0RLE8uZ4oPwc" 701 "elCjmw2kSYu.Ec6ycULevoBK25fs2xXgMNrCzIMVcgEJAstJeonj1" }, 702 { "$6$rounds=10$roundstoolow", "the minimum number is still observed", 703 "$6$rounds=1000$roundstoolow$kUMsbe306n21p9R.FRkW3IGn.S9NPN0x50YhH1x" 704 "hLsPuWGsUSklZt58jaTfF4ZEQpyUNGc0dqbpBYYBaHHrsX." }, 705 }; 706 #define ntests2 (NELEM(tests2)) 707 708 709 int 710 main (void) 711 { 712 struct sha512_ctx ctx; 713 char sum[64]; 714 int result = 0; 715 int cnt; 716 717 for (cnt = 0; cnt < (int) ntests; ++cnt) 718 { 719 __crypt__sha512_init_ctx (&ctx); 720 __crypt__sha512_process_bytes (tests[cnt].input, strlen (tests[cnt].input), &ctx); 721 __crypt__sha512_finish_ctx (&ctx, sum); 722 if (memcmp (tests[cnt].result, sum, 64) != 0) 723 { 724 printf ("test %d run %d failed\n", cnt, 1); 725 result = 1; 726 } 727 728 __crypt__sha512_init_ctx (&ctx); 729 for (int i = 0; tests[cnt].input[i] != '\0'; ++i) 730 __crypt__sha512_process_bytes (&tests[cnt].input[i], 1, &ctx); 731 __crypt__sha512_finish_ctx (&ctx, sum); 732 if (memcmp (tests[cnt].result, sum, 64) != 0) 733 { 734 printf ("test %d run %d failed\n", cnt, 2); 735 result = 1; 736 } 737 } 738 739 /* Test vector from FIPS 180-2: appendix C.3. */ 740 char buf[1000]; 741 memset (buf, 'a', sizeof (buf)); 742 __crypt__sha512_init_ctx (&ctx); 743 for (int i = 0; i < 1000; ++i) 744 __crypt__sha512_process_bytes (buf, sizeof (buf), &ctx); 745 __crypt__sha512_finish_ctx (&ctx, sum); 746 static const char expected[64] = 747 "\xe7\x18\x48\x3d\x0c\xe7\x69\x64\x4e\x2e\x42\xc7\xbc\x15\xb4\x63" 748 "\x8e\x1f\x98\xb1\x3b\x20\x44\x28\x56\x32\xa8\x03\xaf\xa9\x73\xeb" 749 "\xde\x0f\xf2\x44\x87\x7e\xa6\x0a\x4c\xb0\x43\x2c\xe5\x77\xc3\x1b" 750 "\xeb\x00\x9c\x5c\x2c\x49\xaa\x2e\x4e\xad\xb2\x17\xad\x8c\xc0\x9b"; 751 if (memcmp (expected, sum, 64) != 0) 752 { 753 printf ("test %d failed\n", cnt); 754 result = 1; 755 } 756 757 for (cnt = 0; cnt < ntests2; ++cnt) 758 { 759 char *cp = crypt_sha512 (tests2[cnt].input, tests2[cnt].salt); 760 761 if (strcmp (cp, tests2[cnt].expected) != 0) 762 { 763 printf ("test %d: expected \"%s\", got \"%s\"\n", 764 cnt, tests2[cnt].expected, cp); 765 result = 1; 766 } 767 } 768 769 if (result == 0) 770 puts ("all tests OK"); 771 772 return result; 773 } 774 #endif 775 776