Use X509_get_signature_info() when checking security levels.
Make signature security level checking more flexible by using X509_get_signaure_info(): some signature methods (e.g. PSS, ED25519) do not indicate the signing digest (if any) in the signature OID. Reviewed-by: Richard Levitte <levitte@openssl.org> (Merged from https://github.com/openssl/openssl/pull/3301)
This commit is contained in:
parent
786dd2c22c
commit
c3c8823c87
1 changed files with 2 additions and 10 deletions
|
@ -3201,8 +3201,6 @@ static int check_key_level(X509_STORE_CTX *ctx, X509 *cert)
|
||||||
*/
|
*/
|
||||||
static int check_sig_level(X509_STORE_CTX *ctx, X509 *cert)
|
static int check_sig_level(X509_STORE_CTX *ctx, X509 *cert)
|
||||||
{
|
{
|
||||||
int nid = X509_get_signature_nid(cert);
|
|
||||||
int mdnid = NID_undef;
|
|
||||||
int secbits = -1;
|
int secbits = -1;
|
||||||
int level = ctx->param->auth_level;
|
int level = ctx->param->auth_level;
|
||||||
|
|
||||||
|
@ -3211,14 +3209,8 @@ static int check_sig_level(X509_STORE_CTX *ctx, X509 *cert)
|
||||||
if (level > NUM_AUTH_LEVELS)
|
if (level > NUM_AUTH_LEVELS)
|
||||||
level = NUM_AUTH_LEVELS;
|
level = NUM_AUTH_LEVELS;
|
||||||
|
|
||||||
/* Lookup signature algorithm digest */
|
if (!X509_get_signature_info(cert, NULL, NULL, &secbits, NULL))
|
||||||
if (nid && OBJ_find_sigid_algs(nid, &mdnid, NULL)) {
|
return 0;
|
||||||
const EVP_MD *md;
|
|
||||||
|
|
||||||
/* Assume 4 bits of collision resistance for each hash octet */
|
|
||||||
if (mdnid != NID_undef && (md = EVP_get_digestbynid(mdnid)) != NULL)
|
|
||||||
secbits = EVP_MD_size(md) * 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
return secbits >= minbits_table[level - 1];
|
return secbits >= minbits_table[level - 1];
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue