diff options
author | jsing <> | 2023-02-19 13:51:00 +0000 |
---|---|---|
committer | jsing <> | 2023-02-19 13:51:00 +0000 |
commit | 0b9113bf9e31f4dff7749b7c96c558ac5cf0332e (patch) | |
tree | de81f5c43431758b2a374ba14c7a5908bdd19f5c /src/lib | |
parent | 0a69e4b42828860153d1be7ce5e7626ac56d6b04 (diff) | |
download | openbsd-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@
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/libcrypto/bn/bn_mont.c | 50 |
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 | ||
332 | BN_MONT_CTX * | 332 | BN_MONT_CTX * |
333 | BN_MONT_CTX_set_locked(BN_MONT_CTX **pmont, int lock, const BIGNUM *mod, | 333 | BN_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 |