xref: /dflybsd-src/crypto/libressl/ssl/tls12_lib.c (revision 961e30ea7dc61d1112b778ea4981eac68129fb86)
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
tls12_finished_verify_data(SSL * s,const char * finished_label,size_t finished_label_len,uint8_t * verify_data,size_t verify_data_len,size_t * out_len)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
tls12_client_finished_verify_data(SSL * s,uint8_t * verify_data,size_t verify_data_len,size_t * out_len)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
tls12_server_finished_verify_data(SSL * s,uint8_t * verify_data,size_t verify_data_len,size_t * out_len)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
tls12_derive_finished(SSL * s)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
tls12_derive_peer_finished(SSL * s)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
tls12_derive_master_secret(SSL * s,uint8_t * premaster_secret,size_t premaster_secret_len)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