diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/usr.bin/openssl/passwd.c | 107 |
1 files changed, 72 insertions, 35 deletions
diff --git a/src/usr.bin/openssl/passwd.c b/src/usr.bin/openssl/passwd.c index a8c7f08dd7..11b43d653a 100644 --- a/src/usr.bin/openssl/passwd.c +++ b/src/usr.bin/openssl/passwd.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: passwd.c,v 1.11 2021/11/25 16:53:58 tb Exp $ */ | 1 | /* $OpenBSD: passwd.c,v 1.12 2021/12/12 20:40:25 tb Exp $ */ |
| 2 | 2 | ||
| 3 | #if defined OPENSSL_NO_MD5 | 3 | #if defined OPENSSL_NO_MD5 |
| 4 | #define NO_MD5CRYPT_1 | 4 | #define NO_MD5CRYPT_1 |
| @@ -306,7 +306,7 @@ md5crypt(const char *passwd, const char *magic, const char *salt) | |||
| 306 | char *salt_out; | 306 | char *salt_out; |
| 307 | int n; | 307 | int n; |
| 308 | unsigned int i; | 308 | unsigned int i; |
| 309 | EVP_MD_CTX md, md2; | 309 | EVP_MD_CTX *md = NULL, *md2 = NULL; |
| 310 | size_t passwd_len, salt_len; | 310 | size_t passwd_len, salt_len; |
| 311 | 311 | ||
| 312 | passwd_len = strlen(passwd); | 312 | passwd_len = strlen(passwd); |
| @@ -321,45 +321,74 @@ md5crypt(const char *passwd, const char *magic, const char *salt) | |||
| 321 | salt_len = strlen(salt_out); | 321 | salt_len = strlen(salt_out); |
| 322 | assert(salt_len <= 8); | 322 | assert(salt_len <= 8); |
| 323 | 323 | ||
| 324 | EVP_MD_CTX_init(&md); | 324 | if ((md = EVP_MD_CTX_new()) == NULL) |
| 325 | EVP_DigestInit_ex(&md, EVP_md5(), NULL); | 325 | goto err; |
| 326 | EVP_DigestUpdate(&md, passwd, passwd_len); | 326 | if (!EVP_DigestInit_ex(md, EVP_md5(), NULL)) |
| 327 | EVP_DigestUpdate(&md, "$", 1); | 327 | goto err; |
| 328 | EVP_DigestUpdate(&md, magic, strlen(magic)); | 328 | if (!EVP_DigestUpdate(md, passwd, passwd_len)) |
| 329 | EVP_DigestUpdate(&md, "$", 1); | 329 | goto err; |
| 330 | EVP_DigestUpdate(&md, salt_out, salt_len); | 330 | if (!EVP_DigestUpdate(md, "$", 1)) |
| 331 | 331 | goto err; | |
| 332 | EVP_MD_CTX_init(&md2); | 332 | if (!EVP_DigestUpdate(md, magic, strlen(magic))) |
| 333 | EVP_DigestInit_ex(&md2, EVP_md5(), NULL); | 333 | goto err; |
| 334 | EVP_DigestUpdate(&md2, passwd, passwd_len); | 334 | if (!EVP_DigestUpdate(md, "$", 1)) |
| 335 | EVP_DigestUpdate(&md2, salt_out, salt_len); | 335 | goto err; |
| 336 | EVP_DigestUpdate(&md2, passwd, passwd_len); | 336 | if (!EVP_DigestUpdate(md, salt_out, salt_len)) |
| 337 | EVP_DigestFinal_ex(&md2, buf, NULL); | 337 | goto err; |
| 338 | 338 | ||
| 339 | for (i = passwd_len; i > sizeof buf; i -= sizeof buf) | 339 | if ((md2 = EVP_MD_CTX_new()) == NULL) |
| 340 | EVP_DigestUpdate(&md, buf, sizeof buf); | 340 | goto err; |
| 341 | EVP_DigestUpdate(&md, buf, i); | 341 | if (!EVP_DigestInit_ex(md2, EVP_md5(), NULL)) |
| 342 | goto err; | ||
| 343 | if (!EVP_DigestUpdate(md2, passwd, passwd_len)) | ||
| 344 | goto err; | ||
| 345 | if (!EVP_DigestUpdate(md2, salt_out, salt_len)) | ||
| 346 | goto err; | ||
| 347 | if (!EVP_DigestUpdate(md2, passwd, passwd_len)) | ||
| 348 | goto err; | ||
| 349 | if (!EVP_DigestFinal_ex(md2, buf, NULL)) | ||
| 350 | goto err; | ||
| 351 | |||
| 352 | for (i = passwd_len; i > sizeof buf; i -= sizeof buf) { | ||
| 353 | if (!EVP_DigestUpdate(md, buf, sizeof buf)) | ||
| 354 | goto err; | ||
| 355 | } | ||
| 356 | if (!EVP_DigestUpdate(md, buf, i)) | ||
| 357 | goto err; | ||
| 342 | 358 | ||
| 343 | n = passwd_len; | 359 | n = passwd_len; |
| 344 | while (n) { | 360 | while (n) { |
| 345 | EVP_DigestUpdate(&md, (n & 1) ? "\0" : passwd, 1); | 361 | if (!EVP_DigestUpdate(md, (n & 1) ? "\0" : passwd, 1)) |
| 362 | goto err; | ||
| 346 | n >>= 1; | 363 | n >>= 1; |
| 347 | } | 364 | } |
| 348 | EVP_DigestFinal_ex(&md, buf, NULL); | 365 | if (!EVP_DigestFinal_ex(md, buf, NULL)) |
| 366 | goto err; | ||
| 349 | 367 | ||
| 350 | for (i = 0; i < 1000; i++) { | 368 | for (i = 0; i < 1000; i++) { |
| 351 | EVP_DigestInit_ex(&md2, EVP_md5(), NULL); | 369 | if (!EVP_DigestInit_ex(md2, EVP_md5(), NULL)) |
| 352 | EVP_DigestUpdate(&md2, (i & 1) ? (unsigned const char *) passwd : buf, | 370 | goto err; |
| 353 | (i & 1) ? passwd_len : sizeof buf); | 371 | if (!EVP_DigestUpdate(md2, |
| 354 | if (i % 3) | 372 | (i & 1) ? (unsigned const char *) passwd : buf, |
| 355 | EVP_DigestUpdate(&md2, salt_out, salt_len); | 373 | (i & 1) ? passwd_len : sizeof buf)) |
| 356 | if (i % 7) | 374 | goto err; |
| 357 | EVP_DigestUpdate(&md2, passwd, passwd_len); | 375 | if (i % 3) { |
| 358 | EVP_DigestUpdate(&md2, (i & 1) ? buf : (unsigned const char *) passwd, | 376 | if (!EVP_DigestUpdate(md2, salt_out, salt_len)) |
| 359 | (i & 1) ? sizeof buf : passwd_len); | 377 | goto err; |
| 360 | EVP_DigestFinal_ex(&md2, buf, NULL); | 378 | } |
| 379 | if (i % 7) { | ||
| 380 | if (!EVP_DigestUpdate(md2, passwd, passwd_len)) | ||
| 381 | goto err; | ||
| 382 | } | ||
| 383 | if (!EVP_DigestUpdate(md2, | ||
| 384 | (i & 1) ? buf : (unsigned const char *) passwd, | ||
| 385 | (i & 1) ? sizeof buf : passwd_len)) | ||
| 386 | goto err; | ||
| 387 | if (!EVP_DigestFinal_ex(md2, buf, NULL)) | ||
| 388 | goto err; | ||
| 361 | } | 389 | } |
| 362 | EVP_MD_CTX_cleanup(&md2); | 390 | EVP_MD_CTX_free(md2); |
| 391 | md2 = NULL; | ||
| 363 | 392 | ||
| 364 | { | 393 | { |
| 365 | /* transform buf into output string */ | 394 | /* transform buf into output string */ |
| @@ -394,9 +423,14 @@ md5crypt(const char *passwd, const char *magic, const char *salt) | |||
| 394 | *output = 0; | 423 | *output = 0; |
| 395 | assert(strlen(out_buf) < sizeof(out_buf)); | 424 | assert(strlen(out_buf) < sizeof(out_buf)); |
| 396 | } | 425 | } |
| 397 | EVP_MD_CTX_cleanup(&md); | 426 | EVP_MD_CTX_free(md); |
| 398 | 427 | ||
| 399 | return out_buf; | 428 | return out_buf; |
| 429 | err: | ||
| 430 | EVP_MD_CTX_free(md); | ||
| 431 | EVP_MD_CTX_free(md2); | ||
| 432 | |||
| 433 | return NULL; | ||
| 400 | } | 434 | } |
| 401 | #endif | 435 | #endif |
| 402 | 436 | ||
| @@ -463,7 +497,8 @@ do_passwd(int passed_salt, char **salt_p, char **salt_malloc_p, | |||
| 463 | #endif | 497 | #endif |
| 464 | #ifndef NO_MD5CRYPT_1 | 498 | #ifndef NO_MD5CRYPT_1 |
| 465 | if (use1 || useapr1) | 499 | if (use1 || useapr1) |
| 466 | hash = md5crypt(passwd, (use1 ? "1" : "apr1"), *salt_p); | 500 | if ((hash = md5crypt(passwd, (use1 ? "1" : "apr1"), *salt_p)) == NULL) |
| 501 | goto err; | ||
| 467 | #endif | 502 | #endif |
| 468 | assert(hash != NULL); | 503 | assert(hash != NULL); |
| 469 | 504 | ||
| @@ -476,6 +511,8 @@ do_passwd(int passed_salt, char **salt_p, char **salt_malloc_p, | |||
| 476 | return 1; | 511 | return 1; |
| 477 | 512 | ||
| 478 | err: | 513 | err: |
| 514 | free(*salt_malloc_p); | ||
| 515 | *salt_malloc_p = NULL; | ||
| 479 | return 0; | 516 | return 0; |
| 480 | } | 517 | } |
| 481 | #else | 518 | #else |
