diff options
author | Alessandro Ghedini <alessandro@ghedini.me> | 2016-03-04 15:43:46 +0000 |
---|---|---|
committer | Rich Salz <rsalz@openssl.org> | 2016-03-08 09:07:32 -0500 |
commit | d188a53617de68a707fe9459d4f4245d9a57cd9c (patch) | |
tree | 5280ea92a3c2772e7c0446efa6fede7eba6e7eb4 /crypto/dh | |
parent | f989cd8c0bb3c579d112294bf8e304647b334ee8 (diff) |
Convert CRYPTO_LOCK_{DH,DSA,RSA} to new multi-threading API
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Rich Salz <rsalz@openssl.org>
Diffstat (limited to 'crypto/dh')
-rw-r--r-- | crypto/dh/dh_key.c | 4 | ||||
-rw-r--r-- | crypto/dh/dh_lib.c | 25 |
2 files changed, 22 insertions, 7 deletions
diff --git a/crypto/dh/dh_key.c b/crypto/dh/dh_key.c index 5ee38e3a87..558ec8c3cd 100644 --- a/crypto/dh/dh_key.c +++ b/crypto/dh/dh_key.c @@ -140,7 +140,7 @@ static int generate_key(DH *dh) if (dh->flags & DH_FLAG_CACHE_MONT_P) { mont = BN_MONT_CTX_set_locked(&dh->method_mont_p, - CRYPTO_LOCK_DH, dh->p, ctx); + dh->lock, dh->p, ctx); if (!mont) goto err; } @@ -222,7 +222,7 @@ static int compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh) if (dh->flags & DH_FLAG_CACHE_MONT_P) { mont = BN_MONT_CTX_set_locked(&dh->method_mont_p, - CRYPTO_LOCK_DH, dh->p, ctx); + dh->lock, dh->p, ctx); if ((dh->flags & DH_FLAG_NO_EXP_CONSTTIME) == 0) { /* XXX */ BN_set_flags(dh->priv_key, BN_FLG_CONSTTIME); diff --git a/crypto/dh/dh_lib.c b/crypto/dh/dh_lib.c index 58280d8734..d7aed6a282 100644 --- a/crypto/dh/dh_lib.c +++ b/crypto/dh/dh_lib.c @@ -108,7 +108,7 @@ DH *DH_new_method(ENGINE *engine) if (ret == NULL) { DHerr(DH_F_DH_NEW_METHOD, ERR_R_MALLOC_FAILURE); - return (NULL); + return NULL; } ret->meth = DH_get_default_method(); @@ -135,16 +135,25 @@ DH *DH_new_method(ENGINE *engine) ret->references = 1; ret->flags = ret->meth->flags; + CRYPTO_new_ex_data(CRYPTO_EX_INDEX_DH, ret, &ret->ex_data); - if ((ret->meth->init != NULL) && !ret->meth->init(ret)) { + + ret->lock = CRYPTO_THREAD_lock_new(); + if (ret->lock == NULL) { #ifndef OPENSSL_NO_ENGINE ENGINE_finish(ret->engine); #endif CRYPTO_free_ex_data(CRYPTO_EX_INDEX_DH, ret, &ret->ex_data); OPENSSL_free(ret); + return NULL; + } + + if ((ret->meth->init != NULL) && !ret->meth->init(ret)) { + DH_free(ret); ret = NULL; } - return (ret); + + return ret; } void DH_free(DH *r) @@ -153,7 +162,8 @@ void DH_free(DH *r) if (r == NULL) return; - i = CRYPTO_add(&r->references, -1, CRYPTO_LOCK_DH); + + CRYPTO_atomic_add(&r->references, -1, &i, r->lock); REF_PRINT_COUNT("DH", r); if (i > 0) return; @@ -167,6 +177,8 @@ void DH_free(DH *r) CRYPTO_free_ex_data(CRYPTO_EX_INDEX_DH, r, &r->ex_data); + CRYPTO_THREAD_lock_free(r->lock); + BN_clear_free(r->p); BN_clear_free(r->g); BN_clear_free(r->q); @@ -180,7 +192,10 @@ void DH_free(DH *r) int DH_up_ref(DH *r) { - int i = CRYPTO_add(&r->references, 1, CRYPTO_LOCK_DH); + int i; + + if (CRYPTO_atomic_add(&r->references, 1, &i, r->lock) <= 0) + return 0; REF_PRINT_COUNT("DH", r); REF_ASSERT_ISNT(i < 2); |