1*e0c4386eSCy Schubert /*
2*e0c4386eSCy Schubert * Copyright 2016-2021 The OpenSSL Project Authors. All Rights Reserved.
3*e0c4386eSCy Schubert *
4*e0c4386eSCy Schubert * Licensed under the Apache License 2.0 (the "License"). You may not use
5*e0c4386eSCy Schubert * this file except in compliance with the License. You can obtain a copy
6*e0c4386eSCy Schubert * in the file LICENSE in the source distribution or at
7*e0c4386eSCy Schubert * https://www.openssl.org/source/license.html
8*e0c4386eSCy Schubert */
9*e0c4386eSCy Schubert
10*e0c4386eSCy Schubert #include <openssl/ssl.h>
11*e0c4386eSCy Schubert #include <openssl/evp.h>
12*e0c4386eSCy Schubert
13*e0c4386eSCy Schubert #include "../ssl/ssl_local.h"
14*e0c4386eSCy Schubert #include "testutil.h"
15*e0c4386eSCy Schubert
16*e0c4386eSCy Schubert #define IVLEN 12
17*e0c4386eSCy Schubert #define KEYLEN 16
18*e0c4386eSCy Schubert
19*e0c4386eSCy Schubert /*
20*e0c4386eSCy Schubert * Based on the test vectors available in:
21*e0c4386eSCy Schubert * https://tools.ietf.org/html/draft-ietf-tls-tls13-vectors-06
22*e0c4386eSCy Schubert */
23*e0c4386eSCy Schubert
24*e0c4386eSCy Schubert static unsigned char hs_start_hash[] = {
25*e0c4386eSCy Schubert 0xc6, 0xc9, 0x18, 0xad, 0x2f, 0x41, 0x99, 0xd5, 0x59, 0x8e, 0xaf, 0x01, 0x16,
26*e0c4386eSCy Schubert 0xcb, 0x7a, 0x5c, 0x2c, 0x14, 0xcb, 0x54, 0x78, 0x12, 0x18, 0x88, 0x8d, 0xb7,
27*e0c4386eSCy Schubert 0x03, 0x0d, 0xd5, 0x0d, 0x5e, 0x6d
28*e0c4386eSCy Schubert };
29*e0c4386eSCy Schubert
30*e0c4386eSCy Schubert static unsigned char hs_full_hash[] = {
31*e0c4386eSCy Schubert 0xf8, 0xc1, 0x9e, 0x8c, 0x77, 0xc0, 0x38, 0x79, 0xbb, 0xc8, 0xeb, 0x6d, 0x56,
32*e0c4386eSCy Schubert 0xe0, 0x0d, 0xd5, 0xd8, 0x6e, 0xf5, 0x59, 0x27, 0xee, 0xfc, 0x08, 0xe1, 0xb0,
33*e0c4386eSCy Schubert 0x02, 0xb6, 0xec, 0xe0, 0x5d, 0xbf
34*e0c4386eSCy Schubert };
35*e0c4386eSCy Schubert
36*e0c4386eSCy Schubert static unsigned char early_secret[] = {
37*e0c4386eSCy Schubert 0x33, 0xad, 0x0a, 0x1c, 0x60, 0x7e, 0xc0, 0x3b, 0x09, 0xe6, 0xcd, 0x98, 0x93,
38*e0c4386eSCy Schubert 0x68, 0x0c, 0xe2, 0x10, 0xad, 0xf3, 0x00, 0xaa, 0x1f, 0x26, 0x60, 0xe1, 0xb2,
39*e0c4386eSCy Schubert 0x2e, 0x10, 0xf1, 0x70, 0xf9, 0x2a
40*e0c4386eSCy Schubert };
41*e0c4386eSCy Schubert
42*e0c4386eSCy Schubert static unsigned char ecdhe_secret[] = {
43*e0c4386eSCy Schubert 0x81, 0x51, 0xd1, 0x46, 0x4c, 0x1b, 0x55, 0x53, 0x36, 0x23, 0xb9, 0xc2, 0x24,
44*e0c4386eSCy Schubert 0x6a, 0x6a, 0x0e, 0x6e, 0x7e, 0x18, 0x50, 0x63, 0xe1, 0x4a, 0xfd, 0xaf, 0xf0,
45*e0c4386eSCy Schubert 0xb6, 0xe1, 0xc6, 0x1a, 0x86, 0x42
46*e0c4386eSCy Schubert };
47*e0c4386eSCy Schubert
48*e0c4386eSCy Schubert static unsigned char handshake_secret[] = {
49*e0c4386eSCy Schubert 0x5b, 0x4f, 0x96, 0x5d, 0xf0, 0x3c, 0x68, 0x2c, 0x46, 0xe6, 0xee, 0x86, 0xc3,
50*e0c4386eSCy Schubert 0x11, 0x63, 0x66, 0x15, 0xa1, 0xd2, 0xbb, 0xb2, 0x43, 0x45, 0xc2, 0x52, 0x05,
51*e0c4386eSCy Schubert 0x95, 0x3c, 0x87, 0x9e, 0x8d, 0x06
52*e0c4386eSCy Schubert };
53*e0c4386eSCy Schubert
54*e0c4386eSCy Schubert static const char *client_hts_label = "c hs traffic";
55*e0c4386eSCy Schubert
56*e0c4386eSCy Schubert static unsigned char client_hts[] = {
57*e0c4386eSCy Schubert 0xe2, 0xe2, 0x32, 0x07, 0xbd, 0x93, 0xfb, 0x7f, 0xe4, 0xfc, 0x2e, 0x29, 0x7a,
58*e0c4386eSCy Schubert 0xfe, 0xab, 0x16, 0x0e, 0x52, 0x2b, 0x5a, 0xb7, 0x5d, 0x64, 0xa8, 0x6e, 0x75,
59*e0c4386eSCy Schubert 0xbc, 0xac, 0x3f, 0x3e, 0x51, 0x03
60*e0c4386eSCy Schubert };
61*e0c4386eSCy Schubert
62*e0c4386eSCy Schubert static unsigned char client_hts_key[] = {
63*e0c4386eSCy Schubert 0x26, 0x79, 0xa4, 0x3e, 0x1d, 0x76, 0x78, 0x40, 0x34, 0xea, 0x17, 0x97, 0xd5,
64*e0c4386eSCy Schubert 0xad, 0x26, 0x49
65*e0c4386eSCy Schubert };
66*e0c4386eSCy Schubert
67*e0c4386eSCy Schubert static unsigned char client_hts_iv[] = {
68*e0c4386eSCy Schubert 0x54, 0x82, 0x40, 0x52, 0x90, 0xdd, 0x0d, 0x2f, 0x81, 0xc0, 0xd9, 0x42
69*e0c4386eSCy Schubert };
70*e0c4386eSCy Schubert
71*e0c4386eSCy Schubert static const char *server_hts_label = "s hs traffic";
72*e0c4386eSCy Schubert
73*e0c4386eSCy Schubert static unsigned char server_hts[] = {
74*e0c4386eSCy Schubert 0x3b, 0x7a, 0x83, 0x9c, 0x23, 0x9e, 0xf2, 0xbf, 0x0b, 0x73, 0x05, 0xa0, 0xe0,
75*e0c4386eSCy Schubert 0xc4, 0xe5, 0xa8, 0xc6, 0xc6, 0x93, 0x30, 0xa7, 0x53, 0xb3, 0x08, 0xf5, 0xe3,
76*e0c4386eSCy Schubert 0xa8, 0x3a, 0xa2, 0xef, 0x69, 0x79
77*e0c4386eSCy Schubert };
78*e0c4386eSCy Schubert
79*e0c4386eSCy Schubert static unsigned char server_hts_key[] = {
80*e0c4386eSCy Schubert 0xc6, 0x6c, 0xb1, 0xae, 0xc5, 0x19, 0xdf, 0x44, 0xc9, 0x1e, 0x10, 0x99, 0x55,
81*e0c4386eSCy Schubert 0x11, 0xac, 0x8b
82*e0c4386eSCy Schubert };
83*e0c4386eSCy Schubert
84*e0c4386eSCy Schubert static unsigned char server_hts_iv[] = {
85*e0c4386eSCy Schubert 0xf7, 0xf6, 0x88, 0x4c, 0x49, 0x81, 0x71, 0x6c, 0x2d, 0x0d, 0x29, 0xa4
86*e0c4386eSCy Schubert };
87*e0c4386eSCy Schubert
88*e0c4386eSCy Schubert static unsigned char master_secret[] = {
89*e0c4386eSCy Schubert 0x5c, 0x79, 0xd1, 0x69, 0x42, 0x4e, 0x26, 0x2b, 0x56, 0x32, 0x03, 0x62, 0x7b,
90*e0c4386eSCy Schubert 0xe4, 0xeb, 0x51, 0x03, 0x3f, 0x58, 0x8c, 0x43, 0xc9, 0xce, 0x03, 0x73, 0x37,
91*e0c4386eSCy Schubert 0x2d, 0xbc, 0xbc, 0x01, 0x85, 0xa7
92*e0c4386eSCy Schubert };
93*e0c4386eSCy Schubert
94*e0c4386eSCy Schubert static const char *client_ats_label = "c ap traffic";
95*e0c4386eSCy Schubert
96*e0c4386eSCy Schubert static unsigned char client_ats[] = {
97*e0c4386eSCy Schubert 0xe2, 0xf0, 0xdb, 0x6a, 0x82, 0xe8, 0x82, 0x80, 0xfc, 0x26, 0xf7, 0x3c, 0x89,
98*e0c4386eSCy Schubert 0x85, 0x4e, 0xe8, 0x61, 0x5e, 0x25, 0xdf, 0x28, 0xb2, 0x20, 0x79, 0x62, 0xfa,
99*e0c4386eSCy Schubert 0x78, 0x22, 0x26, 0xb2, 0x36, 0x26
100*e0c4386eSCy Schubert };
101*e0c4386eSCy Schubert
102*e0c4386eSCy Schubert static unsigned char client_ats_key[] = {
103*e0c4386eSCy Schubert 0x88, 0xb9, 0x6a, 0xd6, 0x86, 0xc8, 0x4b, 0xe5, 0x5a, 0xce, 0x18, 0xa5, 0x9c,
104*e0c4386eSCy Schubert 0xce, 0x5c, 0x87
105*e0c4386eSCy Schubert };
106*e0c4386eSCy Schubert
107*e0c4386eSCy Schubert static unsigned char client_ats_iv[] = {
108*e0c4386eSCy Schubert 0xb9, 0x9d, 0xc5, 0x8c, 0xd5, 0xff, 0x5a, 0xb0, 0x82, 0xfd, 0xad, 0x19
109*e0c4386eSCy Schubert };
110*e0c4386eSCy Schubert
111*e0c4386eSCy Schubert static const char *server_ats_label = "s ap traffic";
112*e0c4386eSCy Schubert
113*e0c4386eSCy Schubert static unsigned char server_ats[] = {
114*e0c4386eSCy Schubert 0x5b, 0x73, 0xb1, 0x08, 0xd9, 0xac, 0x1b, 0x9b, 0x0c, 0x82, 0x48, 0xca, 0x39,
115*e0c4386eSCy Schubert 0x26, 0xec, 0x6e, 0x7b, 0xc4, 0x7e, 0x41, 0x17, 0x06, 0x96, 0x39, 0x87, 0xec,
116*e0c4386eSCy Schubert 0x11, 0x43, 0x5d, 0x30, 0x57, 0x19
117*e0c4386eSCy Schubert };
118*e0c4386eSCy Schubert
119*e0c4386eSCy Schubert static unsigned char server_ats_key[] = {
120*e0c4386eSCy Schubert 0xa6, 0x88, 0xeb, 0xb5, 0xac, 0x82, 0x6d, 0x6f, 0x42, 0xd4, 0x5c, 0x0c, 0xc4,
121*e0c4386eSCy Schubert 0x4b, 0x9b, 0x7d
122*e0c4386eSCy Schubert };
123*e0c4386eSCy Schubert
124*e0c4386eSCy Schubert static unsigned char server_ats_iv[] = {
125*e0c4386eSCy Schubert 0xc1, 0xca, 0xd4, 0x42, 0x5a, 0x43, 0x8b, 0x5d, 0xe7, 0x14, 0x83, 0x0a
126*e0c4386eSCy Schubert };
127*e0c4386eSCy Schubert
128*e0c4386eSCy Schubert /* Mocked out implementations of various functions */
ssl3_digest_cached_records(SSL * s,int keep)129*e0c4386eSCy Schubert int ssl3_digest_cached_records(SSL *s, int keep)
130*e0c4386eSCy Schubert {
131*e0c4386eSCy Schubert return 1;
132*e0c4386eSCy Schubert }
133*e0c4386eSCy Schubert
134*e0c4386eSCy Schubert static int full_hash = 0;
135*e0c4386eSCy Schubert
136*e0c4386eSCy Schubert /* Give a hash of the currently set handshake */
ssl_handshake_hash(SSL * s,unsigned char * out,size_t outlen,size_t * hashlen)137*e0c4386eSCy Schubert int ssl_handshake_hash(SSL *s, unsigned char *out, size_t outlen,
138*e0c4386eSCy Schubert size_t *hashlen)
139*e0c4386eSCy Schubert {
140*e0c4386eSCy Schubert if (sizeof(hs_start_hash) > outlen
141*e0c4386eSCy Schubert || sizeof(hs_full_hash) != sizeof(hs_start_hash))
142*e0c4386eSCy Schubert return 0;
143*e0c4386eSCy Schubert
144*e0c4386eSCy Schubert if (full_hash) {
145*e0c4386eSCy Schubert memcpy(out, hs_full_hash, sizeof(hs_full_hash));
146*e0c4386eSCy Schubert *hashlen = sizeof(hs_full_hash);
147*e0c4386eSCy Schubert } else {
148*e0c4386eSCy Schubert memcpy(out, hs_start_hash, sizeof(hs_start_hash));
149*e0c4386eSCy Schubert *hashlen = sizeof(hs_start_hash);
150*e0c4386eSCy Schubert }
151*e0c4386eSCy Schubert
152*e0c4386eSCy Schubert return 1;
153*e0c4386eSCy Schubert }
154*e0c4386eSCy Schubert
ssl_handshake_md(SSL * s)155*e0c4386eSCy Schubert const EVP_MD *ssl_handshake_md(SSL *s)
156*e0c4386eSCy Schubert {
157*e0c4386eSCy Schubert return EVP_sha256();
158*e0c4386eSCy Schubert }
159*e0c4386eSCy Schubert
RECORD_LAYER_reset_read_sequence(RECORD_LAYER * rl)160*e0c4386eSCy Schubert void RECORD_LAYER_reset_read_sequence(RECORD_LAYER *rl)
161*e0c4386eSCy Schubert {
162*e0c4386eSCy Schubert }
163*e0c4386eSCy Schubert
RECORD_LAYER_reset_write_sequence(RECORD_LAYER * rl)164*e0c4386eSCy Schubert void RECORD_LAYER_reset_write_sequence(RECORD_LAYER *rl)
165*e0c4386eSCy Schubert {
166*e0c4386eSCy Schubert }
167*e0c4386eSCy Schubert
ssl_cipher_get_evp_cipher(SSL_CTX * ctx,const SSL_CIPHER * sslc,const EVP_CIPHER ** enc)168*e0c4386eSCy Schubert int ssl_cipher_get_evp_cipher(SSL_CTX *ctx, const SSL_CIPHER *sslc,
169*e0c4386eSCy Schubert const EVP_CIPHER **enc)
170*e0c4386eSCy Schubert {
171*e0c4386eSCy Schubert return 0;
172*e0c4386eSCy Schubert }
173*e0c4386eSCy Schubert
ssl_cipher_get_evp(SSL_CTX * ctx,const SSL_SESSION * s,const EVP_CIPHER ** enc,const EVP_MD ** md,int * mac_pkey_type,size_t * mac_secret_size,SSL_COMP ** comp,int use_etm)174*e0c4386eSCy Schubert int ssl_cipher_get_evp(SSL_CTX *ctx, const SSL_SESSION *s,
175*e0c4386eSCy Schubert const EVP_CIPHER **enc, const EVP_MD **md,
176*e0c4386eSCy Schubert int *mac_pkey_type, size_t *mac_secret_size,
177*e0c4386eSCy Schubert SSL_COMP **comp, int use_etm)
178*e0c4386eSCy Schubert
179*e0c4386eSCy Schubert {
180*e0c4386eSCy Schubert return 0;
181*e0c4386eSCy Schubert }
182*e0c4386eSCy Schubert
tls1_alert_code(int code)183*e0c4386eSCy Schubert int tls1_alert_code(int code)
184*e0c4386eSCy Schubert {
185*e0c4386eSCy Schubert return code;
186*e0c4386eSCy Schubert }
187*e0c4386eSCy Schubert
ssl_log_secret(SSL * ssl,const char * label,const uint8_t * secret,size_t secret_len)188*e0c4386eSCy Schubert int ssl_log_secret(SSL *ssl,
189*e0c4386eSCy Schubert const char *label,
190*e0c4386eSCy Schubert const uint8_t *secret,
191*e0c4386eSCy Schubert size_t secret_len)
192*e0c4386eSCy Schubert {
193*e0c4386eSCy Schubert return 1;
194*e0c4386eSCy Schubert }
195*e0c4386eSCy Schubert
ssl_md(SSL_CTX * ctx,int idx)196*e0c4386eSCy Schubert const EVP_MD *ssl_md(SSL_CTX *ctx, int idx)
197*e0c4386eSCy Schubert {
198*e0c4386eSCy Schubert return EVP_sha256();
199*e0c4386eSCy Schubert }
200*e0c4386eSCy Schubert
ossl_statem_send_fatal(SSL * s,int al)201*e0c4386eSCy Schubert void ossl_statem_send_fatal(SSL *s, int al)
202*e0c4386eSCy Schubert {
203*e0c4386eSCy Schubert }
204*e0c4386eSCy Schubert
ossl_statem_fatal(SSL * s,int al,int reason,const char * fmt,...)205*e0c4386eSCy Schubert void ossl_statem_fatal(SSL *s, int al, int reason, const char *fmt, ...)
206*e0c4386eSCy Schubert {
207*e0c4386eSCy Schubert }
208*e0c4386eSCy Schubert
ossl_statem_export_allowed(SSL * s)209*e0c4386eSCy Schubert int ossl_statem_export_allowed(SSL *s)
210*e0c4386eSCy Schubert {
211*e0c4386eSCy Schubert return 1;
212*e0c4386eSCy Schubert }
213*e0c4386eSCy Schubert
ossl_statem_export_early_allowed(SSL * s)214*e0c4386eSCy Schubert int ossl_statem_export_early_allowed(SSL *s)
215*e0c4386eSCy Schubert {
216*e0c4386eSCy Schubert return 1;
217*e0c4386eSCy Schubert }
218*e0c4386eSCy Schubert
ssl_evp_cipher_free(const EVP_CIPHER * cipher)219*e0c4386eSCy Schubert void ssl_evp_cipher_free(const EVP_CIPHER *cipher)
220*e0c4386eSCy Schubert {
221*e0c4386eSCy Schubert }
222*e0c4386eSCy Schubert
ssl_evp_md_free(const EVP_MD * md)223*e0c4386eSCy Schubert void ssl_evp_md_free(const EVP_MD *md)
224*e0c4386eSCy Schubert {
225*e0c4386eSCy Schubert }
226*e0c4386eSCy Schubert
227*e0c4386eSCy Schubert /* End of mocked out code */
228*e0c4386eSCy Schubert
test_secret(SSL * s,unsigned char * prk,const unsigned char * label,size_t labellen,const unsigned char * ref_secret,const unsigned char * ref_key,const unsigned char * ref_iv)229*e0c4386eSCy Schubert static int test_secret(SSL *s, unsigned char *prk,
230*e0c4386eSCy Schubert const unsigned char *label, size_t labellen,
231*e0c4386eSCy Schubert const unsigned char *ref_secret,
232*e0c4386eSCy Schubert const unsigned char *ref_key, const unsigned char *ref_iv)
233*e0c4386eSCy Schubert {
234*e0c4386eSCy Schubert size_t hashsize;
235*e0c4386eSCy Schubert unsigned char gensecret[EVP_MAX_MD_SIZE];
236*e0c4386eSCy Schubert unsigned char hash[EVP_MAX_MD_SIZE];
237*e0c4386eSCy Schubert unsigned char key[KEYLEN];
238*e0c4386eSCy Schubert unsigned char iv[IVLEN];
239*e0c4386eSCy Schubert const EVP_MD *md = ssl_handshake_md(s);
240*e0c4386eSCy Schubert
241*e0c4386eSCy Schubert if (!ssl_handshake_hash(s, hash, sizeof(hash), &hashsize)) {
242*e0c4386eSCy Schubert TEST_error("Failed to get hash");
243*e0c4386eSCy Schubert return 0;
244*e0c4386eSCy Schubert }
245*e0c4386eSCy Schubert
246*e0c4386eSCy Schubert if (!tls13_hkdf_expand(s, md, prk, label, labellen, hash, hashsize,
247*e0c4386eSCy Schubert gensecret, hashsize, 1)) {
248*e0c4386eSCy Schubert TEST_error("Secret generation failed");
249*e0c4386eSCy Schubert return 0;
250*e0c4386eSCy Schubert }
251*e0c4386eSCy Schubert
252*e0c4386eSCy Schubert if (!TEST_mem_eq(gensecret, hashsize, ref_secret, hashsize))
253*e0c4386eSCy Schubert return 0;
254*e0c4386eSCy Schubert
255*e0c4386eSCy Schubert if (!tls13_derive_key(s, md, gensecret, key, KEYLEN)) {
256*e0c4386eSCy Schubert TEST_error("Key generation failed");
257*e0c4386eSCy Schubert return 0;
258*e0c4386eSCy Schubert }
259*e0c4386eSCy Schubert
260*e0c4386eSCy Schubert if (!TEST_mem_eq(key, KEYLEN, ref_key, KEYLEN))
261*e0c4386eSCy Schubert return 0;
262*e0c4386eSCy Schubert
263*e0c4386eSCy Schubert if (!tls13_derive_iv(s, md, gensecret, iv, IVLEN)) {
264*e0c4386eSCy Schubert TEST_error("IV generation failed");
265*e0c4386eSCy Schubert return 0;
266*e0c4386eSCy Schubert }
267*e0c4386eSCy Schubert
268*e0c4386eSCy Schubert if (!TEST_mem_eq(iv, IVLEN, ref_iv, IVLEN))
269*e0c4386eSCy Schubert return 0;
270*e0c4386eSCy Schubert
271*e0c4386eSCy Schubert return 1;
272*e0c4386eSCy Schubert }
273*e0c4386eSCy Schubert
test_handshake_secrets(void)274*e0c4386eSCy Schubert static int test_handshake_secrets(void)
275*e0c4386eSCy Schubert {
276*e0c4386eSCy Schubert SSL_CTX *ctx = NULL;
277*e0c4386eSCy Schubert SSL *s = NULL;
278*e0c4386eSCy Schubert int ret = 0;
279*e0c4386eSCy Schubert size_t hashsize;
280*e0c4386eSCy Schubert unsigned char out_master_secret[EVP_MAX_MD_SIZE];
281*e0c4386eSCy Schubert size_t master_secret_length;
282*e0c4386eSCy Schubert
283*e0c4386eSCy Schubert ctx = SSL_CTX_new(TLS_method());
284*e0c4386eSCy Schubert if (!TEST_ptr(ctx))
285*e0c4386eSCy Schubert goto err;
286*e0c4386eSCy Schubert
287*e0c4386eSCy Schubert s = SSL_new(ctx);
288*e0c4386eSCy Schubert if (!TEST_ptr(s ))
289*e0c4386eSCy Schubert goto err;
290*e0c4386eSCy Schubert
291*e0c4386eSCy Schubert s->session = SSL_SESSION_new();
292*e0c4386eSCy Schubert if (!TEST_ptr(s->session))
293*e0c4386eSCy Schubert goto err;
294*e0c4386eSCy Schubert
295*e0c4386eSCy Schubert if (!TEST_true(tls13_generate_secret(s, ssl_handshake_md(s), NULL, NULL, 0,
296*e0c4386eSCy Schubert (unsigned char *)&s->early_secret))) {
297*e0c4386eSCy Schubert TEST_info("Early secret generation failed");
298*e0c4386eSCy Schubert goto err;
299*e0c4386eSCy Schubert }
300*e0c4386eSCy Schubert
301*e0c4386eSCy Schubert if (!TEST_mem_eq(s->early_secret, sizeof(early_secret),
302*e0c4386eSCy Schubert early_secret, sizeof(early_secret))) {
303*e0c4386eSCy Schubert TEST_info("Early secret does not match");
304*e0c4386eSCy Schubert goto err;
305*e0c4386eSCy Schubert }
306*e0c4386eSCy Schubert
307*e0c4386eSCy Schubert if (!TEST_true(tls13_generate_handshake_secret(s, ecdhe_secret,
308*e0c4386eSCy Schubert sizeof(ecdhe_secret)))) {
309*e0c4386eSCy Schubert TEST_info("Handshake secret generation failed");
310*e0c4386eSCy Schubert goto err;
311*e0c4386eSCy Schubert }
312*e0c4386eSCy Schubert
313*e0c4386eSCy Schubert if (!TEST_mem_eq(s->handshake_secret, sizeof(handshake_secret),
314*e0c4386eSCy Schubert handshake_secret, sizeof(handshake_secret)))
315*e0c4386eSCy Schubert goto err;
316*e0c4386eSCy Schubert
317*e0c4386eSCy Schubert hashsize = EVP_MD_get_size(ssl_handshake_md(s));
318*e0c4386eSCy Schubert if (!TEST_size_t_eq(sizeof(client_hts), hashsize))
319*e0c4386eSCy Schubert goto err;
320*e0c4386eSCy Schubert if (!TEST_size_t_eq(sizeof(client_hts_key), KEYLEN))
321*e0c4386eSCy Schubert goto err;
322*e0c4386eSCy Schubert if (!TEST_size_t_eq(sizeof(client_hts_iv), IVLEN))
323*e0c4386eSCy Schubert goto err;
324*e0c4386eSCy Schubert
325*e0c4386eSCy Schubert if (!TEST_true(test_secret(s, s->handshake_secret,
326*e0c4386eSCy Schubert (unsigned char *)client_hts_label,
327*e0c4386eSCy Schubert strlen(client_hts_label), client_hts,
328*e0c4386eSCy Schubert client_hts_key, client_hts_iv))) {
329*e0c4386eSCy Schubert TEST_info("Client handshake secret test failed");
330*e0c4386eSCy Schubert goto err;
331*e0c4386eSCy Schubert }
332*e0c4386eSCy Schubert
333*e0c4386eSCy Schubert if (!TEST_size_t_eq(sizeof(server_hts), hashsize))
334*e0c4386eSCy Schubert goto err;
335*e0c4386eSCy Schubert if (!TEST_size_t_eq(sizeof(server_hts_key), KEYLEN))
336*e0c4386eSCy Schubert goto err;
337*e0c4386eSCy Schubert if (!TEST_size_t_eq(sizeof(server_hts_iv), IVLEN))
338*e0c4386eSCy Schubert goto err;
339*e0c4386eSCy Schubert
340*e0c4386eSCy Schubert if (!TEST_true(test_secret(s, s->handshake_secret,
341*e0c4386eSCy Schubert (unsigned char *)server_hts_label,
342*e0c4386eSCy Schubert strlen(server_hts_label), server_hts,
343*e0c4386eSCy Schubert server_hts_key, server_hts_iv))) {
344*e0c4386eSCy Schubert TEST_info("Server handshake secret test failed");
345*e0c4386eSCy Schubert goto err;
346*e0c4386eSCy Schubert }
347*e0c4386eSCy Schubert
348*e0c4386eSCy Schubert /*
349*e0c4386eSCy Schubert * Ensure the mocked out ssl_handshake_hash() returns the full handshake
350*e0c4386eSCy Schubert * hash.
351*e0c4386eSCy Schubert */
352*e0c4386eSCy Schubert full_hash = 1;
353*e0c4386eSCy Schubert
354*e0c4386eSCy Schubert if (!TEST_true(tls13_generate_master_secret(s, out_master_secret,
355*e0c4386eSCy Schubert s->handshake_secret, hashsize,
356*e0c4386eSCy Schubert &master_secret_length))) {
357*e0c4386eSCy Schubert TEST_info("Master secret generation failed");
358*e0c4386eSCy Schubert goto err;
359*e0c4386eSCy Schubert }
360*e0c4386eSCy Schubert
361*e0c4386eSCy Schubert if (!TEST_mem_eq(out_master_secret, master_secret_length,
362*e0c4386eSCy Schubert master_secret, sizeof(master_secret))) {
363*e0c4386eSCy Schubert TEST_info("Master secret does not match");
364*e0c4386eSCy Schubert goto err;
365*e0c4386eSCy Schubert }
366*e0c4386eSCy Schubert
367*e0c4386eSCy Schubert if (!TEST_size_t_eq(sizeof(client_ats), hashsize))
368*e0c4386eSCy Schubert goto err;
369*e0c4386eSCy Schubert if (!TEST_size_t_eq(sizeof(client_ats_key), KEYLEN))
370*e0c4386eSCy Schubert goto err;
371*e0c4386eSCy Schubert if (!TEST_size_t_eq(sizeof(client_ats_iv), IVLEN))
372*e0c4386eSCy Schubert goto err;
373*e0c4386eSCy Schubert
374*e0c4386eSCy Schubert if (!TEST_true(test_secret(s, out_master_secret,
375*e0c4386eSCy Schubert (unsigned char *)client_ats_label,
376*e0c4386eSCy Schubert strlen(client_ats_label), client_ats,
377*e0c4386eSCy Schubert client_ats_key, client_ats_iv))) {
378*e0c4386eSCy Schubert TEST_info("Client application data secret test failed");
379*e0c4386eSCy Schubert goto err;
380*e0c4386eSCy Schubert }
381*e0c4386eSCy Schubert
382*e0c4386eSCy Schubert if (!TEST_size_t_eq(sizeof(server_ats), hashsize))
383*e0c4386eSCy Schubert goto err;
384*e0c4386eSCy Schubert if (!TEST_size_t_eq(sizeof(server_ats_key), KEYLEN))
385*e0c4386eSCy Schubert goto err;
386*e0c4386eSCy Schubert if (!TEST_size_t_eq(sizeof(server_ats_iv), IVLEN))
387*e0c4386eSCy Schubert goto err;
388*e0c4386eSCy Schubert
389*e0c4386eSCy Schubert if (!TEST_true(test_secret(s, out_master_secret,
390*e0c4386eSCy Schubert (unsigned char *)server_ats_label,
391*e0c4386eSCy Schubert strlen(server_ats_label), server_ats,
392*e0c4386eSCy Schubert server_ats_key, server_ats_iv))) {
393*e0c4386eSCy Schubert TEST_info("Server application data secret test failed");
394*e0c4386eSCy Schubert goto err;
395*e0c4386eSCy Schubert }
396*e0c4386eSCy Schubert
397*e0c4386eSCy Schubert ret = 1;
398*e0c4386eSCy Schubert err:
399*e0c4386eSCy Schubert SSL_free(s);
400*e0c4386eSCy Schubert SSL_CTX_free(ctx);
401*e0c4386eSCy Schubert return ret;
402*e0c4386eSCy Schubert }
403*e0c4386eSCy Schubert
setup_tests(void)404*e0c4386eSCy Schubert int setup_tests(void)
405*e0c4386eSCy Schubert {
406*e0c4386eSCy Schubert ADD_TEST(test_handshake_secrets);
407*e0c4386eSCy Schubert return 1;
408*e0c4386eSCy Schubert }
409