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

Side by Side Diff: components/cast_certificate/cast_crl.cc

Issue 2832703002: Allow the TrustStore interface to return matching intermediates, and identify distrusted certs. (Closed)
Patch Set: fix cert_verify_tool Created 3 years, 7 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
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/cast_certificate/cast_crl.h" 5 #include "components/cast_certificate/cast_crl.h"
6 6
7 #include <unordered_map> 7 #include <unordered_map>
8 #include <unordered_set> 8 #include <unordered_set>
9 9
10 #include "base/base64.h" 10 #include "base/base64.h"
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 friend struct base::DefaultSingletonTraits<CastCRLTrustStore>; 63 friend struct base::DefaultSingletonTraits<CastCRLTrustStore>;
64 64
65 CastCRLTrustStore() { 65 CastCRLTrustStore() {
66 // Initialize the trust store with the root certificate. 66 // Initialize the trust store with the root certificate.
67 net::CertErrors errors; 67 net::CertErrors errors;
68 scoped_refptr<net::ParsedCertificate> cert = 68 scoped_refptr<net::ParsedCertificate> cert =
69 net::ParsedCertificate::CreateWithoutCopyingUnsafe( 69 net::ParsedCertificate::CreateWithoutCopyingUnsafe(
70 kCastCRLRootCaDer, sizeof(kCastCRLRootCaDer), {}, &errors); 70 kCastCRLRootCaDer, sizeof(kCastCRLRootCaDer), {}, &errors);
71 CHECK(cert) << errors.ToDebugString(); 71 CHECK(cert) << errors.ToDebugString();
72 // Enforce pathlen constraints and policies defined on the root certificate. 72 // Enforce pathlen constraints and policies defined on the root certificate.
73 scoped_refptr<net::TrustAnchor> anchor = 73 store_.AddTrustAnchorWithConstraints(std::move(cert));
74 net::TrustAnchor::CreateFromCertificateWithConstraints(std::move(cert));
75 CHECK(anchor);
76 store_.AddTrustAnchor(std::move(anchor));
77 } 74 }
78 75
79 net::TrustStoreInMemory store_; 76 net::TrustStoreInMemory store_;
80 DISALLOW_COPY_AND_ASSIGN(CastCRLTrustStore); 77 DISALLOW_COPY_AND_ASSIGN(CastCRLTrustStore);
81 }; 78 };
82 79
83 // Converts a uint64_t unix timestamp to net::der::GeneralizedTime. 80 // Converts a uint64_t unix timestamp to net::der::GeneralizedTime.
84 bool ConvertTimeSeconds(uint64_t seconds, 81 bool ConvertTimeSeconds(uint64_t seconds,
85 net::der::GeneralizedTime* generalized_time) { 82 net::der::GeneralizedTime* generalized_time) {
86 base::Time unix_timestamp = 83 base::Time unix_timestamp =
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
254 251
255 CastCRLImpl::~CastCRLImpl() {} 252 CastCRLImpl::~CastCRLImpl() {}
256 253
257 // Verifies the revocation status of the certificate chain, at the specified 254 // Verifies the revocation status of the certificate chain, at the specified
258 // time. 255 // time.
259 bool CastCRLImpl::CheckRevocation(const net::CertPath& trusted_chain, 256 bool CastCRLImpl::CheckRevocation(const net::CertPath& trusted_chain,
260 const base::Time& time) const { 257 const base::Time& time) const {
261 if (trusted_chain.IsEmpty()) 258 if (trusted_chain.IsEmpty())
262 return false; 259 return false;
263 260
264 DCHECK(trusted_chain.trust_anchor); 261 DCHECK(trusted_chain.last_cert_trust.IsTrustAnchor());
265 262
266 // Check the validity of the CRL at the specified time. 263 // Check the validity of the CRL at the specified time.
267 net::der::GeneralizedTime verification_time; 264 net::der::GeneralizedTime verification_time;
268 if (!net::der::EncodeTimeAsGeneralizedTime(time, &verification_time)) { 265 if (!net::der::EncodeTimeAsGeneralizedTime(time, &verification_time)) {
269 VLOG(2) << "CRL verification time malformed."; 266 VLOG(2) << "CRL verification time malformed.";
270 return false; 267 return false;
271 } 268 }
272 if ((verification_time < not_before_) || (verification_time > not_after_)) { 269 if ((verification_time < not_before_) || (verification_time > not_after_)) {
273 VLOG(2) << "CRL not time-valid. Perform hard fail."; 270 VLOG(2) << "CRL not time-valid. Perform hard fail.";
274 return false; 271 return false;
275 } 272 }
276 273
277 // Check revocation. Note that this loop has "+ 1" in order to also loop 274 // Check revocation. This loop iterates over both certificates AND then the
278 // over the trust anchor (which is treated specially). 275 // trust anchor after exhausting the certs.
279 for (size_t i = 0; i < trusted_chain.certs.size() + 1; ++i) { 276 for (size_t i = 0; i < trusted_chain.certs.size(); ++i) {
280 // This loop iterates over both certificates AND then the trust 277 const net::der::Input& spki_tlv = trusted_chain.certs[i]->tbs().spki_tlv;
281 // anchor after exhausing the certs.
282 net::der::Input spki_tlv;
283 if (i == trusted_chain.certs.size()) {
284 spki_tlv = trusted_chain.trust_anchor->spki();
285 } else {
286 spki_tlv = trusted_chain.certs[i]->tbs().spki_tlv;
287 }
288 278
289 // Calculate the public key's hash to check for revocation. 279 // Calculate the public key's hash to check for revocation.
290 std::string spki_hash = crypto::SHA256HashString(spki_tlv.AsString()); 280 std::string spki_hash = crypto::SHA256HashString(spki_tlv.AsString());
291 if (revoked_hashes_.find(spki_hash) != revoked_hashes_.end()) { 281 if (revoked_hashes_.find(spki_hash) != revoked_hashes_.end()) {
292 VLOG(2) << "Public key is revoked."; 282 VLOG(2) << "Public key is revoked.";
293 return false; 283 return false;
294 } 284 }
295 285
296 // Check if the subordinate certificate was revoked by serial number. 286 // Check if the subordinate certificate was revoked by serial number.
297 if (i > 0) { 287 if (i > 0) {
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
352 LOG(ERROR) << "CRL - Verification failed."; 342 LOG(ERROR) << "CRL - Verification failed.";
353 return nullptr; 343 return nullptr;
354 } 344 }
355 return base::MakeUnique<CastCRLImpl>(tbs_crl, overall_not_after); 345 return base::MakeUnique<CastCRLImpl>(tbs_crl, overall_not_after);
356 } 346 }
357 LOG(ERROR) << "No supported version of revocation data."; 347 LOG(ERROR) << "No supported version of revocation data.";
358 return nullptr; 348 return nullptr;
359 } 349 }
360 350
361 } // namespace cast_certificate 351 } // namespace cast_certificate
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698