summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjsing <>2023-02-19 13:51:00 +0000
committerjsing <>2023-02-19 13:51:00 +0000
commit0b9113bf9e31f4dff7749b7c96c558ac5cf0332e (patch)
treede81f5c43431758b2a374ba14c7a5908bdd19f5c
parent0a69e4b42828860153d1be7ce5e7626ac56d6b04 (diff)
downloadopenbsd-0b9113bf9e31f4dff7749b7c96c558ac5cf0332e.tar.gz
openbsd-0b9113bf9e31f4dff7749b7c96c558ac5cf0332e.tar.bz2
openbsd-0b9113bf9e31f4dff7749b7c96c558ac5cf0332e.zip
Rewrite BN_MONT_CTX_set_locked()
Rewrite and simplify BN_MONT_CTX_set_locked - in particular, only hold the lock for a short period of time, rather than holding a write lock for a module across an expensive operation. ok tb@
-rw-r--r--src/lib/libcrypto/bn/bn_mont.c50
1 files changed, 27 insertions, 23 deletions
diff --git a/src/lib/libcrypto/bn/bn_mont.c b/src/lib/libcrypto/bn/bn_mont.c
index bf38eac303..cae8569b8d 100644
--- a/src/lib/libcrypto/bn/bn_mont.c
+++ b/src/lib/libcrypto/bn/bn_mont.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: bn_mont.c,v 1.40 2023/02/19 13:44:29 jsing Exp $ */ 1/* $OpenBSD: bn_mont.c,v 1.41 2023/02/19 13:51:00 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -330,35 +330,39 @@ err:
330} 330}
331 331
332BN_MONT_CTX * 332BN_MONT_CTX *
333BN_MONT_CTX_set_locked(BN_MONT_CTX **pmont, int lock, const BIGNUM *mod, 333BN_MONT_CTX_set_locked(BN_MONT_CTX **pmctx, int lock, const BIGNUM *mod,
334 BN_CTX *ctx) 334 BN_CTX *ctx)
335{ 335{
336 int got_write_lock = 0; 336 BN_MONT_CTX *mctx = NULL;
337 BN_MONT_CTX *ret;
338 337
339 CRYPTO_r_lock(lock); 338 CRYPTO_r_lock(lock);
340 if (!*pmont) { 339 mctx = *pmctx;
341 CRYPTO_r_unlock(lock); 340 CRYPTO_r_unlock(lock);
342 CRYPTO_w_lock(lock);
343 got_write_lock = 1;
344
345 if (!*pmont) {
346 ret = BN_MONT_CTX_new();
347 if (ret && !BN_MONT_CTX_set(ret, mod, ctx))
348 BN_MONT_CTX_free(ret);
349 else
350 *pmont = ret;
351 }
352 }
353 341
354 ret = *pmont; 342 if (mctx != NULL)
343 goto done;
355 344
356 if (got_write_lock) 345 if ((mctx = BN_MONT_CTX_new()) == NULL)
357 CRYPTO_w_unlock(lock); 346 goto err;
358 else 347 if (!BN_MONT_CTX_set(mctx, mod, ctx))
359 CRYPTO_r_unlock(lock); 348 goto err;
360 349
361 return ret; 350 CRYPTO_w_lock(lock);
351 if (*pmctx != NULL) {
352 /* Someone else raced us... */
353 BN_MONT_CTX_free(mctx);
354 mctx = *pmctx;
355 } else {
356 *pmctx = mctx;
357 }
358 CRYPTO_w_unlock(lock);
359
360 goto done;
361 err:
362 BN_MONT_CTX_free(mctx);
363 mctx = NULL;
364 done:
365 return mctx;
362} 366}
363 367
364#ifdef OPENSSL_NO_ASM 368#ifdef OPENSSL_NO_ASM