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