mirror of
https://github.com/openssl/openssl.git
synced 2025-02-17 14:32:04 +08:00
RSA, DSA, DH: Allow some given input to be NULL on already initialised keys
The diverse {RSA,DSA,DH}_set0_* functions are made to allow some parameters to be NULL IF the corresponding numbers in the given key structure have already been previously initialised. Specifically, this allows the addition of private components to be added to a key that already has the public half, approximately like this: RSA_get0_key(rsa, NULL, &e, NULL); RSA_get0_factors(rsa, &p, &q); /* calculate new d */ RSA_set0_key(rsa, NULL, NULL, d); Reviewed-by: Matt Caswell <matt@openssl.org>
This commit is contained in:
parent
3aec886ed4
commit
1da12e34ed
@ -245,15 +245,27 @@ void DH_get0_pqg(const DH *dh, BIGNUM **p, BIGNUM **q, BIGNUM **g)
|
||||
|
||||
int DH_set0_pqg(DH *dh, BIGNUM *p, BIGNUM *q, BIGNUM *g)
|
||||
{
|
||||
/* q is optional */
|
||||
if (p == NULL || g == NULL)
|
||||
/* If the fields p and g in d are NULL, the corresponding input
|
||||
* parameters MUST be non-NULL. q may remain NULL.
|
||||
*
|
||||
* It is an error to give the results from get0 on d
|
||||
* as input parameters.
|
||||
*/
|
||||
if (p == dh->p || (dh->q != NULL && q == dh->q) || g == dh->g)
|
||||
return 0;
|
||||
BN_free(dh->p);
|
||||
BN_free(dh->q);
|
||||
BN_free(dh->g);
|
||||
dh->p = p;
|
||||
dh->q = q;
|
||||
dh->g = g;
|
||||
|
||||
if (p != NULL) {
|
||||
BN_free(dh->p);
|
||||
dh->p = p;
|
||||
}
|
||||
if (q != NULL) {
|
||||
BN_free(dh->q);
|
||||
dh->q = q;
|
||||
}
|
||||
if (g != NULL) {
|
||||
BN_free(dh->g);
|
||||
dh->g = g;
|
||||
}
|
||||
|
||||
if (q != NULL) {
|
||||
dh->length = BN_num_bits(q);
|
||||
@ -283,14 +295,25 @@ void DH_get0_key(const DH *dh, BIGNUM **pub_key, BIGNUM **priv_key)
|
||||
|
||||
int DH_set0_key(DH *dh, BIGNUM *pub_key, BIGNUM *priv_key)
|
||||
{
|
||||
/* Note that it is valid for priv_key to be NULL */
|
||||
if (pub_key == NULL)
|
||||
/* If the pub_key in dh is NULL, the corresponding input
|
||||
* parameters MUST be non-NULL. The priv_key field may
|
||||
* be left NULL.
|
||||
*
|
||||
* It is an error to give the results from get0 on dh
|
||||
* as input parameters.
|
||||
*/
|
||||
if (dh->pub_key == pub_key
|
||||
|| (dh->priv_key != NULL && priv_key != dh->priv_key))
|
||||
return 0;
|
||||
|
||||
BN_free(dh->pub_key);
|
||||
BN_free(dh->priv_key);
|
||||
dh->pub_key = pub_key;
|
||||
dh->priv_key = priv_key;
|
||||
if (pub_key != NULL) {
|
||||
BN_free(dh->pub_key);
|
||||
dh->pub_key = pub_key;
|
||||
}
|
||||
if (priv_key != NULL) {
|
||||
BN_free(dh->priv_key);
|
||||
dh->priv_key = priv_key;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -315,14 +315,27 @@ void DSA_get0_pqg(const DSA *d, BIGNUM **p, BIGNUM **q, BIGNUM **g)
|
||||
|
||||
int DSA_set0_pqg(DSA *d, BIGNUM *p, BIGNUM *q, BIGNUM *g)
|
||||
{
|
||||
if (p == NULL || q == NULL || g == NULL)
|
||||
/* If the fields in d are NULL, the corresponding input
|
||||
* parameters MUST be non-NULL.
|
||||
*
|
||||
* It is an error to give the results from get0 on d
|
||||
* as input parameters.
|
||||
*/
|
||||
if (p == d->p || q == d->q || g == d->g)
|
||||
return 0;
|
||||
BN_free(d->p);
|
||||
BN_free(d->q);
|
||||
BN_free(d->g);
|
||||
d->p = p;
|
||||
d->q = q;
|
||||
d->g = g;
|
||||
|
||||
if (p != NULL) {
|
||||
BN_free(d->p);
|
||||
d->p = p;
|
||||
}
|
||||
if (q != NULL) {
|
||||
BN_free(d->q);
|
||||
d->q = q;
|
||||
}
|
||||
if (g != NULL) {
|
||||
BN_free(d->g);
|
||||
d->g = g;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
@ -337,14 +350,25 @@ void DSA_get0_key(const DSA *d, BIGNUM **pub_key, BIGNUM **priv_key)
|
||||
|
||||
int DSA_set0_key(DSA *d, BIGNUM *pub_key, BIGNUM *priv_key)
|
||||
{
|
||||
/* Note that it is valid for priv_key to be NULL */
|
||||
if (pub_key == NULL)
|
||||
/* If the pub_key in d is NULL, the corresponding input
|
||||
* parameters MUST be non-NULL. The priv_key field may
|
||||
* be left NULL.
|
||||
*
|
||||
* It is an error to give the results from get0 on d
|
||||
* as input parameters.
|
||||
*/
|
||||
if (d->pub_key == pub_key
|
||||
|| (d->priv_key != NULL && priv_key != d->priv_key))
|
||||
return 0;
|
||||
|
||||
BN_free(d->pub_key);
|
||||
BN_free(d->priv_key);
|
||||
d->pub_key = pub_key;
|
||||
d->priv_key = priv_key;
|
||||
if (pub_key != NULL) {
|
||||
BN_free(d->pub_key);
|
||||
d->pub_key = pub_key;
|
||||
}
|
||||
if (priv_key != NULL) {
|
||||
BN_free(d->priv_key);
|
||||
d->priv_key = priv_key;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -286,44 +286,79 @@ int RSA_security_bits(const RSA *rsa)
|
||||
|
||||
int RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d)
|
||||
{
|
||||
/* d is the private component and may be NULL */
|
||||
if (n == NULL || e == NULL)
|
||||
/* If the fields in r are NULL, the corresponding input
|
||||
* parameters MUST be non-NULL for n and e. d may be
|
||||
* left NULL (in case only the public key is used).
|
||||
*
|
||||
* It is an error to give the results from get0 on r
|
||||
* as input parameters.
|
||||
*/
|
||||
if (n == r->n || e == r->e
|
||||
|| (r->d != NULL && d == r->d))
|
||||
return 0;
|
||||
|
||||
BN_free(r->n);
|
||||
BN_free(r->e);
|
||||
BN_free(r->d);
|
||||
r->n = n;
|
||||
r->e = e;
|
||||
r->d = d;
|
||||
if (n != NULL) {
|
||||
BN_free(r->n);
|
||||
r->n = n;
|
||||
}
|
||||
if (e != NULL) {
|
||||
BN_free(r->e);
|
||||
r->e = e;
|
||||
}
|
||||
if (d != NULL) {
|
||||
BN_free(r->d);
|
||||
r->d = d;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int RSA_set0_factors(RSA *r, BIGNUM *p, BIGNUM *q)
|
||||
{
|
||||
if (p == NULL || q == NULL)
|
||||
/* If the fields in r are NULL, the corresponding input
|
||||
* parameters MUST be non-NULL.
|
||||
*
|
||||
* It is an error to give the results from get0 on r
|
||||
* as input parameters.
|
||||
*/
|
||||
if (p == r->p || q == r->q)
|
||||
return 0;
|
||||
|
||||
BN_free(r->p);
|
||||
BN_free(r->q);
|
||||
r->p = p;
|
||||
r->q = q;
|
||||
if (p != NULL) {
|
||||
BN_free(r->p);
|
||||
r->p = p;
|
||||
}
|
||||
if (q != NULL) {
|
||||
BN_free(r->q);
|
||||
r->q = q;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int RSA_set0_crt_params(RSA *r, BIGNUM *dmp1, BIGNUM *dmq1, BIGNUM *iqmp)
|
||||
{
|
||||
if (dmp1 == NULL || dmq1 == NULL || iqmp == NULL)
|
||||
/* If the fields in r are NULL, the corresponding input
|
||||
* parameters MUST be non-NULL.
|
||||
*
|
||||
* It is an error to give the results from get0 on r
|
||||
* as input parameters.
|
||||
*/
|
||||
if (dmp1 == r->dmp1 || dmq1 == r->dmq1 || iqmp == r->iqmp)
|
||||
return 0;
|
||||
|
||||
BN_free(r->dmp1);
|
||||
BN_free(r->dmq1);
|
||||
BN_free(r->iqmp);
|
||||
r->dmp1 = dmp1;
|
||||
r->dmq1 = dmq1;
|
||||
r->iqmp = iqmp;
|
||||
if (dmp1 != NULL) {
|
||||
BN_free(r->dmp1);
|
||||
r->dmp1 = dmp1;
|
||||
}
|
||||
if (dmq1 != NULL) {
|
||||
BN_free(r->dmq1);
|
||||
r->dmq1 = dmq1;
|
||||
}
|
||||
if (iqmp != NULL) {
|
||||
BN_free(r->iqmp);
|
||||
r->iqmp = iqmp;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user