1*de0e0e4dSAntonio Huete Jimenez /* $OpenBSD: tls12_lib.c,v 1.5 2022/06/07 17:19:09 tb Exp $ */ 2*de0e0e4dSAntonio Huete Jimenez /* 3*de0e0e4dSAntonio Huete Jimenez * Copyright (c) 2021 Joel Sing <jsing@openbsd.org> 4*de0e0e4dSAntonio Huete Jimenez * 5*de0e0e4dSAntonio Huete Jimenez * Permission to use, copy, modify, and distribute this software for any 6*de0e0e4dSAntonio Huete Jimenez * purpose with or without fee is hereby granted, provided that the above 7*de0e0e4dSAntonio Huete Jimenez * copyright notice and this permission notice appear in all copies. 8*de0e0e4dSAntonio Huete Jimenez * 9*de0e0e4dSAntonio Huete Jimenez * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10*de0e0e4dSAntonio Huete Jimenez * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11*de0e0e4dSAntonio Huete Jimenez * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12*de0e0e4dSAntonio Huete Jimenez * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13*de0e0e4dSAntonio Huete Jimenez * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14*de0e0e4dSAntonio Huete Jimenez * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15*de0e0e4dSAntonio Huete Jimenez * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16*de0e0e4dSAntonio Huete Jimenez */ 17*de0e0e4dSAntonio Huete Jimenez 18*de0e0e4dSAntonio Huete Jimenez #include "ssl_locl.h" 19*de0e0e4dSAntonio Huete Jimenez 20*de0e0e4dSAntonio Huete Jimenez static int 21*de0e0e4dSAntonio Huete Jimenez tls12_finished_verify_data(SSL *s, const char *finished_label, 22*de0e0e4dSAntonio Huete Jimenez size_t finished_label_len, uint8_t *verify_data, size_t verify_data_len, 23*de0e0e4dSAntonio Huete Jimenez size_t *out_len) 24*de0e0e4dSAntonio Huete Jimenez { 25*de0e0e4dSAntonio Huete Jimenez uint8_t transcript_hash[EVP_MAX_MD_SIZE]; 26*de0e0e4dSAntonio Huete Jimenez size_t transcript_hash_len; 27*de0e0e4dSAntonio Huete Jimenez 28*de0e0e4dSAntonio Huete Jimenez *out_len = 0; 29*de0e0e4dSAntonio Huete Jimenez 30*de0e0e4dSAntonio Huete Jimenez if (s->session->master_key_length == 0) 31*de0e0e4dSAntonio Huete Jimenez return 0; 32*de0e0e4dSAntonio Huete Jimenez 33*de0e0e4dSAntonio Huete Jimenez if (verify_data_len < TLS1_FINISH_MAC_LENGTH) 34*de0e0e4dSAntonio Huete Jimenez return 0; 35*de0e0e4dSAntonio Huete Jimenez 36*de0e0e4dSAntonio Huete Jimenez if (!tls1_transcript_hash_value(s, transcript_hash, 37*de0e0e4dSAntonio Huete Jimenez sizeof(transcript_hash), &transcript_hash_len)) 38*de0e0e4dSAntonio Huete Jimenez return 0; 39*de0e0e4dSAntonio Huete Jimenez 40*de0e0e4dSAntonio Huete Jimenez if (!tls1_PRF(s, s->session->master_key, s->session->master_key_length, 41*de0e0e4dSAntonio Huete Jimenez finished_label, finished_label_len, transcript_hash, 42*de0e0e4dSAntonio Huete Jimenez transcript_hash_len, NULL, 0, NULL, 0, NULL, 0, verify_data, 43*de0e0e4dSAntonio Huete Jimenez TLS1_FINISH_MAC_LENGTH)) 44*de0e0e4dSAntonio Huete Jimenez return 0; 45*de0e0e4dSAntonio Huete Jimenez 46*de0e0e4dSAntonio Huete Jimenez *out_len = TLS1_FINISH_MAC_LENGTH; 47*de0e0e4dSAntonio Huete Jimenez 48*de0e0e4dSAntonio Huete Jimenez return 1; 49*de0e0e4dSAntonio Huete Jimenez } 50*de0e0e4dSAntonio Huete Jimenez 51*de0e0e4dSAntonio Huete Jimenez static int 52*de0e0e4dSAntonio Huete Jimenez tls12_client_finished_verify_data(SSL *s, uint8_t *verify_data, 53*de0e0e4dSAntonio Huete Jimenez size_t verify_data_len, size_t *out_len) 54*de0e0e4dSAntonio Huete Jimenez { 55*de0e0e4dSAntonio Huete Jimenez return tls12_finished_verify_data(s, TLS_MD_CLIENT_FINISH_CONST, 56*de0e0e4dSAntonio Huete Jimenez TLS_MD_CLIENT_FINISH_CONST_SIZE, verify_data, verify_data_len, 57*de0e0e4dSAntonio Huete Jimenez out_len); 58*de0e0e4dSAntonio Huete Jimenez } 59*de0e0e4dSAntonio Huete Jimenez 60*de0e0e4dSAntonio Huete Jimenez static int 61*de0e0e4dSAntonio Huete Jimenez tls12_server_finished_verify_data(SSL *s, uint8_t *verify_data, 62*de0e0e4dSAntonio Huete Jimenez size_t verify_data_len, size_t *out_len) 63*de0e0e4dSAntonio Huete Jimenez { 64*de0e0e4dSAntonio Huete Jimenez return tls12_finished_verify_data(s, TLS_MD_SERVER_FINISH_CONST, 65*de0e0e4dSAntonio Huete Jimenez TLS_MD_SERVER_FINISH_CONST_SIZE, verify_data, verify_data_len, 66*de0e0e4dSAntonio Huete Jimenez out_len); 67*de0e0e4dSAntonio Huete Jimenez } 68*de0e0e4dSAntonio Huete Jimenez 69*de0e0e4dSAntonio Huete Jimenez int 70*de0e0e4dSAntonio Huete Jimenez tls12_derive_finished(SSL *s) 71*de0e0e4dSAntonio Huete Jimenez { 72*de0e0e4dSAntonio Huete Jimenez if (!s->server) { 73*de0e0e4dSAntonio Huete Jimenez return tls12_client_finished_verify_data(s, 74*de0e0e4dSAntonio Huete Jimenez s->s3->hs.finished, sizeof(s->s3->hs.finished), 75*de0e0e4dSAntonio Huete Jimenez &s->s3->hs.finished_len); 76*de0e0e4dSAntonio Huete Jimenez } else { 77*de0e0e4dSAntonio Huete Jimenez return tls12_server_finished_verify_data(s, 78*de0e0e4dSAntonio Huete Jimenez s->s3->hs.finished, sizeof(s->s3->hs.finished), 79*de0e0e4dSAntonio Huete Jimenez &s->s3->hs.finished_len); 80*de0e0e4dSAntonio Huete Jimenez } 81*de0e0e4dSAntonio Huete Jimenez } 82*de0e0e4dSAntonio Huete Jimenez 83*de0e0e4dSAntonio Huete Jimenez int 84*de0e0e4dSAntonio Huete Jimenez tls12_derive_peer_finished(SSL *s) 85*de0e0e4dSAntonio Huete Jimenez { 86*de0e0e4dSAntonio Huete Jimenez if (s->server) { 87*de0e0e4dSAntonio Huete Jimenez return tls12_client_finished_verify_data(s, 88*de0e0e4dSAntonio Huete Jimenez s->s3->hs.peer_finished, sizeof(s->s3->hs.peer_finished), 89*de0e0e4dSAntonio Huete Jimenez &s->s3->hs.peer_finished_len); 90*de0e0e4dSAntonio Huete Jimenez } else { 91*de0e0e4dSAntonio Huete Jimenez return tls12_server_finished_verify_data(s, 92*de0e0e4dSAntonio Huete Jimenez s->s3->hs.peer_finished, sizeof(s->s3->hs.peer_finished), 93*de0e0e4dSAntonio Huete Jimenez &s->s3->hs.peer_finished_len); 94*de0e0e4dSAntonio Huete Jimenez } 95*de0e0e4dSAntonio Huete Jimenez } 96*de0e0e4dSAntonio Huete Jimenez 97*de0e0e4dSAntonio Huete Jimenez int 98*de0e0e4dSAntonio Huete Jimenez tls12_derive_master_secret(SSL *s, uint8_t *premaster_secret, 99*de0e0e4dSAntonio Huete Jimenez size_t premaster_secret_len) 100*de0e0e4dSAntonio Huete Jimenez { 101*de0e0e4dSAntonio Huete Jimenez s->session->master_key_length = 0; 102*de0e0e4dSAntonio Huete Jimenez 103*de0e0e4dSAntonio Huete Jimenez if (premaster_secret_len == 0) 104*de0e0e4dSAntonio Huete Jimenez return 0; 105*de0e0e4dSAntonio Huete Jimenez 106*de0e0e4dSAntonio Huete Jimenez CTASSERT(sizeof(s->session->master_key) == SSL_MAX_MASTER_KEY_LENGTH); 107*de0e0e4dSAntonio Huete Jimenez 108*de0e0e4dSAntonio Huete Jimenez if (!tls1_PRF(s, premaster_secret, premaster_secret_len, 109*de0e0e4dSAntonio Huete Jimenez TLS_MD_MASTER_SECRET_CONST, TLS_MD_MASTER_SECRET_CONST_SIZE, 110*de0e0e4dSAntonio Huete Jimenez s->s3->client_random, SSL3_RANDOM_SIZE, NULL, 0, 111*de0e0e4dSAntonio Huete Jimenez s->s3->server_random, SSL3_RANDOM_SIZE, NULL, 0, 112*de0e0e4dSAntonio Huete Jimenez s->session->master_key, sizeof(s->session->master_key))) 113*de0e0e4dSAntonio Huete Jimenez return 0; 114*de0e0e4dSAntonio Huete Jimenez 115*de0e0e4dSAntonio Huete Jimenez s->session->master_key_length = SSL_MAX_MASTER_KEY_LENGTH; 116*de0e0e4dSAntonio Huete Jimenez 117*de0e0e4dSAntonio Huete Jimenez return 1; 118*de0e0e4dSAntonio Huete Jimenez } 119