Latest update.
This commit is contained in:
+45
-33
@@ -859,6 +859,7 @@ static int rsa_sig_info_set(X509_SIG_INFO *siginf, const X509_ALGOR *sigalg,
|
||||
uint32_t flags;
|
||||
const EVP_MD *mgf1md = NULL, *md = NULL;
|
||||
RSA_PSS_PARAMS *pss;
|
||||
int secbits;
|
||||
|
||||
/* Sanity check: make sure it is PSS */
|
||||
if (OBJ_obj2nid(sigalg->algorithm) != EVP_PKEY_RSA_PSS)
|
||||
@@ -878,7 +879,24 @@ static int rsa_sig_info_set(X509_SIG_INFO *siginf, const X509_ALGOR *sigalg,
|
||||
else
|
||||
flags = 0;
|
||||
/* Note: security bits half number of digest bits */
|
||||
X509_SIG_INFO_set(siginf, mdnid, EVP_PKEY_RSA_PSS, EVP_MD_size(md) * 4,
|
||||
secbits = EVP_MD_size(md) * 4;
|
||||
/*
|
||||
* SHA1 and MD5 are known to be broken. Reduce security bits so that
|
||||
* they're no longer accepted at security level 1. The real values don't
|
||||
* really matter as long as they're lower than 80, which is our security
|
||||
* level 1.
|
||||
* https://eprint.iacr.org/2020/014 puts a chosen-prefix attack for SHA1 at
|
||||
* 2^63.4
|
||||
* https://documents.epfl.ch/users/l/le/lenstra/public/papers/lat.pdf
|
||||
* puts a chosen-prefix attack for MD5 at 2^39.
|
||||
*/
|
||||
if (mdnid == NID_sha1)
|
||||
secbits = 64;
|
||||
else if (mdnid == NID_md5_sha1)
|
||||
secbits = 68;
|
||||
else if (mdnid == NID_md5)
|
||||
secbits = 39;
|
||||
X509_SIG_INFO_set(siginf, mdnid, EVP_PKEY_RSA_PSS, secbits,
|
||||
flags);
|
||||
rv = 1;
|
||||
err:
|
||||
@@ -1056,40 +1074,42 @@ static size_t rsa_pkey_dirty_cnt(const EVP_PKEY *pkey)
|
||||
|
||||
DEFINE_SPECIAL_STACK_OF_CONST(BIGNUM_const, BIGNUM)
|
||||
|
||||
static void *rsa_pkey_export_to(const EVP_PKEY *pk, EVP_KEYMGMT *keymgmt,
|
||||
int want_domainparams)
|
||||
static int rsa_pkey_export_to(const EVP_PKEY *from, void *to_keydata,
|
||||
EVP_KEYMGMT *to_keymgmt)
|
||||
{
|
||||
RSA *rsa = pk->pkey.rsa;
|
||||
RSA *rsa = from->pkey.rsa;
|
||||
OSSL_PARAM_BLD tmpl;
|
||||
const BIGNUM *n = RSA_get0_n(rsa), *e = RSA_get0_e(rsa);
|
||||
const BIGNUM *d = RSA_get0_d(rsa);
|
||||
STACK_OF(BIGNUM_const) *primes = NULL, *exps = NULL, *coeffs = NULL;
|
||||
int numprimes = 0, numexps = 0, numcoeffs = 0;
|
||||
OSSL_PARAM *params = NULL;
|
||||
void *provkey = NULL;
|
||||
|
||||
/*
|
||||
* There are no domain parameters for RSA keys, or rather, they are
|
||||
* included in the key data itself.
|
||||
*/
|
||||
if (want_domainparams)
|
||||
goto err;
|
||||
|
||||
/* Get all the primes and CRT params */
|
||||
if ((primes = sk_BIGNUM_const_new_null()) == NULL
|
||||
|| (exps = sk_BIGNUM_const_new_null()) == NULL
|
||||
|| (coeffs = sk_BIGNUM_const_new_null()) == NULL)
|
||||
goto err;
|
||||
|
||||
if (!rsa_get0_all_params(rsa, primes, exps, coeffs))
|
||||
goto err;
|
||||
int rv = 0;
|
||||
|
||||
/* Public parameters must always be present */
|
||||
if (n == NULL || e == NULL)
|
||||
goto err;
|
||||
|
||||
ossl_param_bld_init(&tmpl);
|
||||
|
||||
/* |e| and |n| are always present */
|
||||
if (!ossl_param_bld_push_BN(&tmpl, OSSL_PKEY_PARAM_RSA_E, e))
|
||||
goto err;
|
||||
if (!ossl_param_bld_push_BN(&tmpl, OSSL_PKEY_PARAM_RSA_N, n))
|
||||
goto err;
|
||||
|
||||
if (d != NULL) {
|
||||
/* It's a private key, so we should have everything else too */
|
||||
int i;
|
||||
|
||||
/* Get all the primes and CRT params */
|
||||
if ((primes = sk_BIGNUM_const_new_null()) == NULL
|
||||
|| (exps = sk_BIGNUM_const_new_null()) == NULL
|
||||
|| (coeffs = sk_BIGNUM_const_new_null()) == NULL)
|
||||
goto err;
|
||||
|
||||
if (!rsa_get0_all_params(rsa, primes, exps, coeffs))
|
||||
goto err;
|
||||
|
||||
numprimes = sk_BIGNUM_const_num(primes);
|
||||
numexps = sk_BIGNUM_const_num(exps);
|
||||
numcoeffs = sk_BIGNUM_const_num(coeffs);
|
||||
@@ -1102,15 +1122,6 @@ static void *rsa_pkey_export_to(const EVP_PKEY *pk, EVP_KEYMGMT *keymgmt,
|
||||
+ numprimes + numexps + numcoeffs
|
||||
<= OSSL_PARAM_BLD_MAX))
|
||||
goto err;
|
||||
}
|
||||
|
||||
ossl_param_bld_init(&tmpl);
|
||||
if (!ossl_param_bld_push_BN(&tmpl, OSSL_PKEY_PARAM_RSA_N, n)
|
||||
|| !ossl_param_bld_push_BN(&tmpl, OSSL_PKEY_PARAM_RSA_E, e))
|
||||
goto err;
|
||||
|
||||
if (d != NULL) {
|
||||
int i;
|
||||
|
||||
if (!ossl_param_bld_push_BN(&tmpl, OSSL_PKEY_PARAM_RSA_D, d))
|
||||
goto err;
|
||||
@@ -1144,14 +1155,15 @@ static void *rsa_pkey_export_to(const EVP_PKEY *pk, EVP_KEYMGMT *keymgmt,
|
||||
goto err;
|
||||
|
||||
/* We export, the provider imports */
|
||||
provkey = evp_keymgmt_importkey(keymgmt, params);
|
||||
rv = evp_keymgmt_import(to_keymgmt, to_keydata, OSSL_KEYMGMT_SELECT_ALL,
|
||||
params);
|
||||
|
||||
err:
|
||||
sk_BIGNUM_const_free(primes);
|
||||
sk_BIGNUM_const_free(exps);
|
||||
sk_BIGNUM_const_free(coeffs);
|
||||
ossl_param_bld_free(params);
|
||||
return provkey;
|
||||
return rv;
|
||||
}
|
||||
|
||||
const EVP_PKEY_ASN1_METHOD rsa_asn1_meths[2] = {
|
||||
|
||||
Reference in New Issue
Block a user