diff options
Diffstat (limited to 'src/lib/libssl/ssl_srvr.c')
-rw-r--r-- | src/lib/libssl/ssl_srvr.c | 101 |
1 files changed, 38 insertions, 63 deletions
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c index f06491e558..b099fdb8b1 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.45 2018/08/24 18:10:25 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_srvr.c,v 1.46 2018/08/27 16:42:48 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 | * |
@@ -2526,20 +2526,21 @@ int | |||
2526 | ssl3_send_newsession_ticket(SSL *s) | 2526 | ssl3_send_newsession_ticket(SSL *s) |
2527 | { | 2527 | { |
2528 | CBB cbb, session_ticket, ticket; | 2528 | CBB cbb, session_ticket, ticket; |
2529 | unsigned char *enc_ticket = NULL; | ||
2530 | unsigned char *senc = NULL; | ||
2531 | const unsigned char *const_p; | ||
2532 | unsigned char *p, *hmac; | ||
2533 | size_t hmac_len; | ||
2534 | int enc_ticket_len, len, slen; | ||
2535 | int slen_full = 0; | ||
2536 | SSL_SESSION *sess; | ||
2537 | unsigned int hlen; | ||
2538 | EVP_CIPHER_CTX ctx; | ||
2539 | HMAC_CTX hctx; | ||
2540 | SSL_CTX *tctx = s->initial_ctx; | 2529 | SSL_CTX *tctx = s->initial_ctx; |
2530 | size_t enc_session_len, enc_session_max_len, hmac_len; | ||
2531 | size_t session_len = 0; | ||
2532 | unsigned char *enc_session = NULL, *session = NULL; | ||
2541 | unsigned char iv[EVP_MAX_IV_LENGTH]; | 2533 | unsigned char iv[EVP_MAX_IV_LENGTH]; |
2542 | unsigned char key_name[16]; | 2534 | unsigned char key_name[16]; |
2535 | unsigned char *hmac; | ||
2536 | unsigned int hlen; | ||
2537 | EVP_CIPHER_CTX ctx; | ||
2538 | HMAC_CTX hctx; | ||
2539 | int len; | ||
2540 | |||
2541 | /* | ||
2542 | * New Session Ticket - RFC 5077, section 3.3. | ||
2543 | */ | ||
2543 | 2544 | ||
2544 | EVP_CIPHER_CTX_init(&ctx); | 2545 | EVP_CIPHER_CTX_init(&ctx); |
2545 | HMAC_CTX_init(&hctx); | 2546 | HMAC_CTX_init(&hctx); |
@@ -2551,47 +2552,17 @@ ssl3_send_newsession_ticket(SSL *s) | |||
2551 | SSL3_MT_NEWSESSION_TICKET)) | 2552 | SSL3_MT_NEWSESSION_TICKET)) |
2552 | goto err; | 2553 | goto err; |
2553 | 2554 | ||
2554 | /* get session encoding length */ | 2555 | if (!SSL_SESSION_ticket(s->session, &session, &session_len)) |
2555 | slen_full = i2d_SSL_SESSION(s->session, NULL); | ||
2556 | /* | ||
2557 | * Some length values are 16 bits, so forget it if session is | ||
2558 | * too long | ||
2559 | */ | ||
2560 | if (slen_full > 0xFF00) | ||
2561 | goto err; | 2556 | goto err; |
2562 | senc = malloc(slen_full); | 2557 | if (session_len > 0xffff) |
2563 | if (!senc) | ||
2564 | goto err; | 2558 | goto err; |
2565 | p = senc; | ||
2566 | i2d_SSL_SESSION(s->session, &p); | ||
2567 | 2559 | ||
2568 | /* | 2560 | /* |
2569 | * Create a fresh copy (not shared with other threads) to | 2561 | * Initialize HMAC and cipher contexts. If callback is present |
2570 | * clean up | 2562 | * it does all the work, otherwise use generated values from |
2563 | * parent context. | ||
2571 | */ | 2564 | */ |
2572 | const_p = senc; | 2565 | if (tctx->internal->tlsext_ticket_key_cb != NULL) { |
2573 | sess = d2i_SSL_SESSION(NULL, &const_p, slen_full); | ||
2574 | if (sess == NULL) | ||
2575 | goto err; | ||
2576 | |||
2577 | /* ID is irrelevant for the ticket */ | ||
2578 | sess->session_id_length = 0; | ||
2579 | |||
2580 | slen = i2d_SSL_SESSION(sess, NULL); | ||
2581 | if (slen > slen_full) { | ||
2582 | /* shouldn't ever happen */ | ||
2583 | goto err; | ||
2584 | } | ||
2585 | p = senc; | ||
2586 | i2d_SSL_SESSION(sess, &p); | ||
2587 | SSL_SESSION_free(sess); | ||
2588 | |||
2589 | /* | ||
2590 | * Initialize HMAC and cipher contexts. If callback present | ||
2591 | * it does all the work otherwise use generated values | ||
2592 | * from parent ctx. | ||
2593 | */ | ||
2594 | if (tctx->internal->tlsext_ticket_key_cb) { | ||
2595 | if (tctx->internal->tlsext_ticket_key_cb(s, | 2566 | if (tctx->internal->tlsext_ticket_key_cb(s, |
2596 | key_name, iv, &ctx, &hctx, 1) < 0) { | 2567 | key_name, iv, &ctx, &hctx, 1) < 0) { |
2597 | EVP_CIPHER_CTX_cleanup(&ctx); | 2568 | EVP_CIPHER_CTX_cleanup(&ctx); |
@@ -2606,19 +2577,21 @@ ssl3_send_newsession_ticket(SSL *s) | |||
2606 | memcpy(key_name, tctx->internal->tlsext_tick_key_name, 16); | 2577 | memcpy(key_name, tctx->internal->tlsext_tick_key_name, 16); |
2607 | } | 2578 | } |
2608 | 2579 | ||
2609 | /* Encrypt the session ticket. */ | 2580 | /* Encrypt the session state. */ |
2610 | if ((enc_ticket = calloc(1, slen + EVP_MAX_BLOCK_LENGTH)) == NULL) | 2581 | enc_session_max_len = session_len + EVP_MAX_BLOCK_LENGTH; |
2582 | if ((enc_session = calloc(1, enc_session_max_len)) == NULL) | ||
2611 | goto err; | 2583 | goto err; |
2612 | enc_ticket_len = 0; | 2584 | enc_session_len = 0; |
2613 | if (!EVP_EncryptUpdate(&ctx, enc_ticket, &len, senc, slen)) | 2585 | if (!EVP_EncryptUpdate(&ctx, enc_session, &len, session, |
2586 | session_len)) | ||
2614 | goto err; | 2587 | goto err; |
2615 | enc_ticket_len += len; | 2588 | enc_session_len += len; |
2616 | if (!EVP_EncryptFinal_ex(&ctx, enc_ticket + enc_ticket_len, &len)) | 2589 | if (!EVP_EncryptFinal_ex(&ctx, enc_session + enc_session_len, |
2590 | &len)) | ||
2617 | goto err; | 2591 | goto err; |
2618 | enc_ticket_len += len; | 2592 | enc_session_len += len; |
2619 | 2593 | ||
2620 | if (enc_ticket_len < 0 || | 2594 | if (enc_session_len > enc_session_max_len) |
2621 | enc_ticket_len > slen + EVP_MAX_BLOCK_LENGTH) | ||
2622 | goto err; | 2595 | goto err; |
2623 | 2596 | ||
2624 | /* Generate the HMAC. */ | 2597 | /* Generate the HMAC. */ |
@@ -2626,7 +2599,7 @@ ssl3_send_newsession_ticket(SSL *s) | |||
2626 | goto err; | 2599 | goto err; |
2627 | if (!HMAC_Update(&hctx, iv, EVP_CIPHER_CTX_iv_length(&ctx))) | 2600 | if (!HMAC_Update(&hctx, iv, EVP_CIPHER_CTX_iv_length(&ctx))) |
2628 | goto err; | 2601 | goto err; |
2629 | if (!HMAC_Update(&hctx, enc_ticket, enc_ticket_len)) | 2602 | if (!HMAC_Update(&hctx, enc_session, enc_session_len)) |
2630 | goto err; | 2603 | goto err; |
2631 | 2604 | ||
2632 | if ((hmac_len = HMAC_size(&hctx)) <= 0) | 2605 | if ((hmac_len = HMAC_size(&hctx)) <= 0) |
@@ -2648,13 +2621,15 @@ ssl3_send_newsession_ticket(SSL *s) | |||
2648 | goto err; | 2621 | goto err; |
2649 | if (!CBB_add_bytes(&ticket, iv, EVP_CIPHER_CTX_iv_length(&ctx))) | 2622 | if (!CBB_add_bytes(&ticket, iv, EVP_CIPHER_CTX_iv_length(&ctx))) |
2650 | goto err; | 2623 | goto err; |
2651 | if (!CBB_add_bytes(&ticket, enc_ticket, enc_ticket_len)) | 2624 | if (!CBB_add_bytes(&ticket, enc_session, enc_session_len)) |
2652 | goto err; | 2625 | goto err; |
2653 | if (!CBB_add_space(&ticket, &hmac, hmac_len)) | 2626 | if (!CBB_add_space(&ticket, &hmac, hmac_len)) |
2654 | goto err; | 2627 | goto err; |
2655 | 2628 | ||
2656 | if (!HMAC_Final(&hctx, hmac, &hlen)) | 2629 | if (!HMAC_Final(&hctx, hmac, &hlen)) |
2657 | goto err; | 2630 | goto err; |
2631 | if (hlen != hmac_len) | ||
2632 | goto err; | ||
2658 | 2633 | ||
2659 | if (!ssl3_handshake_msg_finish(s, &cbb)) | 2634 | if (!ssl3_handshake_msg_finish(s, &cbb)) |
2660 | goto err; | 2635 | goto err; |
@@ -2664,8 +2639,8 @@ ssl3_send_newsession_ticket(SSL *s) | |||
2664 | 2639 | ||
2665 | EVP_CIPHER_CTX_cleanup(&ctx); | 2640 | EVP_CIPHER_CTX_cleanup(&ctx); |
2666 | HMAC_CTX_cleanup(&hctx); | 2641 | HMAC_CTX_cleanup(&hctx); |
2667 | freezero(senc, slen_full); | 2642 | freezero(session, session_len); |
2668 | free(enc_ticket); | 2643 | free(enc_session); |
2669 | 2644 | ||
2670 | /* SSL3_ST_SW_SESSION_TICKET_B */ | 2645 | /* SSL3_ST_SW_SESSION_TICKET_B */ |
2671 | return (ssl3_handshake_write(s)); | 2646 | return (ssl3_handshake_write(s)); |
@@ -2674,8 +2649,8 @@ ssl3_send_newsession_ticket(SSL *s) | |||
2674 | CBB_cleanup(&cbb); | 2649 | CBB_cleanup(&cbb); |
2675 | EVP_CIPHER_CTX_cleanup(&ctx); | 2650 | EVP_CIPHER_CTX_cleanup(&ctx); |
2676 | HMAC_CTX_cleanup(&hctx); | 2651 | HMAC_CTX_cleanup(&hctx); |
2677 | freezero(senc, slen_full); | 2652 | freezero(session, session_len); |
2678 | free(enc_ticket); | 2653 | free(enc_session); |
2679 | 2654 | ||
2680 | return (-1); | 2655 | return (-1); |
2681 | } | 2656 | } |