summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortb <>2023-07-02 13:37:09 +0000
committertb <>2023-07-02 13:37:09 +0000
commit81cf7f5a0e83ddd6884c89e7deb313c814fb1794 (patch)
tree4a45788c1a81131fd17dbb375d331a34e94f4b78 /src
parentba8395f5f34f1d7f095fcbdb24b6427010056a97 (diff)
downloadopenbsd-81cf7f5a0e83ddd6884c89e7deb313c814fb1794.tar.gz
openbsd-81cf7f5a0e83ddd6884c89e7deb313c814fb1794.tar.bz2
openbsd-81cf7f5a0e83ddd6884c89e7deb313c814fb1794.zip
Switch sign_sig() and sign_setup() to using BN_CTX
Both these functions use a BN_CTX internally to deal with the EC API that usually requires one. However, they don't actually make use of it. Get the BIGNUMs from the BN_CTX instead, which simplifies the cleanup. Also defer allocation of the ECDSA_SIG to the very end. Instead of using its internal r and s, use two local r and s variables and transfer those to the ECDSA_SIG on success. ok beck jsing
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/ecdsa/ecs_ossl.c120
1 files changed, 73 insertions, 47 deletions
diff --git a/src/lib/libcrypto/ecdsa/ecs_ossl.c b/src/lib/libcrypto/ecdsa/ecs_ossl.c
index 728c07d8bb..adbabb609b 100644
--- a/src/lib/libcrypto/ecdsa/ecs_ossl.c
+++ b/src/lib/libcrypto/ecdsa/ecs_ossl.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ecs_ossl.c,v 1.44 2023/07/02 13:26:36 tb Exp $ */ 1/* $OpenBSD: ecs_ossl.c,v 1.45 2023/07/02 13:37:09 tb Exp $ */
2/* 2/*
3 * Written by Nils Larsch for the OpenSSL project 3 * Written by Nils Larsch for the OpenSSL project
4 */ 4 */
@@ -124,11 +124,13 @@ int
124ossl_ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *in_ctx, BIGNUM **out_kinv, 124ossl_ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *in_ctx, BIGNUM **out_kinv,
125 BIGNUM **out_r) 125 BIGNUM **out_r)
126{ 126{
127 BN_CTX *ctx = in_ctx;
128 BIGNUM *k = NULL, *r = NULL, *order = NULL, *x = NULL;
129 EC_POINT *point = NULL;
130 const EC_GROUP *group; 127 const EC_GROUP *group;
131 int order_bits, ret = 0; 128 EC_POINT *point = NULL;
129 BN_CTX *ctx = NULL;
130 BIGNUM *k = NULL, *r = NULL;
131 BIGNUM *order, *x;
132 int order_bits;
133 int ret = 0;
132 134
133 BN_free(*out_kinv); 135 BN_free(*out_kinv);
134 *out_kinv = NULL; 136 *out_kinv = NULL;
@@ -138,21 +140,28 @@ ossl_ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *in_ctx, BIGNUM **out_kinv,
138 140
139 if (eckey == NULL || (group = EC_KEY_get0_group(eckey)) == NULL) { 141 if (eckey == NULL || (group = EC_KEY_get0_group(eckey)) == NULL) {
140 ECDSAerror(ERR_R_PASSED_NULL_PARAMETER); 142 ECDSAerror(ERR_R_PASSED_NULL_PARAMETER);
141 return 0; 143 goto err;
142 } 144 }
143 145
144 if (ctx == NULL) { 146 if ((k = BN_new()) == NULL)
145 if ((ctx = BN_CTX_new()) == NULL) { 147 goto err;
146 ECDSAerror(ERR_R_MALLOC_FAILURE); 148 if ((r = BN_new()) == NULL)
147 return 0; 149 goto err;
148 }
149 }
150 150
151 if ((k = BN_new()) == NULL || (r = BN_new()) == NULL || 151 if ((ctx = in_ctx) == NULL)
152 (order = BN_new()) == NULL || (x = BN_new()) == NULL) { 152 ctx = BN_CTX_new();
153 if (ctx == NULL) {
153 ECDSAerror(ERR_R_MALLOC_FAILURE); 154 ECDSAerror(ERR_R_MALLOC_FAILURE);
154 goto err; 155 goto err;
155 } 156 }
157
158 BN_CTX_start(ctx);
159
160 if ((order = BN_CTX_get(ctx)) == NULL)
161 goto err;
162 if ((x = BN_CTX_get(ctx)) == NULL)
163 goto err;
164
156 if ((point = EC_POINT_new(group)) == NULL) { 165 if ((point = EC_POINT_new(group)) == NULL) {
157 ECDSAerror(ERR_R_EC_LIB); 166 ECDSAerror(ERR_R_EC_LIB);
158 goto err; 167 goto err;
@@ -236,14 +245,14 @@ ossl_ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *in_ctx, BIGNUM **out_kinv,
236 ret = 1; 245 ret = 1;
237 246
238 err: 247 err:
239 if (in_ctx == NULL) 248 BN_CTX_end(ctx);
249 if (ctx != in_ctx)
240 BN_CTX_free(ctx); 250 BN_CTX_free(ctx);
241 BN_free(order);
242 BN_free(k); 251 BN_free(k);
243 BN_free(r); 252 BN_free(r);
244 EC_POINT_free(point); 253 EC_POINT_free(point);
245 BN_free(x); 254
246 return (ret); 255 return ret;
247} 256}
248 257
249/* 258/*
@@ -257,37 +266,51 @@ ECDSA_SIG *
257ossl_ecdsa_sign_sig(const unsigned char *dgst, int dgst_len, 266ossl_ecdsa_sign_sig(const unsigned char *dgst, int dgst_len,
258 const BIGNUM *in_kinv, const BIGNUM *in_r, EC_KEY *eckey) 267 const BIGNUM *in_kinv, const BIGNUM *in_r, EC_KEY *eckey)
259{ 268{
260 BIGNUM *b = NULL, *binv = NULL, *bm = NULL, *bxr = NULL;
261 BIGNUM *kinv = NULL, *m = NULL, *order = NULL, *s;
262 const BIGNUM *ckinv, *priv_key;
263 BN_CTX *ctx = NULL;
264 const EC_GROUP *group; 269 const EC_GROUP *group;
265 ECDSA_SIG *ret; 270 BN_CTX *ctx = NULL;
271 BIGNUM *kinv = NULL, *r = NULL, *s = NULL;
272 BIGNUM *b, *binv, *bm, *bxr, *m, *order;
273 const BIGNUM *ckinv, *priv_key;
266 int attempts = 0; 274 int attempts = 0;
267 int ok = 0; 275 ECDSA_SIG *sig = NULL;
268 276
269 group = EC_KEY_get0_group(eckey); 277 group = EC_KEY_get0_group(eckey);
270 priv_key = EC_KEY_get0_private_key(eckey); 278 priv_key = EC_KEY_get0_private_key(eckey);
271 279
272 if (group == NULL || priv_key == NULL) { 280 if (group == NULL || priv_key == NULL) {
273 ECDSAerror(ERR_R_PASSED_NULL_PARAMETER); 281 ECDSAerror(ERR_R_PASSED_NULL_PARAMETER);
274 return NULL; 282 goto err;
275 } 283 }
276 284
277 if ((ret = ECDSA_SIG_new()) == NULL) { 285 if ((r = BN_new()) == NULL) {
278 ECDSAerror(ERR_R_MALLOC_FAILURE); 286 ECDSAerror(ERR_R_MALLOC_FAILURE);
279 return NULL; 287 goto err;
288 }
289 if ((s = BN_new()) == NULL) {
290 ECDSAerror(ERR_R_MALLOC_FAILURE);
291 goto err;
280 } 292 }
281 s = ret->s;
282 293
283 if ((ctx = BN_CTX_new()) == NULL || (order = BN_new()) == NULL || 294 if ((ctx = BN_CTX_new()) == NULL) {
284 (b = BN_new()) == NULL ||
285 (binv = BN_new()) == NULL || (bm = BN_new()) == NULL ||
286 (bxr = BN_new()) == NULL || (m = BN_new()) == NULL) {
287 ECDSAerror(ERR_R_MALLOC_FAILURE); 295 ECDSAerror(ERR_R_MALLOC_FAILURE);
288 goto err; 296 goto err;
289 } 297 }
290 298
299 BN_CTX_start(ctx);
300
301 if ((order = BN_CTX_get(ctx)) == NULL)
302 goto err;
303 if ((b = BN_CTX_get(ctx)) == NULL)
304 goto err;
305 if ((binv = BN_CTX_get(ctx)) == NULL)
306 goto err;
307 if ((bm = BN_CTX_get(ctx)) == NULL)
308 goto err;
309 if ((bxr = BN_CTX_get(ctx)) == NULL)
310 goto err;
311 if ((m = BN_CTX_get(ctx)) == NULL)
312 goto err;
313
291 if (!EC_GROUP_get_order(group, order, ctx)) { 314 if (!EC_GROUP_get_order(group, order, ctx)) {
292 ECDSAerror(ERR_R_EC_LIB); 315 ECDSAerror(ERR_R_EC_LIB);
293 goto err; 316 goto err;
@@ -298,14 +321,14 @@ ossl_ecdsa_sign_sig(const unsigned char *dgst, int dgst_len,
298 321
299 do { 322 do {
300 if (in_kinv == NULL || in_r == NULL) { 323 if (in_kinv == NULL || in_r == NULL) {
301 if (!ECDSA_sign_setup(eckey, ctx, &kinv, &ret->r)) { 324 if (!ECDSA_sign_setup(eckey, ctx, &kinv, &r)) {
302 ECDSAerror(ERR_R_ECDSA_LIB); 325 ECDSAerror(ERR_R_ECDSA_LIB);
303 goto err; 326 goto err;
304 } 327 }
305 ckinv = kinv; 328 ckinv = kinv;
306 } else { 329 } else {
307 ckinv = in_kinv; 330 ckinv = in_kinv;
308 if (!bn_copy(ret->r, in_r)) { 331 if (!bn_copy(r, in_r)) {
309 ECDSAerror(ERR_R_MALLOC_FAILURE); 332 ECDSAerror(ERR_R_MALLOC_FAILURE);
310 goto err; 333 goto err;
311 } 334 }
@@ -338,7 +361,7 @@ ossl_ecdsa_sign_sig(const unsigned char *dgst, int dgst_len,
338 ECDSAerror(ERR_R_BN_LIB); 361 ECDSAerror(ERR_R_BN_LIB);
339 goto err; 362 goto err;
340 } 363 }
341 if (!BN_mod_mul(bxr, bxr, ret->r, order, ctx)) { /* bxr */ 364 if (!BN_mod_mul(bxr, bxr, r, order, ctx)) { /* bxr */
342 ECDSAerror(ERR_R_BN_LIB); 365 ECDSAerror(ERR_R_BN_LIB);
343 goto err; 366 goto err;
344 } 367 }
@@ -378,22 +401,25 @@ ossl_ecdsa_sign_sig(const unsigned char *dgst, int dgst_len,
378 break; 401 break;
379 } while (1); 402 } while (1);
380 403
381 ok = 1; 404 if ((sig = ECDSA_SIG_new()) == NULL) {
405 ECDSAerror(ERR_R_MALLOC_FAILURE);
406 goto err;
407 }
408 if (!ECDSA_SIG_set0(sig, r, s)) {
409 ECDSA_SIG_free(sig);
410 goto err;
411 }
412 r = NULL;
413 s = NULL;
382 414
383 err: 415 err:
384 if (ok == 0) { 416 BN_CTX_end(ctx);
385 ECDSA_SIG_free(ret);
386 ret = NULL;
387 }
388 BN_CTX_free(ctx); 417 BN_CTX_free(ctx);
389 BN_free(b);
390 BN_free(binv);
391 BN_free(bm);
392 BN_free(bxr);
393 BN_free(kinv); 418 BN_free(kinv);
394 BN_free(m); 419 BN_free(r);
395 BN_free(order); 420 BN_free(s);
396 return ret; 421
422 return sig;
397} 423}
398 424
399int 425int