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