diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/libssl/tls13_key_share.c | 103 |
1 files changed, 98 insertions, 5 deletions
diff --git a/src/lib/libssl/tls13_key_share.c b/src/lib/libssl/tls13_key_share.c index 3fe38ecc37..c38a3e3cb8 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.2 2020/02/01 12:41:58 jsing Exp $ */ | 1 | /* $OpenBSD: tls13_key_share.c,v 1.3 2020/02/04 18:06:26 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2020 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2020 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -27,6 +27,9 @@ struct tls13_key_share { | |||
27 | int nid; | 27 | int nid; |
28 | uint16_t group_id; | 28 | uint16_t group_id; |
29 | 29 | ||
30 | EC_KEY *ecdhe; | ||
31 | EC_KEY *ecdhe_peer; | ||
32 | |||
30 | uint8_t *x25519_public; | 33 | uint8_t *x25519_public; |
31 | uint8_t *x25519_private; | 34 | uint8_t *x25519_private; |
32 | uint8_t *x25519_peer_public; | 35 | uint8_t *x25519_peer_public; |
@@ -59,6 +62,9 @@ tls13_key_share_free(struct tls13_key_share *ks) | |||
59 | if (ks == NULL) | 62 | if (ks == NULL) |
60 | return; | 63 | return; |
61 | 64 | ||
65 | EC_KEY_free(ks->ecdhe); | ||
66 | EC_KEY_free(ks->ecdhe_peer); | ||
67 | |||
62 | freezero(ks->x25519_public, X25519_KEY_LENGTH); | 68 | freezero(ks->x25519_public, X25519_KEY_LENGTH); |
63 | freezero(ks->x25519_private, X25519_KEY_LENGTH); | 69 | freezero(ks->x25519_private, X25519_KEY_LENGTH); |
64 | freezero(ks->x25519_peer_public, X25519_KEY_LENGTH); | 70 | freezero(ks->x25519_peer_public, X25519_KEY_LENGTH); |
@@ -73,6 +79,31 @@ tls13_key_share_group(struct tls13_key_share *ks) | |||
73 | } | 79 | } |
74 | 80 | ||
75 | static int | 81 | static int |
82 | tls13_key_share_generate_ecdhe_ecp(struct tls13_key_share *ks) | ||
83 | { | ||
84 | EC_KEY *ecdhe = NULL; | ||
85 | int ret = 0; | ||
86 | |||
87 | if (ks->ecdhe != NULL) | ||
88 | goto err; | ||
89 | |||
90 | if ((ecdhe = EC_KEY_new()) == NULL) | ||
91 | goto err; | ||
92 | if (!ssl_kex_generate_ecdhe_ecp(ecdhe, ks->nid)) | ||
93 | goto err; | ||
94 | |||
95 | ks->ecdhe = ecdhe; | ||
96 | ecdhe = NULL; | ||
97 | |||
98 | ret = 1; | ||
99 | |||
100 | err: | ||
101 | EC_KEY_free(ecdhe); | ||
102 | |||
103 | return ret; | ||
104 | } | ||
105 | |||
106 | static int | ||
76 | tls13_key_share_generate_x25519(struct tls13_key_share *ks) | 107 | tls13_key_share_generate_x25519(struct tls13_key_share *ks) |
77 | { | 108 | { |
78 | uint8_t *public = NULL, *private = NULL; | 109 | uint8_t *public = NULL, *private = NULL; |
@@ -105,13 +136,24 @@ tls13_key_share_generate_x25519(struct tls13_key_share *ks) | |||
105 | int | 136 | int |
106 | tls13_key_share_generate(struct tls13_key_share *ks) | 137 | tls13_key_share_generate(struct tls13_key_share *ks) |
107 | { | 138 | { |
108 | if (ks->nid == NID_X25519) | 139 | if (ks->nid == NID_X9_62_prime256v1 || ks->nid == NID_secp384r1) |
140 | return tls13_key_share_generate_ecdhe_ecp(ks); | ||
141 | else if (ks->nid == NID_X25519) | ||
109 | return tls13_key_share_generate_x25519(ks); | 142 | return tls13_key_share_generate_x25519(ks); |
110 | 143 | ||
111 | return 0; | 144 | return 0; |
112 | } | 145 | } |
113 | 146 | ||
114 | static int | 147 | static int |
148 | tls13_key_share_public_ecdhe_ecp(struct tls13_key_share *ks, CBB *cbb) | ||
149 | { | ||
150 | if (ks->ecdhe == NULL) | ||
151 | return 0; | ||
152 | |||
153 | return ssl_kex_public_ecdhe_ecp(ks->ecdhe, cbb); | ||
154 | } | ||
155 | |||
156 | static int | ||
115 | tls13_key_share_public_x25519(struct tls13_key_share *ks, CBB *cbb) | 157 | tls13_key_share_public_x25519(struct tls13_key_share *ks, CBB *cbb) |
116 | { | 158 | { |
117 | if (ks->x25519_public == NULL) | 159 | if (ks->x25519_public == NULL) |
@@ -130,7 +172,10 @@ tls13_key_share_public(struct tls13_key_share *ks, CBB *cbb) | |||
130 | if (!CBB_add_u16_length_prefixed(cbb, &key_exchange)) | 172 | if (!CBB_add_u16_length_prefixed(cbb, &key_exchange)) |
131 | goto err; | 173 | goto err; |
132 | 174 | ||
133 | if (ks->nid == NID_X25519) { | 175 | if (ks->nid == NID_X9_62_prime256v1 || ks->nid == NID_secp384r1) { |
176 | if (!tls13_key_share_public_ecdhe_ecp(ks, &key_exchange)) | ||
177 | goto err; | ||
178 | } else if (ks->nid == NID_X25519) { | ||
134 | if (!tls13_key_share_public_x25519(ks, &key_exchange)) | 179 | if (!tls13_key_share_public_x25519(ks, &key_exchange)) |
135 | goto err; | 180 | goto err; |
136 | } else { | 181 | } else { |
@@ -147,10 +192,38 @@ tls13_key_share_public(struct tls13_key_share *ks, CBB *cbb) | |||
147 | } | 192 | } |
148 | 193 | ||
149 | static int | 194 | static int |
195 | tls13_key_share_peer_public_ecdhe_ecp(struct tls13_key_share *ks, CBS *cbs) | ||
196 | { | ||
197 | EC_KEY *ecdhe = NULL; | ||
198 | int ret = 0; | ||
199 | |||
200 | if (ks->ecdhe_peer != NULL) | ||
201 | goto err; | ||
202 | |||
203 | if ((ecdhe = EC_KEY_new()) == NULL) | ||
204 | goto err; | ||
205 | if (!ssl_kex_peer_public_ecdhe_ecp(ecdhe, ks->nid, cbs)) | ||
206 | goto err; | ||
207 | |||
208 | ks->ecdhe_peer = ecdhe; | ||
209 | ecdhe = NULL; | ||
210 | |||
211 | ret = 1; | ||
212 | |||
213 | err: | ||
214 | EC_KEY_free(ecdhe); | ||
215 | |||
216 | return ret; | ||
217 | } | ||
218 | |||
219 | static int | ||
150 | tls13_key_share_peer_public_x25519(struct tls13_key_share *ks, CBS *cbs) | 220 | tls13_key_share_peer_public_x25519(struct tls13_key_share *ks, CBS *cbs) |
151 | { | 221 | { |
152 | size_t out_len; | 222 | size_t out_len; |
153 | 223 | ||
224 | if (ks->x25519_peer_public != NULL) | ||
225 | return 0; | ||
226 | |||
154 | if (CBS_len(cbs) != X25519_KEY_LENGTH) | 227 | if (CBS_len(cbs) != X25519_KEY_LENGTH) |
155 | return 0; | 228 | return 0; |
156 | 229 | ||
@@ -164,15 +237,31 @@ tls13_key_share_peer_public(struct tls13_key_share *ks, uint16_t group, | |||
164 | if (ks->group_id != group) | 237 | if (ks->group_id != group) |
165 | return 0; | 238 | return 0; |
166 | 239 | ||
167 | if (ks->nid == NID_X25519) { | 240 | if (ks->nid == NID_X9_62_prime256v1 || ks->nid == NID_secp384r1) { |
241 | if (!tls13_key_share_peer_public_ecdhe_ecp(ks, cbs)) | ||
242 | return 0; | ||
243 | } else if (ks->nid == NID_X25519) { | ||
168 | if (!tls13_key_share_peer_public_x25519(ks, cbs)) | 244 | if (!tls13_key_share_peer_public_x25519(ks, cbs)) |
169 | return 0; | 245 | return 0; |
246 | } else { | ||
247 | return 0; | ||
170 | } | 248 | } |
171 | 249 | ||
172 | return 1; | 250 | return 1; |
173 | } | 251 | } |
174 | 252 | ||
175 | static int | 253 | static int |
254 | tls13_key_share_derive_ecdhe_ecp(struct tls13_key_share *ks, | ||
255 | uint8_t **shared_key, size_t *shared_key_len) | ||
256 | { | ||
257 | if (ks->ecdhe == NULL || ks->ecdhe_peer == NULL) | ||
258 | return 0; | ||
259 | |||
260 | return ssl_kex_derive_ecdhe_ecp(ks->ecdhe, ks->ecdhe_peer, | ||
261 | shared_key, shared_key_len); | ||
262 | } | ||
263 | |||
264 | static int | ||
176 | tls13_key_share_derive_x25519(struct tls13_key_share *ks, | 265 | tls13_key_share_derive_x25519(struct tls13_key_share *ks, |
177 | uint8_t **shared_key, size_t *shared_key_len) | 266 | uint8_t **shared_key, size_t *shared_key_len) |
178 | { | 267 | { |
@@ -208,9 +297,13 @@ tls13_key_share_derive(struct tls13_key_share *ks, uint8_t **shared_key, | |||
208 | 297 | ||
209 | *shared_key_len = 0; | 298 | *shared_key_len = 0; |
210 | 299 | ||
211 | if (ks->nid == NID_X25519) | 300 | if (ks->nid == NID_X9_62_prime256v1 || ks->nid == NID_secp384r1) { |
301 | return tls13_key_share_derive_ecdhe_ecp(ks, shared_key, | ||
302 | shared_key_len); | ||
303 | } else if (ks->nid == NID_X25519) { | ||
212 | return tls13_key_share_derive_x25519(ks, shared_key, | 304 | return tls13_key_share_derive_x25519(ks, shared_key, |
213 | shared_key_len); | 305 | shared_key_len); |
306 | } | ||
214 | 307 | ||
215 | return 0; | 308 | return 0; |
216 | } | 309 | } |