1 /* SHA256-based Unix crypt implementation.
2 Released into the Public Domain by Ulrich Drepper <drepper@redhat.com>. */
3 /* Windows VC++ port by Pierre Joye <pierre@php.net> */
4
5 #include "php.h"
6 #include "php_main.h"
7
8 #include <errno.h>
9 #include <limits.h>
10
11 #ifdef PHP_WIN32
12 # define __alignof__ __alignof
13 # define alloca _alloca
14 #else
15 # ifndef HAVE_ALIGNOF
16 # include <stddef.h>
17 # define __alignof__(type) offsetof (struct { char c; type member;}, member)
18 # endif
19 #endif
20
21 #include <stdio.h>
22 #include <stdlib.h>
23
24 #ifdef PHP_WIN32
25 # include <string.h>
26 #else
27 # include <sys/param.h>
28 # include <sys/types.h>
29 # include <string.h>
30 #endif
31
__php_stpncpy(char * dst,const char * src,size_t len)32 char * __php_stpncpy(char *dst, const char *src, size_t len)
33 {
34 size_t n = strlen(src);
35 if (n > len) {
36 n = len;
37 }
38 return strncpy(dst, src, len) + n;
39 }
40
__php_mempcpy(void * dst,const void * src,size_t len)41 void * __php_mempcpy(void * dst, const void * src, size_t len)
42 {
43 return (((char *)memcpy(dst, src, len)) + len);
44 }
45
46 #ifndef MIN
47 # define MIN(a, b) (((a) < (b)) ? (a) : (b))
48 #endif
49 #ifndef MAX
50 # define MAX(a, b) (((a) > (b)) ? (a) : (b))
51 #endif
52
53 /* Structure to save state of computation between the single steps. */
54 struct sha256_ctx {
55 uint32_t H[8];
56
57 uint32_t total[2];
58 uint32_t buflen;
59 char buffer[128]; /* NB: always correctly aligned for uint32_t. */
60 };
61
62 #if defined(PHP_WIN32) || (!defined(WORDS_BIGENDIAN))
63 # define SWAP(n) \
64 (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
65 #else
66 # define SWAP(n) (n)
67 #endif
68
69 /* This array contains the bytes used to pad the buffer to the next
70 64-byte boundary. (FIPS 180-2:5.1.1) */
71 static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
72
73
74 /* Constants for SHA256 from FIPS 180-2:4.2.2. */
75 static const uint32_t K[64] = {
76 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
77 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
78 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
79 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
80 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
81 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
82 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
83 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
84 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
85 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
86 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
87 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
88 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
89 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
90 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
91 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
92 };
93
94
95 /* Process LEN bytes of BUFFER, accumulating context into CTX.
96 It is assumed that LEN % 64 == 0. */
sha256_process_block(const void * buffer,size_t len,struct sha256_ctx * ctx)97 static void sha256_process_block (const void *buffer, size_t len, struct sha256_ctx *ctx) {
98 const uint32_t *words = buffer;
99 size_t nwords = len / sizeof (uint32_t);
100 unsigned int t;
101
102 uint32_t a = ctx->H[0];
103 uint32_t b = ctx->H[1];
104 uint32_t c = ctx->H[2];
105 uint32_t d = ctx->H[3];
106 uint32_t e = ctx->H[4];
107 uint32_t f = ctx->H[5];
108 uint32_t g = ctx->H[6];
109 uint32_t h = ctx->H[7];
110
111 /* First increment the byte count. FIPS 180-2 specifies the possible
112 length of the file up to 2^64 bits. Here we only compute the
113 number of bytes. Do a double word increment. */
114 ctx->total[0] += (uint32_t)len;
115 if (ctx->total[0] < len) {
116 ++ctx->total[1];
117 }
118
119 /* Process all bytes in the buffer with 64 bytes in each round of
120 the loop. */
121 while (nwords > 0) {
122 uint32_t W[64];
123 uint32_t a_save = a;
124 uint32_t b_save = b;
125 uint32_t c_save = c;
126 uint32_t d_save = d;
127 uint32_t e_save = e;
128 uint32_t f_save = f;
129 uint32_t g_save = g;
130 uint32_t h_save = h;
131
132 /* Operators defined in FIPS 180-2:4.1.2. */
133 #define Ch(x, y, z) ((x & y) ^ (~x & z))
134 #define Maj(x, y, z) ((x & y) ^ (x & z) ^ (y & z))
135 #define S0(x) (CYCLIC (x, 2) ^ CYCLIC (x, 13) ^ CYCLIC (x, 22))
136 #define S1(x) (CYCLIC (x, 6) ^ CYCLIC (x, 11) ^ CYCLIC (x, 25))
137 #define R0(x) (CYCLIC (x, 7) ^ CYCLIC (x, 18) ^ (x >> 3))
138 #define R1(x) (CYCLIC (x, 17) ^ CYCLIC (x, 19) ^ (x >> 10))
139
140 /* It is unfortunate that C does not provide an operator for
141 cyclic rotation. Hope the C compiler is smart enough. */
142 #define CYCLIC(w, s) ((w >> s) | (w << (32 - s)))
143
144 /* Compute the message schedule according to FIPS 180-2:6.2.2 step 2. */
145 for (t = 0; t < 16; ++t) {
146 W[t] = SWAP (*words);
147 ++words;
148 }
149 for (t = 16; t < 64; ++t)
150 W[t] = R1 (W[t - 2]) + W[t - 7] + R0 (W[t - 15]) + W[t - 16];
151
152 /* The actual computation according to FIPS 180-2:6.2.2 step 3. */
153 for (t = 0; t < 64; ++t) {
154 uint32_t T1 = h + S1 (e) + Ch (e, f, g) + K[t] + W[t];
155 uint32_t T2 = S0 (a) + Maj (a, b, c);
156 h = g;
157 g = f;
158 f = e;
159 e = d + T1;
160 d = c;
161 c = b;
162 b = a;
163 a = T1 + T2;
164 }
165
166 /* Add the starting values of the context according to FIPS 180-2:6.2.2
167 step 4. */
168 a += a_save;
169 b += b_save;
170 c += c_save;
171 d += d_save;
172 e += e_save;
173 f += f_save;
174 g += g_save;
175 h += h_save;
176
177 /* Prepare for the next round. */
178 nwords -= 16;
179 }
180
181 /* Put checksum in context given as argument. */
182 ctx->H[0] = a;
183 ctx->H[1] = b;
184 ctx->H[2] = c;
185 ctx->H[3] = d;
186 ctx->H[4] = e;
187 ctx->H[5] = f;
188 ctx->H[6] = g;
189 ctx->H[7] = h;
190 }
191
192
193 /* Initialize structure containing state of computation.
194 (FIPS 180-2:5.3.2) */
sha256_init_ctx(struct sha256_ctx * ctx)195 static void sha256_init_ctx(struct sha256_ctx *ctx) {
196 ctx->H[0] = 0x6a09e667;
197 ctx->H[1] = 0xbb67ae85;
198 ctx->H[2] = 0x3c6ef372;
199 ctx->H[3] = 0xa54ff53a;
200 ctx->H[4] = 0x510e527f;
201 ctx->H[5] = 0x9b05688c;
202 ctx->H[6] = 0x1f83d9ab;
203 ctx->H[7] = 0x5be0cd19;
204
205 ctx->total[0] = ctx->total[1] = 0;
206 ctx->buflen = 0;
207 }
208
209
210 /* Process the remaining bytes in the internal buffer and the usual
211 prolog according to the standard and write the result to RESBUF.
212
213 IMPORTANT: On some systems it is required that RESBUF is correctly
214 aligned for a 32 bits value. */
sha256_finish_ctx(struct sha256_ctx * ctx,void * resbuf)215 static void * sha256_finish_ctx(struct sha256_ctx *ctx, void *resbuf) {
216 /* Take yet unprocessed bytes into account. */
217 uint32_t bytes = ctx->buflen;
218 size_t pad;
219 unsigned int i;
220
221 /* Now count remaining bytes. */
222 ctx->total[0] += bytes;
223 if (ctx->total[0] < bytes) {
224 ++ctx->total[1];
225 }
226
227 pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes;
228 memcpy(&ctx->buffer[bytes], fillbuf, pad);
229
230 /* Put the 64-bit file length in *bits* at the end of the buffer. */
231 *(uint32_t *) &ctx->buffer[bytes + pad + 4] = SWAP (ctx->total[0] << 3);
232 *(uint32_t *) &ctx->buffer[bytes + pad] = SWAP ((ctx->total[1] << 3) |
233 (ctx->total[0] >> 29));
234
235 /* Process last bytes. */
236 sha256_process_block(ctx->buffer, bytes + pad + 8, ctx);
237
238 /* Put result from CTX in first 32 bytes following RESBUF. */
239 for (i = 0; i < 8; ++i) {
240 ((uint32_t *) resbuf)[i] = SWAP(ctx->H[i]);
241 }
242
243 return resbuf;
244 }
245
246
sha256_process_bytes(const void * buffer,size_t len,struct sha256_ctx * ctx)247 static void sha256_process_bytes(const void *buffer, size_t len, struct sha256_ctx *ctx) {
248 /* When we already have some bits in our internal buffer concatenate
249 both inputs first. */
250 if (ctx->buflen != 0) {
251 size_t left_over = ctx->buflen;
252 size_t add = 128 - left_over > len ? len : 128 - left_over;
253
254 memcpy(&ctx->buffer[left_over], buffer, add);
255 ctx->buflen += (uint32_t)add;
256
257 if (ctx->buflen > 64) {
258 sha256_process_block(ctx->buffer, ctx->buflen & ~63, ctx);
259 ctx->buflen &= 63;
260 /* The regions in the following copy operation cannot overlap. */
261 memcpy(ctx->buffer, &ctx->buffer[(left_over + add) & ~63], ctx->buflen);
262 }
263
264 buffer = (const char *) buffer + add;
265 len -= add;
266 }
267
268 /* Process available complete blocks. */
269 if (len >= 64) {
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__ (uint32_t) != 0)
274 #else
275 # define UNALIGNED_P(p) (((uintptr_t) p) % sizeof (uint32_t) != 0)
276 #endif
277 if (UNALIGNED_P (buffer))
278 while (len > 64) {
279 sha256_process_block(memcpy(ctx->buffer, buffer, 64), 64, ctx);
280 buffer = (const char *) buffer + 64;
281 len -= 64;
282 } else {
283 sha256_process_block(buffer, len & ~63, ctx);
284 buffer = (const char *) buffer + (len & ~63);
285 len &= 63;
286 }
287 }
288
289 /* Move remaining bytes into internal buffer. */
290 if (len > 0) {
291 size_t left_over = ctx->buflen;
292
293 memcpy(&ctx->buffer[left_over], buffer, len);
294 left_over += len;
295 if (left_over >= 64) {
296 sha256_process_block(ctx->buffer, 64, ctx);
297 left_over -= 64;
298 memcpy(ctx->buffer, &ctx->buffer[64], left_over);
299 }
300 ctx->buflen = (uint32_t)left_over;
301 }
302 }
303
304
305 /* Define our magic string to mark salt for SHA256 "encryption"
306 replacement. */
307 static const char sha256_salt_prefix[] = "$5$";
308
309 /* Prefix for optional rounds specification. */
310 static const char sha256_rounds_prefix[] = "rounds=";
311
312 /* Maximum salt string length. */
313 #define SALT_LEN_MAX 16
314 /* Default number of rounds if not explicitly specified. */
315 #define ROUNDS_DEFAULT 5000
316 /* Minimum number of rounds. */
317 #define ROUNDS_MIN 1000
318 /* Maximum number of rounds. */
319 #define ROUNDS_MAX 999999999
320
321 /* Table with characters for base64 transformation. */
322 static const char b64t[64] =
323 "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
324
php_sha256_crypt_r(const char * key,const char * salt,char * buffer,int buflen)325 char * php_sha256_crypt_r(const char *key, const char *salt, char *buffer, int buflen)
326 {
327 #ifdef PHP_WIN32
328 ZEND_SET_ALIGNED(32, unsigned char alt_result[32]);
329 ZEND_SET_ALIGNED(32, unsigned char temp_result[32]);
330 #else
331 ZEND_SET_ALIGNED(__alignof__ (uint32_t), unsigned char alt_result[32]);
332 ZEND_SET_ALIGNED(__alignof__ (uint32_t), unsigned char temp_result[32]);
333 #endif
334
335 struct sha256_ctx ctx;
336 struct sha256_ctx alt_ctx;
337 size_t salt_len;
338 size_t key_len;
339 size_t cnt;
340 char *cp;
341 char *copied_key = NULL;
342 char *copied_salt = NULL;
343 char *p_bytes;
344 char *s_bytes;
345 /* Default number of rounds. */
346 size_t rounds = ROUNDS_DEFAULT;
347 zend_bool rounds_custom = 0;
348
349 /* Find beginning of salt string. The prefix should normally always
350 be present. Just in case it is not. */
351 if (strncmp(sha256_salt_prefix, salt, sizeof(sha256_salt_prefix) - 1) == 0) {
352 /* Skip salt prefix. */
353 salt += sizeof(sha256_salt_prefix) - 1;
354 }
355
356 if (strncmp(salt, sha256_rounds_prefix, sizeof(sha256_rounds_prefix) - 1) == 0) {
357 const char *num = salt + sizeof(sha256_rounds_prefix) - 1;
358 char *endp;
359 zend_ulong srounds = ZEND_STRTOUL(num, &endp, 10);
360 if (*endp == '$') {
361 salt = endp + 1;
362 rounds = MAX(ROUNDS_MIN, MIN(srounds, ROUNDS_MAX));
363 rounds_custom = 1;
364 }
365 }
366
367 salt_len = MIN(strcspn(salt, "$"), SALT_LEN_MAX);
368 key_len = strlen(key);
369
370 if ((key - (char *) 0) % __alignof__ (uint32_t) != 0) {
371 char *tmp = (char *) alloca(key_len + __alignof__(uint32_t));
372 key = copied_key = memcpy(tmp + __alignof__(uint32_t) - (tmp - (char *) 0) % __alignof__(uint32_t), key, key_len);
373 }
374
375 if ((salt - (char *) 0) % __alignof__(uint32_t) != 0) {
376 char *tmp = (char *) alloca(salt_len + 1 + __alignof__(uint32_t));
377 salt = copied_salt =
378 memcpy(tmp + __alignof__(uint32_t) - (tmp - (char *) 0) % __alignof__ (uint32_t), salt, salt_len);
379 copied_salt[salt_len] = 0;
380 }
381
382 /* Prepare for the real work. */
383 sha256_init_ctx(&ctx);
384
385 /* Add the key string. */
386 sha256_process_bytes(key, key_len, &ctx);
387
388 /* The last part is the salt string. This must be at most 16
389 characters and it ends at the first `$' character (for
390 compatibility with existing implementations). */
391 sha256_process_bytes(salt, salt_len, &ctx);
392
393
394 /* Compute alternate SHA256 sum with input KEY, SALT, and KEY. The
395 final result will be added to the first context. */
396 sha256_init_ctx(&alt_ctx);
397
398 /* Add key. */
399 sha256_process_bytes(key, key_len, &alt_ctx);
400
401 /* Add salt. */
402 sha256_process_bytes(salt, salt_len, &alt_ctx);
403
404 /* Add key again. */
405 sha256_process_bytes(key, key_len, &alt_ctx);
406
407 /* Now get result of this (32 bytes) and add it to the other
408 context. */
409 sha256_finish_ctx(&alt_ctx, alt_result);
410
411 /* Add for any character in the key one byte of the alternate sum. */
412 for (cnt = key_len; cnt > 32; cnt -= 32) {
413 sha256_process_bytes(alt_result, 32, &ctx);
414 }
415 sha256_process_bytes(alt_result, cnt, &ctx);
416
417 /* Take the binary representation of the length of the key and for every
418 1 add the alternate sum, for every 0 the key. */
419 for (cnt = key_len; cnt > 0; cnt >>= 1) {
420 if ((cnt & 1) != 0) {
421 sha256_process_bytes(alt_result, 32, &ctx);
422 } else {
423 sha256_process_bytes(key, key_len, &ctx);
424 }
425 }
426
427 /* Create intermediate result. */
428 sha256_finish_ctx(&ctx, alt_result);
429
430 /* Start computation of P byte sequence. */
431 sha256_init_ctx(&alt_ctx);
432
433 /* For every character in the password add the entire password. */
434 for (cnt = 0; cnt < key_len; ++cnt) {
435 sha256_process_bytes(key, key_len, &alt_ctx);
436 }
437
438 /* Finish the digest. */
439 sha256_finish_ctx(&alt_ctx, temp_result);
440
441 /* Create byte sequence P. */
442 cp = p_bytes = alloca(key_len);
443 for (cnt = key_len; cnt >= 32; cnt -= 32) {
444 cp = __php_mempcpy((void *)cp, (const void *)temp_result, 32);
445 }
446 memcpy(cp, temp_result, cnt);
447
448 /* Start computation of S byte sequence. */
449 sha256_init_ctx(&alt_ctx);
450
451 /* For every character in the password add the entire password. */
452 for (cnt = 0; cnt < (size_t) (16 + alt_result[0]); ++cnt) {
453 sha256_process_bytes(salt, salt_len, &alt_ctx);
454 }
455
456 /* Finish the digest. */
457 sha256_finish_ctx(&alt_ctx, temp_result);
458
459 /* Create byte sequence S. */
460 cp = s_bytes = alloca(salt_len);
461 for (cnt = salt_len; cnt >= 32; cnt -= 32) {
462 cp = __php_mempcpy(cp, temp_result, 32);
463 }
464 memcpy(cp, temp_result, cnt);
465
466 /* Repeatedly run the collected hash value through SHA256 to burn
467 CPU cycles. */
468 for (cnt = 0; cnt < rounds; ++cnt) {
469 /* New context. */
470 sha256_init_ctx(&ctx);
471
472 /* Add key or last result. */
473 if ((cnt & 1) != 0) {
474 sha256_process_bytes(p_bytes, key_len, &ctx);
475 } else {
476 sha256_process_bytes(alt_result, 32, &ctx);
477 }
478
479 /* Add salt for numbers not divisible by 3. */
480 if (cnt % 3 != 0) {
481 sha256_process_bytes(s_bytes, salt_len, &ctx);
482 }
483
484 /* Add key for numbers not divisible by 7. */
485 if (cnt % 7 != 0) {
486 sha256_process_bytes(p_bytes, key_len, &ctx);
487 }
488
489 /* Add key or last result. */
490 if ((cnt & 1) != 0) {
491 sha256_process_bytes(alt_result, 32, &ctx);
492 } else {
493 sha256_process_bytes(p_bytes, key_len, &ctx);
494 }
495
496 /* Create intermediate result. */
497 sha256_finish_ctx(&ctx, alt_result);
498 }
499
500 /* Now we can construct the result string. It consists of three
501 parts. */
502 cp = __php_stpncpy(buffer, sha256_salt_prefix, MAX(0, buflen));
503 buflen -= sizeof(sha256_salt_prefix) - 1;
504
505 if (rounds_custom) {
506 #ifdef PHP_WIN32
507 int n = _snprintf(cp, MAX(0, buflen), "%s" ZEND_ULONG_FMT "$", sha256_rounds_prefix, rounds);
508 #else
509 int n = snprintf(cp, MAX(0, buflen), "%s%zu$", sha256_rounds_prefix, rounds);
510 #endif
511 cp += n;
512 buflen -= n;
513 }
514
515 cp = __php_stpncpy(cp, salt, MIN ((size_t) MAX (0, buflen), salt_len));
516 buflen -= MIN(MAX (0, buflen), (int)salt_len);
517
518 if (buflen > 0) {
519 *cp++ = '$';
520 --buflen;
521 }
522
523 #define b64_from_24bit(B2, B1, B0, N) \
524 do { \
525 unsigned int w = ((B2) << 16) | ((B1) << 8) | (B0); \
526 int n = (N); \
527 while (n-- > 0 && buflen > 0) \
528 { \
529 *cp++ = b64t[w & 0x3f]; \
530 --buflen; \
531 w >>= 6; \
532 } \
533 } while (0)
534
535 b64_from_24bit(alt_result[0], alt_result[10], alt_result[20], 4);
536 b64_from_24bit(alt_result[21], alt_result[1], alt_result[11], 4);
537 b64_from_24bit(alt_result[12], alt_result[22], alt_result[2], 4);
538 b64_from_24bit(alt_result[3], alt_result[13], alt_result[23], 4);
539 b64_from_24bit(alt_result[24], alt_result[4], alt_result[14], 4);
540 b64_from_24bit(alt_result[15], alt_result[25], alt_result[5], 4);
541 b64_from_24bit(alt_result[6], alt_result[16], alt_result[26], 4);
542 b64_from_24bit(alt_result[27], alt_result[7], alt_result[17], 4);
543 b64_from_24bit(alt_result[18], alt_result[28], alt_result[8], 4);
544 b64_from_24bit(alt_result[9], alt_result[19], alt_result[29], 4);
545 b64_from_24bit(0, alt_result[31], alt_result[30], 3);
546 if (buflen <= 0) {
547 errno = ERANGE;
548 buffer = NULL;
549 } else
550 *cp = '\0'; /* Terminate the string. */
551
552 /* Clear the buffer for the intermediate result so that people
553 attaching to processes or reading core dumps cannot get any
554 information. We do it in this way to clear correct_words[]
555 inside the SHA256 implementation as well. */
556 sha256_init_ctx(&ctx);
557 sha256_finish_ctx(&ctx, alt_result);
558 ZEND_SECURE_ZERO(temp_result, sizeof(temp_result));
559 ZEND_SECURE_ZERO(p_bytes, key_len);
560 ZEND_SECURE_ZERO(s_bytes, salt_len);
561 ZEND_SECURE_ZERO(&ctx, sizeof(ctx));
562 ZEND_SECURE_ZERO(&alt_ctx, sizeof(alt_ctx));
563
564 if (copied_key != NULL) {
565 ZEND_SECURE_ZERO(copied_key, key_len);
566 }
567 if (copied_salt != NULL) {
568 ZEND_SECURE_ZERO(copied_salt, salt_len);
569 }
570
571 return buffer;
572 }
573
574
575 /* This entry point is equivalent to the `crypt' function in Unix
576 libcs. */
php_sha256_crypt(const char * key,const char * salt)577 char * php_sha256_crypt(const char *key, const char *salt)
578 {
579 /* We don't want to have an arbitrary limit in the size of the
580 password. We can compute an upper bound for the size of the
581 result in advance and so we can prepare the buffer we pass to
582 `sha256_crypt_r'. */
583 ZEND_TLS char *buffer;
584 ZEND_TLS int buflen = 0;
585 int needed = (sizeof(sha256_salt_prefix) - 1
586 + sizeof(sha256_rounds_prefix) + 9 + 1
587 + (int)strlen(salt) + 1 + 43 + 1);
588
589 if (buflen < needed) {
590 char *new_buffer = (char *) realloc(buffer, needed);
591 if (new_buffer == NULL) {
592 return NULL;
593 }
594
595 buffer = new_buffer;
596 buflen = needed;
597 }
598
599 return php_sha256_crypt_r(key, salt, buffer, buflen);
600 }
601
602
603 #ifdef TEST
604 static const struct
605 {
606 const char *input;
607 const char result[32];
608 } tests[] =
609 {
610 /* Test vectors from FIPS 180-2: appendix B.1. */
611 { "abc",
612 "\xba\x78\x16\xbf\x8f\x01\xcf\xea\x41\x41\x40\xde\x5d\xae\x22\x23"
613 "\xb0\x03\x61\xa3\x96\x17\x7a\x9c\xb4\x10\xff\x61\xf2\x00\x15\xad" },
614 /* Test vectors from FIPS 180-2: appendix B.2. */
615 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
616 "\x24\x8d\x6a\x61\xd2\x06\x38\xb8\xe5\xc0\x26\x93\x0c\x3e\x60\x39"
617 "\xa3\x3c\xe4\x59\x64\xff\x21\x67\xf6\xec\xed\xd4\x19\xdb\x06\xc1" },
618 /* Test vectors from the NESSIE project. */
619 { "",
620 "\xe3\xb0\xc4\x42\x98\xfc\x1c\x14\x9a\xfb\xf4\xc8\x99\x6f\xb9\x24"
621 "\x27\xae\x41\xe4\x64\x9b\x93\x4c\xa4\x95\x99\x1b\x78\x52\xb8\x55" },
622 { "a",
623 "\xca\x97\x81\x12\xca\x1b\xbd\xca\xfa\xc2\x31\xb3\x9a\x23\xdc\x4d"
624 "\xa7\x86\xef\xf8\x14\x7c\x4e\x72\xb9\x80\x77\x85\xaf\xee\x48\xbb" },
625 { "message digest",
626 "\xf7\x84\x6f\x55\xcf\x23\xe1\x4e\xeb\xea\xb5\xb4\xe1\x55\x0c\xad"
627 "\x5b\x50\x9e\x33\x48\xfb\xc4\xef\xa3\xa1\x41\x3d\x39\x3c\xb6\x50" },
628 { "abcdefghijklmnopqrstuvwxyz",
629 "\x71\xc4\x80\xdf\x93\xd6\xae\x2f\x1e\xfa\xd1\x44\x7c\x66\xc9\x52"
630 "\x5e\x31\x62\x18\xcf\x51\xfc\x8d\x9e\xd8\x32\xf2\xda\xf1\x8b\x73" },
631 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
632 "\x24\x8d\x6a\x61\xd2\x06\x38\xb8\xe5\xc0\x26\x93\x0c\x3e\x60\x39"
633 "\xa3\x3c\xe4\x59\x64\xff\x21\x67\xf6\xec\xed\xd4\x19\xdb\x06\xc1" },
634 { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
635 "\xdb\x4b\xfc\xbd\x4d\xa0\xcd\x85\xa6\x0c\x3c\x37\xd3\xfb\xd8\x80"
636 "\x5c\x77\xf1\x5f\xc6\xb1\xfd\xfe\x61\x4e\xe0\xa7\xc8\xfd\xb4\xc0" },
637 { "123456789012345678901234567890123456789012345678901234567890"
638 "12345678901234567890",
639 "\xf3\x71\xbc\x4a\x31\x1f\x2b\x00\x9e\xef\x95\x2d\xd8\x3c\xa8\x0e"
640 "\x2b\x60\x02\x6c\x8e\x93\x55\x92\xd0\xf9\xc3\x08\x45\x3c\x81\x3e" }
641 };
642 #define ntests (sizeof (tests) / sizeof (tests[0]))
643
644
645 static const struct
646 {
647 const char *salt;
648 const char *input;
649 const char *expected;
650 } tests2[] =
651 {
652 { "$5$saltstring", "Hello world!",
653 "$5$saltstring$5B8vYYiY.CVt1RlTTf8KbXBH3hsxY/GNooZaBBGWEc5" },
654 { "$5$rounds=10000$saltstringsaltstring", "Hello world!",
655 "$5$rounds=10000$saltstringsaltst$3xv.VbSHBb41AL9AvLeujZkZRBAwqFMz2."
656 "opqey6IcA" },
657 { "$5$rounds=5000$toolongsaltstring", "This is just a test",
658 "$5$rounds=5000$toolongsaltstrin$Un/5jzAHMgOGZ5.mWJpuVolil07guHPvOW8"
659 "mGRcvxa5" },
660 { "$5$rounds=1400$anotherlongsaltstring",
661 "a very much longer text to encrypt. This one even stretches over more"
662 "than one line.",
663 "$5$rounds=1400$anotherlongsalts$Rx.j8H.h8HjEDGomFU8bDkXm3XIUnzyxf12"
664 "oP84Bnq1" },
665 { "$5$rounds=77777$short",
666 "we have a short salt string but not a short password",
667 "$5$rounds=77777$short$JiO1O3ZpDAxGJeaDIuqCoEFysAe1mZNJRs3pw0KQRd/" },
668 { "$5$rounds=123456$asaltof16chars..", "a short string",
669 "$5$rounds=123456$asaltof16chars..$gP3VQ/6X7UUEW3HkBn2w1/Ptq2jxPyzV/"
670 "cZKmF/wJvD" },
671 { "$5$rounds=10$roundstoolow", "the minimum number is still observed",
672 "$5$rounds=1000$roundstoolow$yfvwcWrQ8l/K0DAWyuPMDNHpIVlTQebY9l/gL97"
673 "2bIC" },
674 };
675 #define ntests2 (sizeof (tests2) / sizeof (tests2[0]))
676
677
main(void)678 int main(void) {
679 struct sha256_ctx ctx;
680 char sum[32];
681 int result = 0;
682 int cnt, i;
683 char buf[1000];
684 static const char expected[32] =
685 "\xcd\xc7\x6e\x5c\x99\x14\xfb\x92\x81\xa1\xc7\xe2\x84\xd7\x3e\x67"
686 "\xf1\x80\x9a\x48\xa4\x97\x20\x0e\x04\x6d\x39\xcc\xc7\x11\x2c\xd0";
687
688 for (cnt = 0; cnt < (int) ntests; ++cnt) {
689 sha256_init_ctx(&ctx);
690 sha256_process_bytes(tests[cnt].input, strlen(tests[cnt].input), &ctx);
691 sha256_finish_ctx(&ctx, sum);
692 if (memcmp(tests[cnt].result, sum, 32) != 0) {
693 printf("test %d run %d failed\n", cnt, 1);
694 result = 1;
695 }
696
697 sha256_init_ctx(&ctx);
698 for (i = 0; tests[cnt].input[i] != '\0'; ++i) {
699 sha256_process_bytes(&tests[cnt].input[i], 1, &ctx);
700 }
701 sha256_finish_ctx(&ctx, sum);
702 if (memcmp(tests[cnt].result, sum, 32) != 0) {
703 printf("test %d run %d failed\n", cnt, 2);
704 result = 1;
705 }
706 }
707
708 /* Test vector from FIPS 180-2: appendix B.3. */
709
710 memset(buf, 'a', sizeof(buf));
711 sha256_init_ctx(&ctx);
712 for (i = 0; i < 1000; ++i) {
713 sha256_process_bytes (buf, sizeof (buf), &ctx);
714 }
715
716 sha256_finish_ctx(&ctx, sum);
717
718 if (memcmp(expected, sum, 32) != 0) {
719 printf("test %d failed\n", cnt);
720 result = 1;
721 }
722
723 for (cnt = 0; cnt < ntests2; ++cnt) {
724 char *cp = php_sha256_crypt(tests2[cnt].input, tests2[cnt].salt);
725 if (strcmp(cp, tests2[cnt].expected) != 0) {
726 printf("test %d: expected \"%s\", got \"%s\"\n", cnt, tests2[cnt].expected, cp);
727 result = 1;
728 }
729 }
730
731 if (result == 0)
732 puts("all tests OK");
733
734 return result;
735 }
736 #endif
737