summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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