Index: net/cert/x509_certificate_mac.cc |
diff --git a/net/cert/x509_certificate_mac.cc b/net/cert/x509_certificate_mac.cc |
index ecdf137c40c240e8ef3818db6e2e8b3a685bbf6b..f8bfe12c71489915be70dd5babe7313198791862 100644 |
--- a/net/cert/x509_certificate_mac.cc |
+++ b/net/cert/x509_certificate_mac.cc |
@@ -531,4 +531,41 @@ void X509Certificate::GetPublicKeyInfo(OSCertHandle cert_handle, |
} |
} |
+// static |
+bool X509Certificate::IsSelfSigned(OSCertHandle cert_handle) { |
+ x509_util::CSSMCachedCertificate cached_cert; |
+ OSStatus status = cached_cert.Init(cert_handle); |
+ if (status != noErr) |
+ return false; |
+ |
+ x509_util::CSSMFieldValue subject; |
+ status = cached_cert.GetField(&CSSMOID_X509V1SubjectNameStd, &subject); |
+ if (status != CSSM_OK || !subject.field()) |
+ return false; |
+ |
+ x509_util::CSSMFieldValue issuer; |
+ status = cached_cert.GetField(&CSSMOID_X509V1IssuerNameStd, &issuer); |
+ if (status != CSSM_OK || !issuer.field()) |
+ return false; |
+ |
+ if (subject.field()->Length != issuer.field()->Length || |
+ memcmp(subject.field()->Data, issuer.field()->Data, |
+ issuer.field()->Length) != 0) { |
+ return false; |
+ } |
+ |
+ CSSM_CL_HANDLE cl_handle = CSSM_INVALID_HANDLE; |
+ status = SecCertificateGetCLHandle(cert_handle, &cl_handle); |
+ if (status) |
+ return false; |
+ CSSM_DATA cert_data; |
+ status = SecCertificateGetData(cert_handle, &cert_data); |
+ if (status) |
+ return false; |
+ |
+ if (CSSM_CL_CertVerify(cl_handle, 0, &cert_data, &cert_data, NULL, 0)) |
+ return false; |
+ return true; |
+} |
+ |
} // namespace net |