diff options
Diffstat (limited to 'src/lib/libssl/tls_key_share.c')
| -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) |
