summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjsing <>2019-04-04 16:44:24 +0000
committerjsing <>2019-04-04 16:44:24 +0000
commit4ee3e34310a4dd1cee5a12b0e0b222cbea806322 (patch)
tree183461b00fc0b82a96b5d144624116543c5cd88a
parent71b5f161c982b24df543400bbfc808f5b8c4937b (diff)
downloadopenbsd-4ee3e34310a4dd1cee5a12b0e0b222cbea806322.tar.gz
openbsd-4ee3e34310a4dd1cee5a12b0e0b222cbea806322.tar.bz2
openbsd-4ee3e34310a4dd1cee5a12b0e0b222cbea806322.zip
Clean up the cipher/digest table mess.
The original implementation allows for libcrypto to be compiled without a given algorithm and libssl then detects that ciphers or digests are unavailable so that it can disable the associated cipher suites. This is unnecessary since we do not compile out algorithms. ok beck@, tb@ (a while back)
-rw-r--r--src/lib/libssl/ssl_algs.c5
-rw-r--r--src/lib/libssl/ssl_ciph.c216
-rw-r--r--src/lib/libssl/ssl_locl.h3
3 files changed, 45 insertions, 179 deletions
diff --git a/src/lib/libssl/ssl_algs.c b/src/lib/libssl/ssl_algs.c
index b63f36b3f1..bb736c5de9 100644
--- a/src/lib/libssl/ssl_algs.c
+++ b/src/lib/libssl/ssl_algs.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_algs.c,v 1.27 2017/08/12 02:55:22 jsing Exp $ */ 1/* $OpenBSD: ssl_algs.c,v 1.28 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 *
@@ -119,8 +119,7 @@ SSL_library_init(void)
119 EVP_add_digest(EVP_streebog256()); 119 EVP_add_digest(EVP_streebog256());
120 EVP_add_digest(EVP_streebog512()); 120 EVP_add_digest(EVP_streebog512());
121#endif 121#endif
122 /* initialize cipher/digest methods table */ 122
123 ssl_load_ciphers();
124 return (1); 123 return (1);
125} 124}
126 125
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
163static 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
175static const EVP_MD *ssl_digest_methods[SSL_MD_NUM_IDX] = {
176 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
177};
178
179static 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
184static 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
449void
450ssl_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
504int 414int
505ssl_cipher_get_evp(const SSL_SESSION *s, const EVP_CIPHER **enc, 415ssl_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 */
625int 511int
626ssl_cipher_get_evp_aead(const SSL_SESSION *s, const EVP_AEAD **aead) 512ssl_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
761static void 629static void
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h
index 2dae72309c..31f3e60893 100644
--- a/src/lib/libssl/ssl_locl.h
+++ b/src/lib/libssl/ssl_locl.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_locl.h,v 1.244 2019/03/25 17:33:26 jsing Exp $ */ 1/* $OpenBSD: ssl_locl.h,v 1.245 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 *
@@ -1127,7 +1127,6 @@ void ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher);
1127STACK_OF(SSL_CIPHER) *ssl_get_ciphers_by_id(SSL *s); 1127STACK_OF(SSL_CIPHER) *ssl_get_ciphers_by_id(SSL *s);
1128int ssl_has_ecc_ciphers(SSL *s); 1128int ssl_has_ecc_ciphers(SSL *s);
1129int ssl_verify_alarm_type(long type); 1129int ssl_verify_alarm_type(long type);
1130void ssl_load_ciphers(void);
1131 1130
1132int SSL_SESSION_ticket(SSL_SESSION *ss, unsigned char **out, size_t *out_len); 1131int SSL_SESSION_ticket(SSL_SESSION *ss, unsigned char **out, size_t *out_len);
1133 1132