diff options
author | tb <> | 2024-08-28 07:15:04 +0000 |
---|---|---|
committer | tb <> | 2024-08-28 07:15:04 +0000 |
commit | 075c048b99cefdce1245c13c4aa449b28ce8366c (patch) | |
tree | bb2a05a5261bd27ee87b1f4c8d85ebba6042d17d /src/lib/libcrypto/rsa | |
parent | a03c40153c8f8e484e8b98ea5a52b87116f9bf5a (diff) | |
download | openbsd-075c048b99cefdce1245c13c4aa449b28ce8366c.tar.gz openbsd-075c048b99cefdce1245c13c4aa449b28ce8366c.tar.bz2 openbsd-075c048b99cefdce1245c13c4aa449b28ce8366c.zip |
Implement X509_get_signature_info()
This is a slightly strange combination of OBJ_find_sigid_algs() and the
security level API necessary because OBJ_find_sigid_algs() on its own
isn't smart enough for the special needs of RSA-PSS and EdDSA.
The API extracts the hash's NID and the pubkey's NID from the certificate's
signatureAlgorithm and invokes special handlers for RSA-PSS and EdDSA
for retrieving the corresponding information. This isn't entirely free
for RSA-PSS, but for now we don't cache this information.
The security bits calculation is a bit hand-wavy, but that's something
that comes along with this sort of numerology.
ok jsing
Diffstat (limited to 'src/lib/libcrypto/rsa')
-rw-r--r-- | src/lib/libcrypto/rsa/rsa_ameth.c | 56 |
1 files changed, 55 insertions, 1 deletions
diff --git a/src/lib/libcrypto/rsa/rsa_ameth.c b/src/lib/libcrypto/rsa/rsa_ameth.c index c722188c43..d7ce931733 100644 --- a/src/lib/libcrypto/rsa/rsa_ameth.c +++ b/src/lib/libcrypto/rsa/rsa_ameth.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: rsa_ameth.c,v 1.58 2024/03/17 07:10:00 tb Exp $ */ | 1 | /* $OpenBSD: rsa_ameth.c,v 1.59 2024/08/28 07:15:04 tb Exp $ */ |
2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
3 | * project 2006. | 3 | * project 2006. |
4 | */ | 4 | */ |
@@ -845,6 +845,58 @@ rsa_pss_get_param(const RSA_PSS_PARAMS *pss, const EVP_MD **pmd, | |||
845 | return 1; | 845 | return 1; |
846 | } | 846 | } |
847 | 847 | ||
848 | static int | ||
849 | rsa_pss_signature_info(const X509_ALGOR *alg, int *out_md_nid, | ||
850 | int *out_pkey_nid, int *out_security_bits, uint32_t *out_flags) | ||
851 | { | ||
852 | RSA_PSS_PARAMS *pss = NULL; | ||
853 | const ASN1_OBJECT *aobj; | ||
854 | const EVP_MD *md, *mgf1md; | ||
855 | int md_len, salt_len; | ||
856 | int md_nid = NID_undef, pkey_nid = NID_undef; | ||
857 | int security_bits = -1; | ||
858 | uint32_t flags = 0; | ||
859 | |||
860 | X509_ALGOR_get0(&aobj, NULL, NULL, alg); | ||
861 | if (OBJ_obj2nid(aobj) != EVP_PKEY_RSA_PSS) | ||
862 | goto err; | ||
863 | |||
864 | if ((pss = rsa_pss_decode(alg)) == NULL) | ||
865 | goto err; | ||
866 | if (!rsa_pss_get_param(pss, &md, &mgf1md, &salt_len)) | ||
867 | goto err; | ||
868 | |||
869 | if ((md_nid = EVP_MD_type(md)) == NID_undef) | ||
870 | goto err; | ||
871 | if ((md_len = EVP_MD_size(md)) <= 0) | ||
872 | goto err; | ||
873 | |||
874 | /* | ||
875 | * RFC 8446, section 4.2.3 - restricts the digest algorithm: | ||
876 | * - it must be one of SHA256, SHA384, and SHA512; | ||
877 | * - the same digest must be used in the mask generation function; | ||
878 | * - the salt length must match the output length of the digest. | ||
879 | * XXX - consider separate flags for these checks. | ||
880 | */ | ||
881 | if (md_nid == NID_sha256 || md_nid == NID_sha384 || md_nid == NID_sha512) { | ||
882 | if (md_nid == EVP_MD_type(mgf1md) && salt_len == md_len) | ||
883 | flags |= X509_SIG_INFO_TLS; | ||
884 | } | ||
885 | |||
886 | security_bits = md_len * 4; | ||
887 | flags |= X509_SIG_INFO_VALID; | ||
888 | |||
889 | *out_md_nid = md_nid; | ||
890 | *out_pkey_nid = pkey_nid; | ||
891 | *out_security_bits = security_bits; | ||
892 | *out_flags = flags; | ||
893 | |||
894 | err: | ||
895 | RSA_PSS_PARAMS_free(pss); | ||
896 | |||
897 | return (flags & X509_SIG_INFO_VALID) != 0; | ||
898 | } | ||
899 | |||
848 | #ifndef OPENSSL_NO_CMS | 900 | #ifndef OPENSSL_NO_CMS |
849 | static int | 901 | static int |
850 | rsa_cms_verify(CMS_SignerInfo *si) | 902 | rsa_cms_verify(CMS_SignerInfo *si) |
@@ -1216,6 +1268,8 @@ const EVP_PKEY_ASN1_METHOD rsa_pss_asn1_meth = { | |||
1216 | .pkey_bits = rsa_bits, | 1268 | .pkey_bits = rsa_bits, |
1217 | .pkey_security_bits = rsa_security_bits, | 1269 | .pkey_security_bits = rsa_security_bits, |
1218 | 1270 | ||
1271 | .signature_info = rsa_pss_signature_info, | ||
1272 | |||
1219 | .sig_print = rsa_sig_print, | 1273 | .sig_print = rsa_sig_print, |
1220 | 1274 | ||
1221 | .pkey_free = rsa_free, | 1275 | .pkey_free = rsa_free, |