diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libssl/t1_lib.c | 53 |
1 files changed, 29 insertions, 24 deletions
diff --git a/src/lib/libssl/t1_lib.c b/src/lib/libssl/t1_lib.c index 2bae50f5b3..3cde388d6d 100644 --- a/src/lib/libssl/t1_lib.c +++ b/src/lib/libssl/t1_lib.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: t1_lib.c,v 1.162 2019/04/25 04:48:56 jsing Exp $ */ | 1 | /* $OpenBSD: t1_lib.c,v 1.163 2019/04/25 04:54:35 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 | * |
| @@ -875,19 +875,17 @@ tls_decrypt_ticket(SSL *s, CBS *session_id, CBS *ticket, SSL_SESSION **psess) | |||
| 875 | { | 875 | { |
| 876 | CBS ticket_name, ticket_iv, ticket_encdata, ticket_hmac; | 876 | CBS ticket_name, ticket_iv, ticket_encdata, ticket_hmac; |
| 877 | SSL_SESSION *sess = NULL; | 877 | SSL_SESSION *sess = NULL; |
| 878 | size_t session_id_len = 0; | 878 | size_t session_id_len; |
| 879 | unsigned char *sdec = NULL; | 879 | unsigned char *sdec = NULL; |
| 880 | const unsigned char *p; | 880 | const unsigned char *p; |
| 881 | int slen, hlen, renew_ticket = 0; | ||
| 882 | unsigned char hmac[EVP_MAX_MD_SIZE]; | 881 | unsigned char hmac[EVP_MAX_MD_SIZE]; |
| 883 | HMAC_CTX hctx; | 882 | HMAC_CTX *hctx = NULL; |
| 884 | EVP_CIPHER_CTX cctx; | 883 | EVP_CIPHER_CTX *cctx = NULL; |
| 885 | SSL_CTX *tctx = s->initial_ctx; | 884 | SSL_CTX *tctx = s->initial_ctx; |
| 885 | int slen, hlen; | ||
| 886 | int renew_ticket = 0; | ||
| 886 | int ret = -1; | 887 | int ret = -1; |
| 887 | 888 | ||
| 888 | HMAC_CTX_init(&hctx); | ||
| 889 | EVP_CIPHER_CTX_init(&cctx); | ||
| 890 | |||
| 891 | *psess = NULL; | 889 | *psess = NULL; |
| 892 | 890 | ||
| 893 | if (!CBS_get_bytes(ticket, &ticket_name, 16)) | 891 | if (!CBS_get_bytes(ticket, &ticket_name, 16)) |
| @@ -896,6 +894,11 @@ tls_decrypt_ticket(SSL *s, CBS *session_id, CBS *ticket, SSL_SESSION **psess) | |||
| 896 | /* | 894 | /* |
| 897 | * Initialize session ticket encryption and HMAC contexts. | 895 | * Initialize session ticket encryption and HMAC contexts. |
| 898 | */ | 896 | */ |
| 897 | if ((cctx = EVP_CIPHER_CTX_new()) == NULL) | ||
| 898 | goto err; | ||
| 899 | if ((hctx = HMAC_CTX_new()) == NULL) | ||
| 900 | goto err; | ||
| 901 | |||
| 899 | if (tctx->internal->tlsext_ticket_key_cb != NULL) { | 902 | if (tctx->internal->tlsext_ticket_key_cb != NULL) { |
| 900 | int rv; | 903 | int rv; |
| 901 | 904 | ||
| @@ -910,7 +913,7 @@ tls_decrypt_ticket(SSL *s, CBS *session_id, CBS *ticket, SSL_SESSION **psess) | |||
| 910 | 913 | ||
| 911 | if ((rv = tctx->internal->tlsext_ticket_key_cb(s, | 914 | if ((rv = tctx->internal->tlsext_ticket_key_cb(s, |
| 912 | (unsigned char *)CBS_data(&ticket_name), | 915 | (unsigned char *)CBS_data(&ticket_name), |
| 913 | (unsigned char *)CBS_data(ticket), &cctx, &hctx, 0)) < 0) | 916 | (unsigned char *)CBS_data(ticket), cctx, hctx, 0)) < 0) |
| 914 | goto err; | 917 | goto err; |
| 915 | if (rv == 0) | 918 | if (rv == 0) |
| 916 | goto derr; | 919 | goto derr; |
| @@ -922,7 +925,7 @@ tls_decrypt_ticket(SSL *s, CBS *session_id, CBS *ticket, SSL_SESSION **psess) | |||
| 922 | * the IV since its length is known. | 925 | * the IV since its length is known. |
| 923 | */ | 926 | */ |
| 924 | if (!CBS_get_bytes(ticket, &ticket_iv, | 927 | if (!CBS_get_bytes(ticket, &ticket_iv, |
| 925 | EVP_CIPHER_CTX_iv_length(&cctx))) | 928 | EVP_CIPHER_CTX_iv_length(cctx))) |
| 926 | goto derr; | 929 | goto derr; |
| 927 | } else { | 930 | } else { |
| 928 | /* Check that the key name matches. */ | 931 | /* Check that the key name matches. */ |
| @@ -930,21 +933,23 @@ tls_decrypt_ticket(SSL *s, CBS *session_id, CBS *ticket, SSL_SESSION **psess) | |||
| 930 | tctx->internal->tlsext_tick_key_name, | 933 | tctx->internal->tlsext_tick_key_name, |
| 931 | sizeof(tctx->internal->tlsext_tick_key_name))) | 934 | sizeof(tctx->internal->tlsext_tick_key_name))) |
| 932 | goto derr; | 935 | goto derr; |
| 933 | HMAC_Init_ex(&hctx, tctx->internal->tlsext_tick_hmac_key, | ||
| 934 | sizeof(tctx->internal->tlsext_tick_hmac_key), EVP_sha256(), | ||
| 935 | NULL); | ||
| 936 | if (!CBS_get_bytes(ticket, &ticket_iv, | 936 | if (!CBS_get_bytes(ticket, &ticket_iv, |
| 937 | EVP_CIPHER_iv_length(EVP_aes_128_cbc()))) | 937 | EVP_CIPHER_iv_length(EVP_aes_128_cbc()))) |
| 938 | goto derr; | 938 | goto derr; |
| 939 | EVP_DecryptInit_ex(&cctx, EVP_aes_128_cbc(), NULL, | 939 | if (!EVP_DecryptInit_ex(cctx, EVP_aes_128_cbc(), NULL, |
| 940 | tctx->internal->tlsext_tick_aes_key, CBS_data(&ticket_iv)); | 940 | tctx->internal->tlsext_tick_aes_key, CBS_data(&ticket_iv))) |
| 941 | goto err; | ||
| 942 | if (!HMAC_Init_ex(hctx, tctx->internal->tlsext_tick_hmac_key, | ||
| 943 | sizeof(tctx->internal->tlsext_tick_hmac_key), EVP_sha256(), | ||
| 944 | NULL)) | ||
| 945 | goto err; | ||
| 941 | } | 946 | } |
| 942 | 947 | ||
| 943 | /* | 948 | /* |
| 944 | * Attempt to process session ticket. | 949 | * Attempt to process session ticket. |
| 945 | */ | 950 | */ |
| 946 | 951 | ||
| 947 | if ((hlen = HMAC_size(&hctx)) < 0) | 952 | if ((hlen = HMAC_size(hctx)) < 0) |
| 948 | goto err; | 953 | goto err; |
| 949 | 954 | ||
| 950 | if (hlen > CBS_len(ticket)) | 955 | if (hlen > CBS_len(ticket)) |
| @@ -957,16 +962,16 @@ tls_decrypt_ticket(SSL *s, CBS *session_id, CBS *ticket, SSL_SESSION **psess) | |||
| 957 | goto err; | 962 | goto err; |
| 958 | 963 | ||
| 959 | /* Check HMAC of encrypted ticket. */ | 964 | /* Check HMAC of encrypted ticket. */ |
| 960 | if (HMAC_Update(&hctx, CBS_data(&ticket_name), | 965 | if (HMAC_Update(hctx, CBS_data(&ticket_name), |
| 961 | CBS_len(&ticket_name)) <= 0) | 966 | CBS_len(&ticket_name)) <= 0) |
| 962 | goto err; | 967 | goto err; |
| 963 | if (HMAC_Update(&hctx, CBS_data(&ticket_iv), | 968 | if (HMAC_Update(hctx, CBS_data(&ticket_iv), |
| 964 | CBS_len(&ticket_iv)) <= 0) | 969 | CBS_len(&ticket_iv)) <= 0) |
| 965 | goto err; | 970 | goto err; |
| 966 | if (HMAC_Update(&hctx, CBS_data(&ticket_encdata), | 971 | if (HMAC_Update(hctx, CBS_data(&ticket_encdata), |
| 967 | CBS_len(&ticket_encdata)) <= 0) | 972 | CBS_len(&ticket_encdata)) <= 0) |
| 968 | goto err; | 973 | goto err; |
| 969 | if (HMAC_Final(&hctx, hmac, &hlen) <= 0) | 974 | if (HMAC_Final(hctx, hmac, &hlen) <= 0) |
| 970 | goto err; | 975 | goto err; |
| 971 | 976 | ||
| 972 | if (!CBS_mem_equal(&ticket_hmac, hmac, hlen)) | 977 | if (!CBS_mem_equal(&ticket_hmac, hmac, hlen)) |
| @@ -975,10 +980,10 @@ tls_decrypt_ticket(SSL *s, CBS *session_id, CBS *ticket, SSL_SESSION **psess) | |||
| 975 | /* Attempt to decrypt session data. */ | 980 | /* Attempt to decrypt session data. */ |
| 976 | if ((sdec = malloc(CBS_len(&ticket_encdata))) == NULL) | 981 | if ((sdec = malloc(CBS_len(&ticket_encdata))) == NULL) |
| 977 | goto err; | 982 | goto err; |
| 978 | if (EVP_DecryptUpdate(&cctx, sdec, &slen, CBS_data(&ticket_encdata), | 983 | if (EVP_DecryptUpdate(cctx, sdec, &slen, CBS_data(&ticket_encdata), |
| 979 | CBS_len(&ticket_encdata)) <= 0) | 984 | CBS_len(&ticket_encdata)) <= 0) |
| 980 | goto derr; | 985 | goto derr; |
| 981 | if (EVP_DecryptFinal_ex(&cctx, sdec + slen, &hlen) <= 0) | 986 | if (EVP_DecryptFinal_ex(cctx, sdec + slen, &hlen) <= 0) |
| 982 | goto derr; | 987 | goto derr; |
| 983 | 988 | ||
| 984 | slen += hlen; | 989 | slen += hlen; |
| @@ -1021,8 +1026,8 @@ tls_decrypt_ticket(SSL *s, CBS *session_id, CBS *ticket, SSL_SESSION **psess) | |||
| 1021 | 1026 | ||
| 1022 | done: | 1027 | done: |
| 1023 | free(sdec); | 1028 | free(sdec); |
| 1024 | HMAC_CTX_cleanup(&hctx); | 1029 | EVP_CIPHER_CTX_free(cctx); |
| 1025 | EVP_CIPHER_CTX_cleanup(&cctx); | 1030 | HMAC_CTX_free(hctx); |
| 1026 | SSL_SESSION_free(sess); | 1031 | SSL_SESSION_free(sess); |
| 1027 | 1032 | ||
| 1028 | if (ret == 2) | 1033 | if (ret == 2) |
