diff options
author | tb <> | 2021-12-09 17:53:29 +0000 |
---|---|---|
committer | tb <> | 2021-12-09 17:53:29 +0000 |
commit | 781c7fa1451987684b19a0ec5d2c2e7d7b1c6614 (patch) | |
tree | e308293853c0a74126fa9f2dbb4ccec97fded2c7 | |
parent | c3858ce7e20f4246cf6072ee57ffa016a6f8927c (diff) | |
download | openbsd-781c7fa1451987684b19a0ec5d2c2e7d7b1c6614.tar.gz openbsd-781c7fa1451987684b19a0ec5d2c2e7d7b1c6614.tar.bz2 openbsd-781c7fa1451987684b19a0ec5d2c2e7d7b1c6614.zip |
Convert ssl_srvr.c to opaque EVP_MD_CTX.
ok inoguchi jsing
-rw-r--r-- | src/lib/libssl/ssl_srvr.c | 86 |
1 files changed, 44 insertions, 42 deletions
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c index e9ea6b141c..665fcc5037 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.127 2021/12/04 14:03:22 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_srvr.c,v 1.128 2021/12/09 17:53:29 tb 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 | * |
@@ -1496,7 +1496,7 @@ ssl3_send_server_key_exchange(SSL *s) | |||
1496 | size_t params_len; | 1496 | size_t params_len; |
1497 | const EVP_MD *md = NULL; | 1497 | const EVP_MD *md = NULL; |
1498 | unsigned long type; | 1498 | unsigned long type; |
1499 | EVP_MD_CTX md_ctx; | 1499 | EVP_MD_CTX *md_ctx = NULL; |
1500 | EVP_PKEY_CTX *pctx; | 1500 | EVP_PKEY_CTX *pctx; |
1501 | EVP_PKEY *pkey; | 1501 | EVP_PKEY *pkey; |
1502 | int al; | 1502 | int al; |
@@ -1504,7 +1504,8 @@ ssl3_send_server_key_exchange(SSL *s) | |||
1504 | memset(&cbb, 0, sizeof(cbb)); | 1504 | memset(&cbb, 0, sizeof(cbb)); |
1505 | memset(&cbb_params, 0, sizeof(cbb_params)); | 1505 | memset(&cbb_params, 0, sizeof(cbb_params)); |
1506 | 1506 | ||
1507 | EVP_MD_CTX_init(&md_ctx); | 1507 | if ((md_ctx = EVP_MD_CTX_new()) == NULL) |
1508 | goto err; | ||
1508 | 1509 | ||
1509 | if (S3I(s)->hs.state == SSL3_ST_SW_KEY_EXCH_A) { | 1510 | if (S3I(s)->hs.state == SSL3_ST_SW_KEY_EXCH_A) { |
1510 | 1511 | ||
@@ -1552,7 +1553,7 @@ ssl3_send_server_key_exchange(SSL *s) | |||
1552 | } | 1553 | } |
1553 | } | 1554 | } |
1554 | 1555 | ||
1555 | if (!EVP_DigestSignInit(&md_ctx, &pctx, md, NULL, pkey)) { | 1556 | if (!EVP_DigestSignInit(md_ctx, &pctx, md, NULL, pkey)) { |
1556 | SSLerror(s, ERR_R_EVP_LIB); | 1557 | SSLerror(s, ERR_R_EVP_LIB); |
1557 | goto err; | 1558 | goto err; |
1558 | } | 1559 | } |
@@ -1563,21 +1564,21 @@ ssl3_send_server_key_exchange(SSL *s) | |||
1563 | SSLerror(s, ERR_R_EVP_LIB); | 1564 | SSLerror(s, ERR_R_EVP_LIB); |
1564 | goto err; | 1565 | goto err; |
1565 | } | 1566 | } |
1566 | if (!EVP_DigestSignUpdate(&md_ctx, s->s3->client_random, | 1567 | if (!EVP_DigestSignUpdate(md_ctx, s->s3->client_random, |
1567 | SSL3_RANDOM_SIZE)) { | 1568 | SSL3_RANDOM_SIZE)) { |
1568 | SSLerror(s, ERR_R_EVP_LIB); | 1569 | SSLerror(s, ERR_R_EVP_LIB); |
1569 | goto err; | 1570 | goto err; |
1570 | } | 1571 | } |
1571 | if (!EVP_DigestSignUpdate(&md_ctx, s->s3->server_random, | 1572 | if (!EVP_DigestSignUpdate(md_ctx, s->s3->server_random, |
1572 | SSL3_RANDOM_SIZE)) { | 1573 | SSL3_RANDOM_SIZE)) { |
1573 | SSLerror(s, ERR_R_EVP_LIB); | 1574 | SSLerror(s, ERR_R_EVP_LIB); |
1574 | goto err; | 1575 | goto err; |
1575 | } | 1576 | } |
1576 | if (!EVP_DigestSignUpdate(&md_ctx, params, params_len)) { | 1577 | if (!EVP_DigestSignUpdate(md_ctx, params, params_len)) { |
1577 | SSLerror(s, ERR_R_EVP_LIB); | 1578 | SSLerror(s, ERR_R_EVP_LIB); |
1578 | goto err; | 1579 | goto err; |
1579 | } | 1580 | } |
1580 | if (!EVP_DigestSignFinal(&md_ctx, NULL, &signature_len) || | 1581 | if (!EVP_DigestSignFinal(md_ctx, NULL, &signature_len) || |
1581 | !signature_len) { | 1582 | !signature_len) { |
1582 | SSLerror(s, ERR_R_EVP_LIB); | 1583 | SSLerror(s, ERR_R_EVP_LIB); |
1583 | goto err; | 1584 | goto err; |
@@ -1586,7 +1587,7 @@ ssl3_send_server_key_exchange(SSL *s) | |||
1586 | SSLerror(s, ERR_R_MALLOC_FAILURE); | 1587 | SSLerror(s, ERR_R_MALLOC_FAILURE); |
1587 | goto err; | 1588 | goto err; |
1588 | } | 1589 | } |
1589 | if (!EVP_DigestSignFinal(&md_ctx, signature, &signature_len)) { | 1590 | if (!EVP_DigestSignFinal(md_ctx, signature, &signature_len)) { |
1590 | SSLerror(s, ERR_R_EVP_LIB); | 1591 | SSLerror(s, ERR_R_EVP_LIB); |
1591 | goto err; | 1592 | goto err; |
1592 | } | 1593 | } |
@@ -1605,7 +1606,7 @@ ssl3_send_server_key_exchange(SSL *s) | |||
1605 | S3I(s)->hs.state = SSL3_ST_SW_KEY_EXCH_B; | 1606 | S3I(s)->hs.state = SSL3_ST_SW_KEY_EXCH_B; |
1606 | } | 1607 | } |
1607 | 1608 | ||
1608 | EVP_MD_CTX_cleanup(&md_ctx); | 1609 | EVP_MD_CTX_free(md_ctx); |
1609 | free(params); | 1610 | free(params); |
1610 | free(signature); | 1611 | free(signature); |
1611 | 1612 | ||
@@ -1616,7 +1617,7 @@ ssl3_send_server_key_exchange(SSL *s) | |||
1616 | err: | 1617 | err: |
1617 | CBB_cleanup(&cbb_params); | 1618 | CBB_cleanup(&cbb_params); |
1618 | CBB_cleanup(&cbb); | 1619 | CBB_cleanup(&cbb); |
1619 | EVP_MD_CTX_cleanup(&md_ctx); | 1620 | EVP_MD_CTX_free(md_ctx); |
1620 | free(params); | 1621 | free(params); |
1621 | free(signature); | 1622 | free(signature); |
1622 | 1623 | ||
@@ -2061,15 +2062,13 @@ ssl3_get_cert_verify(SSL *s) | |||
2061 | uint16_t sigalg_value = SIGALG_NONE; | 2062 | uint16_t sigalg_value = SIGALG_NONE; |
2062 | EVP_PKEY *pkey = NULL; | 2063 | EVP_PKEY *pkey = NULL; |
2063 | X509 *peer = NULL; | 2064 | X509 *peer = NULL; |
2064 | EVP_MD_CTX mctx; | 2065 | EVP_MD_CTX *mctx = NULL; |
2065 | int al, verify; | 2066 | int al, verify; |
2066 | const unsigned char *hdata; | 2067 | const unsigned char *hdata; |
2067 | size_t hdatalen; | 2068 | size_t hdatalen; |
2068 | int type = 0; | 2069 | int type = 0; |
2069 | int ret; | 2070 | int ret; |
2070 | 2071 | ||
2071 | EVP_MD_CTX_init(&mctx); | ||
2072 | |||
2073 | if ((ret = ssl3_get_message(s, SSL3_ST_SR_CERT_VRFY_A, | 2072 | if ((ret = ssl3_get_message(s, SSL3_ST_SR_CERT_VRFY_A, |
2074 | SSL3_ST_SR_CERT_VRFY_B, -1, SSL3_RT_MAX_PLAIN_LENGTH)) <= 0) | 2073 | SSL3_ST_SR_CERT_VRFY_B, -1, SSL3_RT_MAX_PLAIN_LENGTH)) <= 0) |
2075 | return ret; | 2074 | return ret; |
@@ -2079,6 +2078,9 @@ ssl3_get_cert_verify(SSL *s) | |||
2079 | if (s->internal->init_num < 0) | 2078 | if (s->internal->init_num < 0) |
2080 | goto err; | 2079 | goto err; |
2081 | 2080 | ||
2081 | if ((mctx = EVP_MD_CTX_new()) == NULL) | ||
2082 | goto err; | ||
2083 | |||
2082 | CBS_init(&cbs, s->internal->init_msg, s->internal->init_num); | 2084 | CBS_init(&cbs, s->internal->init_msg, s->internal->init_num); |
2083 | 2085 | ||
2084 | if (s->session->peer != NULL) { | 2086 | if (s->session->peer != NULL) { |
@@ -2149,7 +2151,7 @@ ssl3_get_cert_verify(SSL *s) | |||
2149 | al = SSL_AD_INTERNAL_ERROR; | 2151 | al = SSL_AD_INTERNAL_ERROR; |
2150 | goto fatal_err; | 2152 | goto fatal_err; |
2151 | } | 2153 | } |
2152 | if (!EVP_DigestVerifyInit(&mctx, &pctx, sigalg->md(), | 2154 | if (!EVP_DigestVerifyInit(mctx, &pctx, sigalg->md(), |
2153 | NULL, pkey)) { | 2155 | NULL, pkey)) { |
2154 | SSLerror(s, ERR_R_EVP_LIB); | 2156 | SSLerror(s, ERR_R_EVP_LIB); |
2155 | al = SSL_AD_INTERNAL_ERROR; | 2157 | al = SSL_AD_INTERNAL_ERROR; |
@@ -2169,12 +2171,12 @@ ssl3_get_cert_verify(SSL *s) | |||
2169 | al = SSL_AD_INTERNAL_ERROR; | 2171 | al = SSL_AD_INTERNAL_ERROR; |
2170 | goto fatal_err; | 2172 | goto fatal_err; |
2171 | } | 2173 | } |
2172 | if (!EVP_DigestVerifyUpdate(&mctx, hdata, hdatalen)) { | 2174 | if (!EVP_DigestVerifyUpdate(mctx, hdata, hdatalen)) { |
2173 | SSLerror(s, ERR_R_EVP_LIB); | 2175 | SSLerror(s, ERR_R_EVP_LIB); |
2174 | al = SSL_AD_INTERNAL_ERROR; | 2176 | al = SSL_AD_INTERNAL_ERROR; |
2175 | goto fatal_err; | 2177 | goto fatal_err; |
2176 | } | 2178 | } |
2177 | if (EVP_DigestVerifyFinal(&mctx, CBS_data(&signature), | 2179 | if (EVP_DigestVerifyFinal(mctx, CBS_data(&signature), |
2178 | CBS_len(&signature)) <= 0) { | 2180 | CBS_len(&signature)) <= 0) { |
2179 | al = SSL_AD_DECRYPT_ERROR; | 2181 | al = SSL_AD_DECRYPT_ERROR; |
2180 | SSLerror(s, SSL_R_BAD_SIGNATURE); | 2182 | SSLerror(s, SSL_R_BAD_SIGNATURE); |
@@ -2243,9 +2245,9 @@ ssl3_get_cert_verify(SSL *s) | |||
2243 | al = SSL_AD_INTERNAL_ERROR; | 2245 | al = SSL_AD_INTERNAL_ERROR; |
2244 | goto fatal_err; | 2246 | goto fatal_err; |
2245 | } | 2247 | } |
2246 | if (!EVP_DigestInit_ex(&mctx, md, NULL) || | 2248 | if (!EVP_DigestInit_ex(mctx, md, NULL) || |
2247 | !EVP_DigestUpdate(&mctx, hdata, hdatalen) || | 2249 | !EVP_DigestUpdate(mctx, hdata, hdatalen) || |
2248 | !EVP_DigestFinal(&mctx, sigbuf, &siglen) || | 2250 | !EVP_DigestFinal(mctx, sigbuf, &siglen) || |
2249 | (EVP_PKEY_verify_init(pctx) <= 0) || | 2251 | (EVP_PKEY_verify_init(pctx) <= 0) || |
2250 | (EVP_PKEY_CTX_set_signature_md(pctx, md) <= 0) || | 2252 | (EVP_PKEY_CTX_set_signature_md(pctx, md) <= 0) || |
2251 | (EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_VERIFY, | 2253 | (EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_VERIFY, |
@@ -2283,7 +2285,7 @@ ssl3_get_cert_verify(SSL *s) | |||
2283 | end: | 2285 | end: |
2284 | tls1_transcript_free(s); | 2286 | tls1_transcript_free(s); |
2285 | err: | 2287 | err: |
2286 | EVP_MD_CTX_cleanup(&mctx); | 2288 | EVP_MD_CTX_free(mctx); |
2287 | EVP_PKEY_free(pkey); | 2289 | EVP_PKEY_free(pkey); |
2288 | return (ret); | 2290 | return (ret); |
2289 | } | 2291 | } |
@@ -2484,16 +2486,18 @@ ssl3_send_newsession_ticket(SSL *s) | |||
2484 | unsigned char key_name[16]; | 2486 | unsigned char key_name[16]; |
2485 | unsigned char *hmac; | 2487 | unsigned char *hmac; |
2486 | unsigned int hlen; | 2488 | unsigned int hlen; |
2487 | EVP_CIPHER_CTX ctx; | 2489 | EVP_CIPHER_CTX *ctx = NULL; |
2488 | HMAC_CTX hctx; | 2490 | HMAC_CTX *hctx = NULL; |
2489 | int len; | 2491 | int len; |
2490 | 2492 | ||
2491 | /* | 2493 | /* |
2492 | * New Session Ticket - RFC 5077, section 3.3. | 2494 | * New Session Ticket - RFC 5077, section 3.3. |
2493 | */ | 2495 | */ |
2494 | 2496 | ||
2495 | EVP_CIPHER_CTX_init(&ctx); | 2497 | if ((ctx = EVP_CIPHER_CTX_new()) == NULL) |
2496 | HMAC_CTX_init(&hctx); | 2498 | goto err; |
2499 | if ((hctx = HMAC_CTX_new()) == NULL) | ||
2500 | goto err; | ||
2497 | 2501 | ||
2498 | memset(&cbb, 0, sizeof(cbb)); | 2502 | memset(&cbb, 0, sizeof(cbb)); |
2499 | 2503 | ||
@@ -2514,15 +2518,13 @@ ssl3_send_newsession_ticket(SSL *s) | |||
2514 | */ | 2518 | */ |
2515 | if (tctx->internal->tlsext_ticket_key_cb != NULL) { | 2519 | if (tctx->internal->tlsext_ticket_key_cb != NULL) { |
2516 | if (tctx->internal->tlsext_ticket_key_cb(s, | 2520 | if (tctx->internal->tlsext_ticket_key_cb(s, |
2517 | key_name, iv, &ctx, &hctx, 1) < 0) { | 2521 | key_name, iv, ctx, hctx, 1) < 0) |
2518 | EVP_CIPHER_CTX_cleanup(&ctx); | ||
2519 | goto err; | 2522 | goto err; |
2520 | } | ||
2521 | } else { | 2523 | } else { |
2522 | arc4random_buf(iv, 16); | 2524 | arc4random_buf(iv, 16); |
2523 | EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, | 2525 | EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, |
2524 | tctx->internal->tlsext_tick_aes_key, iv); | 2526 | tctx->internal->tlsext_tick_aes_key, iv); |
2525 | HMAC_Init_ex(&hctx, tctx->internal->tlsext_tick_hmac_key, | 2527 | HMAC_Init_ex(hctx, tctx->internal->tlsext_tick_hmac_key, |
2526 | 16, EVP_sha256(), NULL); | 2528 | 16, EVP_sha256(), NULL); |
2527 | memcpy(key_name, tctx->internal->tlsext_tick_key_name, 16); | 2529 | memcpy(key_name, tctx->internal->tlsext_tick_key_name, 16); |
2528 | } | 2530 | } |
@@ -2532,11 +2534,11 @@ ssl3_send_newsession_ticket(SSL *s) | |||
2532 | if ((enc_session = calloc(1, enc_session_max_len)) == NULL) | 2534 | if ((enc_session = calloc(1, enc_session_max_len)) == NULL) |
2533 | goto err; | 2535 | goto err; |
2534 | enc_session_len = 0; | 2536 | enc_session_len = 0; |
2535 | if (!EVP_EncryptUpdate(&ctx, enc_session, &len, session, | 2537 | if (!EVP_EncryptUpdate(ctx, enc_session, &len, session, |
2536 | session_len)) | 2538 | session_len)) |
2537 | goto err; | 2539 | goto err; |
2538 | enc_session_len += len; | 2540 | enc_session_len += len; |
2539 | if (!EVP_EncryptFinal_ex(&ctx, enc_session + enc_session_len, | 2541 | if (!EVP_EncryptFinal_ex(ctx, enc_session + enc_session_len, |
2540 | &len)) | 2542 | &len)) |
2541 | goto err; | 2543 | goto err; |
2542 | enc_session_len += len; | 2544 | enc_session_len += len; |
@@ -2545,14 +2547,14 @@ ssl3_send_newsession_ticket(SSL *s) | |||
2545 | goto err; | 2547 | goto err; |
2546 | 2548 | ||
2547 | /* Generate the HMAC. */ | 2549 | /* Generate the HMAC. */ |
2548 | if (!HMAC_Update(&hctx, key_name, sizeof(key_name))) | 2550 | if (!HMAC_Update(hctx, key_name, sizeof(key_name))) |
2549 | goto err; | 2551 | goto err; |
2550 | if (!HMAC_Update(&hctx, iv, EVP_CIPHER_CTX_iv_length(&ctx))) | 2552 | if (!HMAC_Update(hctx, iv, EVP_CIPHER_CTX_iv_length(ctx))) |
2551 | goto err; | 2553 | goto err; |
2552 | if (!HMAC_Update(&hctx, enc_session, enc_session_len)) | 2554 | if (!HMAC_Update(hctx, enc_session, enc_session_len)) |
2553 | goto err; | 2555 | goto err; |
2554 | 2556 | ||
2555 | if ((hmac_len = HMAC_size(&hctx)) <= 0) | 2557 | if ((hmac_len = HMAC_size(hctx)) <= 0) |
2556 | goto err; | 2558 | goto err; |
2557 | 2559 | ||
2558 | /* | 2560 | /* |
@@ -2569,14 +2571,14 @@ ssl3_send_newsession_ticket(SSL *s) | |||
2569 | goto err; | 2571 | goto err; |
2570 | if (!CBB_add_bytes(&ticket, key_name, sizeof(key_name))) | 2572 | if (!CBB_add_bytes(&ticket, key_name, sizeof(key_name))) |
2571 | goto err; | 2573 | goto err; |
2572 | if (!CBB_add_bytes(&ticket, iv, EVP_CIPHER_CTX_iv_length(&ctx))) | 2574 | if (!CBB_add_bytes(&ticket, iv, EVP_CIPHER_CTX_iv_length(ctx))) |
2573 | goto err; | 2575 | goto err; |
2574 | if (!CBB_add_bytes(&ticket, enc_session, enc_session_len)) | 2576 | if (!CBB_add_bytes(&ticket, enc_session, enc_session_len)) |
2575 | goto err; | 2577 | goto err; |
2576 | if (!CBB_add_space(&ticket, &hmac, hmac_len)) | 2578 | if (!CBB_add_space(&ticket, &hmac, hmac_len)) |
2577 | goto err; | 2579 | goto err; |
2578 | 2580 | ||
2579 | if (!HMAC_Final(&hctx, hmac, &hlen)) | 2581 | if (!HMAC_Final(hctx, hmac, &hlen)) |
2580 | goto err; | 2582 | goto err; |
2581 | if (hlen != hmac_len) | 2583 | if (hlen != hmac_len) |
2582 | goto err; | 2584 | goto err; |
@@ -2587,8 +2589,8 @@ ssl3_send_newsession_ticket(SSL *s) | |||
2587 | S3I(s)->hs.state = SSL3_ST_SW_SESSION_TICKET_B; | 2589 | S3I(s)->hs.state = SSL3_ST_SW_SESSION_TICKET_B; |
2588 | } | 2590 | } |
2589 | 2591 | ||
2590 | EVP_CIPHER_CTX_cleanup(&ctx); | 2592 | EVP_CIPHER_CTX_free(ctx); |
2591 | HMAC_CTX_cleanup(&hctx); | 2593 | HMAC_CTX_free(hctx); |
2592 | freezero(session, session_len); | 2594 | freezero(session, session_len); |
2593 | free(enc_session); | 2595 | free(enc_session); |
2594 | 2596 | ||
@@ -2597,8 +2599,8 @@ ssl3_send_newsession_ticket(SSL *s) | |||
2597 | 2599 | ||
2598 | err: | 2600 | err: |
2599 | CBB_cleanup(&cbb); | 2601 | CBB_cleanup(&cbb); |
2600 | EVP_CIPHER_CTX_cleanup(&ctx); | 2602 | EVP_CIPHER_CTX_free(ctx); |
2601 | HMAC_CTX_cleanup(&hctx); | 2603 | HMAC_CTX_free(hctx); |
2602 | freezero(session, session_len); | 2604 | freezero(session, session_len); |
2603 | free(enc_session); | 2605 | free(enc_session); |
2604 | 2606 | ||