#include <Security/oidsbase.h>
#include <Security/cssmtype.h>
#include <Security/cssmapple.h>
#include <string.h>
static const uint8
OID_MD2[] = { OID_RSA_HASH, 2 },
OID_MD4[] = { OID_RSA_HASH, 4 },
OID_MD5[] = { OID_RSA_HASH, 5 },
OID_RSAEncryption[] = { OID_PKCS_1, 1 },
OID_MD2WithRSA[] = { OID_PKCS_1, 2 },
OID_MD4WithRSA[] = { OID_PKCS_1, 3 },
OID_MD5WithRSA[] = { OID_PKCS_1, 4 },
OID_SHA1WithRSA[] = { OID_PKCS_1, 5 },
OID_PKCS_3_ARC[] = { OID_PKCS_3 },
OID_DHKeyAgreement[] = { OID_PKCS_3, 1 },
OID_OIW_DSA[] = { OID_OIW_ALGORITHM, 12 },
OID_OIW_DSAWithSHA1[] = { OID_OIW_ALGORITHM, 27 },
OID_CMS_DSA[] = { 0x2A, 0x86, 0x48, 0xCE, 0x38, 4, 1 },
OID_CMS_DSAWithSHA1[] = { 0x2A, 0x86, 0x48, 0xCE, 0x38, 4, 3 },
OID_JDK_DSA[] = { 0x2B, 0x0E, 0x03, 0x02, 0x0c },
OID_JDK_DSAWithSHA1[] = { 0x2B, 0x0E, 0x03, 0x02, 0x0D },
OID_OIW_SHA1[] = { OID_OIW_ALGORITHM, 26 },
OID_OIW_RSAWithSHA1[] = { OID_OIW_ALGORITHM, 29 },
OID_ANSI_DH_PUB_NUMBER[]= { OID_ANSI_X9_42, 1 },
OID_ANSI_DH_STATIC[] = { OID_ANSI_X9_42_SCHEME, 1 },
OID_ANSI_DH_EPHEM[] = { OID_ANSI_X9_42_SCHEME, 2 },
OID_ANSI_DH_ONE_FLOW[] = { OID_ANSI_X9_42_SCHEME, 3 },
OID_ANSI_DH_HYBRID1[] = { OID_ANSI_X9_42_SCHEME, 4 },
OID_ANSI_DH_HYBRID2[] = { OID_ANSI_X9_42_SCHEME, 5 },
OID_ANSI_DH_HYBRID_ONEFLOW[] = { OID_ANSI_X9_42_SCHEME, 6 },
OID_ANSI_MQV1[] = { OID_ANSI_X9_42_SCHEME, 8 },
OID_ANSI_MQV2[] = { OID_ANSI_X9_42_SCHEME, 7 },
OID_ANSI_DH_STATIC_SHA1[] = { OID_ANSI_X9_42_NAMED_SCHEME, 1 },
OID_ANSI_DH_EPHEM_SHA1[] = { OID_ANSI_X9_42_NAMED_SCHEME, 2 },
OID_ANSI_DH_ONE_FLOW_SHA1[] = { OID_ANSI_X9_42_NAMED_SCHEME, 3 },
OID_ANSI_DH_HYBRID1_SHA1[] = { OID_ANSI_X9_42_NAMED_SCHEME, 4 },
OID_ANSI_DH_HYBRID2_SHA1[] = { OID_ANSI_X9_42_NAMED_SCHEME, 5 },
OID_ANSI_DH_HYBRID_ONEFLOW_SHA1[] = { OID_ANSI_X9_42_NAMED_SCHEME, 6 },
OID_ANSI_MQV1_SHA1[] = { OID_ANSI_X9_42_NAMED_SCHEME, 8 },
OID_ANSI_MQV2_SHA1[] = { OID_ANSI_X9_42_NAMED_SCHEME, 7 };
const CSSM_OID
CSSMOID_MD2 = {OID_RSA_HASH_LENGTH+1, (uint8 *)OID_MD2},
CSSMOID_MD4 = {OID_RSA_HASH_LENGTH+1, (uint8 *)OID_MD4},
CSSMOID_MD5 = {OID_RSA_HASH_LENGTH+1, (uint8 *)OID_MD5},
CSSMOID_RSA = {OID_PKCS_1_LENGTH+1, (uint8 *)OID_RSAEncryption},
CSSMOID_MD2WithRSA = {OID_PKCS_1_LENGTH+1, (uint8 *)OID_MD2WithRSA},
CSSMOID_MD4WithRSA = {OID_PKCS_1_LENGTH+1, (uint8 *)OID_MD4WithRSA},
CSSMOID_MD5WithRSA = {OID_PKCS_1_LENGTH+1, (uint8 *)OID_MD5WithRSA},
CSSMOID_SHA1WithRSA = {OID_PKCS_1_LENGTH+1, (uint8 *)OID_SHA1WithRSA},
CSSMOID_PKCS3 = {OID_PKCS_3_LENGTH, (uint8 *)OID_PKCS_3_ARC},
CSSMOID_DH = {OID_PKCS_3_LENGTH+1, (uint8 *)OID_DHKeyAgreement},
CSSMOID_DSA = {OID_OIW_ALGORITHM_LENGTH+1, (uint8 *)OID_OIW_DSA},
CSSMOID_DSA_CMS = { 7, (uint8 *)OID_CMS_DSA},
CSSMOID_DSA_JDK = { 5, (uint8 *)OID_JDK_DSA},
CSSMOID_SHA1WithDSA = {OID_OIW_ALGORITHM_LENGTH+1, (uint8 *)OID_OIW_DSAWithSHA1},
CSSMOID_SHA1WithDSA_CMS = { 7, (uint8 *)OID_CMS_DSAWithSHA1},
CSSMOID_SHA1WithDSA_JDK = { 5, (uint8 *)OID_JDK_DSAWithSHA1},
CSSMOID_SHA1 = {OID_OIW_ALGORITHM_LENGTH+1, (uint8 *)OID_OIW_SHA1},
CSSMOID_SHA1WithRSA_OIW = {OID_OIW_ALGORITHM_LENGTH+1, (uint8 *)OID_OIW_RSAWithSHA1},
CSSMOID_ANSI_DH_PUB_NUMBER = {OID_ANSI_X9_42_LEN + 1, (uint8 *)OID_ANSI_DH_PUB_NUMBER},
CSSMOID_ANSI_DH_STATIC = {OID_ANSI_X9_42_SCHEME_LEN + 1, (uint8 *)OID_ANSI_DH_STATIC},
CSSMOID_ANSI_DH_ONE_FLOW = {OID_ANSI_X9_42_SCHEME_LEN + 1, (uint8 *)OID_ANSI_DH_ONE_FLOW},
CSSMOID_ANSI_DH_EPHEM = {OID_ANSI_X9_42_SCHEME_LEN + 1, (uint8 *)OID_ANSI_DH_EPHEM},
CSSMOID_ANSI_DH_HYBRID1 = {OID_ANSI_X9_42_SCHEME_LEN + 1, (uint8 *)OID_ANSI_DH_HYBRID1},
CSSMOID_ANSI_DH_HYBRID2 = {OID_ANSI_X9_42_SCHEME_LEN + 1, (uint8 *)OID_ANSI_DH_HYBRID2},
CSSMOID_ANSI_DH_HYBRID_ONEFLOW = {OID_ANSI_X9_42_SCHEME_LEN + 1,
(uint8 *)OID_ANSI_DH_HYBRID_ONEFLOW},
CSSMOID_ANSI_DH_MQV1 = {OID_ANSI_X9_42_SCHEME_LEN + 1, (uint8 *)OID_ANSI_MQV1},
CSSMOID_ANSI_DH_MQV2 = {OID_ANSI_X9_42_SCHEME_LEN + 1, (uint8 *)OID_ANSI_MQV2},
CSSMOID_ANSI_DH_STATIC_SHA1 = {OID_ANSI_X9_42_NAMED_SCHEME_LEN + 1,
(uint8 *)OID_ANSI_DH_STATIC_SHA1},
CSSMOID_ANSI_DH_ONE_FLOW_SHA1 = {OID_ANSI_X9_42_NAMED_SCHEME_LEN + 1,
(uint8 *)OID_ANSI_DH_ONE_FLOW_SHA1},
CSSMOID_ANSI_DH_EPHEM_SHA1 = {OID_ANSI_X9_42_NAMED_SCHEME_LEN + 1,
(uint8 *)OID_ANSI_DH_EPHEM_SHA1},
CSSMOID_ANSI_DH_HYBRID1_SHA1 = {OID_ANSI_X9_42_NAMED_SCHEME_LEN + 1,
(uint8 *)OID_ANSI_DH_HYBRID1_SHA1},
CSSMOID_ANSI_DH_HYBRID2_SHA1 = {OID_ANSI_X9_42_NAMED_SCHEME_LEN + 1,
(uint8 *)OID_ANSI_DH_HYBRID2_SHA1},
CSSMOID_ANSI_DH_HYBRID_ONEFLOW_SHA1 = {OID_ANSI_X9_42_NAMED_SCHEME_LEN + 1,
(uint8 *)OID_ANSI_DH_HYBRID_ONEFLOW_SHA1},
CSSMOID_ANSI_MQV1_SHA1 = {OID_ANSI_X9_42_NAMED_SCHEME_LEN + 1,
(uint8 *)OID_ANSI_MQV1_SHA1},
CSSMOID_ANSI_MQV2_SHA1 = {OID_ANSI_X9_42_NAMED_SCHEME_LEN + 1,
(uint8 *)OID_ANSI_MQV2_SHA1};
static const uint8
APPLE_TP_ISIGN[] = {APPLE_TP_OID, 1},
APPLE_TP_X509_BASIC[] = {APPLE_TP_OID, 2},
APPLE_TP_SSL[] = {APPLE_TP_OID, 3},
APPLE_TP_LOCAL_CERT_GEN[] = {APPLE_TP_OID, 4},
APPLE_TP_CSR_GEN[] = {APPLE_TP_OID, 5},
APPLE_TP_REVOCATION_CRL[] = {APPLE_TP_OID, 6},
APPLE_TP_REVOCATION_OCSP[] = {APPLE_TP_OID, 7},
APPLE_TP_SMIME[] = {APPLE_TP_OID, 8},
APPLE_TP_EAP[] = {APPLE_TP_OID, 9},
APPLE_FEE[] = {APPLE_ALG_OID, 1},
APPLE_ASC[] = {APPLE_ALG_OID, 2},
APPLE_FEE_MD5[] = {APPLE_ALG_OID, 3},
APPLE_FEE_SHA1[] = {APPLE_ALG_OID, 4},
APPLE_FEED[] = {APPLE_ALG_OID, 5},
APPLE_FEEDEXP[] = {APPLE_ALG_OID, 6},
APPLE_ECDSA[] = {APPLE_ALG_OID, 7};
const CSSM_OID
CSSMOID_APPLE_ISIGN = {APPLE_TP_OID_LENGTH+1, (uint8 *)APPLE_TP_ISIGN},
CSSMOID_APPLE_X509_BASIC = {APPLE_TP_OID_LENGTH+1, (uint8 *)APPLE_TP_X509_BASIC},
CSSMOID_APPLE_TP_SSL = {APPLE_TP_OID_LENGTH+1, (uint8 *)APPLE_TP_SSL},
CSSMOID_APPLE_TP_LOCAL_CERT_GEN =
{APPLE_TP_OID_LENGTH+1, (uint8 *)APPLE_TP_LOCAL_CERT_GEN},
CSSMOID_APPLE_TP_CSR_GEN = {APPLE_TP_OID_LENGTH+1, (uint8 *)APPLE_TP_CSR_GEN},
CSSMOID_APPLE_TP_REVOCATION_CRL =
{APPLE_TP_OID_LENGTH+1, (uint8 *)APPLE_TP_REVOCATION_CRL},
CSSMOID_APPLE_TP_REVOCATION_OCSP =
{APPLE_TP_OID_LENGTH+1, (uint8 *)APPLE_TP_REVOCATION_OCSP},
CSSMOID_APPLE_TP_SMIME = {APPLE_TP_OID_LENGTH+1, (uint8 *)APPLE_TP_SMIME},
CSSMOID_APPLE_TP_EAP = {APPLE_TP_OID_LENGTH+1, (uint8 *)APPLE_TP_EAP},
CSSMOID_APPLE_FEE = {APPLE_ALG_OID_LENGTH+1, (uint8 *)APPLE_FEE},
CSSMOID_APPLE_ASC = {APPLE_ALG_OID_LENGTH+1, (uint8 *)APPLE_ASC},
CSSMOID_APPLE_FEE_MD5 = {APPLE_ALG_OID_LENGTH+1, (uint8 *)APPLE_FEE_MD5},
CSSMOID_APPLE_FEE_SHA1 = {APPLE_ALG_OID_LENGTH+1, (uint8 *)APPLE_FEE_SHA1},
CSSMOID_APPLE_FEED = {APPLE_ALG_OID_LENGTH+1, (uint8 *)APPLE_FEED},
CSSMOID_APPLE_FEEDEXP = {APPLE_ALG_OID_LENGTH+1, (uint8 *)APPLE_FEEDEXP},
CSSMOID_APPLE_ECDSA = {APPLE_ALG_OID_LENGTH+1, (uint8 *)APPLE_ECDSA};
#define OID_PKCS12_PbeIds OID_PKCS_12,1
#define OID_PKCS12_PbeIds_Length OID_PKCS_12_LENGTH+1
static const uint8
OID_PKCS12_pbeWithSHAAnd128BitRC4[] = { OID_PKCS12_PbeIds, 1 },
OID_PKCS12_pbeWithSHAAnd40BitRC4[] = { OID_PKCS12_PbeIds, 2 },
OID_PKCS12_pbeWithSHAAnd3Key3DESCBC[] = { OID_PKCS12_PbeIds, 3 },
OID_PKCS12_pbeWithSHAAnd2Key3DESCBC[] = { OID_PKCS12_PbeIds, 4 },
OID_PKCS12_pbeWithSHAAnd128BitRC2CBC[] ={ OID_PKCS12_PbeIds, 5 },
OID_PKCS12_pbewithSHAAnd40BitRC2CBC[] = { OID_PKCS12_PbeIds, 6 };
const CSSM_OID
CSSMOID_PKCS12_pbeWithSHAAnd128BitRC4 = {OID_PKCS12_PbeIds_Length + 1,
(uint8 *)OID_PKCS12_pbeWithSHAAnd128BitRC4 },
CSSMOID_PKCS12_pbeWithSHAAnd40BitRC4 = {OID_PKCS12_PbeIds_Length + 1,
(uint8 *)OID_PKCS12_pbeWithSHAAnd40BitRC4 },
CSSMOID_PKCS12_pbeWithSHAAnd3Key3DESCBC = {OID_PKCS12_PbeIds_Length + 1,
(uint8 *)OID_PKCS12_pbeWithSHAAnd3Key3DESCBC },
CSSMOID_PKCS12_pbeWithSHAAnd2Key3DESCBC = {OID_PKCS12_PbeIds_Length + 1,
(uint8 *)OID_PKCS12_pbeWithSHAAnd2Key3DESCBC },
CSSMOID_PKCS12_pbeWithSHAAnd128BitRC2CBC = {OID_PKCS12_PbeIds_Length + 1,
(uint8 *)OID_PKCS12_pbeWithSHAAnd128BitRC2CBC },
CSSMOID_PKCS12_pbewithSHAAnd40BitRC2CBC = {OID_PKCS12_PbeIds_Length + 1,
(uint8 *)OID_PKCS12_pbewithSHAAnd40BitRC2CBC };
#pragma mark ----- CSSM_OID <--> CSSM_ALGORITHMS -----
typedef struct {
const CSSM_OID *oid;
CSSM_ALGORITHMS alg;
} OidToAlgEnt;
static const OidToAlgEnt oidToAlgMap[] =
{
{&CSSMOID_RSA, CSSM_ALGID_RSA },
{&CSSMOID_MD2WithRSA, CSSM_ALGID_MD2WithRSA },
{&CSSMOID_MD5WithRSA, CSSM_ALGID_MD5WithRSA },
{&CSSMOID_SHA1WithRSA, CSSM_ALGID_SHA1WithRSA },
{&CSSMOID_SHA1WithRSA_OIW, CSSM_ALGID_SHA1WithRSA },
{&CSSMOID_SHA1, CSSM_ALGID_SHA1},
{&CSSMOID_MD5, CSSM_ALGID_MD5 },
{&CSSMOID_DSA_CMS, CSSM_ALGID_DSA },
{&CSSMOID_DSA, CSSM_ALGID_DSA },
{&CSSMOID_DSA_JDK, CSSM_ALGID_DSA },
{&CSSMOID_SHA1WithDSA_CMS, CSSM_ALGID_SHA1WithDSA },
{&CSSMOID_SHA1WithDSA, CSSM_ALGID_SHA1WithDSA },
{&CSSMOID_SHA1WithDSA_JDK, CSSM_ALGID_SHA1WithDSA },
{&CSSMOID_DH, CSSM_ALGID_DH},
{&CSSMOID_ANSI_DH_PUB_NUMBER, CSSM_ALGID_DH},
{&CSSMOID_ANSI_DH_STATIC, CSSM_ALGID_DH},
{&CSSMOID_ANSI_DH_ONE_FLOW, CSSM_ALGID_DH},
{&CSSMOID_ANSI_DH_EPHEM, CSSM_ALGID_DH},
{&CSSMOID_ANSI_DH_HYBRID1, CSSM_ALGID_DH},
{&CSSMOID_ANSI_DH_HYBRID2, CSSM_ALGID_DH},
{&CSSMOID_ANSI_DH_HYBRID_ONEFLOW, CSSM_ALGID_DH},
{&CSSMOID_APPLE_FEE, CSSM_ALGID_FEE },
{&CSSMOID_APPLE_ASC, CSSM_ALGID_ASC },
{&CSSMOID_APPLE_FEE_MD5, CSSM_ALGID_FEE_MD5 },
{&CSSMOID_APPLE_FEE_SHA1, CSSM_ALGID_FEE_SHA1 },
{&CSSMOID_APPLE_FEED, CSSM_ALGID_FEED },
{&CSSMOID_APPLE_FEEDEXP, CSSM_ALGID_FEEDEXP },
{&CSSMOID_APPLE_ECDSA, CSSM_ALGID_SHA1WithECDSA },
{NULL, 0}
};
#define NUM_OID_TO_ALGS (sizeof(oidToAlgMap) / sizeof(oidToAlgMap[0]))
static bool compareCssmData(
const CSSM_DATA *data1,
const CSSM_DATA *data2)
{
if((data1 == NULL) || (data1->Data == NULL) ||
(data2 == NULL) || (data2->Data == NULL) ||
(data1->Length != data2->Length)) {
return false;
}
if(data1->Length != data2->Length) {
return false;
}
if(memcmp(data1->Data, data2->Data, data1->Length) == 0) {
return true;
}
else {
return false;
}
}
bool cssmOidToAlg(
const CSSM_OID *oid,
CSSM_ALGORITHMS *alg) {
const OidToAlgEnt *ent;
for(ent=oidToAlgMap; ent->oid; ent++) {
if(compareCssmData(ent->oid, oid)) {
*alg = ent->alg;
return true;
}
}
return false;
}
const CSSM_OID *cssmAlgToOid(
CSSM_ALGORITHMS algId)
{
const OidToAlgEnt *ent;
for(ent=oidToAlgMap; ent->oid; ent++) {
if(ent->alg == algId) {
return ent->oid;
}
}
return NULL;
}