Index: net/cert/x509_certificate_mac.cc |
diff --git a/net/cert/x509_certificate_mac.cc b/net/cert/x509_certificate_mac.cc |
index 8e6ecf9fb42a026f72c2a1813fa71ed851930f52..6283d3658d2dc0e8261d34771cac4b73f4d2bc07 100644 |
--- a/net/cert/x509_certificate_mac.cc |
+++ b/net/cert/x509_certificate_mac.cc |
@@ -518,6 +518,43 @@ void X509Certificate::GetPublicKeyInfo(OSCertHandle cert_handle, |
} |
} |
+X509Certificate::SignatureHashAlgorithm |
+X509Certificate::GetSignatureHashAlgorithm(OSCertHandle cert_handle) { |
+ x509_util::CSSMCachedCertificate cached_cert; |
+ OSStatus status = cached_cert.Init(cert_handle); |
+ if (status) |
+ return kSignatureHashAlgorithmOther; |
+ |
+ x509_util::CSSMFieldValue signature_field; |
+ status = |
+ cached_cert.GetField(&CSSMOID_X509V1SignatureAlgorithm, &signature_field); |
+ if (status || !signature_field.field()) |
+ return kSignatureHashAlgorithmOther; |
+ |
+ const CSSM_X509_ALGORITHM_IDENTIFIER* sig_algorithm = |
+ signature_field.GetAs<CSSM_X509_ALGORITHM_IDENTIFIER>(); |
+ if (!sig_algorithm) |
+ return kSignatureHashAlgorithmOther; |
+ |
+ const CSSM_OID* alg_oid = &sig_algorithm->algorithm; |
+ if (CSSMOIDEqual(alg_oid, &CSSMOID_MD2WithRSA)) |
+ return kSignatureHashAlgorithmMd2; |
+ if (CSSMOIDEqual(alg_oid, &CSSMOID_MD4WithRSA)) |
+ return kSignatureHashAlgorithmMd4; |
+ if (CSSMOIDEqual(alg_oid, &CSSMOID_MD5WithRSA)) |
+ return kSignatureHashAlgorithmMd5; |
+ if (CSSMOIDEqual(alg_oid, &CSSMOID_SHA1WithRSA) || |
+ CSSMOIDEqual(alg_oid, &CSSMOID_SHA1WithRSA_OIW) || |
+ CSSMOIDEqual(alg_oid, &CSSMOID_SHA1WithDSA) || |
+ CSSMOIDEqual(alg_oid, &CSSMOID_SHA1WithDSA_CMS) || |
+ CSSMOIDEqual(alg_oid, &CSSMOID_SHA1WithDSA_JDK) || |
+ CSSMOIDEqual(alg_oid, &CSSMOID_ECDSA_WithSHA1)) { |
+ return kSignatureHashAlgorithmSha1; |
+ } |
+ |
+ return kSignatureHashAlgorithmOther; |
+} |
+ |
// static |
bool X509Certificate::IsSelfSigned(OSCertHandle cert_handle) { |
x509_util::CSSMCachedCertificate cached_cert; |