diff options
Diffstat (limited to 'net/base/x509_certificate_openssl.cc')
-rw-r--r-- | net/base/x509_certificate_openssl.cc | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/net/base/x509_certificate_openssl.cc b/net/base/x509_certificate_openssl.cc index a0601a7..0c74bc5 100644 --- a/net/base/x509_certificate_openssl.cc +++ b/net/base/x509_certificate_openssl.cc @@ -325,6 +325,7 @@ void X509Certificate::FreeOSCertHandle(OSCertHandle cert_handle) { 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 @@ void X509Certificate::ResetCertStore() { 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 @@ SHA1Fingerprint X509Certificate::CalculateFingerprint(OSCertHandle cert) { 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) { |