Latest update.
This commit is contained in:
+39
-65
@@ -88,7 +88,10 @@ static int dsa_pub_encode(X509_PUBKEY *pk, const EVP_PKEY *pkey)
|
||||
ASN1_OBJECT *aobj;
|
||||
|
||||
dsa = pkey->pkey.dsa;
|
||||
if (pkey->save_parameters && dsa->p && dsa->q && dsa->g) {
|
||||
if (pkey->save_parameters
|
||||
&& dsa->params.p != NULL
|
||||
&& dsa->params.q != NULL
|
||||
&& dsa->params.g != NULL) {
|
||||
str = ASN1_STRING_new();
|
||||
if (str == NULL) {
|
||||
DSAerr(DSA_F_DSA_PUB_ENCODE, ERR_R_MALLOC_FAILURE);
|
||||
@@ -183,7 +186,8 @@ static int dsa_priv_decode(EVP_PKEY *pkey, const PKCS8_PRIV_KEY_INFO *p8)
|
||||
}
|
||||
|
||||
BN_set_flags(dsa->priv_key, BN_FLG_CONSTTIME);
|
||||
if (!BN_mod_exp(dsa->pub_key, dsa->g, dsa->priv_key, dsa->p, ctx)) {
|
||||
if (!BN_mod_exp(dsa->pub_key, dsa->params.g, dsa->priv_key, dsa->params.p,
|
||||
ctx)) {
|
||||
DSAerr(DSA_F_DSA_PRIV_DECODE, DSA_R_BN_ERROR);
|
||||
goto dsaerr;
|
||||
}
|
||||
@@ -275,55 +279,34 @@ static int dsa_missing_parameters(const EVP_PKEY *pkey)
|
||||
{
|
||||
DSA *dsa;
|
||||
dsa = pkey->pkey.dsa;
|
||||
if (dsa == NULL || dsa->p == NULL || dsa->q == NULL || dsa->g == NULL)
|
||||
return 1;
|
||||
return 0;
|
||||
return dsa == NULL
|
||||
|| dsa->params.p == NULL
|
||||
|| dsa->params.q == NULL
|
||||
|| dsa->params.g == NULL;
|
||||
}
|
||||
|
||||
static int dsa_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from)
|
||||
{
|
||||
BIGNUM *a;
|
||||
|
||||
if (to->pkey.dsa == NULL) {
|
||||
to->pkey.dsa = DSA_new();
|
||||
if (to->pkey.dsa == NULL)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((a = BN_dup(from->pkey.dsa->p)) == NULL)
|
||||
if (!ffc_params_copy(&to->pkey.dsa->params, &from->pkey.dsa->params))
|
||||
return 0;
|
||||
BN_free(to->pkey.dsa->p);
|
||||
to->pkey.dsa->p = a;
|
||||
|
||||
if ((a = BN_dup(from->pkey.dsa->q)) == NULL)
|
||||
return 0;
|
||||
BN_free(to->pkey.dsa->q);
|
||||
to->pkey.dsa->q = a;
|
||||
|
||||
if ((a = BN_dup(from->pkey.dsa->g)) == NULL)
|
||||
return 0;
|
||||
BN_free(to->pkey.dsa->g);
|
||||
to->pkey.dsa->g = a;
|
||||
to->pkey.dsa->dirty_cnt++;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int dsa_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b)
|
||||
{
|
||||
if (BN_cmp(a->pkey.dsa->p, b->pkey.dsa->p) ||
|
||||
BN_cmp(a->pkey.dsa->q, b->pkey.dsa->q) ||
|
||||
BN_cmp(a->pkey.dsa->g, b->pkey.dsa->g))
|
||||
return 0;
|
||||
else
|
||||
return 1;
|
||||
return ffc_params_cmp(&a->pkey.dsa->params, &b->pkey.dsa->params, 1);
|
||||
}
|
||||
|
||||
static int dsa_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b)
|
||||
{
|
||||
if (BN_cmp(b->pkey.dsa->pub_key, a->pkey.dsa->pub_key) != 0)
|
||||
return 0;
|
||||
else
|
||||
return 1;
|
||||
return BN_cmp(b->pkey.dsa->pub_key, a->pkey.dsa->pub_key) == 0;
|
||||
}
|
||||
|
||||
static void int_dsa_free(EVP_PKEY *pkey)
|
||||
@@ -338,8 +321,8 @@ static int do_dsa_print(BIO *bp, const DSA *x, int off, int ptype)
|
||||
const BIGNUM *priv_key, *pub_key;
|
||||
int mod_len = 0;
|
||||
|
||||
if (x->p != NULL)
|
||||
mod_len = BN_num_bits(x->p);
|
||||
if (x->params.p != NULL)
|
||||
mod_len = DSA_bits(x);
|
||||
|
||||
if (ptype == 2)
|
||||
priv_key = x->priv_key;
|
||||
@@ -358,11 +341,10 @@ static int do_dsa_print(BIO *bp, const DSA *x, int off, int ptype)
|
||||
else
|
||||
ktype = "DSA-Parameters";
|
||||
|
||||
if (priv_key) {
|
||||
if (priv_key != NULL) {
|
||||
if (!BIO_indent(bp, off, 128))
|
||||
goto err;
|
||||
if (BIO_printf(bp, "%s: (%d bit)\n", ktype, BN_num_bits(x->p))
|
||||
<= 0)
|
||||
if (BIO_printf(bp, "%s: (%d bit)\n", ktype, mod_len) <= 0)
|
||||
goto err;
|
||||
} else {
|
||||
if (BIO_printf(bp, "Public-Key: (%d bit)\n", mod_len) <= 0)
|
||||
@@ -373,11 +355,7 @@ static int do_dsa_print(BIO *bp, const DSA *x, int off, int ptype)
|
||||
goto err;
|
||||
if (!ASN1_bn_print(bp, "pub: ", pub_key, NULL, off))
|
||||
goto err;
|
||||
if (!ASN1_bn_print(bp, "P: ", x->p, NULL, off))
|
||||
goto err;
|
||||
if (!ASN1_bn_print(bp, "Q: ", x->q, NULL, off))
|
||||
goto err;
|
||||
if (!ASN1_bn_print(bp, "G: ", x->g, NULL, off))
|
||||
if (!ffc_params_print(bp, &x->params, off))
|
||||
goto err;
|
||||
ret = 1;
|
||||
err:
|
||||
@@ -446,7 +424,7 @@ static int dsa_sig_print(BIO *bp, const X509_ALGOR *sigalg,
|
||||
DSA_SIG *dsa_sig;
|
||||
const unsigned char *p;
|
||||
|
||||
if (!sig) {
|
||||
if (sig == NULL) {
|
||||
if (BIO_puts(bp, "\n") <= 0)
|
||||
return 0;
|
||||
else
|
||||
@@ -454,7 +432,7 @@ static int dsa_sig_print(BIO *bp, const X509_ALGOR *sigalg,
|
||||
}
|
||||
p = sig->data;
|
||||
dsa_sig = d2i_DSA_SIG(NULL, &p, sig->length);
|
||||
if (dsa_sig) {
|
||||
if (dsa_sig != NULL) {
|
||||
int rv = 0;
|
||||
const BIGNUM *r, *s;
|
||||
|
||||
@@ -533,48 +511,44 @@ static size_t dsa_pkey_dirty_cnt(const EVP_PKEY *pkey)
|
||||
return pkey->pkey.dsa->dirty_cnt;
|
||||
}
|
||||
|
||||
static void *dsa_pkey_export_to(const EVP_PKEY *pk, EVP_KEYMGMT *keymgmt,
|
||||
int want_domainparams)
|
||||
static int dsa_pkey_export_to(const EVP_PKEY *from, void *to_keydata,
|
||||
EVP_KEYMGMT *to_keymgmt)
|
||||
{
|
||||
DSA *dsa = pk->pkey.dsa;
|
||||
DSA *dsa = from->pkey.dsa;
|
||||
OSSL_PARAM_BLD tmpl;
|
||||
const BIGNUM *p = DSA_get0_p(dsa), *g = DSA_get0_g(dsa);
|
||||
const BIGNUM *q = DSA_get0_q(dsa), *pub_key = DSA_get0_pub_key(dsa);
|
||||
const BIGNUM *priv_key = DSA_get0_priv_key(dsa);
|
||||
OSSL_PARAM *params;
|
||||
void *provdata = NULL;
|
||||
int rv;
|
||||
|
||||
if (p == NULL || q == NULL || g == NULL)
|
||||
return NULL;
|
||||
return 0;
|
||||
|
||||
ossl_param_bld_init(&tmpl);
|
||||
if (!ossl_param_bld_push_BN(&tmpl, OSSL_PKEY_PARAM_FFC_P, p)
|
||||
|| !ossl_param_bld_push_BN(&tmpl, OSSL_PKEY_PARAM_FFC_Q, q)
|
||||
|| !ossl_param_bld_push_BN(&tmpl, OSSL_PKEY_PARAM_FFC_G, g))
|
||||
return NULL;
|
||||
|
||||
if (!want_domainparams) {
|
||||
/* A key must at least have a public part. */
|
||||
if (!ossl_param_bld_push_BN(&tmpl, OSSL_PKEY_PARAM_DSA_PUB_KEY,
|
||||
pub_key))
|
||||
return NULL;
|
||||
|
||||
if (priv_key != NULL) {
|
||||
if (!ossl_param_bld_push_BN(&tmpl, OSSL_PKEY_PARAM_DSA_PRIV_KEY,
|
||||
priv_key))
|
||||
return NULL;
|
||||
}
|
||||
return 0;
|
||||
if (!ossl_param_bld_push_BN(&tmpl, OSSL_PKEY_PARAM_DSA_PUB_KEY,
|
||||
pub_key))
|
||||
return 0;
|
||||
if (priv_key != NULL) {
|
||||
if (!ossl_param_bld_push_BN(&tmpl, OSSL_PKEY_PARAM_DSA_PRIV_KEY,
|
||||
priv_key))
|
||||
return 0;
|
||||
}
|
||||
|
||||
params = ossl_param_bld_to_param(&tmpl);
|
||||
if ((params = ossl_param_bld_to_param(&tmpl)) == NULL)
|
||||
return 0;
|
||||
|
||||
/* We export, the provider imports */
|
||||
provdata = want_domainparams
|
||||
? evp_keymgmt_importdomparams(keymgmt, params)
|
||||
: evp_keymgmt_importkey(keymgmt, params);
|
||||
rv = evp_keymgmt_import(to_keymgmt, to_keydata, OSSL_KEYMGMT_SELECT_ALL,
|
||||
params);
|
||||
|
||||
ossl_param_bld_free(params);
|
||||
return provdata;
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
/* NB these are sorted in pkey_id order, lowest first */
|
||||
|
||||
Reference in New Issue
Block a user