|  | // Copyright 2019 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "revocation_util.h" | 
|  |  | 
|  | #include "encode_values.h" | 
|  | #include "parse_values.h" | 
|  |  | 
|  | namespace bssl { | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | constexpr int64_t kMinValidTime = -62167219200;  // 0000-01-01 00:00:00 UTC | 
|  | constexpr int64_t kMaxValidTime = 253402300799;  // 9999-12-31 23:59:59 UTC | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | bool CheckRevocationDateValid(const der::GeneralizedTime &this_update, | 
|  | const der::GeneralizedTime *next_update, | 
|  | int64_t verify_time_epoch_seconds, | 
|  | std::optional<int64_t> max_age_seconds) { | 
|  | if (verify_time_epoch_seconds > kMaxValidTime || | 
|  | verify_time_epoch_seconds < kMinValidTime || | 
|  | (max_age_seconds.has_value() && | 
|  | (max_age_seconds.value() > kMaxValidTime || | 
|  | max_age_seconds.value() < 0))) { | 
|  | return false; | 
|  | } | 
|  | der::GeneralizedTime verify_time; | 
|  | if (!der::EncodePosixTimeAsGeneralizedTime(verify_time_epoch_seconds, | 
|  | &verify_time)) { | 
|  | return false; | 
|  | } | 
|  |  | 
|  | if (this_update > verify_time) { | 
|  | return false;  // Response is not yet valid. | 
|  | } | 
|  |  | 
|  | if (next_update && (*next_update <= verify_time)) { | 
|  | return false;  // Response is no longer valid. | 
|  | } | 
|  |  | 
|  | if (max_age_seconds.has_value()) { | 
|  | der::GeneralizedTime earliest_this_update; | 
|  | if (!der::EncodePosixTimeAsGeneralizedTime( | 
|  | verify_time_epoch_seconds - max_age_seconds.value(), | 
|  | &earliest_this_update)) { | 
|  | return false; | 
|  | } | 
|  | if (this_update < earliest_this_update) { | 
|  | return false;  // Response is too old. | 
|  | } | 
|  | } | 
|  |  | 
|  | return true; | 
|  | } | 
|  |  | 
|  | }  // namespace bssl |