Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(103)

Side by Side Diff: chrome/browser/chromeos/net/cert_verify_proc_chromeos.cc

Issue 137553004: NSS Cros multiprofile: trust roots added by a profile shouldn't apply to other profiles. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: ios fix Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/chromeos/net/cert_verify_proc_chromeos.h"
6
7 #include "net/cert/test_root_certs.h"
8 #include "net/cert/x509_certificate.h"
9
10 // NSS doesn't currently define CERT_LIST_TAIL.
11 // See https://bugzilla.mozilla.org/show_bug.cgi?id=962413
12 // Can be removed once chrome requires NSS version 3.16 to build.
13 #ifndef CERT_LIST_TAIL
14 #define CERT_LIST_TAIL(l) ((CERTCertListNode *)PR_LIST_TAIL(&l->list))
15 #endif
16
17 namespace chromeos {
18
19 namespace {
20
21 struct ChainVerifyArgs {
22 CertVerifyProcChromeOS* cert_verify_proc;
23 const net::CertificateList& additional_trust_anchors;
24 };
25
26 } // namespace
27
28 CertVerifyProcChromeOS::CertVerifyProcChromeOS() {}
29
30 CertVerifyProcChromeOS::CertVerifyProcChromeOS(
31 crypto::ScopedPK11Slot public_slot) {
32 profile_filter_.Init(public_slot.Pass(), crypto::ScopedPK11Slot());
33 }
34
35 CertVerifyProcChromeOS::~CertVerifyProcChromeOS() {}
36
37 int CertVerifyProcChromeOS::VerifyInternal(
38 net::X509Certificate* cert,
39 const std::string& hostname,
40 int flags,
41 net::CRLSet* crl_set,
42 const net::CertificateList& additional_trust_anchors,
43 net::CertVerifyResult* verify_result) {
44 ChainVerifyArgs chain_verify_args = {this, additional_trust_anchors};
45
46 CERTChainVerifyCallback chain_verify_callback;
47 chain_verify_callback.isChainValid =
48 &CertVerifyProcChromeOS::IsChainValidFunc;
49 chain_verify_callback.isChainValidArg =
50 static_cast<void*>(&chain_verify_args);
51
52 return VerifyInternalImpl(cert,
53 hostname,
54 flags,
55 crl_set,
56 additional_trust_anchors,
57 &chain_verify_callback,
58 verify_result);
59 }
60
61 // static
62 SECStatus CertVerifyProcChromeOS::IsChainValidFunc(
63 void* is_chain_valid_arg,
64 const CERTCertList* current_chain,
65 PRBool* chain_ok) {
66 ChainVerifyArgs* args = static_cast<ChainVerifyArgs*>(is_chain_valid_arg);
67 CERTCertificate* cert = CERT_LIST_TAIL(current_chain)->cert;
68
69 if (net::TestRootCerts::HasInstance()) {
70 if (net::TestRootCerts::GetInstance()->Contains(cert)) {
71 // Certs in the TestRootCerts are not stored in any slot, and thus would
72 // not be allowed by the profile_filter. This should only be hit in tests.
73 DVLOG(3) << cert->subjectName << " is a TestRootCert";
74 *chain_ok = PR_TRUE;
75 return SECSuccess;
76 }
77 }
78
79 for (net::CertificateList::const_iterator i =
80 args->additional_trust_anchors.begin();
81 i != args->additional_trust_anchors.end();
82 ++i) {
83 if (net::X509Certificate::IsSameOSCert(cert, (*i)->os_cert_handle())) {
84 // Certs in the additional_trust_anchors should always be allowed, even if
85 // they aren't stored in a slot that would be allowed by the
86 // profile_filter.
87 DVLOG(3) << cert->subjectName << " is an additional_trust_anchor";
88 *chain_ok = PR_TRUE;
89 return SECSuccess;
90 }
91 }
92
93 // TODO(mattm): If crbug.com/334384 is fixed to allow setting trust
94 // properly when the same cert is in multiple slots, this would also need
95 // updating to check the per-slot trust values.
96 *chain_ok = args->cert_verify_proc->profile_filter_.IsCertAllowed(cert)
97 ? PR_TRUE
98 : PR_FALSE;
99 DVLOG(3) << cert->subjectName << " is " << (*chain_ok ? "ok" : "not ok");
100 return SECSuccess;
101 }
102
103 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698