OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "net/cert/cert_verify_proc.h" | 5 #include "net/cert/cert_verify_proc.h" |
6 | 6 |
7 #include "base/metrics/histogram.h" | 7 #include "base/metrics/histogram.h" |
8 #include "base/sha1.h" | 8 #include "base/sha1.h" |
9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
10 #include "base/time/time.h" | |
10 #include "build/build_config.h" | 11 #include "build/build_config.h" |
11 #include "net/base/net_errors.h" | 12 #include "net/base/net_errors.h" |
12 #include "net/base/net_util.h" | 13 #include "net/base/net_util.h" |
13 #include "net/base/registry_controlled_domains/registry_controlled_domain.h" | 14 #include "net/base/registry_controlled_domains/registry_controlled_domain.h" |
14 #include "net/cert/cert_status_flags.h" | 15 #include "net/cert/cert_status_flags.h" |
15 #include "net/cert/cert_verifier.h" | 16 #include "net/cert/cert_verifier.h" |
16 #include "net/cert/cert_verify_result.h" | 17 #include "net/cert/cert_verify_result.h" |
17 #include "net/cert/crl_set.h" | 18 #include "net/cert/crl_set.h" |
18 #include "net/cert/x509_certificate.h" | 19 #include "net/cert/x509_certificate.h" |
19 #include "url/url_canon.h" | 20 #include "url/url_canon.h" |
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
265 // hosts. While the CA/Browser Forum Baseline Requirements (v1.1) permit | 266 // hosts. While the CA/Browser Forum Baseline Requirements (v1.1) permit |
266 // these to be issued until 1 November 2015, they represent a real risk for | 267 // these to be issued until 1 November 2015, they represent a real risk for |
267 // the deployment of gTLDs and are being phased out ahead of the hard | 268 // the deployment of gTLDs and are being phased out ahead of the hard |
268 // deadline. | 269 // deadline. |
269 if (verify_result->is_issued_by_known_root && IsHostnameNonUnique(hostname)) { | 270 if (verify_result->is_issued_by_known_root && IsHostnameNonUnique(hostname)) { |
270 verify_result->cert_status |= CERT_STATUS_NON_UNIQUE_NAME; | 271 verify_result->cert_status |= CERT_STATUS_NON_UNIQUE_NAME; |
271 // CERT_STATUS_NON_UNIQUE_NAME will eventually become a hard error. For | 272 // CERT_STATUS_NON_UNIQUE_NAME will eventually become a hard error. For |
272 // now treat it as a warning and do not map it to an error return value. | 273 // now treat it as a warning and do not map it to an error return value. |
273 } | 274 } |
274 | 275 |
276 // Flag certificates using too long validity periods. | |
277 if (HasTooLongValidity(*cert)) { | |
Ryan Sleevi
2014/10/27 22:07:39
Remind me why we aren't checking is_issued_by_know
palmer
2014/10/28 00:05:53
Done.
| |
278 verify_result->cert_status |= CERT_STATUS_TOO_LONG_VALIDITY; | |
279 if (rv == OK) | |
280 rv = MapCertStatusToNetError(verify_result->cert_status); | |
281 } | |
282 | |
275 return rv; | 283 return rv; |
276 } | 284 } |
277 | 285 |
278 // static | 286 // static |
279 bool CertVerifyProc::IsBlacklisted(X509Certificate* cert) { | 287 bool CertVerifyProc::IsBlacklisted(X509Certificate* cert) { |
280 static const unsigned kComodoSerialBytes = 16; | 288 static const unsigned kComodoSerialBytes = 16; |
281 static const uint8 kComodoSerials[][kComodoSerialBytes] = { | 289 static const uint8 kComodoSerials[][kComodoSerialBytes] = { |
282 // Not a real certificate. For testing only. | 290 // Not a real certificate. For testing only. |
283 {0x07,0x7a,0x59,0xbc,0xd5,0x34,0x59,0x60,0x1c,0xa6,0x90,0x72,0x67,0xa6,0xdd, 0x1c}, | 291 {0x07,0x7a,0x59,0xbc,0xd5,0x34,0x59,0x60,0x1c,0xa6,0x90,0x72,0x67,0xa6,0xdd, 0x1c}, |
284 | 292 |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
525 if (!CheckNameConstraints(dns_names, kLimits[i].tlds)) | 533 if (!CheckNameConstraints(dns_names, kLimits[i].tlds)) |
526 return true; | 534 return true; |
527 } | 535 } |
528 } | 536 } |
529 } | 537 } |
530 } | 538 } |
531 | 539 |
532 return false; | 540 return false; |
533 } | 541 } |
534 | 542 |
543 // static | |
544 bool CertVerifyProc::HasTooLongValidity(const X509Certificate& cert) { | |
545 base::Time::Exploded start; | |
546 base::Time::Exploded expiry; | |
547 cert.valid_start().UTCExplode(&start); | |
548 cert.valid_expiry().UTCExplode(&expiry); | |
Ryan Sleevi
2014/10/27 22:07:39
Note that both of these can fail for some certific
palmer
2014/10/28 00:05:53
Done for a first pass. My immediate goal is to re-
| |
549 int month_diff = | |
550 expiry.year * 12 + expiry.month - start.year * 12 - start.month; | |
551 // Add any remainder as a full month. | |
552 if (expiry.day_of_month > start.day_of_month) | |
553 ++month_diff; | |
554 | |
555 static const base::Time time_2015_04_01 = base::Time::FromInternalValue( | |
556 GG_INT64_C(1427871600)); | |
557 static const base::Time time_2012_07_01 = base::Time::FromInternalValue( | |
558 GG_INT64_C(1341126000)); | |
559 static const base::Time time_2019_07_01 = base::Time::FromInternalValue( | |
560 GG_INT64_C(1561964400)); | |
561 | |
562 if (cert.valid_start() >= time_2015_04_01) | |
563 return month_diff > 39; | |
564 if (cert.valid_start() >= time_2012_07_01) | |
565 return month_diff > 60; | |
566 return month_diff > 120 || cert.valid_expiry() > time_2019_07_01; | |
567 } | |
568 | |
535 } // namespace net | 569 } // namespace net |
OLD | NEW |