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