Chromium Code Reviews| Index: net/cert/cert_policy_enforcer.cc |
| diff --git a/net/cert/cert_policy_enforcer.cc b/net/cert/cert_policy_enforcer.cc |
| index 680c2c6d1d792cdf4ef9bf6d9177222cb240e3b5..68a9d1024e4a6e0675b4d19af5ebf3c90e95ec86 100644 |
| --- a/net/cert/cert_policy_enforcer.cc |
| +++ b/net/cert/cert_policy_enforcer.cc |
| @@ -43,20 +43,38 @@ bool IsBuildTimely() { |
| #endif |
| } |
| -uint32_t ApproximateMonthDifference(const base::Time& start, |
| - const base::Time& end) { |
| +struct MonthsDiff { |
| + MonthsDiff() : num_months(0), last_month_is_full(false) {} |
|
davidben
2015/03/25 19:10:11
Per https://chromium-cpp.appspot.com/, these can b
Ryan Sleevi
2015/03/25 19:16:07
That said, please just use two out variables; don'
Eran Messeri
2015/03/26 10:47:17
Done - as Ryan suggested.
|
| + size_t num_months; |
| + bool last_month_is_full; |
|
davidben
2015/03/25 19:10:11
last_month_is_full to me reads like you're roundin
Eran Messeri
2015/03/26 10:47:17
Renamed to has_partial_month as suggested.
|
| +}; |
| + |
| +/* |
|
davidben
2015/03/25 19:10:11
Use // C++-style comments rather than /* C-style *
Eran Messeri
2015/03/26 10:47:17
Done.
|
| + * Returns a rounded-down months difference of |start| and |end|, |
| + * together with an indication of whether the last month was |
| + * a full month, because the range starts specified in the policy |
| + * are not consistent in terms of including the range start value. |
| + */ |
| +MonthsDiff RoundedDownMonthDifference(const base::Time& start, |
| + const base::Time& end) { |
| base::Time::Exploded exploded_start; |
| base::Time::Exploded exploded_expiry; |
| start.UTCExplode(&exploded_start); |
| end.UTCExplode(&exploded_expiry); |
| + if (end < start) |
| + return MonthsDiff(); |
|
davidben
2015/03/25 19:10:11
Not that it matters, but I think this actually wan
Eran Messeri
2015/03/26 10:47:17
Done.
|
| + |
| + MonthsDiff ret; |
| + ret.last_month_is_full = false; |
| uint32_t month_diff = (exploded_expiry.year - exploded_start.year) * 12 + |
| (exploded_expiry.month - exploded_start.month); |
| + if (exploded_expiry.day_of_month < exploded_start.day_of_month) |
| + --month_diff; |
| + else if (exploded_expiry.day_of_month == exploded_start.day_of_month) |
| + ret.last_month_is_full = true; |
|
davidben
2015/03/25 19:10:11
It occurs to me this also doesn't account for hour
Eran Messeri
2015/03/26 10:47:17
No benefit to being that tedious, it'd be extra co
|
| - // Add any remainder as a full month. |
| - if (exploded_expiry.day_of_month > exploded_start.day_of_month) |
| - ++month_diff; |
| - |
| - return month_diff; |
| + ret.num_months = month_diff; |
| + return ret; |
| } |
| bool HasRequiredNumberOfSCTs(const X509Certificate& cert, |
| @@ -81,18 +99,20 @@ bool HasRequiredNumberOfSCTs(const X509Certificate& cert, |
| return false; |
| } |
| - uint32_t expiry_in_months_approx = |
| - ApproximateMonthDifference(cert.valid_start(), cert.valid_expiry()); |
| + MonthsDiff exp = |
|
davidben
2015/03/25 19:10:11
exp -> lifetime? I first read that as exponentiati
Eran Messeri
2015/03/26 10:47:17
Done - rename to lifetime. You're right, it's not
|
| + RoundedDownMonthDifference(cert.valid_start(), cert.valid_expiry()); |
| // For embedded SCTs, if the certificate has the number of SCTs specified in |
| // table 1 of the "Qualifying Certificate" section of the CT/EV policy, then |
| // it qualifies. |
| size_t num_required_embedded_scts; |
| - if (expiry_in_months_approx > 39) { |
| + if ((exp.num_months > 39) || |
| + (exp.num_months == 39 && !exp.last_month_is_full)) { |
| num_required_embedded_scts = 5; |
| - } else if (expiry_in_months_approx > 27) { |
| + } else if ((exp.num_months > 27) || |
| + (exp.num_months == 27 && !exp.last_month_is_full)) { |
| num_required_embedded_scts = 4; |
| - } else if (expiry_in_months_approx >= 15) { |
| + } else if (exp.num_months >= 15) { |
| num_required_embedded_scts = 3; |
| } else { |
| num_required_embedded_scts = 2; |