Index: net/base/x509_certificate_mac.cc |
=================================================================== |
--- net/base/x509_certificate_mac.cc (revision 107789) |
+++ net/base/x509_certificate_mac.cc (working copy) |
@@ -540,6 +540,7 @@ |
&valid_expiry_); |
fingerprint_ = CalculateFingerprint(cert_handle_); |
+ chain_fingerprint_ = CalculateChainFingerprint(); |
serial_number_ = GetCertSerialNumber(cert_handle_); |
} |
@@ -1069,6 +1070,30 @@ |
return sha1; |
} |
+SHA1Fingerprint X509Certificate::CalculateChainFingerprint() const { |
+ SHA1Fingerprint sha1; |
+ memset(sha1.data, 0, sizeof(sha1.data)); |
+ |
+ // The CC_SHA(3cc) man page says all CC_SHA1_xxx routines return 1, so |
Ryan Sleevi
2011/10/28 22:47:01
TODO - I think we should look to abstract out the
|
+ // we don't check their return values. |
+ CC_SHA1_CTX sha1_ctx; |
+ CC_SHA1_Init(&sha1_ctx); |
+ CSSM_DATA cert_data; |
+ OSStatus status = SecCertificateGetData(cert_handle_, &cert_data); |
+ if (status) |
+ return sha1; |
+ CC_SHA1_Update(&sha1_ctx, cert_data.Data, cert_data.Length); |
+ for (size_t i = 0; i < intermediate_ca_certs_.size(); ++i) { |
+ status = SecCertificateGetData(intermediate_ca_certs_[i], &cert_data); |
+ if (status) |
+ return sha1; |
+ CC_SHA1_Update(&sha1_ctx, cert_data.Data, cert_data.Length); |
+ } |
+ CC_SHA1_Final(sha1.data, &sha1_ctx); |
+ |
+ return sha1; |
+} |
+ |
bool X509Certificate::SupportsSSLClientAuth() const { |
CSSMFields fields; |
if (GetCertFields(cert_handle_, &fields) != noErr) |