| Index: net/base/x509_certificate_nss.cc
|
| ===================================================================
|
| --- net/base/x509_certificate_nss.cc (revision 107789)
|
| +++ net/base/x509_certificate_nss.cc (working copy)
|
| @@ -677,6 +677,7 @@
|
| ParseDate(&cert_handle_->validity.notAfter, &valid_expiry_);
|
|
|
| fingerprint_ = CalculateFingerprint(cert_handle_);
|
| + chain_fingerprint_ = CalculateChainFingerprint();
|
|
|
| serial_number_ = std::string(
|
| reinterpret_cast<char*>(cert_handle_->serialNumber.data),
|
| @@ -1005,6 +1006,26 @@
|
| return sha1;
|
| }
|
|
|
| +SHA1Fingerprint X509Certificate::CalculateChainFingerprint() const {
|
| + SHA1Fingerprint sha1;
|
| + memset(sha1.data, 0, sizeof(sha1.data));
|
| +
|
| + HASHContext* sha1_ctx = HASH_Create(HASH_AlgSHA1);
|
| + if (!sha1_ctx)
|
| + return sha1;
|
| + HASH_Begin(sha1_ctx);
|
| + HASH_Update(sha1_ctx, cert_handle_->derCert.data, cert_handle_->derCert.len);
|
| + for (size_t i = 0; i < intermediate_ca_certs_.size(); ++i) {
|
| + CERTCertificate* ca_cert = intermediate_ca_certs_[i];
|
| + HASH_Update(sha1_ctx, ca_cert->derCert.data, ca_cert->derCert.len);
|
| + }
|
| + unsigned int result_len;
|
| + HASH_End(sha1_ctx, sha1.data, &result_len, HASH_ResultLenContext(sha1_ctx));
|
| + HASH_Destroy(sha1_ctx);
|
| +
|
| + return sha1;
|
| +}
|
| +
|
| // static
|
| X509Certificate::OSCertHandle
|
| X509Certificate::ReadOSCertHandleFromPickle(const Pickle& pickle,
|
|
|