+/* The new SecKey API has made this very painful */
+static SecKeyAlgorithm SECOID_FindSecKeyAlgorithmByTags(SECOidTag sigAlgTag, SECOidTag digAlgTag, bool isDigest) {
+ switch(sigAlgTag) {
+ case(SEC_OID_PKCS1_MD5_WITH_RSA_ENCRYPTION):
+ if (digAlgTag == SEC_OID_MD5) {
+ return ((isDigest) ? kSecKeyAlgorithmRSASignatureDigestPKCS1v15MD5 :
+ kSecKeyAlgorithmRSASignatureMessagePKCS1v15MD5);
+ }
+ break;
+ case(SEC_OID_PKCS1_SHA1_WITH_RSA_ENCRYPTION):
+ if (digAlgTag == SEC_OID_SHA1) {
+ return ((isDigest) ? kSecKeyAlgorithmRSASignatureDigestPKCS1v15SHA1
+ : kSecKeyAlgorithmRSASignatureMessagePKCS1v15SHA1);
+ }
+ break;
+ case(SEC_OID_PKCS1_SHA256_WITH_RSA_ENCRYPTION):
+ if (digAlgTag == SEC_OID_SHA256) {
+ return ((isDigest) ? kSecKeyAlgorithmRSASignatureDigestPKCS1v15SHA256
+ : kSecKeyAlgorithmRSASignatureMessagePKCS1v15SHA256);
+ }
+ break;
+ case(SEC_OID_PKCS1_SHA384_WITH_RSA_ENCRYPTION):
+ if (digAlgTag == SEC_OID_SHA384) {
+ return ((isDigest) ? kSecKeyAlgorithmRSASignatureDigestPKCS1v15SHA384
+ : kSecKeyAlgorithmRSASignatureMessagePKCS1v15SHA384);
+ }
+ break;
+ case(SEC_OID_PKCS1_SHA512_WITH_RSA_ENCRYPTION):
+ if (digAlgTag == SEC_OID_SHA512) {
+ return ((isDigest) ? kSecKeyAlgorithmRSASignatureDigestPKCS1v15SHA512
+ : kSecKeyAlgorithmRSASignatureMessagePKCS1v15SHA512);
+ }
+ break;
+ case(SEC_OID_PKCS1_RSA_ENCRYPTION):
+ switch (digAlgTag) {
+ case (SEC_OID_MD5):
+ return ((isDigest) ? kSecKeyAlgorithmRSASignatureDigestPKCS1v15MD5 :
+ kSecKeyAlgorithmRSASignatureMessagePKCS1v15MD5);
+ case(SEC_OID_SHA1):
+ return ((isDigest) ? kSecKeyAlgorithmRSASignatureDigestPKCS1v15SHA1
+ : kSecKeyAlgorithmRSASignatureMessagePKCS1v15SHA1);
+ case(SEC_OID_SHA256):
+ return ((isDigest) ? kSecKeyAlgorithmRSASignatureDigestPKCS1v15SHA256
+ : kSecKeyAlgorithmRSASignatureMessagePKCS1v15SHA256);
+ case(SEC_OID_SHA384):
+ return ((isDigest) ? kSecKeyAlgorithmRSASignatureDigestPKCS1v15SHA384
+ : kSecKeyAlgorithmRSASignatureMessagePKCS1v15SHA384);
+ case(SEC_OID_SHA512):
+ return ((isDigest) ? kSecKeyAlgorithmRSASignatureDigestPKCS1v15SHA512
+ : kSecKeyAlgorithmRSASignatureMessagePKCS1v15SHA512);
+ default:
+ return NULL;
+ }
+ case(SEC_OID_ECDSA_WithSHA1):
+ if (digAlgTag == SEC_OID_SHA1) {
+ return ((isDigest) ? kSecKeyAlgorithmECDSASignatureDigestX962
+ : kSecKeyAlgorithmECDSASignatureMessageX962SHA1);
+ }
+ break;
+ case(SEC_OID_ECDSA_WITH_SHA256):
+ if (digAlgTag == SEC_OID_SHA256) {
+ return ((isDigest) ? kSecKeyAlgorithmECDSASignatureDigestX962
+ : kSecKeyAlgorithmECDSASignatureMessageX962SHA256);
+ }
+ break;
+ case(SEC_OID_ECDSA_WITH_SHA384):
+ if (digAlgTag == SEC_OID_SHA384) {
+ return ((isDigest) ? kSecKeyAlgorithmECDSASignatureDigestX962
+ : kSecKeyAlgorithmECDSASignatureMessageX962SHA384);
+ }
+ break;
+ case(SEC_OID_ECDSA_WITH_SHA512):
+ if (digAlgTag == SEC_OID_SHA512) {
+ return ((isDigest) ? kSecKeyAlgorithmECDSASignatureDigestX962
+ : kSecKeyAlgorithmECDSASignatureMessageX962SHA512);
+ }
+ break;
+ case(SEC_OID_EC_PUBLIC_KEY):
+ case(SEC_OID_SECP_256_R1):
+ case(SEC_OID_SECP_384_R1):
+ case(SEC_OID_SECP_521_R1):
+ switch (digAlgTag) {
+ case(SEC_OID_SHA1):
+ return ((isDigest) ? kSecKeyAlgorithmECDSASignatureDigestX962
+ : kSecKeyAlgorithmECDSASignatureMessageX962SHA1);
+ case(SEC_OID_SHA256):
+ return ((isDigest) ? kSecKeyAlgorithmECDSASignatureDigestX962
+ : kSecKeyAlgorithmECDSASignatureMessageX962SHA256);
+ case(SEC_OID_SHA384):
+ return ((isDigest) ? kSecKeyAlgorithmECDSASignatureDigestX962
+ : kSecKeyAlgorithmECDSASignatureMessageX962SHA384);
+ case(SEC_OID_SHA512):
+ return ((isDigest) ? kSecKeyAlgorithmECDSASignatureDigestX962
+ : kSecKeyAlgorithmECDSASignatureMessageX962SHA512);
+ default:
+ return NULL;
+ }
+ default:
+ return NULL;