199ebb4caSwyllys /*
299ebb4caSwyllys  * Copyright (c) 1995-2000 Intel Corporation. All rights reserved.
39a767088Shaimay  */
49a767088Shaimay /*
5*e65e5c2dSWyllys Ingersoll  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
699ebb4caSwyllys  * Use is subject to license terms.
799ebb4caSwyllys  */
899ebb4caSwyllys 
999ebb4caSwyllys #include <stdlib.h>
1099ebb4caSwyllys #include <string.h>
1199ebb4caSwyllys 
1299ebb4caSwyllys #include <kmfapiP.h>
1399ebb4caSwyllys 
1499ebb4caSwyllys typedef struct {
1599ebb4caSwyllys 	KMF_OID * AlgOID;
1699ebb4caSwyllys 	KMF_ALGORITHM_INDEX AlgID;
1799ebb4caSwyllys } KMF_OID_ID;
1899ebb4caSwyllys 
1999ebb4caSwyllys /*
2099ebb4caSwyllys  * The following table defines the mapping of AlgOID's to AlgID's.
2199ebb4caSwyllys  */
2299ebb4caSwyllys static KMF_OID_ID ALGOID_ID_Table[] = {
2302744e81Swyllys 	{(KMF_OID *)&KMFOID_X9CM_DSA, KMF_ALGID_DSA},
2402744e81Swyllys 	{(KMF_OID *)&KMFOID_X9CM_DSAWithSHA1, KMF_ALGID_SHA1WithDSA},
2502744e81Swyllys 	{(KMF_OID *)&KMFOID_SHA1, KMF_ALGID_SHA1},
2602744e81Swyllys 	{(KMF_OID *)&KMFOID_RSA, KMF_ALGID_RSA},
2702744e81Swyllys 	{(KMF_OID *)&KMFOID_DSA, KMF_ALGID_DSA},
2802744e81Swyllys 	{(KMF_OID *)&KMFOID_MD5WithRSA, KMF_ALGID_MD5WithRSA},
2902744e81Swyllys 	{(KMF_OID *)&KMFOID_SHA1WithRSA, KMF_ALGID_SHA1WithRSA},
30*e65e5c2dSWyllys Ingersoll 	{(KMF_OID *)&KMFOID_SHA1WithDSA, KMF_ALGID_SHA1WithDSA},
31*e65e5c2dSWyllys Ingersoll 	{(KMF_OID *)&KMFOID_SHA256WithDSA, KMF_ALGID_SHA256WithDSA},
32*e65e5c2dSWyllys Ingersoll 	{(KMF_OID *)&KMFOID_SHA1WithECDSA, KMF_ALGID_SHA1WithECDSA},
33*e65e5c2dSWyllys Ingersoll 	{(KMF_OID *)&KMFOID_SHA256WithECDSA, KMF_ALGID_SHA256WithECDSA},
34*e65e5c2dSWyllys Ingersoll 	{(KMF_OID *)&KMFOID_SHA256WithRSA, KMF_ALGID_SHA256WithRSA},
35*e65e5c2dSWyllys Ingersoll 	{(KMF_OID *)&KMFOID_SHA384WithECDSA, KMF_ALGID_SHA384WithECDSA},
36*e65e5c2dSWyllys Ingersoll 	{(KMF_OID *)&KMFOID_SHA384WithRSA, KMF_ALGID_SHA384WithRSA},
37*e65e5c2dSWyllys Ingersoll 	{(KMF_OID *)&KMFOID_SHA512WithECDSA, KMF_ALGID_SHA512WithECDSA},
38*e65e5c2dSWyllys Ingersoll 	{(KMF_OID *)&KMFOID_SHA512WithRSA, KMF_ALGID_SHA512WithRSA},
39*e65e5c2dSWyllys Ingersoll 	{(KMF_OID *)&KMFOID_EC_PUBLIC_KEY, KMF_ALGID_ECDSA}
4099ebb4caSwyllys };
4199ebb4caSwyllys 
4299ebb4caSwyllys #define	NUM_ALGOIDS ((sizeof (ALGOID_ID_Table))/(sizeof (ALGOID_ID_Table[0])))
4399ebb4caSwyllys 
4499ebb4caSwyllys /*
4530a5e8faSwyllys  * Name: x509_algid_to_algoid
4699ebb4caSwyllys  *
4799ebb4caSwyllys  * Description:
4899ebb4caSwyllys  * This function maps the specified AlgID to the corresponding
4999ebb4caSwyllys  * Algorithm OID.
5099ebb4caSwyllys  *
5199ebb4caSwyllys  * Parameters:
5299ebb4caSwyllys  * alg_int - AlgID to be mapped.
5399ebb4caSwyllys  *
5499ebb4caSwyllys  * Return value:
5599ebb4caSwyllys  * Pointer to OID structure and NULL in case of failure.
5699ebb4caSwyllys  *
5799ebb4caSwyllys  */
5899ebb4caSwyllys KMF_OID *
x509_algid_to_algoid(KMF_ALGORITHM_INDEX alg_int)5930a5e8faSwyllys x509_algid_to_algoid(KMF_ALGORITHM_INDEX alg_int)
6099ebb4caSwyllys {
6199ebb4caSwyllys 	int i;
6299ebb4caSwyllys 
6399ebb4caSwyllys 	switch (alg_int) {
6499ebb4caSwyllys 		case KMF_ALGID_NONE:
6599ebb4caSwyllys 			return (NULL);
6699ebb4caSwyllys 
6799ebb4caSwyllys 		default:
6899ebb4caSwyllys 			for (i = 0; i < NUM_ALGOIDS; i++) {
6999ebb4caSwyllys 				if (ALGOID_ID_Table[i].AlgID == alg_int)
7099ebb4caSwyllys 					return (ALGOID_ID_Table[i].AlgOID);
7199ebb4caSwyllys 			}
7299ebb4caSwyllys 			break;
7399ebb4caSwyllys 	}
7499ebb4caSwyllys 
7599ebb4caSwyllys 	return (NULL);
7699ebb4caSwyllys }
7799ebb4caSwyllys 
7899ebb4caSwyllys /*
7930a5e8faSwyllys  * Name: x509_algoid_to_algid
8099ebb4caSwyllys  *
8199ebb4caSwyllys  * Description:
8299ebb4caSwyllys  * This function maps the specified Algorithm OID to the corresponding
8399ebb4caSwyllys  * AlgID.
8499ebb4caSwyllys  *
8599ebb4caSwyllys  * Parameters:
8699ebb4caSwyllys  * Oid - OID to be mapped.
8799ebb4caSwyllys  *
8899ebb4caSwyllys  * Return value:
8999ebb4caSwyllys  * Algorithm ID and KMF_ALGID_NONE in case of failures.
9099ebb4caSwyllys  */
9199ebb4caSwyllys KMF_ALGORITHM_INDEX
x509_algoid_to_algid(KMF_OID * Oid)9230a5e8faSwyllys x509_algoid_to_algid(KMF_OID * Oid)
9399ebb4caSwyllys {
9499ebb4caSwyllys 	int i;
9599ebb4caSwyllys 
9630a5e8faSwyllys 	if ((Oid == NULL) || (Oid->Data == NULL) || (Oid->Length == 0)) {
9799ebb4caSwyllys 		return (KMF_ALGID_NONE);
9899ebb4caSwyllys 	}
9999ebb4caSwyllys 
10099ebb4caSwyllys 	for (i = 0; i < NUM_ALGOIDS; i++) {
10199ebb4caSwyllys 		if (IsEqualOid(ALGOID_ID_Table[i].AlgOID, Oid))
10299ebb4caSwyllys 			return (ALGOID_ID_Table[i].AlgID);
10399ebb4caSwyllys 	}
10499ebb4caSwyllys 
10599ebb4caSwyllys 	return (KMF_ALGID_NONE);
10699ebb4caSwyllys }
107