xref: /openbsd-src/lib/libcrypto/objects/obj_xref.c (revision 9c6dcd480f58952c1ea6a18d41996d522349812f)
1*9c6dcd48Stb /*	$OpenBSD: obj_xref.c,v 1.15 2024/08/28 06:53:24 tb Exp $ */
28e6e37e3Stb 
38e6e37e3Stb /*
48e6e37e3Stb  * Copyright (c) 2023 Theo Buehler <tb@openbsd.org>
5f1535dc8Sdjm  *
68e6e37e3Stb  * Permission to use, copy, modify, and distribute this software for any
78e6e37e3Stb  * purpose with or without fee is hereby granted, provided that the above
88e6e37e3Stb  * copyright notice and this permission notice appear in all copies.
9f1535dc8Sdjm  *
108e6e37e3Stb  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
118e6e37e3Stb  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
128e6e37e3Stb  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
138e6e37e3Stb  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
148e6e37e3Stb  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
158e6e37e3Stb  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
168e6e37e3Stb  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17f1535dc8Sdjm  */
18f1535dc8Sdjm 
19f1535dc8Sdjm #include <openssl/objects.h>
20f1535dc8Sdjm 
218e6e37e3Stb /*
228e6e37e3Stb  * Map between signature nids and pairs of (hash, pkey) nids. If the hash nid
238e6e37e3Stb  * is NID_undef, this indicates to ASN1_item_{sign,verify}() that the pkey's
248e6e37e3Stb  * ASN.1 method needs to handle algorithm identifiers and part of the message
258e6e37e3Stb  * digest.
268e6e37e3Stb  */
27f1535dc8Sdjm 
288e6e37e3Stb static const struct {
298e6e37e3Stb 	int sign_nid;
308e6e37e3Stb 	int hash_nid;
318e6e37e3Stb 	int pkey_nid;
328e6e37e3Stb } nid_triple[] = {
33f1535dc8Sdjm 	{
348e6e37e3Stb 		.sign_nid = NID_md2WithRSAEncryption,
358e6e37e3Stb 		.hash_nid = NID_md2,
368e6e37e3Stb 		.pkey_nid = NID_rsaEncryption,
378e6e37e3Stb 	},
3876ce35bfSjsing 	{
398e6e37e3Stb 		.sign_nid = NID_md5WithRSAEncryption,
408e6e37e3Stb 		.hash_nid = NID_md5,
418e6e37e3Stb 		.pkey_nid = NID_rsaEncryption,
428e6e37e3Stb 	},
4376ce35bfSjsing 	{
448e6e37e3Stb 		.sign_nid = NID_shaWithRSAEncryption,
458e6e37e3Stb 		.hash_nid = NID_sha,
468e6e37e3Stb 		.pkey_nid = NID_rsaEncryption,
478e6e37e3Stb 	},
48f1535dc8Sdjm 	{
498e6e37e3Stb 		.sign_nid = NID_sha1WithRSAEncryption,
508e6e37e3Stb 		.hash_nid = NID_sha1,
518e6e37e3Stb 		.pkey_nid = NID_rsaEncryption,
528e6e37e3Stb 	},
5376ce35bfSjsing 	{
548e6e37e3Stb 		.sign_nid = NID_dsaWithSHA,
558e6e37e3Stb 		.hash_nid = NID_sha,
568e6e37e3Stb 		.pkey_nid = NID_dsa,
578e6e37e3Stb 	},
5876ce35bfSjsing 	{
598e6e37e3Stb 		.sign_nid = NID_dsaWithSHA1_2,
608e6e37e3Stb 		.hash_nid = NID_sha1,
618e6e37e3Stb 		.pkey_nid = NID_dsa_2,
628e6e37e3Stb 	},
638e6e37e3Stb 	{
648e6e37e3Stb 		.sign_nid = NID_mdc2WithRSA,
658e6e37e3Stb 		.hash_nid = NID_mdc2,
668e6e37e3Stb 		.pkey_nid = NID_rsaEncryption,
678e6e37e3Stb 	},
688e6e37e3Stb 	{
698e6e37e3Stb 		.sign_nid = NID_md5WithRSA,
708e6e37e3Stb 		.hash_nid = NID_md5,
718e6e37e3Stb 		.pkey_nid = NID_rsa,
728e6e37e3Stb 	},
738e6e37e3Stb 	{
748e6e37e3Stb 		.sign_nid = NID_dsaWithSHA1,
758e6e37e3Stb 		.hash_nid = NID_sha1,
768e6e37e3Stb 		.pkey_nid = NID_dsa,
778e6e37e3Stb 	},
788e6e37e3Stb 	{
798e6e37e3Stb 		.sign_nid = NID_sha1WithRSA,
808e6e37e3Stb 		.hash_nid = NID_sha1,
818e6e37e3Stb 		.pkey_nid = NID_rsa,
828e6e37e3Stb 	},
838e6e37e3Stb 	{
848e6e37e3Stb 		.sign_nid = NID_ripemd160WithRSA,
858e6e37e3Stb 		.hash_nid = NID_ripemd160,
868e6e37e3Stb 		.pkey_nid = NID_rsaEncryption,
878e6e37e3Stb 	},
888e6e37e3Stb 	{
898e6e37e3Stb 		.sign_nid = NID_md4WithRSAEncryption,
908e6e37e3Stb 		.hash_nid = NID_md4,
918e6e37e3Stb 		.pkey_nid = NID_rsaEncryption,
928e6e37e3Stb 	},
938e6e37e3Stb 	{
948e6e37e3Stb 		.sign_nid = NID_ecdsa_with_SHA1,
958e6e37e3Stb 		.hash_nid = NID_sha1,
968e6e37e3Stb 		.pkey_nid = NID_X9_62_id_ecPublicKey,
978e6e37e3Stb 	},
988e6e37e3Stb 	{
998e6e37e3Stb 		.sign_nid = NID_sha256WithRSAEncryption,
1008e6e37e3Stb 		.hash_nid = NID_sha256,
1018e6e37e3Stb 		.pkey_nid = NID_rsaEncryption,
1028e6e37e3Stb 	},
1038e6e37e3Stb 	{
1048e6e37e3Stb 		.sign_nid = NID_sha384WithRSAEncryption,
1058e6e37e3Stb 		.hash_nid = NID_sha384,
1068e6e37e3Stb 		.pkey_nid = NID_rsaEncryption,
1078e6e37e3Stb 	},
1088e6e37e3Stb 	{
1098e6e37e3Stb 		.sign_nid = NID_sha512WithRSAEncryption,
1108e6e37e3Stb 		.hash_nid = NID_sha512,
1118e6e37e3Stb 		.pkey_nid = NID_rsaEncryption,
1128e6e37e3Stb 	},
1138e6e37e3Stb 	{
1148e6e37e3Stb 		.sign_nid = NID_sha224WithRSAEncryption,
1158e6e37e3Stb 		.hash_nid = NID_sha224,
1168e6e37e3Stb 		.pkey_nid = NID_rsaEncryption,
1178e6e37e3Stb 	},
1188e6e37e3Stb 	{
1198e6e37e3Stb 		.sign_nid = NID_ecdsa_with_Recommended,
1208e6e37e3Stb 		.hash_nid = NID_undef,
1218e6e37e3Stb 		.pkey_nid = NID_X9_62_id_ecPublicKey,
1228e6e37e3Stb 	},
1238e6e37e3Stb 	{
1248e6e37e3Stb 		.sign_nid = NID_ecdsa_with_Specified,
1258e6e37e3Stb 		.hash_nid = NID_undef,
1268e6e37e3Stb 		.pkey_nid = NID_X9_62_id_ecPublicKey,
1278e6e37e3Stb 	},
1288e6e37e3Stb 	{
1298e6e37e3Stb 		.sign_nid = NID_ecdsa_with_SHA224,
1308e6e37e3Stb 		.hash_nid = NID_sha224,
1318e6e37e3Stb 		.pkey_nid = NID_X9_62_id_ecPublicKey,
1328e6e37e3Stb 	},
1338e6e37e3Stb 	{
1348e6e37e3Stb 		.sign_nid = NID_ecdsa_with_SHA256,
1358e6e37e3Stb 		.hash_nid = NID_sha256,
1368e6e37e3Stb 		.pkey_nid = NID_X9_62_id_ecPublicKey,
1378e6e37e3Stb 	},
1388e6e37e3Stb 	{
1398e6e37e3Stb 		.sign_nid = NID_ecdsa_with_SHA384,
1408e6e37e3Stb 		.hash_nid = NID_sha384,
1418e6e37e3Stb 		.pkey_nid = NID_X9_62_id_ecPublicKey,
1428e6e37e3Stb 	},
1438e6e37e3Stb 	{
1448e6e37e3Stb 		.sign_nid = NID_ecdsa_with_SHA512,
1458e6e37e3Stb 		.hash_nid = NID_sha512,
1468e6e37e3Stb 		.pkey_nid = NID_X9_62_id_ecPublicKey,
1478e6e37e3Stb 	},
1488e6e37e3Stb 	{
1498e6e37e3Stb 		.sign_nid = NID_dsa_with_SHA224,
1508e6e37e3Stb 		.hash_nid = NID_sha224,
1518e6e37e3Stb 		.pkey_nid = NID_dsa,
1528e6e37e3Stb 	},
1538e6e37e3Stb 	{
1548e6e37e3Stb 		.sign_nid = NID_dsa_with_SHA256,
1558e6e37e3Stb 		.hash_nid = NID_sha256,
1568e6e37e3Stb 		.pkey_nid = NID_dsa,
1578e6e37e3Stb 	},
1588e6e37e3Stb 	{
1598e6e37e3Stb 		.sign_nid = NID_id_GostR3411_94_with_GostR3410_2001,
1608e6e37e3Stb 		.hash_nid = NID_id_GostR3411_94,
1618e6e37e3Stb 		.pkey_nid = NID_id_GostR3410_2001,
1628e6e37e3Stb 	},
1638e6e37e3Stb 	{
1648e6e37e3Stb 		.sign_nid = NID_id_GostR3411_94_with_GostR3410_94,
1658e6e37e3Stb 		.hash_nid = NID_id_GostR3411_94,
1668e6e37e3Stb 		.pkey_nid = NID_id_GostR3410_94,
1678e6e37e3Stb 	},
1688e6e37e3Stb 	{
1698e6e37e3Stb 		.sign_nid = NID_id_GostR3411_94_with_GostR3410_94_cc,
1708e6e37e3Stb 		.hash_nid = NID_id_GostR3411_94,
1718e6e37e3Stb 		.pkey_nid = NID_id_GostR3410_94_cc,
1728e6e37e3Stb 	},
1738e6e37e3Stb 	{
1748e6e37e3Stb 		.sign_nid = NID_id_GostR3411_94_with_GostR3410_2001_cc,
1758e6e37e3Stb 		.hash_nid = NID_id_GostR3411_94,
1768e6e37e3Stb 		.pkey_nid = NID_id_GostR3410_2001_cc,
1778e6e37e3Stb 	},
1788e6e37e3Stb 	{
1798e6e37e3Stb 		.sign_nid = NID_rsassaPss,
1808e6e37e3Stb 		.hash_nid = NID_undef,
181*9c6dcd48Stb 		.pkey_nid = NID_rsassaPss,
1828e6e37e3Stb 	},
1838e6e37e3Stb 	{
1848e6e37e3Stb 		.sign_nid = NID_id_tc26_signwithdigest_gost3410_2012_256,
1858e6e37e3Stb 		.hash_nid = NID_id_tc26_gost3411_2012_256,
1868e6e37e3Stb 		.pkey_nid = NID_id_GostR3410_2001,
1878e6e37e3Stb 	},
1888e6e37e3Stb 	{
1898e6e37e3Stb 		.sign_nid = NID_id_tc26_signwithdigest_gost3410_2012_512,
1908e6e37e3Stb 		.hash_nid = NID_id_tc26_gost3411_2012_512,
1918e6e37e3Stb 		.pkey_nid = NID_id_GostR3410_2001,
1928e6e37e3Stb 	},
1938e6e37e3Stb 	{
1948e6e37e3Stb 		.sign_nid = NID_Ed25519,
1958e6e37e3Stb 		.hash_nid = NID_undef,
1968e6e37e3Stb 		.pkey_nid = NID_Ed25519,
1978e6e37e3Stb 	},
1988e6e37e3Stb 	{
1998e6e37e3Stb 		.sign_nid = NID_dhSinglePass_stdDH_sha1kdf_scheme,
2008e6e37e3Stb 		.hash_nid = NID_sha1,
2018e6e37e3Stb 		.pkey_nid = NID_dh_std_kdf,
2028e6e37e3Stb 	},
2038e6e37e3Stb 	{
2048e6e37e3Stb 		.sign_nid = NID_dhSinglePass_stdDH_sha224kdf_scheme,
2058e6e37e3Stb 		.hash_nid = NID_sha224,
2068e6e37e3Stb 		.pkey_nid = NID_dh_std_kdf,
2078e6e37e3Stb 	},
2088e6e37e3Stb 	{
2098e6e37e3Stb 		.sign_nid = NID_dhSinglePass_stdDH_sha256kdf_scheme,
2108e6e37e3Stb 		.hash_nid = NID_sha256,
2118e6e37e3Stb 		.pkey_nid = NID_dh_std_kdf,
2128e6e37e3Stb 	},
2138e6e37e3Stb 	{
2148e6e37e3Stb 		.sign_nid = NID_dhSinglePass_stdDH_sha384kdf_scheme,
2158e6e37e3Stb 		.hash_nid = NID_sha384,
2168e6e37e3Stb 		.pkey_nid = NID_dh_std_kdf,
2178e6e37e3Stb 	},
2188e6e37e3Stb 	{
2198e6e37e3Stb 		.sign_nid = NID_dhSinglePass_stdDH_sha512kdf_scheme,
2208e6e37e3Stb 		.hash_nid = NID_sha512,
2218e6e37e3Stb 		.pkey_nid = NID_dh_std_kdf,
2228e6e37e3Stb 	},
2238e6e37e3Stb 	{
2248e6e37e3Stb 		.sign_nid = NID_dhSinglePass_cofactorDH_sha1kdf_scheme,
2258e6e37e3Stb 		.hash_nid = NID_sha1,
2268e6e37e3Stb 		.pkey_nid = NID_dh_cofactor_kdf,
2278e6e37e3Stb 	},
2288e6e37e3Stb 	{
2298e6e37e3Stb 		.sign_nid = NID_dhSinglePass_cofactorDH_sha224kdf_scheme,
2308e6e37e3Stb 		.hash_nid = NID_sha224,
2318e6e37e3Stb 		.pkey_nid = NID_dh_cofactor_kdf,
2328e6e37e3Stb 	},
2338e6e37e3Stb 	{
2348e6e37e3Stb 		.sign_nid = NID_dhSinglePass_cofactorDH_sha256kdf_scheme,
2358e6e37e3Stb 		.hash_nid = NID_sha256,
2368e6e37e3Stb 		.pkey_nid = NID_dh_cofactor_kdf,
2378e6e37e3Stb 	},
2388e6e37e3Stb 	{
2398e6e37e3Stb 		.sign_nid = NID_dhSinglePass_cofactorDH_sha384kdf_scheme,
2408e6e37e3Stb 		.hash_nid = NID_sha384,
2418e6e37e3Stb 		.pkey_nid = NID_dh_cofactor_kdf,
2428e6e37e3Stb 	},
2438e6e37e3Stb 	{
2448e6e37e3Stb 		.sign_nid = NID_dhSinglePass_cofactorDH_sha512kdf_scheme,
2458e6e37e3Stb 		.hash_nid = NID_sha512,
2468e6e37e3Stb 		.pkey_nid = NID_dh_cofactor_kdf,
2478e6e37e3Stb 	},
2488e6e37e3Stb 	{
2498e6e37e3Stb 		.sign_nid = NID_RSA_SHA3_224,
2508e6e37e3Stb 		.hash_nid = NID_sha3_224,
2518e6e37e3Stb 		.pkey_nid = NID_rsaEncryption,
2528e6e37e3Stb 	},
2538e6e37e3Stb 	{
2548e6e37e3Stb 		.sign_nid = NID_RSA_SHA3_256,
2558e6e37e3Stb 		.hash_nid = NID_sha3_256,
2568e6e37e3Stb 		.pkey_nid = NID_rsaEncryption,
2578e6e37e3Stb 	},
2588e6e37e3Stb 	{
2598e6e37e3Stb 		.sign_nid = NID_RSA_SHA3_384,
2608e6e37e3Stb 		.hash_nid = NID_sha3_384,
2618e6e37e3Stb 		.pkey_nid = NID_rsaEncryption,
2628e6e37e3Stb 	},
2638e6e37e3Stb 	{
2648e6e37e3Stb 		.sign_nid = NID_RSA_SHA3_512,
2658e6e37e3Stb 		.hash_nid = NID_sha3_512,
2668e6e37e3Stb 		.pkey_nid = NID_rsaEncryption,
2678e6e37e3Stb 	},
2680dadb9f5Stb 	{
2690dadb9f5Stb 		.sign_nid = NID_ecdsa_with_SHA3_224,
2700dadb9f5Stb 		.hash_nid = NID_sha3_224,
2710dadb9f5Stb 		.pkey_nid = NID_X9_62_id_ecPublicKey,
2720dadb9f5Stb 	},
2730dadb9f5Stb 	{
2740dadb9f5Stb 		.sign_nid = NID_ecdsa_with_SHA3_256,
2750dadb9f5Stb 		.hash_nid = NID_sha3_256,
2760dadb9f5Stb 		.pkey_nid = NID_X9_62_id_ecPublicKey,
2770dadb9f5Stb 	},
2780dadb9f5Stb 	{
2790dadb9f5Stb 		.sign_nid = NID_ecdsa_with_SHA3_384,
2800dadb9f5Stb 		.hash_nid = NID_sha3_384,
2810dadb9f5Stb 		.pkey_nid = NID_X9_62_id_ecPublicKey,
2820dadb9f5Stb 	},
2830dadb9f5Stb 	{
2840dadb9f5Stb 		.sign_nid = NID_ecdsa_with_SHA3_512,
2850dadb9f5Stb 		.hash_nid = NID_sha3_512,
2860dadb9f5Stb 		.pkey_nid = NID_X9_62_id_ecPublicKey,
2870dadb9f5Stb 	},
2888e6e37e3Stb };
2898e6e37e3Stb 
2908e6e37e3Stb #define N_NID_TRIPLES (sizeof(nid_triple) / sizeof(nid_triple[0]))
291f1535dc8Sdjm 
292223e7da0Sjsing int
2938e6e37e3Stb OBJ_find_sigid_algs(int sign_nid, int *hash_nid, int *pkey_nid)
294f1535dc8Sdjm {
2958e6e37e3Stb 	size_t i;
296f1535dc8Sdjm 
2978e6e37e3Stb 	for (i = 0; i < N_NID_TRIPLES; i++) {
2988e6e37e3Stb 		if (sign_nid != nid_triple[i].sign_nid)
2998e6e37e3Stb 			continue;
3008e6e37e3Stb 
3018e6e37e3Stb 		if (hash_nid != NULL)
3028e6e37e3Stb 			*hash_nid = nid_triple[i].hash_nid;
3038e6e37e3Stb 		if (pkey_nid != NULL)
3048e6e37e3Stb 			*pkey_nid = nid_triple[i].pkey_nid;
3058e6e37e3Stb 
306f1535dc8Sdjm 		return 1;
307f1535dc8Sdjm 	}
3088e6e37e3Stb 
3098e6e37e3Stb 	return 0;
3108e6e37e3Stb }
3111e9308c1Sbeck LCRYPTO_ALIAS(OBJ_find_sigid_algs);
312f1535dc8Sdjm 
313223e7da0Sjsing int
3148e6e37e3Stb OBJ_find_sigid_by_algs(int *sign_nid, int hash_nid, int pkey_nid)
315f1535dc8Sdjm {
3168e6e37e3Stb 	size_t i;
317f1535dc8Sdjm 
3188e6e37e3Stb 	for (i = 0; i < N_NID_TRIPLES; i++) {
3198e6e37e3Stb 		if (hash_nid != nid_triple[i].hash_nid)
3208e6e37e3Stb 			continue;
3218e6e37e3Stb 		if (pkey_nid != nid_triple[i].pkey_nid)
3228e6e37e3Stb 			continue;
323f1535dc8Sdjm 
3248e6e37e3Stb 		if (sign_nid != NULL)
3258e6e37e3Stb 			*sign_nid = nid_triple[i].sign_nid;
3268e6e37e3Stb 
327f1535dc8Sdjm 		return 1;
328f1535dc8Sdjm 	}
3298e6e37e3Stb 
3308e6e37e3Stb 	return 0;
3318e6e37e3Stb }
3321e9308c1Sbeck LCRYPTO_ALIAS(OBJ_find_sigid_by_algs);
333