diff options
author | jsing <> | 2020-04-17 17:16:53 +0000 |
---|---|---|
committer | jsing <> | 2020-04-17 17:16:53 +0000 |
commit | 295bf02f8211b77feb0bc6963c1b7ec49122ce18 (patch) | |
tree | 6980ad850639ce4d604770bdc22972d3796629db /src/lib | |
parent | 08ce53d34d4a31ffea547e7c058abeb9c77d0835 (diff) | |
download | openbsd-295bf02f8211b77feb0bc6963c1b7ec49122ce18.tar.gz openbsd-295bf02f8211b77feb0bc6963c1b7ec49122ce18.tar.bz2 openbsd-295bf02f8211b77feb0bc6963c1b7ec49122ce18.zip |
Generate client key share using our preferred group.
Generate a client key share using our preferred group, rather than always
using X25519. This means that the key share group can be controlled via
SSL{_CTX,}_set1_groups() and SSL{_CTX,}_set1_groups_list().
ok beck@
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/libssl/tls13_client.c | 27 | ||||
-rw-r--r-- | src/lib/libssl/tls13_internal.h | 5 | ||||
-rw-r--r-- | src/lib/libssl/tls13_key_share.c | 26 | ||||
-rw-r--r-- | src/lib/libssl/tls13_server.c | 4 |
4 files changed, 37 insertions, 25 deletions
diff --git a/src/lib/libssl/tls13_client.c b/src/lib/libssl/tls13_client.c index 22cda1e6be..5cd588875e 100644 --- a/src/lib/libssl/tls13_client.c +++ b/src/lib/libssl/tls13_client.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls13_client.c,v 1.48 2020/04/08 16:23:58 jsing Exp $ */ | 1 | /* $OpenBSD: tls13_client.c,v 1.49 2020/04/17 17:16:53 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 | * |
@@ -36,6 +36,8 @@ tls13_connect(struct tls13_ctx *ctx) | |||
36 | static int | 36 | static int |
37 | tls13_client_init(struct tls13_ctx *ctx) | 37 | tls13_client_init(struct tls13_ctx *ctx) |
38 | { | 38 | { |
39 | const uint16_t *groups; | ||
40 | size_t groups_len; | ||
39 | SSL *s = ctx->ssl; | 41 | SSL *s = ctx->ssl; |
40 | 42 | ||
41 | if (!ssl_supported_version_range(s, &ctx->hs->min_version, | 43 | if (!ssl_supported_version_range(s, &ctx->hs->min_version, |
@@ -51,7 +53,11 @@ tls13_client_init(struct tls13_ctx *ctx) | |||
51 | if (!tls1_transcript_init(s)) | 53 | if (!tls1_transcript_init(s)) |
52 | return 0; | 54 | return 0; |
53 | 55 | ||
54 | if ((ctx->hs->key_share = tls13_key_share_new(NID_X25519)) == NULL) | 56 | /* Generate a key share using our preferred group. */ |
57 | tls1_get_group_list(s, 0, &groups, &groups_len); | ||
58 | if (groups_len < 1) | ||
59 | return 0; | ||
60 | if ((ctx->hs->key_share = tls13_key_share_new(groups[0])) == NULL) | ||
55 | return 0; | 61 | return 0; |
56 | if (!tls13_key_share_generate(ctx->hs->key_share)) | 62 | if (!tls13_key_share_generate(ctx->hs->key_share)) |
57 | return 0; | 63 | return 0; |
@@ -560,23 +566,20 @@ tls13_server_hello_recv(struct tls13_ctx *ctx, CBS *cbs) | |||
560 | int | 566 | int |
561 | tls13_client_hello_retry_send(struct tls13_ctx *ctx, CBB *cbb) | 567 | tls13_client_hello_retry_send(struct tls13_ctx *ctx, CBB *cbb) |
562 | { | 568 | { |
563 | int nid; | ||
564 | |||
565 | /* | 569 | /* |
566 | * Ensure that the server supported group is not the same | 570 | * Ensure that the server supported group is one that we listed in our |
567 | * as the one we previously offered and that it was one that | 571 | * supported groups and is not the same as the key share we previously |
568 | * we listed in our supported groups. | 572 | * offered. |
569 | */ | 573 | */ |
570 | if (ctx->hs->server_group == tls13_key_share_group(ctx->hs->key_share)) | 574 | if (!tls1_check_curve(ctx->ssl, ctx->hs->server_group)) |
571 | return 0; /* XXX alert */ | 575 | return 0; /* XXX alert */ |
572 | if ((nid = tls1_ec_curve_id2nid(ctx->hs->server_group)) == 0) | 576 | if (ctx->hs->server_group == tls13_key_share_group(ctx->hs->key_share)) |
573 | return 0; | ||
574 | if (nid != NID_X25519 && nid != NID_X9_62_prime256v1 && nid != NID_secp384r1) | ||
575 | return 0; /* XXX alert */ | 577 | return 0; /* XXX alert */ |
576 | 578 | ||
577 | /* Switch to new key share. */ | 579 | /* Switch to new key share. */ |
578 | tls13_key_share_free(ctx->hs->key_share); | 580 | tls13_key_share_free(ctx->hs->key_share); |
579 | if ((ctx->hs->key_share = tls13_key_share_new(nid)) == NULL) | 581 | if ((ctx->hs->key_share = |
582 | tls13_key_share_new(ctx->hs->server_group)) == NULL) | ||
580 | return 0; | 583 | return 0; |
581 | if (!tls13_key_share_generate(ctx->hs->key_share)) | 584 | if (!tls13_key_share_generate(ctx->hs->key_share)) |
582 | return 0; | 585 | return 0; |
diff --git a/src/lib/libssl/tls13_internal.h b/src/lib/libssl/tls13_internal.h index 053a7972a0..8d5d9c4efe 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.61 2020/03/10 17:15:02 jsing Exp $ */ | 1 | /* $OpenBSD: tls13_internal.h,v 1.62 2020/04/17 17:16:53 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> |
@@ -123,7 +123,8 @@ int tls13_update_server_traffic_secret(struct tls13_secrets *secrets); | |||
123 | */ | 123 | */ |
124 | struct tls13_key_share; | 124 | struct tls13_key_share; |
125 | 125 | ||
126 | struct tls13_key_share *tls13_key_share_new(int nid); | 126 | struct tls13_key_share *tls13_key_share_new(uint16_t group_id); |
127 | struct tls13_key_share *tls13_key_share_new_nid(int nid); | ||
127 | void tls13_key_share_free(struct tls13_key_share *ks); | 128 | void tls13_key_share_free(struct tls13_key_share *ks); |
128 | 129 | ||
129 | uint16_t tls13_key_share_group(struct tls13_key_share *ks); | 130 | uint16_t tls13_key_share_group(struct tls13_key_share *ks); |
diff --git a/src/lib/libssl/tls13_key_share.c b/src/lib/libssl/tls13_key_share.c index c38a3e3cb8..5404c04070 100644 --- a/src/lib/libssl/tls13_key_share.c +++ b/src/lib/libssl/tls13_key_share.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls13_key_share.c,v 1.3 2020/02/04 18:06:26 jsing Exp $ */ | 1 | /* $OpenBSD: tls13_key_share.c,v 1.4 2020/04/17 17:16:53 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2020 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2020 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -36,24 +36,32 @@ struct tls13_key_share { | |||
36 | }; | 36 | }; |
37 | 37 | ||
38 | struct tls13_key_share * | 38 | struct tls13_key_share * |
39 | tls13_key_share_new(int nid) | 39 | tls13_key_share_new(uint16_t group_id) |
40 | { | 40 | { |
41 | struct tls13_key_share *ks; | 41 | struct tls13_key_share *ks; |
42 | int nid; | ||
42 | 43 | ||
43 | if ((ks = calloc(1, sizeof(struct tls13_key_share))) == NULL) | 44 | if ((nid = tls1_ec_curve_id2nid(group_id)) == 0) |
44 | goto err; | 45 | return NULL; |
45 | 46 | ||
46 | if ((ks->group_id = tls1_ec_nid2curve_id(nid)) == 0) | 47 | if ((ks = calloc(1, sizeof(struct tls13_key_share))) == NULL) |
47 | goto err; | 48 | return NULL; |
48 | 49 | ||
50 | ks->group_id = group_id; | ||
49 | ks->nid = nid; | 51 | ks->nid = nid; |
50 | 52 | ||
51 | return ks; | 53 | return ks; |
54 | } | ||
52 | 55 | ||
53 | err: | 56 | struct tls13_key_share * |
54 | tls13_key_share_free(ks); | 57 | tls13_key_share_new_nid(int nid) |
58 | { | ||
59 | uint16_t group_id; | ||
60 | |||
61 | if ((group_id = tls1_ec_nid2curve_id(nid)) == 0) | ||
62 | return NULL; | ||
55 | 63 | ||
56 | return NULL; | 64 | return tls13_key_share_new(group_id); |
57 | } | 65 | } |
58 | 66 | ||
59 | void | 67 | void |
diff --git a/src/lib/libssl/tls13_server.c b/src/lib/libssl/tls13_server.c index 3b170f9370..1aebf5840c 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.28 2020/03/10 17:23:25 jsing Exp $ */ | 1 | /* $OpenBSD: tls13_server.c,v 1.29 2020/04/17 17:16:53 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> |
@@ -49,7 +49,7 @@ tls13_server_init(struct tls13_ctx *ctx) | |||
49 | if ((s->session = SSL_SESSION_new()) == NULL) | 49 | if ((s->session = SSL_SESSION_new()) == NULL) |
50 | return 0; | 50 | return 0; |
51 | 51 | ||
52 | if ((ctx->hs->key_share = tls13_key_share_new(NID_X25519)) == NULL) | 52 | if ((ctx->hs->key_share = tls13_key_share_new_nid(NID_X25519)) == NULL) |
53 | return 0; | 53 | return 0; |
54 | if (!tls13_key_share_generate(ctx->hs->key_share)) | 54 | if (!tls13_key_share_generate(ctx->hs->key_share)) |
55 | return 0; | 55 | return 0; |