diff options
Diffstat (limited to 'src/lib/libssl/ssl_ciph.c')
| -rw-r--r-- | src/lib/libssl/ssl_ciph.c | 216 |
1 files changed, 42 insertions, 174 deletions
diff --git a/src/lib/libssl/ssl_ciph.c b/src/lib/libssl/ssl_ciph.c index 3cbf368ad3..ed167efffd 100644 --- a/src/lib/libssl/ssl_ciph.c +++ b/src/lib/libssl/ssl_ciph.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ssl_ciph.c,v 1.107 2019/03/24 17:10:54 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_ciph.c,v 1.108 2019/04/04 16:44:24 jsing Exp $ */ |
| 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
| 3 | * All rights reserved. | 3 | * All rights reserved. |
| 4 | * | 4 | * |
| @@ -150,41 +150,6 @@ | |||
| 150 | 150 | ||
| 151 | #include "ssl_locl.h" | 151 | #include "ssl_locl.h" |
| 152 | 152 | ||
| 153 | #define SSL_ENC_3DES_IDX 0 | ||
| 154 | #define SSL_ENC_RC4_IDX 1 | ||
| 155 | #define SSL_ENC_NULL_IDX 2 | ||
| 156 | #define SSL_ENC_AES128_IDX 3 | ||
| 157 | #define SSL_ENC_AES256_IDX 4 | ||
| 158 | #define SSL_ENC_CAMELLIA128_IDX 5 | ||
| 159 | #define SSL_ENC_CAMELLIA256_IDX 6 | ||
| 160 | #define SSL_ENC_GOST89_IDX 7 | ||
| 161 | #define SSL_ENC_NUM_IDX 8 | ||
| 162 | |||
| 163 | static const EVP_CIPHER *ssl_cipher_methods[SSL_ENC_NUM_IDX] = { | ||
| 164 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
| 165 | }; | ||
| 166 | |||
| 167 | #define SSL_MD_MD5_IDX 0 | ||
| 168 | #define SSL_MD_SHA1_IDX 1 | ||
| 169 | #define SSL_MD_GOST94_IDX 2 | ||
| 170 | #define SSL_MD_GOST89MAC_IDX 3 | ||
| 171 | #define SSL_MD_SHA256_IDX 4 | ||
| 172 | #define SSL_MD_SHA384_IDX 5 | ||
| 173 | #define SSL_MD_STREEBOG256_IDX 6 | ||
| 174 | #define SSL_MD_NUM_IDX 7 | ||
| 175 | static const EVP_MD *ssl_digest_methods[SSL_MD_NUM_IDX] = { | ||
| 176 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
| 177 | }; | ||
| 178 | |||
| 179 | static int ssl_mac_pkey_id[SSL_MD_NUM_IDX] = { | ||
| 180 | EVP_PKEY_HMAC, EVP_PKEY_HMAC, EVP_PKEY_HMAC, EVP_PKEY_GOSTIMIT, | ||
| 181 | EVP_PKEY_HMAC, EVP_PKEY_HMAC, EVP_PKEY_HMAC, | ||
| 182 | }; | ||
| 183 | |||
| 184 | static int ssl_mac_secret_size[SSL_MD_NUM_IDX] = { | ||
| 185 | 0, 0, 0, 0, 0, 0, 0, | ||
| 186 | }; | ||
| 187 | |||
| 188 | #define CIPHER_ADD 1 | 153 | #define CIPHER_ADD 1 |
| 189 | #define CIPHER_KILL 2 | 154 | #define CIPHER_KILL 2 |
| 190 | #define CIPHER_DEL 3 | 155 | #define CIPHER_DEL 3 |
| @@ -446,164 +411,77 @@ static const SSL_CIPHER cipher_aliases[] = { | |||
| 446 | }, | 411 | }, |
| 447 | }; | 412 | }; |
| 448 | 413 | ||
| 449 | void | ||
| 450 | ssl_load_ciphers(void) | ||
| 451 | { | ||
| 452 | ssl_cipher_methods[SSL_ENC_3DES_IDX] = | ||
| 453 | EVP_get_cipherbyname(SN_des_ede3_cbc); | ||
| 454 | ssl_cipher_methods[SSL_ENC_RC4_IDX] = | ||
| 455 | EVP_get_cipherbyname(SN_rc4); | ||
| 456 | ssl_cipher_methods[SSL_ENC_AES128_IDX] = | ||
| 457 | EVP_get_cipherbyname(SN_aes_128_cbc); | ||
| 458 | ssl_cipher_methods[SSL_ENC_AES256_IDX] = | ||
| 459 | EVP_get_cipherbyname(SN_aes_256_cbc); | ||
| 460 | ssl_cipher_methods[SSL_ENC_CAMELLIA128_IDX] = | ||
| 461 | EVP_get_cipherbyname(SN_camellia_128_cbc); | ||
| 462 | ssl_cipher_methods[SSL_ENC_CAMELLIA256_IDX] = | ||
| 463 | EVP_get_cipherbyname(SN_camellia_256_cbc); | ||
| 464 | ssl_cipher_methods[SSL_ENC_GOST89_IDX] = | ||
| 465 | EVP_get_cipherbyname(SN_gost89_cnt); | ||
| 466 | |||
| 467 | ssl_digest_methods[SSL_MD_MD5_IDX] = | ||
| 468 | EVP_get_digestbyname(SN_md5); | ||
| 469 | ssl_mac_secret_size[SSL_MD_MD5_IDX] = | ||
| 470 | EVP_MD_size(ssl_digest_methods[SSL_MD_MD5_IDX]); | ||
| 471 | OPENSSL_assert(ssl_mac_secret_size[SSL_MD_MD5_IDX] >= 0); | ||
| 472 | ssl_digest_methods[SSL_MD_SHA1_IDX] = | ||
| 473 | EVP_get_digestbyname(SN_sha1); | ||
| 474 | ssl_mac_secret_size[SSL_MD_SHA1_IDX] = | ||
| 475 | EVP_MD_size(ssl_digest_methods[SSL_MD_SHA1_IDX]); | ||
| 476 | OPENSSL_assert(ssl_mac_secret_size[SSL_MD_SHA1_IDX] >= 0); | ||
| 477 | ssl_digest_methods[SSL_MD_GOST94_IDX] = | ||
| 478 | EVP_get_digestbyname(SN_id_GostR3411_94); | ||
| 479 | if (ssl_digest_methods[SSL_MD_GOST94_IDX]) { | ||
| 480 | ssl_mac_secret_size[SSL_MD_GOST94_IDX] = | ||
| 481 | EVP_MD_size(ssl_digest_methods[SSL_MD_GOST94_IDX]); | ||
| 482 | OPENSSL_assert(ssl_mac_secret_size[SSL_MD_GOST94_IDX] >= 0); | ||
| 483 | } | ||
| 484 | ssl_digest_methods[SSL_MD_GOST89MAC_IDX] = | ||
| 485 | EVP_get_digestbyname(SN_id_Gost28147_89_MAC); | ||
| 486 | if (ssl_mac_pkey_id[SSL_MD_GOST89MAC_IDX]) { | ||
| 487 | ssl_mac_secret_size[SSL_MD_GOST89MAC_IDX] = 32; | ||
| 488 | } | ||
| 489 | |||
| 490 | ssl_digest_methods[SSL_MD_SHA256_IDX] = | ||
| 491 | EVP_get_digestbyname(SN_sha256); | ||
| 492 | ssl_mac_secret_size[SSL_MD_SHA256_IDX] = | ||
| 493 | EVP_MD_size(ssl_digest_methods[SSL_MD_SHA256_IDX]); | ||
| 494 | ssl_digest_methods[SSL_MD_SHA384_IDX] = | ||
| 495 | EVP_get_digestbyname(SN_sha384); | ||
| 496 | ssl_mac_secret_size[SSL_MD_SHA384_IDX] = | ||
| 497 | EVP_MD_size(ssl_digest_methods[SSL_MD_SHA384_IDX]); | ||
| 498 | ssl_digest_methods[SSL_MD_STREEBOG256_IDX] = | ||
| 499 | EVP_get_digestbyname(SN_id_tc26_gost3411_2012_256); | ||
| 500 | ssl_mac_secret_size[SSL_MD_STREEBOG256_IDX] = | ||
| 501 | EVP_MD_size(ssl_digest_methods[SSL_MD_STREEBOG256_IDX]); | ||
| 502 | } | ||
| 503 | |||
| 504 | int | 414 | int |
| 505 | ssl_cipher_get_evp(const SSL_SESSION *s, const EVP_CIPHER **enc, | 415 | ssl_cipher_get_evp(const SSL_SESSION *ss, const EVP_CIPHER **enc, |
| 506 | const EVP_MD **md, int *mac_pkey_type, int *mac_secret_size) | 416 | const EVP_MD **md, int *mac_pkey_type, int *mac_secret_size) |
| 507 | { | 417 | { |
| 508 | const SSL_CIPHER *c; | 418 | *enc = NULL; |
| 509 | int i; | 419 | *md = NULL; |
| 420 | *mac_pkey_type = NID_undef; | ||
| 421 | *mac_secret_size = 0; | ||
| 510 | 422 | ||
| 511 | c = s->cipher; | 423 | if (ss->cipher == NULL) |
| 512 | if (c == NULL) | 424 | return 0; |
| 513 | return (0); | ||
| 514 | 425 | ||
| 515 | /* | 426 | /* |
| 516 | * This function does not handle EVP_AEAD. | 427 | * This function does not handle EVP_AEAD. |
| 517 | * See ssl_cipher_get_aead_evp instead. | 428 | * See ssl_cipher_get_aead_evp instead. |
| 518 | */ | 429 | */ |
| 519 | if (c->algorithm_mac & SSL_AEAD) | 430 | if (ss->cipher->algorithm_mac & SSL_AEAD) |
| 520 | return(0); | 431 | return 0; |
| 521 | |||
| 522 | if ((enc == NULL) || (md == NULL)) | ||
| 523 | return (0); | ||
| 524 | 432 | ||
| 525 | switch (c->algorithm_enc) { | 433 | switch (ss->cipher->algorithm_enc) { |
| 526 | case SSL_3DES: | 434 | case SSL_3DES: |
| 527 | i = SSL_ENC_3DES_IDX; | 435 | *enc = EVP_des_ede3_cbc(); |
| 528 | break; | 436 | break; |
| 529 | case SSL_RC4: | 437 | case SSL_RC4: |
| 530 | i = SSL_ENC_RC4_IDX; | 438 | *enc = EVP_rc4(); |
| 531 | break; | 439 | break; |
| 532 | case SSL_eNULL: | 440 | case SSL_eNULL: |
| 533 | i = SSL_ENC_NULL_IDX; | 441 | *enc = EVP_enc_null(); |
| 534 | break; | 442 | break; |
| 535 | case SSL_AES128: | 443 | case SSL_AES128: |
| 536 | i = SSL_ENC_AES128_IDX; | 444 | *enc = EVP_aes_128_cbc(); |
| 537 | break; | 445 | break; |
| 538 | case SSL_AES256: | 446 | case SSL_AES256: |
| 539 | i = SSL_ENC_AES256_IDX; | 447 | *enc = EVP_aes_256_cbc(); |
| 540 | break; | 448 | break; |
| 541 | case SSL_CAMELLIA128: | 449 | case SSL_CAMELLIA128: |
| 542 | i = SSL_ENC_CAMELLIA128_IDX; | 450 | *enc = EVP_camellia_128_cbc(); |
| 543 | break; | 451 | break; |
| 544 | case SSL_CAMELLIA256: | 452 | case SSL_CAMELLIA256: |
| 545 | i = SSL_ENC_CAMELLIA256_IDX; | 453 | *enc = EVP_camellia_256_cbc(); |
| 546 | break; | 454 | break; |
| 547 | case SSL_eGOST2814789CNT: | 455 | case SSL_eGOST2814789CNT: |
| 548 | i = SSL_ENC_GOST89_IDX; | 456 | *enc = EVP_gost2814789_cnt(); |
| 549 | break; | 457 | break; |
| 550 | default: | ||
| 551 | i = -1; | ||
| 552 | break; | ||
| 553 | } | ||
| 554 | |||
| 555 | if ((i < 0) || (i >= SSL_ENC_NUM_IDX)) | ||
| 556 | *enc = NULL; | ||
| 557 | else { | ||
| 558 | if (i == SSL_ENC_NULL_IDX) | ||
| 559 | *enc = EVP_enc_null(); | ||
| 560 | else | ||
| 561 | *enc = ssl_cipher_methods[i]; | ||
| 562 | } | 458 | } |
| 563 | 459 | ||
| 564 | switch (c->algorithm_mac) { | 460 | switch (ss->cipher->algorithm_mac) { |
| 565 | case SSL_MD5: | 461 | case SSL_MD5: |
| 566 | i = SSL_MD_MD5_IDX; | 462 | *md = EVP_md5(); |
| 567 | break; | 463 | break; |
| 568 | case SSL_SHA1: | 464 | case SSL_SHA1: |
| 569 | i = SSL_MD_SHA1_IDX; | 465 | *md = EVP_sha1(); |
| 570 | break; | 466 | break; |
| 571 | case SSL_SHA256: | 467 | case SSL_SHA256: |
| 572 | i = SSL_MD_SHA256_IDX; | 468 | *md = EVP_sha256(); |
| 573 | break; | 469 | break; |
| 574 | case SSL_SHA384: | 470 | case SSL_SHA384: |
| 575 | i = SSL_MD_SHA384_IDX; | 471 | *md = EVP_sha384(); |
| 576 | break; | ||
| 577 | case SSL_GOST94: | ||
| 578 | i = SSL_MD_GOST94_IDX; | ||
| 579 | break; | 472 | break; |
| 580 | case SSL_GOST89MAC: | 473 | case SSL_GOST89MAC: |
| 581 | i = SSL_MD_GOST89MAC_IDX; | 474 | *md = EVP_gost2814789imit(); |
| 582 | break; | 475 | break; |
| 583 | case SSL_STREEBOG256: | 476 | case SSL_GOST94: |
| 584 | i = SSL_MD_STREEBOG256_IDX; | 477 | *md = EVP_gostr341194(); |
| 585 | break; | 478 | break; |
| 586 | default: | 479 | case SSL_STREEBOG256: |
| 587 | i = -1; | 480 | *md = EVP_streebog256(); |
| 588 | break; | 481 | break; |
| 589 | } | 482 | } |
| 590 | if ((i < 0) || (i >= SSL_MD_NUM_IDX)) { | ||
| 591 | *md = NULL; | ||
| 592 | |||
| 593 | if (mac_pkey_type != NULL) | ||
| 594 | *mac_pkey_type = NID_undef; | ||
| 595 | if (mac_secret_size != NULL) | ||
| 596 | *mac_secret_size = 0; | ||
| 597 | } else { | ||
| 598 | *md = ssl_digest_methods[i]; | ||
| 599 | if (mac_pkey_type != NULL) | ||
| 600 | *mac_pkey_type = ssl_mac_pkey_id[i]; | ||
| 601 | if (mac_secret_size != NULL) | ||
| 602 | *mac_secret_size = ssl_mac_secret_size[i]; | ||
| 603 | } | ||
| 604 | 483 | ||
| 605 | if (*enc == NULL || *md == NULL || | 484 | if (*enc == NULL || *md == NULL) |
| 606 | (mac_pkey_type != NULL && *mac_pkey_type == NID_undef)) | ||
| 607 | return 0; | 485 | return 0; |
| 608 | 486 | ||
| 609 | /* | 487 | /* |
| @@ -615,6 +493,14 @@ ssl_cipher_get_evp(const SSL_SESSION *s, const EVP_CIPHER **enc, | |||
| 615 | if (EVP_CIPHER_mode(*enc) == EVP_CIPH_GCM_MODE) | 493 | if (EVP_CIPHER_mode(*enc) == EVP_CIPH_GCM_MODE) |
| 616 | return 0; | 494 | return 0; |
| 617 | 495 | ||
| 496 | if (ss->cipher->algorithm_mac == SSL_GOST89MAC) { | ||
| 497 | *mac_pkey_type = EVP_PKEY_GOSTIMIT; | ||
| 498 | *mac_secret_size = 32; /* XXX */ | ||
| 499 | } else { | ||
| 500 | *mac_pkey_type = EVP_PKEY_HMAC; | ||
| 501 | *mac_secret_size = EVP_MD_size(*md); | ||
| 502 | } | ||
| 503 | |||
| 618 | return 1; | 504 | return 1; |
| 619 | } | 505 | } |
| 620 | 506 | ||
| @@ -623,18 +509,16 @@ ssl_cipher_get_evp(const SSL_SESSION *s, const EVP_CIPHER **enc, | |||
| 623 | * for s->cipher. It returns 1 on success and 0 on error. | 509 | * for s->cipher. It returns 1 on success and 0 on error. |
| 624 | */ | 510 | */ |
| 625 | int | 511 | int |
| 626 | ssl_cipher_get_evp_aead(const SSL_SESSION *s, const EVP_AEAD **aead) | 512 | ssl_cipher_get_evp_aead(const SSL_SESSION *ss, const EVP_AEAD **aead) |
| 627 | { | 513 | { |
| 628 | const SSL_CIPHER *c = s->cipher; | ||
| 629 | |||
| 630 | *aead = NULL; | 514 | *aead = NULL; |
| 631 | 515 | ||
| 632 | if (c == NULL) | 516 | if (ss->cipher == NULL) |
| 633 | return 0; | 517 | return 0; |
| 634 | if ((c->algorithm_mac & SSL_AEAD) == 0) | 518 | if ((ss->cipher->algorithm_mac & SSL_AEAD) == 0) |
| 635 | return 0; | 519 | return 0; |
| 636 | 520 | ||
| 637 | switch (c->algorithm_enc) { | 521 | switch (ss->cipher->algorithm_enc) { |
| 638 | case SSL_AES128GCM: | 522 | case SSL_AES128GCM: |
| 639 | *aead = EVP_aead_aes_128_gcm(); | 523 | *aead = EVP_aead_aes_128_gcm(); |
| 640 | return 1; | 524 | return 1; |
| @@ -740,22 +624,6 @@ ssl_cipher_get_disabled(unsigned long *mkey, unsigned long *auth, | |||
| 740 | #ifdef SSL_FORBID_ENULL | 624 | #ifdef SSL_FORBID_ENULL |
| 741 | *enc |= SSL_eNULL; | 625 | *enc |= SSL_eNULL; |
| 742 | #endif | 626 | #endif |
| 743 | |||
| 744 | *enc |= (ssl_cipher_methods[SSL_ENC_3DES_IDX] == NULL) ? SSL_3DES : 0; | ||
| 745 | *enc |= (ssl_cipher_methods[SSL_ENC_RC4_IDX ] == NULL) ? SSL_RC4 : 0; | ||
| 746 | *enc |= (ssl_cipher_methods[SSL_ENC_AES128_IDX] == NULL) ? SSL_AES128 : 0; | ||
| 747 | *enc |= (ssl_cipher_methods[SSL_ENC_AES256_IDX] == NULL) ? SSL_AES256 : 0; | ||
| 748 | *enc |= (ssl_cipher_methods[SSL_ENC_CAMELLIA128_IDX] == NULL) ? SSL_CAMELLIA128 : 0; | ||
| 749 | *enc |= (ssl_cipher_methods[SSL_ENC_CAMELLIA256_IDX] == NULL) ? SSL_CAMELLIA256 : 0; | ||
| 750 | *enc |= (ssl_cipher_methods[SSL_ENC_GOST89_IDX] == NULL) ? SSL_eGOST2814789CNT : 0; | ||
| 751 | |||
| 752 | *mac |= (ssl_digest_methods[SSL_MD_MD5_IDX ] == NULL) ? SSL_MD5 : 0; | ||
| 753 | *mac |= (ssl_digest_methods[SSL_MD_SHA1_IDX] == NULL) ? SSL_SHA1 : 0; | ||
| 754 | *mac |= (ssl_digest_methods[SSL_MD_SHA256_IDX] == NULL) ? SSL_SHA256 : 0; | ||
| 755 | *mac |= (ssl_digest_methods[SSL_MD_SHA384_IDX] == NULL) ? SSL_SHA384 : 0; | ||
| 756 | *mac |= (ssl_digest_methods[SSL_MD_GOST94_IDX] == NULL) ? SSL_GOST94 : 0; | ||
| 757 | *mac |= (ssl_digest_methods[SSL_MD_GOST89MAC_IDX] == NULL) ? SSL_GOST89MAC : 0; | ||
| 758 | *mac |= (ssl_digest_methods[SSL_MD_STREEBOG256_IDX] == NULL) ? SSL_STREEBOG256 : 0; | ||
| 759 | } | 627 | } |
| 760 | 628 | ||
| 761 | static void | 629 | static void |
