diff options
author | jsing <> | 2022-01-07 15:46:30 +0000 |
---|---|---|
committer | jsing <> | 2022-01-07 15:46:30 +0000 |
commit | 3f7702534a377e0a3b33a6681df0af8a57adbc57 (patch) | |
tree | 270b59705c9d4efa145c0649cce3fa41750939d9 /src/lib/libssl/tls_key_share.c | |
parent | a42b07afac78ec75467b5a5ca9fcbbdaf9d093a4 (diff) | |
download | openbsd-3f7702534a377e0a3b33a6681df0af8a57adbc57.tar.gz openbsd-3f7702534a377e0a3b33a6681df0af8a57adbc57.tar.bz2 openbsd-3f7702534a377e0a3b33a6681df0af8a57adbc57.zip |
Convert legacy server to tls_key_share.
This requires a few more additions to the DHE key share code - we need to
be able to either set the DHE parameters or specify the number of key bits
for use with auto DHE parameters. Additionally, we need to be able to
serialise the DHE parameters to send to the client.
This removes the infamous 'tmp' struct from ssl3_state_internal_st.
ok inoguchi@ tb@
Diffstat (limited to '')
-rw-r--r-- | src/lib/libssl/tls_key_share.c | 69 |
1 files changed, 65 insertions, 4 deletions
diff --git a/src/lib/libssl/tls_key_share.c b/src/lib/libssl/tls_key_share.c index 6e390f4a24..eb30a0ea69 100644 --- a/src/lib/libssl/tls_key_share.c +++ b/src/lib/libssl/tls_key_share.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* $OpenBSD: tls_key_share.c,v 1.2 2022/01/06 18:23:56 jsing Exp $ */ | 1 | /* $OpenBSD: tls_key_share.c,v 1.3 2022/01/07 15:46:30 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2020 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2020, 2021 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
5 | * Permission to use, copy, modify, and distribute this software for any | 5 | * Permission to use, copy, modify, and distribute this software for any |
6 | * purpose with or without fee is hereby granted, provided that the above | 6 | * purpose with or without fee is hereby granted, provided that the above |
@@ -18,7 +18,9 @@ | |||
18 | #include <stdlib.h> | 18 | #include <stdlib.h> |
19 | 19 | ||
20 | #include <openssl/curve25519.h> | 20 | #include <openssl/curve25519.h> |
21 | #include <openssl/dh.h> | ||
21 | #include <openssl/ec.h> | 22 | #include <openssl/ec.h> |
23 | #include <openssl/evp.h> | ||
22 | 24 | ||
23 | #include "bytestring.h" | 25 | #include "bytestring.h" |
24 | #include "ssl_locl.h" | 26 | #include "ssl_locl.h" |
@@ -27,6 +29,7 @@ | |||
27 | struct tls_key_share { | 29 | struct tls_key_share { |
28 | int nid; | 30 | int nid; |
29 | uint16_t group_id; | 31 | uint16_t group_id; |
32 | size_t key_bits; | ||
30 | 33 | ||
31 | DH *dhe; | 34 | DH *dhe; |
32 | DH *dhe_peer; | 35 | DH *dhe_peer; |
@@ -108,6 +111,28 @@ tls_key_share_nid(struct tls_key_share *ks) | |||
108 | return ks->nid; | 111 | return ks->nid; |
109 | } | 112 | } |
110 | 113 | ||
114 | void | ||
115 | tls_key_share_set_key_bits(struct tls_key_share *ks, size_t key_bits) | ||
116 | { | ||
117 | ks->key_bits = key_bits; | ||
118 | } | ||
119 | |||
120 | int | ||
121 | tls_key_share_set_dh_params(struct tls_key_share *ks, DH *dh_params) | ||
122 | { | ||
123 | if (ks->nid != NID_dhKeyAgreement) | ||
124 | return 0; | ||
125 | if (ks->dhe != NULL || ks->dhe_peer != NULL) | ||
126 | return 0; | ||
127 | |||
128 | if ((ks->dhe = DHparams_dup(dh_params)) == NULL) | ||
129 | return 0; | ||
130 | if ((ks->dhe_peer = DHparams_dup(dh_params)) == NULL) | ||
131 | return 0; | ||
132 | |||
133 | return 1; | ||
134 | } | ||
135 | |||
111 | int | 136 | int |
112 | tls_key_share_peer_pkey(struct tls_key_share *ks, EVP_PKEY *pkey) | 137 | tls_key_share_peer_pkey(struct tls_key_share *ks, EVP_PKEY *pkey) |
113 | { | 138 | { |
@@ -126,10 +151,28 @@ tls_key_share_peer_pkey(struct tls_key_share *ks, EVP_PKEY *pkey) | |||
126 | static int | 151 | static int |
127 | tls_key_share_generate_dhe(struct tls_key_share *ks) | 152 | tls_key_share_generate_dhe(struct tls_key_share *ks) |
128 | { | 153 | { |
129 | if (ks->dhe == NULL) | 154 | /* |
155 | * If auto params are not being used then we must already have DH | ||
156 | * parameters set. | ||
157 | */ | ||
158 | if (ks->key_bits == 0) { | ||
159 | if (ks->dhe == NULL) | ||
160 | return 0; | ||
161 | |||
162 | return ssl_kex_generate_dhe(ks->dhe, ks->dhe); | ||
163 | } | ||
164 | |||
165 | if (ks->dhe != NULL || ks->dhe_peer != NULL) | ||
166 | return 0; | ||
167 | |||
168 | if ((ks->dhe = DH_new()) == NULL) | ||
169 | return 0; | ||
170 | if (!ssl_kex_generate_dhe_params_auto(ks->dhe, ks->key_bits)) | ||
171 | return 0; | ||
172 | if ((ks->dhe_peer = DHparams_dup(ks->dhe)) == NULL) | ||
130 | return 0; | 173 | return 0; |
131 | 174 | ||
132 | return ssl_kex_generate_dhe(ks->dhe, ks->dhe); | 175 | return 1; |
133 | } | 176 | } |
134 | 177 | ||
135 | static int | 178 | static int |
@@ -200,6 +243,24 @@ tls_key_share_generate(struct tls_key_share *ks) | |||
200 | } | 243 | } |
201 | 244 | ||
202 | static int | 245 | static int |
246 | tls_key_share_params_dhe(struct tls_key_share *ks, CBB *cbb) | ||
247 | { | ||
248 | if (ks->dhe == NULL) | ||
249 | return 0; | ||
250 | |||
251 | return ssl_kex_params_dhe(ks->dhe, cbb); | ||
252 | } | ||
253 | |||
254 | int | ||
255 | tls_key_share_params(struct tls_key_share *ks, CBB *cbb) | ||
256 | { | ||
257 | if (ks->nid == NID_dhKeyAgreement) | ||
258 | return tls_key_share_params_dhe(ks, cbb); | ||
259 | |||
260 | return 0; | ||
261 | } | ||
262 | |||
263 | static int | ||
203 | tls_key_share_public_dhe(struct tls_key_share *ks, CBB *cbb) | 264 | tls_key_share_public_dhe(struct tls_key_share *ks, CBB *cbb) |
204 | { | 265 | { |
205 | if (ks->dhe == NULL) | 266 | if (ks->dhe == NULL) |