summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libssl/tls13_handshake.c3
-rw-r--r--src/lib/libssl/tls13_internal.h3
-rw-r--r--src/lib/libssl/tls13_server.c76
3 files changed, 78 insertions, 4 deletions
diff --git a/src/lib/libssl/tls13_handshake.c b/src/lib/libssl/tls13_handshake.c
index 1157d6ecac..518073f4a1 100644
--- a/src/lib/libssl/tls13_handshake.c
+++ b/src/lib/libssl/tls13_handshake.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_handshake.c,v 1.41 2020/01/23 02:24:38 jsing Exp $ */ 1/* $OpenBSD: tls13_handshake.c,v 1.42 2020/01/24 04:43:09 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2018-2019 Theo Buehler <tb@openbsd.org> 3 * Copyright (c) 2018-2019 Theo Buehler <tb@openbsd.org>
4 * Copyright (c) 2019 Joel Sing <jsing@openbsd.org> 4 * Copyright (c) 2019 Joel Sing <jsing@openbsd.org>
@@ -97,6 +97,7 @@ struct tls13_handshake_action state_machine[] = {
97 .handshake_type = TLS13_MT_SERVER_HELLO, 97 .handshake_type = TLS13_MT_SERVER_HELLO,
98 .sender = TLS13_HS_SERVER, 98 .sender = TLS13_HS_SERVER,
99 .send = tls13_server_hello_send, 99 .send = tls13_server_hello_send,
100 .sent = tls13_server_hello_sent,
100 .recv = tls13_server_hello_recv, 101 .recv = tls13_server_hello_recv,
101 }, 102 },
102 [SERVER_HELLO_RETRY] = { 103 [SERVER_HELLO_RETRY] = {
diff --git a/src/lib/libssl/tls13_internal.h b/src/lib/libssl/tls13_internal.h
index 7b3670bf45..b42889712f 100644
--- a/src/lib/libssl/tls13_internal.h
+++ b/src/lib/libssl/tls13_internal.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_internal.h,v 1.51 2020/01/24 04:36:29 beck Exp $ */ 1/* $OpenBSD: tls13_internal.h,v 1.52 2020/01/24 04:43:09 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2018 Bob Beck <beck@openbsd.org> 3 * Copyright (c) 2018 Bob Beck <beck@openbsd.org>
4 * Copyright (c) 2018 Theo Buehler <tb@openbsd.org> 4 * Copyright (c) 2018 Theo Buehler <tb@openbsd.org>
@@ -280,6 +280,7 @@ int tls13_client_key_update_send(struct tls13_ctx *ctx, CBB *cbb);
280int tls13_client_key_update_recv(struct tls13_ctx *ctx, CBS *cbs); 280int tls13_client_key_update_recv(struct tls13_ctx *ctx, CBS *cbs);
281int tls13_server_hello_recv(struct tls13_ctx *ctx, CBS *cbs); 281int tls13_server_hello_recv(struct tls13_ctx *ctx, CBS *cbs);
282int tls13_server_hello_send(struct tls13_ctx *ctx, CBB *cbb); 282int tls13_server_hello_send(struct tls13_ctx *ctx, CBB *cbb);
283int tls13_server_hello_sent(struct tls13_ctx *ctx);
283int tls13_server_hello_retry_recv(struct tls13_ctx *ctx, CBS *cbs); 284int tls13_server_hello_retry_recv(struct tls13_ctx *ctx, CBS *cbs);
284int tls13_server_hello_retry_send(struct tls13_ctx *ctx, CBB *cbb); 285int tls13_server_hello_retry_send(struct tls13_ctx *ctx, CBB *cbb);
285int tls13_server_encrypted_extensions_recv(struct tls13_ctx *ctx, CBS *cbs); 286int tls13_server_encrypted_extensions_recv(struct tls13_ctx *ctx, CBS *cbs);
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;