Index: net/base/x509_certificate_win.cc |
diff --git a/net/base/x509_certificate_win.cc b/net/base/x509_certificate_win.cc |
index a9d66063de864ac5d6bdc649192298ee85328cce..9d94ac9c37c7d4437108ec992d8beea88adbe6ea 100644 |
--- a/net/base/x509_certificate_win.cc |
+++ b/net/base/x509_certificate_win.cc |
@@ -9,6 +9,7 @@ |
#include "base/lazy_instance.h" |
#include "base/logging.h" |
#include "base/pickle.h" |
+#include "base/sha1.h" |
#include "base/string_tokenizer.h" |
#include "base/string_util.h" |
#include "base/utf_string_conversions.h" |
@@ -18,6 +19,7 @@ |
#include "net/base/net_errors.h" |
#include "net/base/scoped_cert_chain_context.h" |
#include "net/base/test_root_certs.h" |
+#include "net/base/x509_certificate_win_known_hashes.h" |
wtc
2011/04/07 05:01:54
Typo: hashes => roots
Nit: it may be better to na
agl
2011/04/07 15:02:49
Done.
|
#pragma comment(lib, "crypt32.lib") |
@@ -504,6 +506,21 @@ void X509Certificate::Initialize() { |
serial_number_ = serial_number_.substr(1, serial_number_.size() - 1); |
} |
+// IsIssuedByKnownRoot returns true if the given chain is rooted at a root CA |
+// which we recognise as a standard root. |
+bool X509Certificate::IsIssuedByKnownRoot(PCCERT_CHAIN_CONTEXT chain_context) { |
+ PCERT_SIMPLE_CHAIN first_chain = chain_context->rgpChain[0]; |
+ int num_elements = first_chain->cElement; |
+ if (num_elements < 1) |
+ return true; |
+ PCERT_CHAIN_ELEMENT* element = first_chain->rgpElement; |
+ PCCERT_CONTEXT cert = element[num_elements - 1]->pCertContext; |
+ |
+ SHA1Fingerprint hash = CalculateFingerprint(cert); |
+ return X509Certificate::IsSHA1HashInSortedArray( |
+ hash, &kKnownRootCertSHA1Hashes[0][0], sizeof(kKnownRootCertSHA1Hashes)); |
+} |
+ |
// static |
X509Certificate* X509Certificate::CreateFromPickle(const Pickle& pickle, |
void** pickle_iter) { |
@@ -782,6 +799,8 @@ int X509Certificate::Verify(const std::string& hostname, |
if (CertSubjectCommonNameHasNull(cert_handle_)) |
verify_result->cert_status |= CERT_STATUS_INVALID; |
+ verify_result->is_issued_by_known_root = IsIssuedByKnownRoot(chain_context); |
+ |
std::wstring wstr_hostname = ASCIIToWide(hostname); |
SSL_EXTRA_CERT_CHAIN_POLICY_PARA extra_policy_para; |