xref: /openbsd-src/lib/libssl/tls12_lib.c (revision c9675a23de50ec5aa20be3956f170f2eccffb293)
1*c9675a23Stb /*	$OpenBSD: tls12_lib.c,v 1.6 2022/11/26 16:08:56 tb Exp $ */
2643d65b6Sjsing /*
3643d65b6Sjsing  * Copyright (c) 2021 Joel Sing <jsing@openbsd.org>
4643d65b6Sjsing  *
5643d65b6Sjsing  * Permission to use, copy, modify, and distribute this software for any
6643d65b6Sjsing  * purpose with or without fee is hereby granted, provided that the above
7643d65b6Sjsing  * copyright notice and this permission notice appear in all copies.
8643d65b6Sjsing  *
9643d65b6Sjsing  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10643d65b6Sjsing  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11643d65b6Sjsing  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12643d65b6Sjsing  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13643d65b6Sjsing  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14643d65b6Sjsing  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15643d65b6Sjsing  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16643d65b6Sjsing  */
17643d65b6Sjsing 
18*c9675a23Stb #include "ssl_local.h"
19643d65b6Sjsing 
20643d65b6Sjsing 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)21643d65b6Sjsing tls12_finished_verify_data(SSL *s, const char *finished_label,
22643d65b6Sjsing     size_t finished_label_len, uint8_t *verify_data, size_t verify_data_len,
23643d65b6Sjsing     size_t *out_len)
24643d65b6Sjsing {
25643d65b6Sjsing 	uint8_t transcript_hash[EVP_MAX_MD_SIZE];
26643d65b6Sjsing 	size_t transcript_hash_len;
27643d65b6Sjsing 
28643d65b6Sjsing 	*out_len = 0;
29643d65b6Sjsing 
30388ab3bcStb 	if (s->session->master_key_length == 0)
31f55f2bcfSjsing 		return 0;
32f55f2bcfSjsing 
33643d65b6Sjsing 	if (verify_data_len < TLS1_FINISH_MAC_LENGTH)
34643d65b6Sjsing 		return 0;
35643d65b6Sjsing 
36643d65b6Sjsing 	if (!tls1_transcript_hash_value(s, transcript_hash,
37643d65b6Sjsing 	    sizeof(transcript_hash), &transcript_hash_len))
38643d65b6Sjsing 		return 0;
39643d65b6Sjsing 
40643d65b6Sjsing 	if (!tls1_PRF(s, s->session->master_key, s->session->master_key_length,
41643d65b6Sjsing 	    finished_label, finished_label_len, transcript_hash,
42643d65b6Sjsing 	    transcript_hash_len, NULL, 0, NULL, 0, NULL, 0, verify_data,
43643d65b6Sjsing 	    TLS1_FINISH_MAC_LENGTH))
44643d65b6Sjsing 		return 0;
45643d65b6Sjsing 
46643d65b6Sjsing 	*out_len = TLS1_FINISH_MAC_LENGTH;
47643d65b6Sjsing 
48643d65b6Sjsing 	return 1;
49643d65b6Sjsing }
50643d65b6Sjsing 
51643d65b6Sjsing static int
tls12_client_finished_verify_data(SSL * s,uint8_t * verify_data,size_t verify_data_len,size_t * out_len)52643d65b6Sjsing tls12_client_finished_verify_data(SSL *s, uint8_t *verify_data,
53643d65b6Sjsing     size_t verify_data_len, size_t *out_len)
54643d65b6Sjsing {
55643d65b6Sjsing 	return tls12_finished_verify_data(s, TLS_MD_CLIENT_FINISH_CONST,
56643d65b6Sjsing 	    TLS_MD_CLIENT_FINISH_CONST_SIZE, verify_data, verify_data_len,
57643d65b6Sjsing 	    out_len);
58643d65b6Sjsing }
59643d65b6Sjsing 
60643d65b6Sjsing static int
tls12_server_finished_verify_data(SSL * s,uint8_t * verify_data,size_t verify_data_len,size_t * out_len)61643d65b6Sjsing tls12_server_finished_verify_data(SSL *s, uint8_t *verify_data,
62643d65b6Sjsing     size_t verify_data_len, size_t *out_len)
63643d65b6Sjsing {
64643d65b6Sjsing 	return tls12_finished_verify_data(s, TLS_MD_SERVER_FINISH_CONST,
65643d65b6Sjsing 	    TLS_MD_SERVER_FINISH_CONST_SIZE, verify_data, verify_data_len,
66643d65b6Sjsing 	    out_len);
67643d65b6Sjsing }
68643d65b6Sjsing 
69643d65b6Sjsing int
tls12_derive_finished(SSL * s)70643d65b6Sjsing tls12_derive_finished(SSL *s)
71643d65b6Sjsing {
72643d65b6Sjsing 	if (!s->server) {
73643d65b6Sjsing 		return tls12_client_finished_verify_data(s,
7402876cc3Sjsing 		    s->s3->hs.finished, sizeof(s->s3->hs.finished),
7502876cc3Sjsing 		    &s->s3->hs.finished_len);
76643d65b6Sjsing 	} else {
77643d65b6Sjsing 		return tls12_server_finished_verify_data(s,
7802876cc3Sjsing 		    s->s3->hs.finished, sizeof(s->s3->hs.finished),
7902876cc3Sjsing 		    &s->s3->hs.finished_len);
80643d65b6Sjsing 	}
81643d65b6Sjsing }
82643d65b6Sjsing 
83643d65b6Sjsing int
tls12_derive_peer_finished(SSL * s)84643d65b6Sjsing tls12_derive_peer_finished(SSL *s)
85643d65b6Sjsing {
86643d65b6Sjsing 	if (s->server) {
87643d65b6Sjsing 		return tls12_client_finished_verify_data(s,
8802876cc3Sjsing 		    s->s3->hs.peer_finished, sizeof(s->s3->hs.peer_finished),
8902876cc3Sjsing 		    &s->s3->hs.peer_finished_len);
90643d65b6Sjsing 	} else {
91643d65b6Sjsing 		return tls12_server_finished_verify_data(s,
9202876cc3Sjsing 		    s->s3->hs.peer_finished, sizeof(s->s3->hs.peer_finished),
9302876cc3Sjsing 		    &s->s3->hs.peer_finished_len);
94643d65b6Sjsing 	}
95643d65b6Sjsing }
96155a0ed0Sjsing 
97155a0ed0Sjsing int
tls12_derive_master_secret(SSL * s,uint8_t * premaster_secret,size_t premaster_secret_len)98155a0ed0Sjsing tls12_derive_master_secret(SSL *s, uint8_t *premaster_secret,
99155a0ed0Sjsing     size_t premaster_secret_len)
100155a0ed0Sjsing {
101155a0ed0Sjsing 	s->session->master_key_length = 0;
102155a0ed0Sjsing 
103155a0ed0Sjsing 	if (premaster_secret_len == 0)
104155a0ed0Sjsing 		return 0;
105155a0ed0Sjsing 
106155a0ed0Sjsing 	CTASSERT(sizeof(s->session->master_key) == SSL_MAX_MASTER_KEY_LENGTH);
107155a0ed0Sjsing 
108155a0ed0Sjsing 	if (!tls1_PRF(s, premaster_secret, premaster_secret_len,
109155a0ed0Sjsing 	    TLS_MD_MASTER_SECRET_CONST, TLS_MD_MASTER_SECRET_CONST_SIZE,
110155a0ed0Sjsing 	    s->s3->client_random, SSL3_RANDOM_SIZE, NULL, 0,
111155a0ed0Sjsing 	    s->s3->server_random, SSL3_RANDOM_SIZE, NULL, 0,
112155a0ed0Sjsing 	    s->session->master_key, sizeof(s->session->master_key)))
113155a0ed0Sjsing 		return 0;
114155a0ed0Sjsing 
115155a0ed0Sjsing 	s->session->master_key_length = SSL_MAX_MASTER_KEY_LENGTH;
116155a0ed0Sjsing 
117155a0ed0Sjsing 	return 1;
118155a0ed0Sjsing }
119