Skip to content

Commit a0ebdfe

Browse files
authored
Merge pull request #261 from alexsaezm/go1.19-fips-release
[Backport] fix Config.Time in tests using expired certificates
2 parents 9a07e37 + b23bac9 commit a0ebdfe

File tree

1 file changed

+200
-0
lines changed

1 file changed

+200
-0
lines changed
Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
From cf2e74a83536cc11d5ce2ac87935141cb1b4fd6d Mon Sep 17 00:00:00 2001
2+
From: =?UTF-8?q?Alejandro=20S=C3=A1ez?= <[email protected]>
3+
Date: Wed, 29 Jan 2025 13:15:56 +0100
4+
Subject: [PATCH] [Backport] fix Config.Time in tests using expired
5+
certificates
6+
7+
Issue link: golang/go#71077
8+
Upstream patch: https://go-review.googlesource.com/c/go/+/639655
9+
---
10+
src/crypto/tls/handshake_client_test.go | 27 +++++++++++++++----------
11+
src/crypto/tls/handshake_server_test.go | 1 +
12+
src/crypto/tls/handshake_test.go | 2 ++
13+
src/crypto/tls/tls_test.go | 4 +---
14+
4 files changed, 20 insertions(+), 14 deletions(-)
15+
16+
diff --git a/src/crypto/tls/handshake_client_test.go b/src/crypto/tls/handshake_client_test.go
17+
index beb20ad14a..7a7c434b85 100644
18+
--- a/src/crypto/tls/handshake_client_test.go
19+
+++ b/src/crypto/tls/handshake_client_test.go
20+
@@ -881,6 +881,7 @@ func testResumption(t *testing.T, version uint16) {
21+
MaxVersion: version,
22+
CipherSuites: []uint16{TLS_RSA_WITH_RC4_128_SHA, TLS_ECDHE_RSA_WITH_RC4_128_SHA},
23+
Certificates: testConfig.Certificates,
24+
+ Time: testTime,
25+
}
26+
27+
issuer, err := x509.ParseCertificate(testRSACertificateIssuer)
28+
@@ -897,6 +898,7 @@ func testResumption(t *testing.T, version uint16) {
29+
ClientSessionCache: NewLRUClientSessionCache(32),
30+
RootCAs: rootCAs,
31+
ServerName: "example.golang",
32+
+ Time: testTime,
33+
}
34+
35+
testResumeState := func(test string, didResume bool) {
36+
@@ -944,20 +946,20 @@ func testResumption(t *testing.T, version uint16) {
37+
}
38+
39+
// An old session ticket can resume, but the server will provide a ticket encrypted with a fresh key.
40+
- serverConfig.Time = func() time.Time { return time.Now().Add(24*time.Hour + time.Minute) }
41+
+ serverConfig.Time = func() time.Time { return testTime().Add(24*time.Hour + time.Minute) }
42+
testResumeState("ResumeWithOldTicket", true)
43+
if bytes.Equal(ticket[:ticketKeyNameLen], getTicket()[:ticketKeyNameLen]) {
44+
t.Fatal("old first ticket matches the fresh one")
45+
}
46+
47+
// Now the session tickey key is expired, so a full handshake should occur.
48+
- serverConfig.Time = func() time.Time { return time.Now().Add(24*8*time.Hour + time.Minute) }
49+
+ serverConfig.Time = func() time.Time { return testTime().Add(24*8*time.Hour + time.Minute) }
50+
testResumeState("ResumeWithExpiredTicket", false)
51+
if bytes.Equal(ticket, getTicket()) {
52+
t.Fatal("expired first ticket matches the fresh one")
53+
}
54+
55+
- serverConfig.Time = func() time.Time { return time.Now() } // reset the time back
56+
+ serverConfig.Time = testTime // reset the time back
57+
key1 := randomKey()
58+
serverConfig.SetSessionTicketKeys([][32]byte{key1})
59+
60+
@@ -974,11 +976,11 @@ func testResumption(t *testing.T, version uint16) {
61+
testResumeState("KeyChangeFinish", true)
62+
63+
// Age the session ticket a bit, but not yet expired.
64+
- serverConfig.Time = func() time.Time { return time.Now().Add(24*time.Hour + time.Minute) }
65+
+ serverConfig.Time = func() time.Time { return testTime().Add(24*time.Hour + time.Minute) }
66+
testResumeState("OldSessionTicket", true)
67+
ticket = getTicket()
68+
// Expire the session ticket, which would force a full handshake.
69+
- serverConfig.Time = func() time.Time { return time.Now().Add(24*8*time.Hour + time.Minute) }
70+
+ serverConfig.Time = func() time.Time { return testTime().Add(24*8*time.Hour + time.Minute) }
71+
testResumeState("ExpiredSessionTicket", false)
72+
if bytes.Equal(ticket, getTicket()) {
73+
t.Fatal("new ticket wasn't provided after old ticket expired")
74+
@@ -988,15 +990,14 @@ func testResumption(t *testing.T, version uint16) {
75+
d := 0 * time.Hour
76+
for i := 0; i < 13; i++ {
77+
d += 12 * time.Hour
78+
- serverConfig.Time = func() time.Time { return time.Now().Add(d) }
79+
+ serverConfig.Time = func() time.Time { return testTime().Add(d) }
80+
testResumeState("OldSessionTicket", true)
81+
}
82+
// Expire it (now a little more than 7 days) and make sure a full
83+
// handshake occurs for TLS 1.2. Resumption should still occur for
84+
// TLS 1.3 since the client should be using a fresh ticket sent over
85+
// by the server.
86+
- d += 12 * time.Hour
87+
- serverConfig.Time = func() time.Time { return time.Now().Add(d) }
88+
+ d += 12*time.Hour + time.Minute
89+
if version == VersionTLS13 {
90+
testResumeState("ExpiredSessionTicket", true)
91+
} else {
92+
@@ -1012,6 +1013,7 @@ func testResumption(t *testing.T, version uint16) {
93+
MaxVersion: version,
94+
CipherSuites: []uint16{TLS_RSA_WITH_RC4_128_SHA, TLS_ECDHE_RSA_WITH_RC4_128_SHA},
95+
Certificates: testConfig.Certificates,
96+
+ Time: testTime,
97+
}
98+
serverConfig.SetSessionTicketKeys([][32]byte{key2})
99+
100+
@@ -1721,6 +1723,7 @@ func testVerifyConnection(t *testing.T, version uint16) {
101+
Certificates: []Certificate{testConfig.Certificates[0]},
102+
ClientCAs: rootCAs,
103+
NextProtos: []string{"protocol1"},
104+
+ Time: testTime,
105+
}
106+
serverConfig.Certificates[0].SignedCertificateTimestamps = [][]byte{[]byte("dummy sct 1"), []byte("dummy sct 2")}
107+
serverConfig.Certificates[0].OCSPStaple = []byte("dummy ocsp")
108+
@@ -1733,6 +1736,7 @@ func testVerifyConnection(t *testing.T, version uint16) {
109+
ServerName: "example.golang",
110+
Certificates: []Certificate{testConfig.Certificates[0]},
111+
NextProtos: []string{"protocol1"},
112+
+ Time: testTime,
113+
}
114+
test.configureClient(clientConfig, &clientCalled)
115+
116+
@@ -2021,7 +2025,7 @@ func testVerifyPeerCertificate(t *testing.T, version uint16) {
117+
config.ServerName = "example.golang"
118+
config.ClientAuth = RequireAndVerifyClientCert
119+
config.ClientCAs = rootCAs
120+
- config.Time = now
121+
+ config.Time = testTime
122+
config.MaxVersion = version
123+
config.Certificates = make([]Certificate, 1)
124+
config.Certificates[0].Certificate = [][]byte{testRSACertificate}
125+
@@ -2156,7 +2160,7 @@ func testBuffering(t *testing.T, version uint16) {
126+
}
127+
128+
func TestAlertFlushing(t *testing.T) {
129+
- t.Skip("unsupported in FIPS mode, different error returned")
130+
+ t.Skip("unsupported in FIPS mode, different error returned")
131+
c, s := localPipe(t)
132+
done := make(chan bool)
133+
134+
@@ -2352,7 +2356,7 @@ func testGetClientCertificate(t *testing.T, version uint16) {
135+
serverConfig.RootCAs = x509.NewCertPool()
136+
serverConfig.RootCAs.AddCert(issuer)
137+
serverConfig.ClientCAs = serverConfig.RootCAs
138+
- serverConfig.Time = func() time.Time { return time.Unix(1476984729, 0) }
139+
+ serverConfig.Time = testTime,
140+
serverConfig.MaxVersion = version
141+
142+
clientConfig := testConfig.Clone()
143+
@@ -2523,6 +2527,7 @@ func testResumptionKeepsOCSPAndSCT(t *testing.T, ver uint16) {
144+
ClientSessionCache: NewLRUClientSessionCache(32),
145+
ServerName: "example.golang",
146+
RootCAs: roots,
147+
+ Time: testTime,
148+
}
149+
serverConfig := testConfig.Clone()
150+
serverConfig.MaxVersion = ver
151+
diff --git a/src/crypto/tls/handshake_server_test.go b/src/crypto/tls/handshake_server_test.go
152+
index b2e81077be..de49e7b97b 100644
153+
--- a/src/crypto/tls/handshake_server_test.go
154+
+++ b/src/crypto/tls/handshake_server_test.go
155+
@@ -488,6 +488,7 @@ func testCrossVersionResume(t *testing.T, version uint16) {
156+
ClientSessionCache: NewLRUClientSessionCache(1),
157+
ServerName: "servername",
158+
MinVersion: VersionTLS10,
159+
+ Time: testTime,
160+
}
161+
162+
// Establish a session at TLS 1.1.
163+
diff --git a/src/crypto/tls/handshake_test.go b/src/crypto/tls/handshake_test.go
164+
index bacc8b7d4f..0848a2de67 100644
165+
--- a/src/crypto/tls/handshake_test.go
166+
+++ b/src/crypto/tls/handshake_test.go
167+
@@ -429,6 +429,8 @@ func fromHex(s string) []byte {
168+
return b
169+
}
170+
171+
+var testTime = func() time.Time { return time.Unix(1476984729, 0) }
172+
+
173+
var testRSACertificate = fromHex("3082024b308201b4a003020102020900e8f09d3fe25beaa6300d06092a864886f70d01010b0500301f310b3009060355040a1302476f3110300e06035504031307476f20526f6f74301e170d3136303130313030303030305a170d3235303130313030303030305a301a310b3009060355040a1302476f310b300906035504031302476f30819f300d06092a864886f70d010101050003818d0030818902818100db467d932e12270648bc062821ab7ec4b6a25dfe1e5245887a3647a5080d92425bc281c0be97799840fb4f6d14fd2b138bc2a52e67d8d4099ed62238b74a0b74732bc234f1d193e596d9747bf3589f6c613cc0b041d4d92b2b2423775b1c3bbd755dce2054cfa163871d1e24c4f31d1a508baab61443ed97a77562f414c852d70203010001a38193308190300e0603551d0f0101ff0404030205a0301d0603551d250416301406082b0601050507030106082b06010505070302300c0603551d130101ff0402300030190603551d0e041204109f91161f43433e49a6de6db680d79f60301b0603551d230414301280104813494d137e1631bba301d5acab6e7b30190603551d1104123010820e6578616d706c652e676f6c616e67300d06092a864886f70d01010b0500038181009d30cc402b5b50a061cbbae55358e1ed8328a9581aa938a495a1ac315a1a84663d43d32dd90bf297dfd320643892243a00bccf9c7db74020015faad3166109a276fd13c3cce10c5ceeb18782f16c04ed73bbb343778d0c1cf10fa1d8408361c94c722b9daedb4606064df4c1b33ec0d1bd42d4dbfe3d1360845c21d33be9fae7")
174+
175+
var testRSACertificateIssuer = fromHex("3082021930820182a003020102020900ca5e4e811a965964300d06092a864886f70d01010b0500301f310b3009060355040a1302476f3110300e06035504031307476f20526f6f74301e170d3136303130313030303030305a170d3235303130313030303030305a301f310b3009060355040a1302476f3110300e06035504031307476f20526f6f7430819f300d06092a864886f70d010101050003818d0030818902818100d667b378bb22f34143b6cd2008236abefaf2852adf3ab05e01329e2c14834f5105df3f3073f99dab5442d45ee5f8f57b0111c8cb682fbb719a86944eebfffef3406206d898b8c1b1887797c9c5006547bb8f00e694b7a063f10839f269f2c34fff7a1f4b21fbcd6bfdfb13ac792d1d11f277b5c5b48600992203059f2a8f8cc50203010001a35d305b300e0603551d0f0101ff040403020204301d0603551d250416301406082b0601050507030106082b06010505070302300f0603551d130101ff040530030101ff30190603551d0e041204104813494d137e1631bba301d5acab6e7b300d06092a864886f70d01010b050003818100c1154b4bab5266221f293766ae4138899bd4c5e36b13cee670ceeaa4cbdf4f6679017e2fe649765af545749fe4249418a56bd38a04b81e261f5ce86b8d5c65413156a50d12449554748c59a30c515bc36a59d38bddf51173e899820b282e40aa78c806526fd184fb6b4cf186ec728edffa585440d2b3225325f7ab580e87dd76")
176+
diff --git a/src/crypto/tls/tls_test.go b/src/crypto/tls/tls_test.go
177+
index d8a43add17..5fa6e90069 100644
178+
--- a/src/crypto/tls/tls_test.go
179+
+++ b/src/crypto/tls/tls_test.go
180+
@@ -1058,8 +1058,6 @@ func TestConnectionState(t *testing.T) {
181+
rootCAs := x509.NewCertPool()
182+
rootCAs.AddCert(issuer)
183+
184+
- now := func() time.Time { return time.Unix(1476984729, 0) }
185+
-
186+
const alpnProtocol = "golang"
187+
const serverName = "example.golang"
188+
var scts = [][]byte{[]byte("dummy sct 1"), []byte("dummy sct 2")}
189+
@@ -1075,7 +1073,7 @@ func TestConnectionState(t *testing.T) {
190+
}
191+
t.Run(name, func(t *testing.T) {
192+
config := &Config{
193+
- Time: now,
194+
+ Time: testTime,
195+
Rand: zeroSource{},
196+
Certificates: make([]Certificate, 1),
197+
MaxVersion: v,
198+
--
199+
2.47.1
200+

0 commit comments

Comments
 (0)