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