1 /* SHA256-based Unix crypt implementation.
2 Released into the Public Domain by Ulrich Drepper <drepper@redhat.com>. */
13 #include <sys/param.h>
14 #include <sys/types.h>
18 /* Structure to save state of computation between the single steps. */
25 char buffer
[128]; /* NB: always correctly aligned for uint32_t. */
29 #if __BYTE_ORDER == __LITTLE_ENDIAN
31 (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
37 /* This array contains the bytes used to pad the buffer to the next
38 64-byte boundary. (FIPS 180-2:5.1.1) */
39 static const unsigned char fillbuf
[64] = { 0x80, 0 /* , 0, 0, ... */ };
42 /* Constants for SHA256 from FIPS 180-2:4.2.2. */
43 static const uint32_t K
[64] =
45 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
46 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
47 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
48 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
49 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
50 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
51 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
52 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
53 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
54 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
55 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
56 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
57 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
58 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
59 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
60 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
64 /* Process LEN bytes of BUFFER, accumulating context into CTX.
65 It is assumed that LEN % 64 == 0. */
67 sha256_process_block (const void *buffer
, size_t len
, struct sha256_ctx
*ctx
)
70 const uint32_t *words
= buffer
;
71 size_t nwords
= len
/ sizeof (uint32_t);
72 uint32_t a
= ctx
->H
[0];
73 uint32_t b
= ctx
->H
[1];
74 uint32_t c
= ctx
->H
[2];
75 uint32_t d
= ctx
->H
[3];
76 uint32_t e
= ctx
->H
[4];
77 uint32_t f
= ctx
->H
[5];
78 uint32_t g
= ctx
->H
[6];
79 uint32_t h
= ctx
->H
[7];
81 /* First increment the byte count. FIPS 180-2 specifies the possible
82 length of the file up to 2^64 bits. Here we only compute the
83 number of bytes. Do a double word increment. */
85 if (ctx
->total
[0] < len
)
88 /* Process all bytes in the buffer with 64 bytes in each round of
102 /* Operators defined in FIPS 180-2:4.1.2. */
103 #define Ch(x, y, z) ((x & y) ^ (~x & z))
104 #define Maj(x, y, z) ((x & y) ^ (x & z) ^ (y & z))
105 #define S0(x) (CYCLIC (x, 2) ^ CYCLIC (x, 13) ^ CYCLIC (x, 22))
106 #define S1(x) (CYCLIC (x, 6) ^ CYCLIC (x, 11) ^ CYCLIC (x, 25))
107 #define R0(x) (CYCLIC (x, 7) ^ CYCLIC (x, 18) ^ (x >> 3))
108 #define R1(x) (CYCLIC (x, 17) ^ CYCLIC (x, 19) ^ (x >> 10))
110 /* It is unfortunate that C does not provide an operator for
111 cyclic rotation. Hope the C compiler is smart enough. */
112 #define CYCLIC(w, s) ((w >> s) | (w << (32 - s)))
114 /* Compute the message schedule according to FIPS 180-2:6.2.2 step 2. */
115 for (t
= 0; t
< 16; ++t
)
117 W
[t
] = SWAP (*words
);
120 for (t
= 16; t
< 64; ++t
)
121 W
[t
] = R1 (W
[t
- 2]) + W
[t
- 7] + R0 (W
[t
- 15]) + W
[t
- 16];
123 /* The actual computation according to FIPS 180-2:6.2.2 step 3. */
124 for (t
= 0; t
< 64; ++t
)
126 uint32_t T1
= h
+ S1 (e
) + Ch (e
, f
, g
) + K
[t
] + W
[t
];
127 uint32_t T2
= S0 (a
) + Maj (a
, b
, c
);
138 /* Add the starting values of the context according to FIPS 180-2:6.2.2
149 /* Prepare for the next round. */
153 /* Put checksum in context given as argument. */
165 /* Initialize structure containing state of computation.
166 (FIPS 180-2:5.3.2) */
168 sha256_init_ctx (struct sha256_ctx
*ctx
)
170 ctx
->H
[0] = 0x6a09e667;
171 ctx
->H
[1] = 0xbb67ae85;
172 ctx
->H
[2] = 0x3c6ef372;
173 ctx
->H
[3] = 0xa54ff53a;
174 ctx
->H
[4] = 0x510e527f;
175 ctx
->H
[5] = 0x9b05688c;
176 ctx
->H
[6] = 0x1f83d9ab;
177 ctx
->H
[7] = 0x5be0cd19;
179 ctx
->total
[0] = ctx
->total
[1] = 0;
184 /* Process the remaining bytes in the internal buffer and the usual
185 prolog according to the standard and write the result to RESBUF.
187 IMPORTANT: On some systems it is required that RESBUF is correctly
188 aligned for a 32 bits value. */
190 sha256_finish_ctx (struct sha256_ctx
*ctx
, void *resbuf
)
193 /* Take yet unprocessed bytes into account. */
194 uint32_t bytes
= ctx
->buflen
;
197 /* Now count remaining bytes. */
198 ctx
->total
[0] += bytes
;
199 if (ctx
->total
[0] < bytes
)
202 pad
= bytes
>= 56 ? 64 + 56 - bytes
: 56 - bytes
;
203 memcpy (&ctx
->buffer
[bytes
], fillbuf
, pad
);
205 /* Put the 64-bit file length in *bits* at the end of the buffer. */
206 *(uint32_t *) &ctx
->buffer
[bytes
+ pad
+ 4] = SWAP (ctx
->total
[0] << 3);
207 *(uint32_t *) &ctx
->buffer
[bytes
+ pad
] = SWAP ((ctx
->total
[1] << 3) |
208 (ctx
->total
[0] >> 29));
210 /* Process last bytes. */
211 sha256_process_block (ctx
->buffer
, bytes
+ pad
+ 8, ctx
);
213 /* Put result from CTX in first 32 bytes following RESBUF. */
214 for (i
= 0; i
< 8; ++i
)
215 ((uint32_t *) resbuf
)[i
] = SWAP (ctx
->H
[i
]);
222 sha256_process_bytes (const void *buffer
, size_t len
, struct sha256_ctx
*ctx
)
224 /* When we already have some bits in our internal buffer concatenate
225 both inputs first. */
226 if (ctx
->buflen
!= 0)
228 size_t left_over
= ctx
->buflen
;
229 size_t add
= 128 - left_over
> len
? len
: 128 - left_over
;
231 memcpy (&ctx
->buffer
[left_over
], buffer
, add
);
234 if (ctx
->buflen
> 64)
236 sha256_process_block (ctx
->buffer
, ctx
->buflen
& ~63, ctx
);
239 /* The regions in the following copy operation cannot overlap. */
240 memcpy (ctx
->buffer
, &ctx
->buffer
[(left_over
+ add
) & ~63],
244 buffer
= (const char *) buffer
+ add
;
248 /* Process available complete blocks. */
251 /* To check alignment gcc has an appropriate operator. Other
254 # define UNALIGNED_P(p) (((uintptr_t) p) % __alignof__ (uint32_t) != 0)
256 # define UNALIGNED_P(p) (((uintptr_t) p) % sizeof (uint32_t) != 0)
258 if (UNALIGNED_P (buffer
))
261 sha256_process_block (memcpy (ctx
->buffer
, buffer
, 64), 64, ctx
);
262 buffer
= (const char *) buffer
+ 64;
267 sha256_process_block (buffer
, len
& ~63, ctx
);
268 buffer
= (const char *) buffer
+ (len
& ~63);
273 /* Move remaining bytes into internal buffer. */
276 size_t left_over
= ctx
->buflen
;
278 memcpy (&ctx
->buffer
[left_over
], buffer
, len
);
282 sha256_process_block (ctx
->buffer
, 64, ctx
);
284 memcpy (ctx
->buffer
, &ctx
->buffer
[64], left_over
);
286 ctx
->buflen
= left_over
;
291 /* Define our magic string to mark salt for SHA256 "encryption"
293 static const char sha256_salt_prefix
[] = "$5$";
295 /* Prefix for optional rounds specification. */
296 static const char sha256_rounds_prefix
[] = "rounds=";
298 /* Maximum salt string length. */
299 #define SALT_LEN_MAX 16
300 /* Default number of rounds if not explicitly specified. */
301 #define ROUNDS_DEFAULT 5000
302 /* Minimum number of rounds. */
303 #define ROUNDS_MIN 1000
304 /* Maximum number of rounds. */
305 #define ROUNDS_MAX 999999999
307 /* Table with characters for base64 transformation. */
308 static const char b64t
[64] =
309 "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
313 sha256_crypt_r (const char *key
, const char *salt
, char *buffer
, int buflen
)
315 unsigned char alt_result
[32]
316 __attribute__ ((__aligned__ (__alignof__ (uint32_t))));
317 unsigned char temp_result
[32]
318 __attribute__ ((__aligned__ (__alignof__ (uint32_t))));
319 struct sha256_ctx ctx
;
320 struct sha256_ctx alt_ctx
;
325 char *copied_key
= NULL
;
326 char *copied_salt
= NULL
;
329 /* Default number of rounds. */
330 size_t rounds
= ROUNDS_DEFAULT
;
331 bool rounds_custom
= false;
333 /* Find beginning of salt string. The prefix should normally always
334 be present. Just in case it is not. */
335 if (strncmp (sha256_salt_prefix
, salt
, sizeof (sha256_salt_prefix
) - 1) == 0)
336 /* Skip salt prefix. */
337 salt
+= sizeof (sha256_salt_prefix
) - 1;
339 if (strncmp (salt
, sha256_rounds_prefix
, sizeof (sha256_rounds_prefix
) - 1)
342 const char *num
= salt
+ sizeof (sha256_rounds_prefix
) - 1;
344 unsigned long int srounds
= strtoul (num
, &endp
, 10);
348 rounds
= MAX (ROUNDS_MIN
, MIN (srounds
, ROUNDS_MAX
));
349 rounds_custom
= true;
353 salt_len
= MIN (strcspn (salt
, "$"), SALT_LEN_MAX
);
354 key_len
= strlen (key
);
356 if ((key
- (char *) 0) % __alignof__ (uint32_t) != 0)
358 char *tmp
= (char *) alloca (key_len
+ __alignof__ (uint32_t));
360 memcpy (tmp
+ __alignof__ (uint32_t)
361 - (tmp
- (char *) 0) % __alignof__ (uint32_t),
365 if ((salt
- (char *) 0) % __alignof__ (uint32_t) != 0)
367 char *tmp
= (char *) alloca (salt_len
+ __alignof__ (uint32_t));
369 memcpy (tmp
+ __alignof__ (uint32_t)
370 - (tmp
- (char *) 0) % __alignof__ (uint32_t),
374 /* Prepare for the real work. */
375 sha256_init_ctx (&ctx
);
377 /* Add the key string. */
378 sha256_process_bytes (key
, key_len
, &ctx
);
380 /* The last part is the salt string. This must be at most 8
381 characters and it ends at the first `$' character (for
382 compatibility with existing implementations). */
383 sha256_process_bytes (salt
, salt_len
, &ctx
);
386 /* Compute alternate SHA256 sum with input KEY, SALT, and KEY. The
387 final result will be added to the first context. */
388 sha256_init_ctx (&alt_ctx
);
391 sha256_process_bytes (key
, key_len
, &alt_ctx
);
394 sha256_process_bytes (salt
, salt_len
, &alt_ctx
);
397 sha256_process_bytes (key
, key_len
, &alt_ctx
);
399 /* Now get result of this (32 bytes) and add it to the other
401 sha256_finish_ctx (&alt_ctx
, alt_result
);
403 /* Add for any character in the key one byte of the alternate sum. */
404 for (cnt
= key_len
; cnt
> 32; cnt
-= 32)
405 sha256_process_bytes (alt_result
, 32, &ctx
);
406 sha256_process_bytes (alt_result
, cnt
, &ctx
);
408 /* Take the binary representation of the length of the key and for every
409 1 add the alternate sum, for every 0 the key. */
410 for (cnt
= key_len
; cnt
> 0; cnt
>>= 1)
412 sha256_process_bytes (alt_result
, 32, &ctx
);
414 sha256_process_bytes (key
, key_len
, &ctx
);
416 /* Create intermediate result. */
417 sha256_finish_ctx (&ctx
, alt_result
);
419 /* Start computation of P byte sequence. */
420 sha256_init_ctx (&alt_ctx
);
422 /* For every character in the password add the entire password. */
423 for (cnt
= 0; cnt
< key_len
; ++cnt
)
424 sha256_process_bytes (key
, key_len
, &alt_ctx
);
426 /* Finish the digest. */
427 sha256_finish_ctx (&alt_ctx
, temp_result
);
429 /* Create byte sequence P. */
430 cp
= p_bytes
= alloca (key_len
);
431 for (cnt
= key_len
; cnt
>= 32; cnt
-= 32)
432 cp
= mempcpy (cp
, temp_result
, 32);
433 memcpy (cp
, temp_result
, cnt
);
435 /* Start computation of S byte sequence. */
436 sha256_init_ctx (&alt_ctx
);
438 /* For every character in the password add the entire password. */
439 for (cnt
= 0; cnt
< 16 + alt_result
[0]; ++cnt
)
440 sha256_process_bytes (salt
, salt_len
, &alt_ctx
);
442 /* Finish the digest. */
443 sha256_finish_ctx (&alt_ctx
, temp_result
);
445 /* Create byte sequence S. */
446 cp
= s_bytes
= alloca (salt_len
);
447 for (cnt
= salt_len
; cnt
>= 32; cnt
-= 32)
448 cp
= mempcpy (cp
, temp_result
, 32);
449 memcpy (cp
, temp_result
, cnt
);
451 /* Repeatedly run the collected hash value through SHA256 to burn
453 for (cnt
= 0; cnt
< rounds
; ++cnt
)
456 sha256_init_ctx (&ctx
);
458 /* Add key or last result. */
460 sha256_process_bytes (p_bytes
, key_len
, &ctx
);
462 sha256_process_bytes (alt_result
, 32, &ctx
);
464 /* Add salt for numbers not divisible by 3. */
466 sha256_process_bytes (s_bytes
, salt_len
, &ctx
);
468 /* Add key for numbers not divisible by 7. */
470 sha256_process_bytes (p_bytes
, key_len
, &ctx
);
472 /* Add key or last result. */
474 sha256_process_bytes (alt_result
, 32, &ctx
);
476 sha256_process_bytes (p_bytes
, key_len
, &ctx
);
478 /* Create intermediate result. */
479 sha256_finish_ctx (&ctx
, alt_result
);
482 /* Now we can construct the result string. It consists of three
484 cp
= stpncpy (buffer
, sha256_salt_prefix
, MAX (0, buflen
));
485 buflen
-= sizeof (sha256_salt_prefix
) - 1;
489 int n
= snprintf (cp
, MAX (0, buflen
), "%s%zu$",
490 sha256_rounds_prefix
, rounds
);
495 cp
= stpncpy (cp
, salt
, MIN ((size_t) MAX (0, buflen
), salt_len
));
496 buflen
-= MIN ((size_t) MAX (0, buflen
), salt_len
);
504 #define b64_from_24bit(B2, B1, B0, N) \
506 unsigned int w = ((B2) << 16) | ((B1) << 8) | (B0); \
508 while (n-- > 0 && buflen > 0) \
510 *cp++ = b64t[w & 0x3f]; \
516 b64_from_24bit (alt_result
[0], alt_result
[10], alt_result
[20], 4);
517 b64_from_24bit (alt_result
[21], alt_result
[1], alt_result
[11], 4);
518 b64_from_24bit (alt_result
[12], alt_result
[22], alt_result
[2], 4);
519 b64_from_24bit (alt_result
[3], alt_result
[13], alt_result
[23], 4);
520 b64_from_24bit (alt_result
[24], alt_result
[4], alt_result
[14], 4);
521 b64_from_24bit (alt_result
[15], alt_result
[25], alt_result
[5], 4);
522 b64_from_24bit (alt_result
[6], alt_result
[16], alt_result
[26], 4);
523 b64_from_24bit (alt_result
[27], alt_result
[7], alt_result
[17], 4);
524 b64_from_24bit (alt_result
[18], alt_result
[28], alt_result
[8], 4);
525 b64_from_24bit (alt_result
[9], alt_result
[19], alt_result
[29], 4);
526 b64_from_24bit (0, alt_result
[31], alt_result
[30], 3);
533 *cp
= '\0'; /* Terminate the string. */
535 /* Clear the buffer for the intermediate result so that people
536 attaching to processes or reading core dumps cannot get any
537 information. We do it in this way to clear correct_words[]
538 inside the SHA256 implementation as well. */
539 sha256_init_ctx (&ctx
);
540 sha256_finish_ctx (&ctx
, alt_result
);
541 memset (temp_result
, '\0', sizeof (temp_result
));
542 memset (p_bytes
, '\0', key_len
);
543 memset (s_bytes
, '\0', salt_len
);
544 memset (&ctx
, '\0', sizeof (ctx
));
545 memset (&alt_ctx
, '\0', sizeof (alt_ctx
));
546 if (copied_key
!= NULL
)
547 memset (copied_key
, '\0', key_len
);
548 if (copied_salt
!= NULL
)
549 memset (copied_salt
, '\0', salt_len
);
555 /* This entry point is equivalent to the `crypt' function in Unix
558 sha256_crypt (const char *key
, const char *salt
)
560 /* We don't want to have an arbitrary limit in the size of the
561 password. We can compute an upper bound for the size of the
562 result in advance and so we can prepare the buffer we pass to
566 int needed
= (sizeof (sha256_salt_prefix
) - 1
567 + sizeof (sha256_rounds_prefix
) + 9 + 1
568 + strlen (salt
) + 1 + 43 + 1);
572 char *new_buffer
= (char *) realloc (buffer
, needed
);
573 if (new_buffer
== NULL
)
580 return sha256_crypt_r (key
, salt
, buffer
, buflen
);
588 const char result
[32];
591 /* Test vectors from FIPS 180-2: appendix B.1. */
593 "\xba\x78\x16\xbf\x8f\x01\xcf\xea\x41\x41\x40\xde\x5d\xae\x22\x23"
594 "\xb0\x03\x61\xa3\x96\x17\x7a\x9c\xb4\x10\xff\x61\xf2\x00\x15\xad" },
595 /* Test vectors from FIPS 180-2: appendix B.2. */
596 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
597 "\x24\x8d\x6a\x61\xd2\x06\x38\xb8\xe5\xc0\x26\x93\x0c\x3e\x60\x39"
598 "\xa3\x3c\xe4\x59\x64\xff\x21\x67\xf6\xec\xed\xd4\x19\xdb\x06\xc1" },
599 /* Test vectors from the NESSIE project. */
601 "\xe3\xb0\xc4\x42\x98\xfc\x1c\x14\x9a\xfb\xf4\xc8\x99\x6f\xb9\x24"
602 "\x27\xae\x41\xe4\x64\x9b\x93\x4c\xa4\x95\x99\x1b\x78\x52\xb8\x55" },
604 "\xca\x97\x81\x12\xca\x1b\xbd\xca\xfa\xc2\x31\xb3\x9a\x23\xdc\x4d"
605 "\xa7\x86\xef\xf8\x14\x7c\x4e\x72\xb9\x80\x77\x85\xaf\xee\x48\xbb" },
607 "\xf7\x84\x6f\x55\xcf\x23\xe1\x4e\xeb\xea\xb5\xb4\xe1\x55\x0c\xad"
608 "\x5b\x50\x9e\x33\x48\xfb\xc4\xef\xa3\xa1\x41\x3d\x39\x3c\xb6\x50" },
609 { "abcdefghijklmnopqrstuvwxyz",
610 "\x71\xc4\x80\xdf\x93\xd6\xae\x2f\x1e\xfa\xd1\x44\x7c\x66\xc9\x52"
611 "\x5e\x31\x62\x18\xcf\x51\xfc\x8d\x9e\xd8\x32\xf2\xda\xf1\x8b\x73" },
612 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
613 "\x24\x8d\x6a\x61\xd2\x06\x38\xb8\xe5\xc0\x26\x93\x0c\x3e\x60\x39"
614 "\xa3\x3c\xe4\x59\x64\xff\x21\x67\xf6\xec\xed\xd4\x19\xdb\x06\xc1" },
615 { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
616 "\xdb\x4b\xfc\xbd\x4d\xa0\xcd\x85\xa6\x0c\x3c\x37\xd3\xfb\xd8\x80"
617 "\x5c\x77\xf1\x5f\xc6\xb1\xfd\xfe\x61\x4e\xe0\xa7\xc8\xfd\xb4\xc0" },
618 { "123456789012345678901234567890123456789012345678901234567890"
619 "12345678901234567890",
620 "\xf3\x71\xbc\x4a\x31\x1f\x2b\x00\x9e\xef\x95\x2d\xd8\x3c\xa8\x0e"
621 "\x2b\x60\x02\x6c\x8e\x93\x55\x92\xd0\xf9\xc3\x08\x45\x3c\x81\x3e" }
623 #define ntests (sizeof (tests) / sizeof (tests[0]))
630 const char *expected
;
633 { "$5$saltstring", "Hello world!",
634 "$5$saltstring$5B8vYYiY.CVt1RlTTf8KbXBH3hsxY/GNooZaBBGWEc5" },
635 { "$5$rounds=10000$saltstringsaltstring", "Hello world!",
636 "$5$rounds=10000$saltstringsaltst$3xv.VbSHBb41AL9AvLeujZkZRBAwqFMz2."
638 { "$5$rounds=5000$toolongsaltstring", "This is just a test",
639 "$5$rounds=5000$toolongsaltstrin$Un/5jzAHMgOGZ5.mWJpuVolil07guHPvOW8"
641 { "$5$rounds=1400$anotherlongsaltstring",
642 "a very much longer text to encrypt. This one even stretches over more"
644 "$5$rounds=1400$anotherlongsalts$Rx.j8H.h8HjEDGomFU8bDkXm3XIUnzyxf12"
646 { "$5$rounds=77777$short",
647 "we have a short salt string but not a short password",
648 "$5$rounds=77777$short$JiO1O3ZpDAxGJeaDIuqCoEFysAe1mZNJRs3pw0KQRd/" },
649 { "$5$rounds=123456$asaltof16chars..", "a short string",
650 "$5$rounds=123456$asaltof16chars..$gP3VQ/6X7UUEW3HkBn2w1/Ptq2jxPyzV/"
652 { "$5$rounds=10$roundstoolow", "the minimum number is still observed",
653 "$5$rounds=1000$roundstoolow$yfvwcWrQ8l/K0DAWyuPMDNHpIVlTQebY9l/gL97"
656 #define ntests2 (sizeof (tests2) / sizeof (tests2[0]))
662 struct sha256_ctx ctx
;
667 for (cnt
= 0; cnt
< (int) ntests
; ++cnt
)
669 sha256_init_ctx (&ctx
);
670 sha256_process_bytes (tests
[cnt
].input
, strlen (tests
[cnt
].input
), &ctx
);
671 sha256_finish_ctx (&ctx
, sum
);
672 if (memcmp (tests
[cnt
].result
, sum
, 32) != 0)
674 printf ("test %d run %d failed\n", cnt
, 1);
678 sha256_init_ctx (&ctx
);
679 for (int i
= 0; tests
[cnt
].input
[i
] != '\0'; ++i
)
680 sha256_process_bytes (&tests
[cnt
].input
[i
], 1, &ctx
);
681 sha256_finish_ctx (&ctx
, sum
);
682 if (memcmp (tests
[cnt
].result
, sum
, 32) != 0)
684 printf ("test %d run %d failed\n", cnt
, 2);
689 /* Test vector from FIPS 180-2: appendix B.3. */
691 memset (buf
, 'a', sizeof (buf
));
692 sha256_init_ctx (&ctx
);
693 for (int i
= 0; i
< 1000; ++i
)
694 sha256_process_bytes (buf
, sizeof (buf
), &ctx
);
695 sha256_finish_ctx (&ctx
, sum
);
696 static const char expected
[32] =
697 "\xcd\xc7\x6e\x5c\x99\x14\xfb\x92\x81\xa1\xc7\xe2\x84\xd7\x3e\x67"
698 "\xf1\x80\x9a\x48\xa4\x97\x20\x0e\x04\x6d\x39\xcc\xc7\x11\x2c\xd0";
699 if (memcmp (expected
, sum
, 32) != 0)
701 printf ("test %d failed\n", cnt
);
705 for (cnt
= 0; cnt
< ntests2
; ++cnt
)
707 char *cp
= sha256_crypt (tests2
[cnt
].input
, tests2
[cnt
].salt
);
709 if (strcmp (cp
, tests2
[cnt
].expected
) != 0)
711 printf ("test %d: expected \"%s\", got \"%s\"\n",
712 cnt
, tests2
[cnt
].expected
, cp
);
718 puts ("all tests OK");