diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libssl/ssl_srvr.c | 94 |
1 files changed, 33 insertions, 61 deletions
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c index ff5b020d7a..3d20f0f900 100644 --- a/src/lib/libssl/ssl_srvr.c +++ b/src/lib/libssl/ssl_srvr.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ssl_srvr.c,v 1.35 2018/06/10 13:50:39 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_srvr.c,v 1.36 2018/08/10 17:44:16 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 | * |
| @@ -1504,13 +1504,10 @@ ssl3_send_server_key_exchange(SSL *s) | |||
| 1504 | CBB cbb; | 1504 | CBB cbb; |
| 1505 | unsigned char *params = NULL; | 1505 | unsigned char *params = NULL; |
| 1506 | size_t params_len; | 1506 | size_t params_len; |
| 1507 | unsigned char *q; | ||
| 1508 | unsigned char md_buf[MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH]; | ||
| 1509 | unsigned int u; | ||
| 1510 | EVP_PKEY *pkey; | 1507 | EVP_PKEY *pkey; |
| 1511 | const EVP_MD *md = NULL; | 1508 | const EVP_MD *md = NULL; |
| 1512 | unsigned char *p, *d; | 1509 | unsigned char *p, *d; |
| 1513 | int al, i, j, n, kn; | 1510 | int al, i, n, kn; |
| 1514 | unsigned long type; | 1511 | unsigned long type; |
| 1515 | BUF_MEM *buf; | 1512 | BUF_MEM *buf; |
| 1516 | EVP_MD_CTX md_ctx; | 1513 | EVP_MD_CTX md_ctx; |
| @@ -1570,68 +1567,43 @@ ssl3_send_server_key_exchange(SSL *s) | |||
| 1570 | n = params_len; | 1567 | n = params_len; |
| 1571 | p += params_len; | 1568 | p += params_len; |
| 1572 | 1569 | ||
| 1573 | /* not anonymous */ | 1570 | /* Add signature unless anonymous. */ |
| 1574 | if (pkey != NULL) { | 1571 | if (pkey != NULL) { |
| 1575 | /* | 1572 | if (pkey->type == EVP_PKEY_RSA && !SSL_USE_SIGALGS(s)) |
| 1576 | * n is the length of the params, they start at &(d[4]) | 1573 | md = EVP_md5_sha1(); |
| 1577 | * and p points to the space at the end. | 1574 | |
| 1578 | */ | 1575 | if (md == NULL) { |
| 1579 | if (pkey->type == EVP_PKEY_RSA && !SSL_USE_SIGALGS(s)) { | ||
| 1580 | q = md_buf; | ||
| 1581 | j = 0; | ||
| 1582 | if (!EVP_DigestInit_ex(&md_ctx, EVP_md5_sha1(), | ||
| 1583 | NULL)) | ||
| 1584 | goto err; | ||
| 1585 | EVP_DigestUpdate(&md_ctx, s->s3->client_random, | ||
| 1586 | SSL3_RANDOM_SIZE); | ||
| 1587 | EVP_DigestUpdate(&md_ctx, s->s3->server_random, | ||
| 1588 | SSL3_RANDOM_SIZE); | ||
| 1589 | EVP_DigestUpdate(&md_ctx, d, n); | ||
| 1590 | EVP_DigestFinal_ex(&md_ctx, q, | ||
| 1591 | (unsigned int *)&i); | ||
| 1592 | q += i; | ||
| 1593 | j += i; | ||
| 1594 | if (RSA_sign(NID_md5_sha1, md_buf, j, | ||
| 1595 | &(p[2]), &u, pkey->pkey.rsa) <= 0) { | ||
| 1596 | SSLerror(s, ERR_R_RSA_LIB); | ||
| 1597 | goto err; | ||
| 1598 | } | ||
| 1599 | s2n(u, p); | ||
| 1600 | n += u + 2; | ||
| 1601 | } else if (md) { | ||
| 1602 | /* Send signature algorithm. */ | ||
| 1603 | if (SSL_USE_SIGALGS(s)) { | ||
| 1604 | if (!tls12_get_sigandhash(p, pkey, md)) { | ||
| 1605 | /* Should never happen */ | ||
| 1606 | al = SSL_AD_INTERNAL_ERROR; | ||
| 1607 | SSLerror(s, ERR_R_INTERNAL_ERROR); | ||
| 1608 | goto f_err; | ||
| 1609 | } | ||
| 1610 | p += 2; | ||
| 1611 | } | ||
| 1612 | EVP_SignInit_ex(&md_ctx, md, NULL); | ||
| 1613 | EVP_SignUpdate(&md_ctx, | ||
| 1614 | s->s3->client_random, | ||
| 1615 | SSL3_RANDOM_SIZE); | ||
| 1616 | EVP_SignUpdate(&md_ctx, | ||
| 1617 | s->s3->server_random, | ||
| 1618 | SSL3_RANDOM_SIZE); | ||
| 1619 | EVP_SignUpdate(&md_ctx, d, n); | ||
| 1620 | if (!EVP_SignFinal(&md_ctx, &p[2], | ||
| 1621 | (unsigned int *)&i, pkey)) { | ||
| 1622 | SSLerror(s, ERR_R_EVP_LIB); | ||
| 1623 | goto err; | ||
| 1624 | } | ||
| 1625 | s2n(i, p); | ||
| 1626 | n += i + 2; | ||
| 1627 | if (SSL_USE_SIGALGS(s)) | ||
| 1628 | n += 2; | ||
| 1629 | } else { | ||
| 1630 | /* Is this error check actually needed? */ | 1576 | /* Is this error check actually needed? */ |
| 1631 | al = SSL_AD_HANDSHAKE_FAILURE; | 1577 | al = SSL_AD_HANDSHAKE_FAILURE; |
| 1632 | SSLerror(s, SSL_R_UNKNOWN_PKEY_TYPE); | 1578 | SSLerror(s, SSL_R_UNKNOWN_PKEY_TYPE); |
| 1633 | goto f_err; | 1579 | goto f_err; |
| 1634 | } | 1580 | } |
| 1581 | |||
| 1582 | /* Send signature algorithm. */ | ||
| 1583 | if (SSL_USE_SIGALGS(s)) { | ||
| 1584 | if (!tls12_get_sigandhash(p, pkey, md)) { | ||
| 1585 | /* Should never happen */ | ||
| 1586 | al = SSL_AD_INTERNAL_ERROR; | ||
| 1587 | SSLerror(s, ERR_R_INTERNAL_ERROR); | ||
| 1588 | goto f_err; | ||
| 1589 | } | ||
| 1590 | p += 2; | ||
| 1591 | } | ||
| 1592 | EVP_SignInit_ex(&md_ctx, md, NULL); | ||
| 1593 | EVP_SignUpdate(&md_ctx, s->s3->client_random, | ||
| 1594 | SSL3_RANDOM_SIZE); | ||
| 1595 | EVP_SignUpdate(&md_ctx, s->s3->server_random, | ||
| 1596 | SSL3_RANDOM_SIZE); | ||
| 1597 | EVP_SignUpdate(&md_ctx, d, n); | ||
| 1598 | if (!EVP_SignFinal(&md_ctx, &p[2], (unsigned int *)&i, | ||
| 1599 | pkey)) { | ||
| 1600 | SSLerror(s, ERR_R_EVP_LIB); | ||
| 1601 | goto err; | ||
| 1602 | } | ||
| 1603 | s2n(i, p); | ||
| 1604 | n += i + 2; | ||
| 1605 | if (SSL_USE_SIGALGS(s)) | ||
| 1606 | n += 2; | ||
| 1635 | } | 1607 | } |
| 1636 | 1608 | ||
| 1637 | ssl3_handshake_msg_finish(s, n); | 1609 | ssl3_handshake_msg_finish(s, n); |
