diff options
author | miod <> | 2014-11-18 05:33:43 +0000 |
---|---|---|
committer | miod <> | 2014-11-18 05:33:43 +0000 |
commit | 0c986de0d047d74ccf3708c551b93f60ed6bfafb (patch) | |
tree | 1ff6097d67d8f3a7af1e40761e736566bcd71b7d /src/lib/libssl/ssl_ciph.c | |
parent | 9555aff2e872287755e956f3b44930bf7de0cdda (diff) | |
download | openbsd-0c986de0d047d74ccf3708c551b93f60ed6bfafb.tar.gz openbsd-0c986de0d047d74ccf3708c551b93f60ed6bfafb.tar.bz2 openbsd-0c986de0d047d74ccf3708c551b93f60ed6bfafb.zip |
Update the GOST code in libssl, as contributed by Dmitry Eremin-Solenikov.
This causes a libssl major version bump as this affects the layout of some
internal-but-unfortunately-made-visible structs.
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; |