summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libssl/d1_both.c11
-rw-r--r--src/lib/libssl/d1_pkt.c4
-rw-r--r--src/lib/libssl/ssl_locl.h12
-rw-r--r--src/lib/libssl/t1_enc.c20
-rw-r--r--src/lib/libssl/tls12_record_layer.c107
5 files changed, 137 insertions, 17 deletions
diff --git a/src/lib/libssl/d1_both.c b/src/lib/libssl/d1_both.c
index d6bf6dfd1b..8c4fec589f 100644
--- a/src/lib/libssl/d1_both.c
+++ b/src/lib/libssl/d1_both.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: d1_both.c,v 1.64 2021/01/19 18:51:08 jsing Exp $ */ 1/* $OpenBSD: d1_both.c,v 1.65 2021/01/19 19:07:39 jsing Exp $ */
2/* 2/*
3 * DTLS implementation written by Nagendra Modadugu 3 * DTLS implementation written by Nagendra Modadugu
4 * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. 4 * (nagendra@cs.stanford.edu) for the OpenSSL project 2005.
@@ -1055,9 +1055,8 @@ dtls1_retransmit_message(SSL *s, unsigned short seq, unsigned long frag_off,
1055 /* restore state in which the message was originally sent */ 1055 /* restore state in which the message was originally sent */
1056 s->session = frag->msg_header.saved_retransmit_state.session; 1056 s->session = frag->msg_header.saved_retransmit_state.session;
1057 D1I(s)->w_epoch = frag->msg_header.saved_retransmit_state.epoch; 1057 D1I(s)->w_epoch = frag->msg_header.saved_retransmit_state.epoch;
1058 if (!tls12_record_layer_set_write_cipher_hash(s->internal->rl, 1058
1059 frag->msg_header.saved_retransmit_state.enc_write_ctx, 1059 if (!tls12_record_layer_use_write_epoch(s->internal->rl, D1I(s)->w_epoch))
1060 frag->msg_header.saved_retransmit_state.write_hash, 0))
1061 return 0; 1060 return 0;
1062 1061
1063 if (frag->msg_header.saved_retransmit_state.epoch == 1062 if (frag->msg_header.saved_retransmit_state.epoch ==
@@ -1074,8 +1073,8 @@ dtls1_retransmit_message(SSL *s, unsigned short seq, unsigned long frag_off,
1074 /* restore current state */ 1073 /* restore current state */
1075 s->session = saved_state.session; 1074 s->session = saved_state.session;
1076 D1I(s)->w_epoch = saved_state.epoch; 1075 D1I(s)->w_epoch = saved_state.epoch;
1077 if (!tls12_record_layer_set_write_cipher_hash(s->internal->rl, 1076
1078 s->internal->enc_write_ctx, s->internal->write_hash, 0)) 1077 if (!tls12_record_layer_use_write_epoch(s->internal->rl, D1I(s)->w_epoch))
1079 return 0; 1078 return 0;
1080 1079
1081 if (frag->msg_header.saved_retransmit_state.epoch == 1080 if (frag->msg_header.saved_retransmit_state.epoch ==
diff --git a/src/lib/libssl/d1_pkt.c b/src/lib/libssl/d1_pkt.c
index 14ff8221be..bde13c99e5 100644
--- a/src/lib/libssl/d1_pkt.c
+++ b/src/lib/libssl/d1_pkt.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: d1_pkt.c,v 1.89 2021/01/19 18:57:09 jsing Exp $ */ 1/* $OpenBSD: d1_pkt.c,v 1.90 2021/01/19 19:07:39 jsing Exp $ */
2/* 2/*
3 * DTLS implementation written by Nagendra Modadugu 3 * DTLS implementation written by Nagendra Modadugu
4 * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. 4 * (nagendra@cs.stanford.edu) for the OpenSSL project 2005.
@@ -1105,7 +1105,6 @@ do_dtls1_write(SSL *s, int type, const unsigned char *buf, unsigned int len)
1105 goto err; 1105 goto err;
1106 1106
1107 tls12_record_layer_set_version(s->internal->rl, s->version); 1107 tls12_record_layer_set_version(s->internal->rl, s->version);
1108 tls12_record_layer_set_write_epoch(s->internal->rl, D1I(s)->w_epoch);
1109 1108
1110 if (!tls12_record_layer_seal_record(s->internal->rl, type, buf, len, &cbb)) 1109 if (!tls12_record_layer_seal_record(s->internal->rl, type, buf, len, &cbb))
1111 goto err; 1110 goto err;
@@ -1245,6 +1244,7 @@ dtls1_reset_seq_numbers(SSL *s, int rw)
1245 memset(S3I(s)->read_sequence, 0, sizeof(S3I(s)->read_sequence)); 1244 memset(S3I(s)->read_sequence, 0, sizeof(S3I(s)->read_sequence));
1246 } else { 1245 } else {
1247 D1I(s)->w_epoch++; 1246 D1I(s)->w_epoch++;
1247 tls12_record_layer_set_write_epoch(s->internal->rl, D1I(s)->w_epoch);
1248 memcpy(D1I(s)->last_write_sequence, S3I(s)->write_sequence, 1248 memcpy(D1I(s)->last_write_sequence, S3I(s)->write_sequence,
1249 sizeof(S3I(s)->write_sequence)); 1249 sizeof(S3I(s)->write_sequence));
1250 memset(S3I(s)->write_sequence, 0, sizeof(S3I(s)->write_sequence)); 1250 memset(S3I(s)->write_sequence, 0, sizeof(S3I(s)->write_sequence));
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h
index e0a4c49ccb..5a3e3ff726 100644
--- a/src/lib/libssl/ssl_locl.h
+++ b/src/lib/libssl/ssl_locl.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_locl.h,v 1.314 2021/01/19 18:57:09 jsing Exp $ */ 1/* $OpenBSD: ssl_locl.h,v 1.315 2021/01/19 19:07:39 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -485,6 +485,10 @@ void tls12_record_layer_set_version(struct tls12_record_layer *rl,
485 uint16_t version); 485 uint16_t version);
486void tls12_record_layer_set_write_epoch(struct tls12_record_layer *rl, 486void tls12_record_layer_set_write_epoch(struct tls12_record_layer *rl,
487 uint16_t epoch); 487 uint16_t epoch);
488int tls12_record_layer_use_write_epoch(struct tls12_record_layer *rl,
489 uint16_t epoch);
490void tls12_record_layer_write_epoch_done(struct tls12_record_layer *rl,
491 uint16_t epoch);
488void tls12_record_layer_clear_read_state(struct tls12_record_layer *rl); 492void tls12_record_layer_clear_read_state(struct tls12_record_layer *rl);
489void tls12_record_layer_clear_write_state(struct tls12_record_layer *rl); 493void tls12_record_layer_clear_write_state(struct tls12_record_layer *rl);
490void tls12_record_layer_set_read_seq_num(struct tls12_record_layer *rl, 494void tls12_record_layer_set_read_seq_num(struct tls12_record_layer *rl,
@@ -501,6 +505,12 @@ int tls12_record_layer_set_write_cipher_hash(struct tls12_record_layer *rl,
501 EVP_CIPHER_CTX *cipher_ctx, EVP_MD_CTX *hash_ctx, int stream_mac); 505 EVP_CIPHER_CTX *cipher_ctx, EVP_MD_CTX *hash_ctx, int stream_mac);
502int tls12_record_layer_set_read_mac_key(struct tls12_record_layer *rl, 506int tls12_record_layer_set_read_mac_key(struct tls12_record_layer *rl,
503 const uint8_t *mac_key, size_t mac_key_len); 507 const uint8_t *mac_key, size_t mac_key_len);
508int tls12_record_layer_change_read_cipher_state(struct tls12_record_layer *rl,
509 const uint8_t *mac_key, size_t mac_key_len, const uint8_t *key,
510 size_t key_len, const uint8_t *iv, size_t iv_len);
511int tls12_record_layer_change_write_cipher_state(struct tls12_record_layer *rl,
512 const uint8_t *mac_key, size_t mac_key_len, const uint8_t *key,
513 size_t key_len, const uint8_t *iv, size_t iv_len);
504int tls12_record_layer_open_record(struct tls12_record_layer *rl, 514int tls12_record_layer_open_record(struct tls12_record_layer *rl,
505 uint8_t *buf, size_t buf_len, uint8_t **out, size_t *out_len); 515 uint8_t *buf, size_t buf_len, uint8_t **out, size_t *out_len);
506int tls12_record_layer_seal_record(struct tls12_record_layer *rl, 516int tls12_record_layer_seal_record(struct tls12_record_layer *rl,
diff --git a/src/lib/libssl/t1_enc.c b/src/lib/libssl/t1_enc.c
index 6c376be2e0..875aae36b0 100644
--- a/src/lib/libssl/t1_enc.c
+++ b/src/lib/libssl/t1_enc.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: t1_enc.c,v 1.128 2021/01/07 15:32:59 jsing Exp $ */ 1/* $OpenBSD: t1_enc.c,v 1.129 2021/01/19 19:07:39 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -562,7 +562,21 @@ tls1_change_cipher_state(SSL *s, int which)
562 562
563 if (key_block - S3I(s)->hs.key_block != S3I(s)->hs.key_block_len) { 563 if (key_block - S3I(s)->hs.key_block != S3I(s)->hs.key_block_len) {
564 SSLerror(s, ERR_R_INTERNAL_ERROR); 564 SSLerror(s, ERR_R_INTERNAL_ERROR);
565 goto err2; 565 goto err;
566 }
567
568 if (is_read) {
569 if (!tls12_record_layer_change_read_cipher_state(s->internal->rl,
570 mac_secret, mac_secret_size, key, key_len, iv, iv_len))
571 goto err;
572 tls12_record_layer_set_read_seq_num(s->internal->rl,
573 S3I(s)->read_sequence);
574 } else {
575 if (!tls12_record_layer_change_write_cipher_state(s->internal->rl,
576 mac_secret, mac_secret_size, key, key_len, iv, iv_len))
577 goto err;
578 tls12_record_layer_set_write_seq_num(s->internal->rl,
579 S3I(s)->write_sequence);
566 } 580 }
567 581
568 if (aead != NULL) { 582 if (aead != NULL) {
@@ -573,7 +587,7 @@ tls1_change_cipher_state(SSL *s, int which)
573 return tls1_change_cipher_state_cipher(s, is_read, 587 return tls1_change_cipher_state_cipher(s, is_read,
574 mac_secret, mac_secret_size, key, key_len, iv, iv_len); 588 mac_secret, mac_secret_size, key, key_len, iv, iv_len);
575 589
576err2: 590 err:
577 return (0); 591 return (0);
578} 592}
579 593
diff --git a/src/lib/libssl/tls12_record_layer.c b/src/lib/libssl/tls12_record_layer.c
index affc5375a2..83d71d1c7a 100644
--- a/src/lib/libssl/tls12_record_layer.c
+++ b/src/lib/libssl/tls12_record_layer.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls12_record_layer.c,v 1.12 2021/01/19 18:57:09 jsing Exp $ */ 1/* $OpenBSD: tls12_record_layer.c,v 1.13 2021/01/19 19:07:39 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2020 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2020 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -132,8 +132,13 @@ struct tls12_record_layer {
132 132
133 uint8_t alert_desc; 133 uint8_t alert_desc;
134 134
135 /* Pointers to active record protection (memory is not owned). */
135 struct tls12_record_protection *read; 136 struct tls12_record_protection *read;
136 struct tls12_record_protection *write; 137 struct tls12_record_protection *write;
138
139 struct tls12_record_protection *read_current;
140 struct tls12_record_protection *write_current;
141 struct tls12_record_protection *write_previous;
137}; 142};
138 143
139struct tls12_record_layer * 144struct tls12_record_layer *
@@ -143,11 +148,14 @@ tls12_record_layer_new(void)
143 148
144 if ((rl = calloc(1, sizeof(struct tls12_record_layer))) == NULL) 149 if ((rl = calloc(1, sizeof(struct tls12_record_layer))) == NULL)
145 goto err; 150 goto err;
146 if ((rl->read = tls12_record_protection_new()) == NULL) 151 if ((rl->read_current = tls12_record_protection_new()) == NULL)
147 goto err; 152 goto err;
148 if ((rl->write = tls12_record_protection_new()) == NULL) 153 if ((rl->write_current = tls12_record_protection_new()) == NULL)
149 goto err; 154 goto err;
150 155
156 rl->read = rl->read_current;
157 rl->write = rl->write_current;
158
151 return rl; 159 return rl;
152 160
153 err: 161 err:
@@ -162,8 +170,9 @@ tls12_record_layer_free(struct tls12_record_layer *rl)
162 if (rl == NULL) 170 if (rl == NULL)
163 return; 171 return;
164 172
165 tls12_record_protection_free(rl->read); 173 tls12_record_protection_free(rl->read_current);
166 tls12_record_protection_free(rl->write); 174 tls12_record_protection_free(rl->write_current);
175 tls12_record_protection_free(rl->write_previous);
167 176
168 freezero(rl, sizeof(struct tls12_record_layer)); 177 freezero(rl, sizeof(struct tls12_record_layer));
169} 178}
@@ -226,6 +235,37 @@ tls12_record_layer_set_write_epoch(struct tls12_record_layer *rl, uint16_t epoch
226 rl->write->epoch = epoch; 235 rl->write->epoch = epoch;
227} 236}
228 237
238int
239tls12_record_layer_use_write_epoch(struct tls12_record_layer *rl, uint16_t epoch)
240{
241 if (rl->write->epoch == epoch)
242 return 1;
243
244 if (rl->write_current->epoch == epoch) {
245 rl->write = rl->write_current;
246 return 1;
247 }
248
249 if (rl->write_previous != NULL && rl->write_previous->epoch == epoch) {
250 rl->write = rl->write_previous;
251 return 1;
252 }
253
254 return 0;
255}
256
257void
258tls12_record_layer_write_epoch_done(struct tls12_record_layer *rl, uint16_t epoch)
259{
260 if (rl->write_previous == NULL || rl->write_previous->epoch != epoch)
261 return;
262
263 rl->write = rl->write_current;
264
265 tls12_record_protection_free(rl->write_previous);
266 rl->write_previous = NULL;
267}
268
229static void 269static void
230tls12_record_layer_set_read_state(struct tls12_record_layer *rl, 270tls12_record_layer_set_read_state(struct tls12_record_layer *rl,
231 SSL_AEAD_CTX *aead_ctx, EVP_CIPHER_CTX *cipher_ctx, EVP_MD_CTX *hash_ctx, 271 SSL_AEAD_CTX *aead_ctx, EVP_CIPHER_CTX *cipher_ctx, EVP_MD_CTX *hash_ctx,
@@ -263,6 +303,9 @@ tls12_record_layer_clear_write_state(struct tls12_record_layer *rl)
263{ 303{
264 tls12_record_layer_set_write_state(rl, NULL, NULL, NULL, 0); 304 tls12_record_layer_set_write_state(rl, NULL, NULL, NULL, 0);
265 rl->write->seq_num = NULL; 305 rl->write->seq_num = NULL;
306
307 tls12_record_protection_free(rl->write_previous);
308 rl->write_previous = NULL;
266} 309}
267 310
268void 311void
@@ -337,6 +380,60 @@ tls12_record_layer_set_read_mac_key(struct tls12_record_layer *rl,
337 return 1; 380 return 1;
338} 381}
339 382
383int
384tls12_record_layer_change_read_cipher_state(struct tls12_record_layer *rl,
385 const uint8_t *mac_key, size_t mac_key_len, const uint8_t *key,
386 size_t key_len, const uint8_t *iv, size_t iv_len)
387{
388 struct tls12_record_protection *read_new = NULL;
389 int ret = 0;
390
391 if ((read_new = tls12_record_protection_new()) == NULL)
392 goto err;
393
394 /* XXX - change cipher state. */
395
396 tls12_record_protection_free(rl->read_current);
397 rl->read = rl->read_current = read_new;
398 read_new = NULL;
399
400 ret = 1;
401
402 err:
403 tls12_record_protection_free(read_new);
404
405 return ret;
406}
407
408int
409tls12_record_layer_change_write_cipher_state(struct tls12_record_layer *rl,
410 const uint8_t *mac_key, size_t mac_key_len, const uint8_t *key,
411 size_t key_len, const uint8_t *iv, size_t iv_len)
412{
413 struct tls12_record_protection *write_new;
414 int ret = 0;
415
416 if ((write_new = tls12_record_protection_new()) == NULL)
417 goto err;
418
419 /* XXX - change cipher state. */
420
421 if (rl->dtls) {
422 tls12_record_protection_free(rl->write_previous);
423 rl->write_previous = rl->write_current;
424 rl->write_current = NULL;
425 }
426 tls12_record_protection_free(rl->write_current);
427 rl->write = rl->write_current = write_new;
428 write_new = NULL;
429
430 ret = 1;
431
432 err:
433 tls12_record_protection_free(write_new);
434
435 return ret;
436}
340static int 437static int
341tls12_record_layer_build_seq_num(struct tls12_record_layer *rl, CBB *cbb, 438tls12_record_layer_build_seq_num(struct tls12_record_layer *rl, CBB *cbb,
342 uint16_t epoch, uint8_t *seq_num, size_t seq_num_len) 439 uint16_t epoch, uint8_t *seq_num, size_t seq_num_len)