| Index: net/base/x509_certificate_openssl.cc
|
| ===================================================================
|
| --- net/base/x509_certificate_openssl.cc (revision 107789)
|
| +++ net/base/x509_certificate_openssl.cc (working copy)
|
| @@ -325,6 +325,7 @@
|
| void X509Certificate::Initialize() {
|
| crypto::EnsureOpenSSLInit();
|
| fingerprint_ = CalculateFingerprint(cert_handle_);
|
| + chain_fingerprint_ = CalculateChainFingerprint();
|
|
|
| ASN1_INTEGER* num = X509_get_serialNumber(cert_handle_);
|
| if (num) {
|
| @@ -347,6 +348,7 @@
|
| X509InitSingleton::GetInstance()->ResetCertStore();
|
| }
|
|
|
| +// static
|
| SHA1Fingerprint X509Certificate::CalculateFingerprint(OSCertHandle cert) {
|
| SHA1Fingerprint sha1;
|
| unsigned int sha1_size = static_cast<unsigned int>(sizeof(sha1.data));
|
| @@ -356,6 +358,26 @@
|
| return sha1;
|
| }
|
|
|
| +SHA1Fingerprint X509Certificate::CalculateChainFingerprint() const {
|
| + SHA1Fingerprint sha1;
|
| + memset(sha1.data, 0, sizeof(sha1.data));
|
| +
|
| + SHA_CTX sha1_ctx;
|
| + SHA1_Init(&sha1_ctx);
|
| + DERCache der_cache;
|
| + if (!GetDERAndCacheIfNeeded(cert_handle_, &der_cache))
|
| + return sha1;
|
| + SHA1_Update(&sha1_ctx, der_cache.data, der_cache.data_length);
|
| + for (size_t i = 0; i < intermediate_ca_certs_.size(); ++i) {
|
| + if (!GetDERAndCacheIfNeeded(intermediate_ca_certs_[i], &der_cache))
|
| + return sha1;
|
| + SHA1_Update(&sha1_ctx, der_cache.data, der_cache.data_length);
|
| + }
|
| + SHA1_Final(sha1.data, &sha1_ctx);
|
| +
|
| + return sha1;
|
| +}
|
| +
|
| // static
|
| X509Certificate::OSCertHandle X509Certificate::CreateOSCertHandleFromBytes(
|
| const char* data, int length) {
|
|
|