summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjsing <>2021-03-21 17:25:17 +0000
committerjsing <>2021-03-21 17:25:17 +0000
commit25064bbd608cffa42b7bf46d3ea7eeb88d693de4 (patch)
treecc502959cce0dda3950056cfd7fad89b63fed442
parentd80f02f1a1af44e9d5abc9866168fefa7c4a6b7a (diff)
downloadopenbsd-25064bbd608cffa42b7bf46d3ea7eeb88d693de4.tar.gz
openbsd-25064bbd608cffa42b7bf46d3ea7eeb88d693de4.tar.bz2
openbsd-25064bbd608cffa42b7bf46d3ea7eeb88d693de4.zip
Split TLSv1.3 record protection from record layer.
This makes the TLSv1.2 and TLSv1.3 record layers more consistent and while it is not currently necessary from a functionality perspective, it makes for more readable and simpler code. ok inoguchi@ tb@
-rw-r--r--src/lib/libssl/tls13_record_layer.c118
1 files changed, 72 insertions, 46 deletions
diff --git a/src/lib/libssl/tls13_record_layer.c b/src/lib/libssl/tls13_record_layer.c
index bbecc60674..4be4bad860 100644
--- a/src/lib/libssl/tls13_record_layer.c
+++ b/src/lib/libssl/tls13_record_layer.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_record_layer.c,v 1.58 2021/01/05 17:49:04 tb Exp $ */ 1/* $OpenBSD: tls13_record_layer.c,v 1.59 2021/03/21 17:25:17 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -25,6 +25,41 @@ static ssize_t tls13_record_layer_write_chunk(struct tls13_record_layer *rl,
25static ssize_t tls13_record_layer_write_record(struct tls13_record_layer *rl, 25static ssize_t tls13_record_layer_write_record(struct tls13_record_layer *rl,
26 uint8_t content_type, const uint8_t *content, size_t content_len); 26 uint8_t content_type, const uint8_t *content, size_t content_len);
27 27
28struct tls13_record_protection {
29 EVP_AEAD_CTX aead_ctx;
30 struct tls13_secret iv;
31 struct tls13_secret nonce;
32 uint8_t seq_num[TLS13_RECORD_SEQ_NUM_LEN];
33};
34
35struct tls13_record_protection *
36tls13_record_protection_new(void)
37{
38 return calloc(1, sizeof(struct tls13_record_protection));
39}
40
41void
42tls13_record_protection_clear(struct tls13_record_protection *rp)
43{
44 EVP_AEAD_CTX_cleanup(&rp->aead_ctx);
45
46 tls13_secret_cleanup(&rp->iv);
47 tls13_secret_cleanup(&rp->nonce);
48
49 memset(rp->seq_num, 0, sizeof(rp->seq_num));
50}
51
52void
53tls13_record_protection_free(struct tls13_record_protection *rp)
54{
55 if (rp == NULL)
56 return;
57
58 tls13_record_protection_clear(rp);
59
60 freezero(rp, sizeof(struct tls13_record_protection));
61}
62
28struct tls13_record_layer { 63struct tls13_record_layer {
29 uint16_t legacy_version; 64 uint16_t legacy_version;
30 65
@@ -75,14 +110,8 @@ struct tls13_record_layer {
75 /* Record protection. */ 110 /* Record protection. */
76 const EVP_MD *hash; 111 const EVP_MD *hash;
77 const EVP_AEAD *aead; 112 const EVP_AEAD *aead;
78 EVP_AEAD_CTX read_aead_ctx; 113 struct tls13_record_protection *read;
79 EVP_AEAD_CTX write_aead_ctx; 114 struct tls13_record_protection *write;
80 struct tls13_secret read_iv;
81 struct tls13_secret write_iv;
82 struct tls13_secret read_nonce;
83 struct tls13_secret write_nonce;
84 uint8_t read_seq_num[TLS13_RECORD_SEQ_NUM_LEN];
85 uint8_t write_seq_num[TLS13_RECORD_SEQ_NUM_LEN];
86 115
87 /* Callbacks. */ 116 /* Callbacks. */
88 struct tls13_record_layer_callbacks cb; 117 struct tls13_record_layer_callbacks cb;
@@ -120,13 +149,23 @@ tls13_record_layer_new(const struct tls13_record_layer_callbacks *callbacks,
120 struct tls13_record_layer *rl; 149 struct tls13_record_layer *rl;
121 150
122 if ((rl = calloc(1, sizeof(struct tls13_record_layer))) == NULL) 151 if ((rl = calloc(1, sizeof(struct tls13_record_layer))) == NULL)
123 return NULL; 152 goto err;
153
154 if ((rl->read = tls13_record_protection_new()) == NULL)
155 goto err;
156 if ((rl->write = tls13_record_protection_new()) == NULL)
157 goto err;
124 158
125 rl->legacy_version = TLS1_2_VERSION; 159 rl->legacy_version = TLS1_2_VERSION;
126 rl->cb = *callbacks; 160 rl->cb = *callbacks;
127 rl->cb_arg = cb_arg; 161 rl->cb_arg = cb_arg;
128 162
129 return rl; 163 return rl;
164
165 err:
166 tls13_record_layer_free(rl);
167
168 return NULL;
130} 169}
131 170
132void 171void
@@ -143,13 +182,8 @@ tls13_record_layer_free(struct tls13_record_layer *rl)
143 182
144 tls13_record_layer_rbuf_free(rl); 183 tls13_record_layer_rbuf_free(rl);
145 184
146 EVP_AEAD_CTX_cleanup(&rl->read_aead_ctx); 185 tls13_record_protection_free(rl->read);
147 EVP_AEAD_CTX_cleanup(&rl->write_aead_ctx); 186 tls13_record_protection_free(rl->write);
148
149 tls13_secret_cleanup(&rl->read_iv);
150 tls13_secret_cleanup(&rl->write_iv);
151 tls13_secret_cleanup(&rl->read_nonce);
152 tls13_secret_cleanup(&rl->write_nonce);
153 187
154 freezero(rl, sizeof(struct tls13_record_layer)); 188 freezero(rl, sizeof(struct tls13_record_layer));
155} 189}
@@ -430,32 +464,28 @@ tls13_record_layer_phh(struct tls13_record_layer *rl, CBS *cbs)
430} 464}
431 465
432static int 466static int
433tls13_record_layer_set_traffic_key(const EVP_AEAD *aead, EVP_AEAD_CTX *aead_ctx, 467tls13_record_layer_set_traffic_key(const EVP_AEAD *aead, const EVP_MD *hash,
434 const EVP_MD *hash, struct tls13_secret *iv, struct tls13_secret *nonce, 468 struct tls13_record_protection *rp, struct tls13_secret *traffic_key)
435 struct tls13_secret *traffic_key)
436{ 469{
437 struct tls13_secret context = { .data = "", .len = 0 }; 470 struct tls13_secret context = { .data = "", .len = 0 };
438 struct tls13_secret key = { .data = NULL, .len = 0 }; 471 struct tls13_secret key = { .data = NULL, .len = 0 };
439 int ret = 0; 472 int ret = 0;
440 473
441 EVP_AEAD_CTX_cleanup(aead_ctx); 474 tls13_record_protection_clear(rp);
442 475
443 tls13_secret_cleanup(iv); 476 if (!tls13_secret_init(&rp->iv, EVP_AEAD_nonce_length(aead)))
444 tls13_secret_cleanup(nonce);
445
446 if (!tls13_secret_init(iv, EVP_AEAD_nonce_length(aead)))
447 goto err; 477 goto err;
448 if (!tls13_secret_init(nonce, EVP_AEAD_nonce_length(aead))) 478 if (!tls13_secret_init(&rp->nonce, EVP_AEAD_nonce_length(aead)))
449 goto err; 479 goto err;
450 if (!tls13_secret_init(&key, EVP_AEAD_key_length(aead))) 480 if (!tls13_secret_init(&key, EVP_AEAD_key_length(aead)))
451 goto err; 481 goto err;
452 482
453 if (!tls13_hkdf_expand_label(iv, hash, traffic_key, "iv", &context)) 483 if (!tls13_hkdf_expand_label(&rp->iv, hash, traffic_key, "iv", &context))
454 goto err; 484 goto err;
455 if (!tls13_hkdf_expand_label(&key, hash, traffic_key, "key", &context)) 485 if (!tls13_hkdf_expand_label(&key, hash, traffic_key, "key", &context))
456 goto err; 486 goto err;
457 487
458 if (!EVP_AEAD_CTX_init(aead_ctx, aead, key.data, key.len, 488 if (!EVP_AEAD_CTX_init(&rp->aead_ctx, aead, key.data, key.len,
459 EVP_AEAD_DEFAULT_TAG_LENGTH, NULL)) 489 EVP_AEAD_DEFAULT_TAG_LENGTH, NULL))
460 goto err; 490 goto err;
461 491
@@ -471,20 +501,16 @@ int
471tls13_record_layer_set_read_traffic_key(struct tls13_record_layer *rl, 501tls13_record_layer_set_read_traffic_key(struct tls13_record_layer *rl,
472 struct tls13_secret *read_key) 502 struct tls13_secret *read_key)
473{ 503{
474 memset(rl->read_seq_num, 0, TLS13_RECORD_SEQ_NUM_LEN); 504 return tls13_record_layer_set_traffic_key(rl->aead, rl->hash,
475 505 rl->read, read_key);
476 return tls13_record_layer_set_traffic_key(rl->aead, &rl->read_aead_ctx,
477 rl->hash, &rl->read_iv, &rl->read_nonce, read_key);
478} 506}
479 507
480int 508int
481tls13_record_layer_set_write_traffic_key(struct tls13_record_layer *rl, 509tls13_record_layer_set_write_traffic_key(struct tls13_record_layer *rl,
482 struct tls13_secret *write_key) 510 struct tls13_secret *write_key)
483{ 511{
484 memset(rl->write_seq_num, 0, TLS13_RECORD_SEQ_NUM_LEN); 512 return tls13_record_layer_set_traffic_key(rl->aead, rl->hash,
485 513 rl->write, write_key);
486 return tls13_record_layer_set_traffic_key(rl->aead, &rl->write_aead_ctx,
487 rl->hash, &rl->write_iv, &rl->write_nonce, write_key);
488} 514}
489 515
490static int 516static int
@@ -541,13 +567,13 @@ tls13_record_layer_open_record_protected(struct tls13_record_layer *rl)
541 goto err; 567 goto err;
542 content_len = CBS_len(&enc_record); 568 content_len = CBS_len(&enc_record);
543 569
544 if (!tls13_record_layer_update_nonce(&rl->read_nonce, &rl->read_iv, 570 if (!tls13_record_layer_update_nonce(&rl->read->nonce, &rl->read->iv,
545 rl->read_seq_num)) 571 rl->read->seq_num))
546 goto err; 572 goto err;
547 573
548 if (!EVP_AEAD_CTX_open(&rl->read_aead_ctx, 574 if (!EVP_AEAD_CTX_open(&rl->read->aead_ctx,
549 content, &out_len, content_len, 575 content, &out_len, content_len,
550 rl->read_nonce.data, rl->read_nonce.len, 576 rl->read->nonce.data, rl->read->nonce.len,
551 CBS_data(&enc_record), CBS_len(&enc_record), 577 CBS_data(&enc_record), CBS_len(&enc_record),
552 CBS_data(&header), CBS_len(&header))) 578 CBS_data(&header), CBS_len(&header)))
553 goto err; 579 goto err;
@@ -557,7 +583,7 @@ tls13_record_layer_open_record_protected(struct tls13_record_layer *rl)
557 goto err; 583 goto err;
558 } 584 }
559 585
560 if (!tls13_record_layer_inc_seq_num(rl->read_seq_num)) 586 if (!tls13_record_layer_inc_seq_num(rl->read->seq_num))
561 goto err; 587 goto err;
562 588
563 /* 589 /*
@@ -718,8 +744,8 @@ tls13_record_layer_seal_record_protected(struct tls13_record_layer *rl,
718 if (!CBB_finish(&cbb, &data, &data_len)) 744 if (!CBB_finish(&cbb, &data, &data_len))
719 goto err; 745 goto err;
720 746
721 if (!tls13_record_layer_update_nonce(&rl->write_nonce, 747 if (!tls13_record_layer_update_nonce(&rl->write->nonce,
722 &rl->write_iv, rl->write_seq_num)) 748 &rl->write->iv, rl->write->seq_num))
723 goto err; 749 goto err;
724 750
725 /* 751 /*
@@ -727,16 +753,16 @@ tls13_record_layer_seal_record_protected(struct tls13_record_layer *rl,
727 * this would avoid a copy since the inner would be passed as two 753 * this would avoid a copy since the inner would be passed as two
728 * separate pieces. 754 * separate pieces.
729 */ 755 */
730 if (!EVP_AEAD_CTX_seal(&rl->write_aead_ctx, 756 if (!EVP_AEAD_CTX_seal(&rl->write->aead_ctx,
731 enc_record, &out_len, enc_record_len, 757 enc_record, &out_len, enc_record_len,
732 rl->write_nonce.data, rl->write_nonce.len, 758 rl->write->nonce.data, rl->write->nonce.len,
733 inner, inner_len, header, header_len)) 759 inner, inner_len, header, header_len))
734 goto err; 760 goto err;
735 761
736 if (out_len != enc_record_len) 762 if (out_len != enc_record_len)
737 goto err; 763 goto err;
738 764
739 if (!tls13_record_layer_inc_seq_num(rl->write_seq_num)) 765 if (!tls13_record_layer_inc_seq_num(rl->write->seq_num))
740 goto err; 766 goto err;
741 767
742 if (!tls13_record_set_data(rl->wrec, data, data_len)) 768 if (!tls13_record_set_data(rl->wrec, data, data_len))