1*6777b538SAndroid Build Coastguard Worker // Copyright 2023 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "net/cert/time_conversions.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
8*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
9*6777b538SAndroid Build Coastguard Worker #include "third_party/boringssl/src/pki/parse_values.h"
10*6777b538SAndroid Build Coastguard Worker
11*6777b538SAndroid Build Coastguard Worker namespace net::test {
12*6777b538SAndroid Build Coastguard Worker
TEST(TimeConversionsTest,EncodeTimeAsGeneralizedTime)13*6777b538SAndroid Build Coastguard Worker TEST(TimeConversionsTest, EncodeTimeAsGeneralizedTime) {
14*6777b538SAndroid Build Coastguard Worker // Fri, 24 Jun 2016 17:04:54 GMT
15*6777b538SAndroid Build Coastguard Worker base::Time time = base::Time::UnixEpoch() + base::Seconds(1466787894);
16*6777b538SAndroid Build Coastguard Worker bssl::der::GeneralizedTime generalized_time;
17*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(EncodeTimeAsGeneralizedTime(time, &generalized_time));
18*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2016, generalized_time.year);
19*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(6, generalized_time.month);
20*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(24, generalized_time.day);
21*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(17, generalized_time.hours);
22*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(4, generalized_time.minutes);
23*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(54, generalized_time.seconds);
24*6777b538SAndroid Build Coastguard Worker
25*6777b538SAndroid Build Coastguard Worker time = base::Time::UnixEpoch() + base::Seconds(253402300799);
26*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(EncodeTimeAsGeneralizedTime(time, &generalized_time));
27*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(9999, generalized_time.year);
28*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(12, generalized_time.month);
29*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(31, generalized_time.day);
30*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(23, generalized_time.hours);
31*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(59, generalized_time.minutes);
32*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(59, generalized_time.seconds);
33*6777b538SAndroid Build Coastguard Worker
34*6777b538SAndroid Build Coastguard Worker time = base::Time::UnixEpoch() + base::Seconds(-62167219200);
35*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(EncodeTimeAsGeneralizedTime(time, &generalized_time));
36*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, generalized_time.year);
37*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, generalized_time.month);
38*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, generalized_time.day);
39*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, generalized_time.hours);
40*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, generalized_time.minutes);
41*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, generalized_time.seconds);
42*6777b538SAndroid Build Coastguard Worker
43*6777b538SAndroid Build Coastguard Worker time = base::Time::UnixEpoch() + base::Seconds(253402300800);
44*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(EncodeTimeAsGeneralizedTime(time, &generalized_time));
45*6777b538SAndroid Build Coastguard Worker
46*6777b538SAndroid Build Coastguard Worker time = base::Time::UnixEpoch() + base::Seconds(-62167219201);
47*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(EncodeTimeAsGeneralizedTime(time, &generalized_time));
48*6777b538SAndroid Build Coastguard Worker
49*6777b538SAndroid Build Coastguard Worker time = base::Time::Max();
50*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(EncodeTimeAsGeneralizedTime(time, &generalized_time));
51*6777b538SAndroid Build Coastguard Worker
52*6777b538SAndroid Build Coastguard Worker time = base::Time::Min();
53*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(EncodeTimeAsGeneralizedTime(time, &generalized_time));
54*6777b538SAndroid Build Coastguard Worker }
55*6777b538SAndroid Build Coastguard Worker
TEST(TimeConversionsTest,GeneralizedTimeToTime)56*6777b538SAndroid Build Coastguard Worker TEST(TimeConversionsTest, GeneralizedTimeToTime) {
57*6777b538SAndroid Build Coastguard Worker bssl::der::GeneralizedTime generalized_time;
58*6777b538SAndroid Build Coastguard Worker generalized_time.year = 2016;
59*6777b538SAndroid Build Coastguard Worker generalized_time.month = 6;
60*6777b538SAndroid Build Coastguard Worker generalized_time.day = 24;
61*6777b538SAndroid Build Coastguard Worker generalized_time.hours = 17;
62*6777b538SAndroid Build Coastguard Worker generalized_time.minutes = 4;
63*6777b538SAndroid Build Coastguard Worker generalized_time.seconds = 54;
64*6777b538SAndroid Build Coastguard Worker base::Time time;
65*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(GeneralizedTimeToTime(generalized_time, &time));
66*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(base::Time::UnixEpoch() + base::Seconds(1466787894), time);
67*6777b538SAndroid Build Coastguard Worker
68*6777b538SAndroid Build Coastguard Worker // Invalid and out of range values should be rejected
69*6777b538SAndroid Build Coastguard Worker generalized_time.day = 0;
70*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(GeneralizedTimeToTime(generalized_time, &time));
71*6777b538SAndroid Build Coastguard Worker generalized_time.day = 24;
72*6777b538SAndroid Build Coastguard Worker generalized_time.year = 10000;
73*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(GeneralizedTimeToTime(generalized_time, &time));
74*6777b538SAndroid Build Coastguard Worker generalized_time.year = -1;
75*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(GeneralizedTimeToTime(generalized_time, &time));
76*6777b538SAndroid Build Coastguard Worker }
77*6777b538SAndroid Build Coastguard Worker
78*6777b538SAndroid Build Coastguard Worker // A time from before the Windows epoch should work.
TEST(TimeConversionsTest,TimeBeforeWindowsEpoch)79*6777b538SAndroid Build Coastguard Worker TEST(TimeConversionsTest, TimeBeforeWindowsEpoch) {
80*6777b538SAndroid Build Coastguard Worker bssl::der::GeneralizedTime generalized_time;
81*6777b538SAndroid Build Coastguard Worker generalized_time.year = 1570;
82*6777b538SAndroid Build Coastguard Worker generalized_time.month = 1;
83*6777b538SAndroid Build Coastguard Worker generalized_time.day = 1;
84*6777b538SAndroid Build Coastguard Worker generalized_time.hours = 0;
85*6777b538SAndroid Build Coastguard Worker generalized_time.minutes = 0;
86*6777b538SAndroid Build Coastguard Worker generalized_time.seconds = 0;
87*6777b538SAndroid Build Coastguard Worker
88*6777b538SAndroid Build Coastguard Worker base::Time time;
89*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(GeneralizedTimeToTime(generalized_time, &time));
90*6777b538SAndroid Build Coastguard Worker
91*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(EncodeTimeAsGeneralizedTime(time, &generalized_time));
92*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1570, generalized_time.year);
93*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, generalized_time.month);
94*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, generalized_time.day);
95*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, generalized_time.hours);
96*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, generalized_time.minutes);
97*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, generalized_time.seconds);
98*6777b538SAndroid Build Coastguard Worker }
99*6777b538SAndroid Build Coastguard Worker
100*6777b538SAndroid Build Coastguard Worker // A time in seconds larger than a 32 bit signed integer should work.
TEST(TimeConversionsTest,TimeAfter32BitPosixMaxYear)101*6777b538SAndroid Build Coastguard Worker TEST(TimeConversionsTest, TimeAfter32BitPosixMaxYear) {
102*6777b538SAndroid Build Coastguard Worker bssl::der::GeneralizedTime generalized_time;
103*6777b538SAndroid Build Coastguard Worker generalized_time.year = 2039;
104*6777b538SAndroid Build Coastguard Worker generalized_time.month = 1;
105*6777b538SAndroid Build Coastguard Worker generalized_time.day = 1;
106*6777b538SAndroid Build Coastguard Worker generalized_time.hours = 0;
107*6777b538SAndroid Build Coastguard Worker generalized_time.minutes = 0;
108*6777b538SAndroid Build Coastguard Worker generalized_time.seconds = 0;
109*6777b538SAndroid Build Coastguard Worker
110*6777b538SAndroid Build Coastguard Worker base::Time time;
111*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(GeneralizedTimeToTime(generalized_time, &time));
112*6777b538SAndroid Build Coastguard Worker
113*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(EncodeTimeAsGeneralizedTime(time, &generalized_time));
114*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2039, generalized_time.year);
115*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, generalized_time.month);
116*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, generalized_time.day);
117*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, generalized_time.hours);
118*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, generalized_time.minutes);
119*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, generalized_time.seconds);
120*6777b538SAndroid Build Coastguard Worker }
121*6777b538SAndroid Build Coastguard Worker
122*6777b538SAndroid Build Coastguard Worker } // namespace net::test
123