diff options
author | Shane Lontis <shane.lontis@oracle.com> | 2020-02-06 22:28:36 +1000 |
---|---|---|
committer | Shane Lontis <shane.lontis@oracle.com> | 2020-02-06 22:28:36 +1000 |
commit | f11f86f6ec7fb31bde1da2810ac975c032205321 (patch) | |
tree | d263614f6dfee9162499a01d14336bb36d543e3f /crypto/dsa/dsa_key.c | |
parent | 104a733df65dfd8c3dd110de9bd56f6ebfc8f2f6 (diff) |
Add FFC param/key generation
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/10909)
Diffstat (limited to 'crypto/dsa/dsa_key.c')
-rw-r--r-- | crypto/dsa/dsa_key.c | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/crypto/dsa/dsa_key.c b/crypto/dsa/dsa_key.c index efc125253e..e0a3c82570 100644 --- a/crypto/dsa/dsa_key.c +++ b/crypto/dsa/dsa_key.c @@ -11,42 +11,53 @@ #include <time.h> #include "internal/cryptlib.h" #include <openssl/bn.h> +#include "crypto/dsa.h" #include "dsa_local.h" -static int dsa_builtin_keygen(DSA *dsa); +static int dsa_builtin_keygen(OPENSSL_CTX *libctx, DSA *dsa); int DSA_generate_key(DSA *dsa) { - if (dsa->meth->dsa_keygen) + if (dsa->meth->dsa_keygen != NULL) return dsa->meth->dsa_keygen(dsa); - return dsa_builtin_keygen(dsa); + return dsa_builtin_keygen(NULL, dsa); } -static int dsa_builtin_keygen(DSA *dsa) +int dsa_generate_key_ctx(OPENSSL_CTX *libctx, DSA *dsa) +{ +#ifndef FIPS_MODE + if (dsa->meth->dsa_keygen != NULL) + return dsa->meth->dsa_keygen(dsa); +#endif + return dsa_builtin_keygen(libctx, dsa); +} + +static int dsa_builtin_keygen(OPENSSL_CTX *libctx, DSA *dsa) { int ok = 0; BN_CTX *ctx = NULL; BIGNUM *pub_key = NULL, *priv_key = NULL; - if ((ctx = BN_CTX_new()) == NULL) + if ((ctx = BN_CTX_new_ex(libctx)) == NULL) goto err; if (dsa->priv_key == NULL) { if ((priv_key = BN_secure_new()) == NULL) goto err; - } else + } else { priv_key = dsa->priv_key; + } - do - if (!BN_priv_rand_range(priv_key, dsa->params.q)) - goto err; - while (BN_is_zero(priv_key)) ; + if (!ffc_generate_private_key(ctx, &dsa->params, BN_num_bits(dsa->params.q), + 112, priv_key)) + goto err; if (dsa->pub_key == NULL) { if ((pub_key = BN_new()) == NULL) goto err; - } else + } else { pub_key = dsa->pub_key; + } { BIGNUM *prk = BN_new(); @@ -55,6 +66,7 @@ static int dsa_builtin_keygen(DSA *dsa) goto err; BN_with_flags(prk, priv_key, BN_FLG_CONSTTIME); + /* pub_key = g ^ priv_key mod p */ if (!BN_mod_exp(pub_key, dsa->params.g, prk, dsa->params.p, ctx)) { BN_free(prk); goto err; |