summaryrefslogtreecommitdiff
path: root/src/lib/libssl/tls13_server.c
diff options
context:
space:
mode:
authorjsing <>2020-01-24 04:43:09 +0000
committerjsing <>2020-01-24 04:43:09 +0000
commit964a70381982bd3478237eede73feae9fa32b0e6 (patch)
treef271583fde3bbe55c9242508f9c0faa3bde9978d /src/lib/libssl/tls13_server.c
parent7c51231fdacb3958fb78ae8cfc85984bfd3854d6 (diff)
downloadopenbsd-964a70381982bd3478237eede73feae9fa32b0e6.tar.gz
openbsd-964a70381982bd3478237eede73feae9fa32b0e6.tar.bz2
openbsd-964a70381982bd3478237eede73feae9fa32b0e6.zip
Switch to encrypted records in the TLSv1.3 server.
This adds code to perform key derivation and set the traffic keys once the ServerHello message has been sent, enabling encrypted records. ok beck@ tb@
Diffstat (limited to '')
-rw-r--r--src/lib/libssl/tls13_server.c76
1 files changed, 74 insertions, 2 deletions
diff --git a/src/lib/libssl/tls13_server.c b/src/lib/libssl/tls13_server.c
index b64fec8edc..aeeea599bc 100644
--- a/src/lib/libssl/tls13_server.c
+++ b/src/lib/libssl/tls13_server.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_server.c,v 1.13 2020/01/23 11:57:20 jsing Exp $ */ 1/* $OpenBSD: tls13_server.c,v 1.14 2020/01/24 04:43:09 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2019, 2020 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2019, 2020 Joel Sing <jsing@openbsd.org>
4 * Copyright (c) 2020 Bob Beck <beck@openbsd.org> 4 * Copyright (c) 2020 Bob Beck <beck@openbsd.org>
@@ -16,6 +16,8 @@
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */ 17 */
18 18
19#include <openssl/curve25519.h>
20
19#include "ssl_locl.h" 21#include "ssl_locl.h"
20#include "ssl_tlsext.h" 22#include "ssl_tlsext.h"
21 23
@@ -41,6 +43,7 @@ tls13_server_init(struct tls13_ctx *ctx)
41 SSLerror(s, SSL_R_NO_PROTOCOLS_AVAILABLE); 43 SSLerror(s, SSL_R_NO_PROTOCOLS_AVAILABLE);
42 return 0; 44 return 0;
43 } 45 }
46 s->version = ctx->hs->max_version;
44 47
45 if (!tls1_transcript_init(s)) 48 if (!tls1_transcript_init(s))
46 return 0; 49 return 0;
@@ -382,11 +385,80 @@ tls13_server_hello_send(struct tls13_ctx *ctx, CBB *cbb)
382 if (!tls13_server_hello_build(ctx, cbb)) 385 if (!tls13_server_hello_build(ctx, cbb))
383 return 0; 386 return 0;
384 387
385 ctx->handshake_stage.hs_type |= NEGOTIATED;
386 return 1; 388 return 1;
387} 389}
388 390
389int 391int
392tls13_server_hello_sent(struct tls13_ctx *ctx)
393{
394 struct tls13_secrets *secrets;
395 struct tls13_secret context;
396 unsigned char buf[EVP_MAX_MD_SIZE];
397 uint8_t *shared_key = NULL;
398 size_t hash_len;
399 SSL *s = ctx->ssl;
400 int ret = 0;
401
402 /* XXX - handle other key share types. */
403 if (ctx->hs->x25519_peer_public == NULL) {
404 /* XXX - alert. */
405 goto err;
406 }
407 if ((shared_key = malloc(X25519_KEY_LENGTH)) == NULL)
408 goto err;
409 if (!X25519(shared_key, ctx->hs->x25519_private,
410 ctx->hs->x25519_peer_public))
411 goto err;
412
413 s->session->cipher = S3I(s)->hs.new_cipher;
414 s->session->ssl_version = ctx->hs->server_version;
415
416 if ((ctx->aead = tls13_cipher_aead(S3I(s)->hs.new_cipher)) == NULL)
417 goto err;
418 if ((ctx->hash = tls13_cipher_hash(S3I(s)->hs.new_cipher)) == NULL)
419 goto err;
420
421 if ((secrets = tls13_secrets_create(ctx->hash, 0)) == NULL)
422 goto err;
423 S3I(ctx->ssl)->hs_tls13.secrets = secrets;
424
425 /* XXX - pass in hash. */
426 if (!tls1_transcript_hash_init(s))
427 goto err;
428 if (!tls1_transcript_hash_value(s, buf, sizeof(buf), &hash_len))
429 goto err;
430 context.data = buf;
431 context.len = hash_len;
432
433 /* Early secrets. */
434 if (!tls13_derive_early_secrets(secrets, secrets->zeros.data,
435 secrets->zeros.len, &context))
436 goto err;
437
438 /* Handshake secrets. */
439 if (!tls13_derive_handshake_secrets(ctx->hs->secrets, shared_key,
440 X25519_KEY_LENGTH, &context))
441 goto err;
442
443 tls13_record_layer_set_aead(ctx->rl, ctx->aead);
444 tls13_record_layer_set_hash(ctx->rl, ctx->hash);
445
446 if (!tls13_record_layer_set_read_traffic_key(ctx->rl,
447 &secrets->client_handshake_traffic))
448 goto err;
449 if (!tls13_record_layer_set_write_traffic_key(ctx->rl,
450 &secrets->server_handshake_traffic))
451 goto err;
452
453 ctx->handshake_stage.hs_type |= NEGOTIATED | WITHOUT_CR;
454 ret = 1;
455
456 err:
457 freezero(shared_key, X25519_KEY_LENGTH);
458 return ret;
459}
460
461int
390tls13_server_hello_retry_send(struct tls13_ctx *ctx, CBB *cbb) 462tls13_server_hello_retry_send(struct tls13_ctx *ctx, CBB *cbb)
391{ 463{
392 return 0; 464 return 0;