summaryrefslogtreecommitdiff
path: root/src/lib/libssl/ssl_ciph.c
diff options
context:
space:
mode:
authormiod <>2014-11-18 05:33:43 +0000
committermiod <>2014-11-18 05:33:43 +0000
commit0c986de0d047d74ccf3708c551b93f60ed6bfafb (patch)
tree1ff6097d67d8f3a7af1e40761e736566bcd71b7d /src/lib/libssl/ssl_ciph.c
parent9555aff2e872287755e956f3b44930bf7de0cdda (diff)
downloadopenbsd-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.c70
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
182static const EVP_MD *ssl_digest_methods[SSL_MD_NUM_IDX] = { 184static 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 */
189static int ssl_mac_pkey_id[SSL_MD_NUM_IDX] = { 191static 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
194static int ssl_mac_secret_size[SSL_MD_NUM_IDX] = { 196static 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
198static int ssl_handshake_digest_flag[SSL_MD_NUM_IDX] = { 200static 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
584int 602int
@@ -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;