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