diff options
Diffstat (limited to 'src/lib/libssl/ssl_ciph.c')
| -rw-r--r-- | src/lib/libssl/ssl_ciph.c | 70 |
1 files changed, 60 insertions, 10 deletions
diff --git a/src/lib/libssl/ssl_ciph.c b/src/lib/libssl/ssl_ciph.c index 443c2ec660..990fe9876c 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.73 2014/11/16 14:12:47 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_ciph.c,v 1.74 2014/11/18 05:33:43 miod 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 | * |
| @@ -175,30 +175,33 @@ static const EVP_CIPHER *ssl_cipher_methods[SSL_ENC_NUM_IDX] = { | |||
| 175 | #define SSL_MD_GOST89MAC_IDX 3 | 175 | #define SSL_MD_GOST89MAC_IDX 3 |
| 176 | #define SSL_MD_SHA256_IDX 4 | 176 | #define SSL_MD_SHA256_IDX 4 |
| 177 | #define SSL_MD_SHA384_IDX 5 | 177 | #define SSL_MD_SHA384_IDX 5 |
| 178 | #define SSL_MD_STREEBOG256_IDX 6 | ||
| 179 | #define SSL_MD_STREEBOG512_IDX 7 | ||
| 178 | /*Constant SSL_MAX_DIGEST equal to size of digests array should be | 180 | /*Constant SSL_MAX_DIGEST equal to size of digests array should be |
| 179 | * defined in the | 181 | * defined in the |
| 180 | * ssl_locl.h */ | 182 | * ssl_locl.h */ |
| 181 | #define SSL_MD_NUM_IDX SSL_MAX_DIGEST | 183 | #define SSL_MD_NUM_IDX SSL_MAX_DIGEST |
| 182 | static const EVP_MD *ssl_digest_methods[SSL_MD_NUM_IDX] = { | 184 | static const EVP_MD *ssl_digest_methods[SSL_MD_NUM_IDX] = { |
| 183 | NULL, NULL, NULL, NULL, NULL, NULL | 185 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL |
| 184 | }; | 186 | }; |
| 185 | /* PKEY_TYPE for GOST89MAC is known in advance, but, because | 187 | /* PKEY_TYPE for GOST89MAC is known in advance, but, because |
| 186 | * implementation is engine-provided, we'll fill it only if | 188 | * implementation is engine-provided, we'll fill it only if |
| 187 | * corresponding EVP_PKEY_METHOD is found | 189 | * corresponding EVP_PKEY_METHOD is found |
| 188 | */ | 190 | */ |
| 189 | static int ssl_mac_pkey_id[SSL_MD_NUM_IDX] = { | 191 | static int ssl_mac_pkey_id[SSL_MD_NUM_IDX] = { |
| 190 | EVP_PKEY_HMAC, EVP_PKEY_HMAC, EVP_PKEY_HMAC, NID_undef, | 192 | EVP_PKEY_HMAC, EVP_PKEY_HMAC, EVP_PKEY_HMAC, EVP_PKEY_GOSTIMIT, |
| 191 | EVP_PKEY_HMAC, EVP_PKEY_HMAC | 193 | EVP_PKEY_HMAC, EVP_PKEY_HMAC, EVP_PKEY_HMAC, EVP_PKEY_HMAC, |
| 192 | }; | 194 | }; |
| 193 | 195 | ||
| 194 | static int ssl_mac_secret_size[SSL_MD_NUM_IDX] = { | 196 | static int ssl_mac_secret_size[SSL_MD_NUM_IDX] = { |
| 195 | 0, 0, 0, 0, 0, 0 | 197 | 0, 0, 0, 0, 0, 0, 0, 0 |
| 196 | }; | 198 | }; |
| 197 | 199 | ||
| 198 | static int ssl_handshake_digest_flag[SSL_MD_NUM_IDX] = { | 200 | static int ssl_handshake_digest_flag[SSL_MD_NUM_IDX] = { |
| 199 | SSL_HANDSHAKE_MAC_MD5, SSL_HANDSHAKE_MAC_SHA, | 201 | SSL_HANDSHAKE_MAC_MD5, SSL_HANDSHAKE_MAC_SHA, |
| 200 | SSL_HANDSHAKE_MAC_GOST94, 0, SSL_HANDSHAKE_MAC_SHA256, | 202 | SSL_HANDSHAKE_MAC_GOST94, 0, SSL_HANDSHAKE_MAC_SHA256, |
| 201 | SSL_HANDSHAKE_MAC_SHA384 | 203 | SSL_HANDSHAKE_MAC_SHA384, SSL_HANDSHAKE_MAC_STREEBOG256, |
| 204 | SSL_HANDSHAKE_MAC_STREEBOG512 | ||
| 202 | }; | 205 | }; |
| 203 | 206 | ||
| 204 | #define CIPHER_ADD 1 | 207 | #define CIPHER_ADD 1 |
| @@ -325,7 +328,7 @@ static const SSL_CIPHER cipher_aliases[] = { | |||
| 325 | .name = SSL_TXT_aGOST, | 328 | .name = SSL_TXT_aGOST, |
| 326 | .algorithm_auth = SSL_aGOST94|SSL_aGOST01, | 329 | .algorithm_auth = SSL_aGOST94|SSL_aGOST01, |
| 327 | }, | 330 | }, |
| 328 | 331 | ||
| 329 | /* aliases combining key exchange and server authentication */ | 332 | /* aliases combining key exchange and server authentication */ |
| 330 | { | 333 | { |
| 331 | .name = SSL_TXT_DHE, | 334 | .name = SSL_TXT_DHE, |
| @@ -450,6 +453,14 @@ static const SSL_CIPHER cipher_aliases[] = { | |||
| 450 | .name = SSL_TXT_SHA384, | 453 | .name = SSL_TXT_SHA384, |
| 451 | .algorithm_mac = SSL_SHA384, | 454 | .algorithm_mac = SSL_SHA384, |
| 452 | }, | 455 | }, |
| 456 | { | ||
| 457 | .name = SSL_TXT_STREEBOG256, | ||
| 458 | .algorithm_mac = SSL_STREEBOG256, | ||
| 459 | }, | ||
| 460 | { | ||
| 461 | .name = SSL_TXT_STREEBOG512, | ||
| 462 | .algorithm_mac = SSL_STREEBOG512, | ||
| 463 | }, | ||
| 453 | 464 | ||
| 454 | /* protocol version aliases */ | 465 | /* protocol version aliases */ |
| 455 | { | 466 | { |
| @@ -566,7 +577,6 @@ ssl_load_ciphers(void) | |||
| 566 | } | 577 | } |
| 567 | ssl_digest_methods[SSL_MD_GOST89MAC_IDX]= | 578 | ssl_digest_methods[SSL_MD_GOST89MAC_IDX]= |
| 568 | EVP_get_digestbyname(SN_id_Gost28147_89_MAC); | 579 | EVP_get_digestbyname(SN_id_Gost28147_89_MAC); |
| 569 | ssl_mac_pkey_id[SSL_MD_GOST89MAC_IDX] = get_optional_pkey_id("gost-mac"); | ||
| 570 | if (ssl_mac_pkey_id[SSL_MD_GOST89MAC_IDX]) { | 580 | if (ssl_mac_pkey_id[SSL_MD_GOST89MAC_IDX]) { |
| 571 | ssl_mac_secret_size[SSL_MD_GOST89MAC_IDX] = 32; | 581 | ssl_mac_secret_size[SSL_MD_GOST89MAC_IDX] = 32; |
| 572 | } | 582 | } |
| @@ -579,6 +589,14 @@ ssl_load_ciphers(void) | |||
| 579 | EVP_get_digestbyname(SN_sha384); | 589 | EVP_get_digestbyname(SN_sha384); |
| 580 | ssl_mac_secret_size[SSL_MD_SHA384_IDX]= | 590 | ssl_mac_secret_size[SSL_MD_SHA384_IDX]= |
| 581 | EVP_MD_size(ssl_digest_methods[SSL_MD_SHA384_IDX]); | 591 | EVP_MD_size(ssl_digest_methods[SSL_MD_SHA384_IDX]); |
| 592 | ssl_digest_methods[SSL_MD_STREEBOG256_IDX]= | ||
| 593 | EVP_get_digestbyname(SN_id_tc26_gost3411_2012_256); | ||
| 594 | ssl_mac_secret_size[SSL_MD_STREEBOG256_IDX]= | ||
| 595 | EVP_MD_size(ssl_digest_methods[SSL_MD_STREEBOG256_IDX]); | ||
| 596 | ssl_digest_methods[SSL_MD_STREEBOG512_IDX]= | ||
| 597 | EVP_get_digestbyname(SN_id_tc26_gost3411_2012_512); | ||
| 598 | ssl_mac_secret_size[SSL_MD_STREEBOG512_IDX]= | ||
| 599 | EVP_MD_size(ssl_digest_methods[SSL_MD_STREEBOG512_IDX]); | ||
| 582 | } | 600 | } |
| 583 | 601 | ||
| 584 | int | 602 | int |
| @@ -672,6 +690,12 @@ ssl_cipher_get_evp(const SSL_SESSION *s, const EVP_CIPHER **enc, | |||
| 672 | case SSL_GOST89MAC: | 690 | case SSL_GOST89MAC: |
| 673 | i = SSL_MD_GOST89MAC_IDX; | 691 | i = SSL_MD_GOST89MAC_IDX; |
| 674 | break; | 692 | break; |
| 693 | case SSL_STREEBOG256: | ||
| 694 | i = SSL_MD_STREEBOG256_IDX; | ||
| 695 | break; | ||
| 696 | case SSL_STREEBOG512: | ||
| 697 | i = SSL_MD_STREEBOG512_IDX; | ||
| 698 | break; | ||
| 675 | default: | 699 | default: |
| 676 | i = -1; | 700 | i = -1; |
| 677 | break; | 701 | break; |
| @@ -829,7 +853,7 @@ ssl_cipher_get_disabled(unsigned long *mkey, unsigned long *auth, | |||
| 829 | *auth |= SSL_aGOST01; | 853 | *auth |= SSL_aGOST01; |
| 830 | } | 854 | } |
| 831 | /* Disable GOST key exchange if no GOST signature algs are available. */ | 855 | /* Disable GOST key exchange if no GOST signature algs are available. */ |
| 832 | if ((*auth & (SSL_aGOST94|SSL_aGOST01)) == (SSL_aGOST94|SSL_aGOST01)) { | 856 | if (((~*auth) & (SSL_aGOST94|SSL_aGOST01)) == 0) { |
| 833 | *mkey |= SSL_kGOST; | 857 | *mkey |= SSL_kGOST; |
| 834 | } | 858 | } |
| 835 | #ifdef SSL_FORBID_ENULL | 859 | #ifdef SSL_FORBID_ENULL |
| @@ -853,7 +877,9 @@ ssl_cipher_get_disabled(unsigned long *mkey, unsigned long *auth, | |||
| 853 | *mac |= (ssl_digest_methods[SSL_MD_SHA256_IDX] == NULL) ? SSL_SHA256 : 0; | 877 | *mac |= (ssl_digest_methods[SSL_MD_SHA256_IDX] == NULL) ? SSL_SHA256 : 0; |
| 854 | *mac |= (ssl_digest_methods[SSL_MD_SHA384_IDX] == NULL) ? SSL_SHA384 : 0; | 878 | *mac |= (ssl_digest_methods[SSL_MD_SHA384_IDX] == NULL) ? SSL_SHA384 : 0; |
| 855 | *mac |= (ssl_digest_methods[SSL_MD_GOST94_IDX] == NULL) ? SSL_GOST94 : 0; | 879 | *mac |= (ssl_digest_methods[SSL_MD_GOST94_IDX] == NULL) ? SSL_GOST94 : 0; |
| 856 | *mac |= (ssl_digest_methods[SSL_MD_GOST89MAC_IDX] == NULL || ssl_mac_pkey_id[SSL_MD_GOST89MAC_IDX]==NID_undef) ? SSL_GOST89MAC : 0; | 880 | *mac |= (ssl_digest_methods[SSL_MD_GOST89MAC_IDX] == NULL) ? SSL_GOST89MAC : 0; |
| 881 | *mac |= (ssl_digest_methods[SSL_MD_STREEBOG256_IDX] == NULL) ? SSL_STREEBOG256 : 0; | ||
| 882 | *mac |= (ssl_digest_methods[SSL_MD_STREEBOG512_IDX] == NULL) ? SSL_STREEBOG512 : 0; | ||
| 857 | 883 | ||
| 858 | } | 884 | } |
| 859 | 885 | ||
| @@ -1581,6 +1607,9 @@ SSL_CIPHER_description(const SSL_CIPHER *cipher, char *buf, int len) | |||
| 1581 | case SSL_kECDHE: | 1607 | case SSL_kECDHE: |
| 1582 | kx = "ECDH"; | 1608 | kx = "ECDH"; |
| 1583 | break; | 1609 | break; |
| 1610 | case SSL_kGOST: | ||
| 1611 | kx = "GOST"; | ||
| 1612 | break; | ||
| 1584 | default: | 1613 | default: |
| 1585 | kx = "unknown"; | 1614 | kx = "unknown"; |
| 1586 | } | 1615 | } |
| @@ -1601,6 +1630,12 @@ SSL_CIPHER_description(const SSL_CIPHER *cipher, char *buf, int len) | |||
| 1601 | case SSL_aECDSA: | 1630 | case SSL_aECDSA: |
| 1602 | au = "ECDSA"; | 1631 | au = "ECDSA"; |
| 1603 | break; | 1632 | break; |
| 1633 | case SSL_aGOST94: | ||
| 1634 | au = "GOST94"; | ||
| 1635 | break; | ||
| 1636 | case SSL_aGOST01: | ||
| 1637 | au = "GOST01"; | ||
| 1638 | break; | ||
| 1604 | default: | 1639 | default: |
| 1605 | au = "unknown"; | 1640 | au = "unknown"; |
| 1606 | break; | 1641 | break; |
| @@ -1643,6 +1678,9 @@ SSL_CIPHER_description(const SSL_CIPHER *cipher, char *buf, int len) | |||
| 1643 | case SSL_CHACHA20POLY1305: | 1678 | case SSL_CHACHA20POLY1305: |
| 1644 | enc = "ChaCha20-Poly1305"; | 1679 | enc = "ChaCha20-Poly1305"; |
| 1645 | break; | 1680 | break; |
| 1681 | case SSL_eGOST2814789CNT: | ||
| 1682 | enc = "GOST-28178-89-CNT"; | ||
| 1683 | break; | ||
| 1646 | default: | 1684 | default: |
| 1647 | enc = "unknown"; | 1685 | enc = "unknown"; |
| 1648 | break; | 1686 | break; |
| @@ -1664,6 +1702,18 @@ SSL_CIPHER_description(const SSL_CIPHER *cipher, char *buf, int len) | |||
| 1664 | case SSL_AEAD: | 1702 | case SSL_AEAD: |
| 1665 | mac = "AEAD"; | 1703 | mac = "AEAD"; |
| 1666 | break; | 1704 | break; |
| 1705 | case SSL_GOST94: | ||
| 1706 | mac = "GOST94"; | ||
| 1707 | break; | ||
| 1708 | case SSL_GOST89MAC: | ||
| 1709 | mac = "GOST89IMIT"; | ||
| 1710 | break; | ||
| 1711 | case SSL_STREEBOG256: | ||
| 1712 | mac = "STREEBOG256"; | ||
| 1713 | break; | ||
| 1714 | case SSL_STREEBOG512: | ||
| 1715 | mac = "STREEBOG512"; | ||
| 1716 | break; | ||
| 1667 | default: | 1717 | default: |
| 1668 | mac = "unknown"; | 1718 | mac = "unknown"; |
| 1669 | break; | 1719 | break; |
