@@ -153,7 +153,32 @@ func logSrv(k *ecdsa.PrivateKey) *testLogSrv {
153153 if r .URL .Path == "/ct/v1/add-pre-chain" {
154154 precert = true
155155 }
156- sct := CreateTestingSignedSCT (jsonReq .Chain , k , precert )
156+ sct := CreateTestingSignedSCT (jsonReq .Chain , k , precert , time .Now ())
157+ fmt .Fprint (w , string (sct ))
158+ atomic .AddInt64 (& testLog .submissions , 1 )
159+ })
160+
161+ testLog .Server = httptest .NewUnstartedServer (m )
162+ testLog .Server .Start ()
163+ return testLog
164+ }
165+
166+ // lyingLogSrv always signs SCTs with the timestamp it was given.
167+ func lyingLogSrv (k * ecdsa.PrivateKey , timestamp time.Time ) * testLogSrv {
168+ testLog := & testLogSrv {}
169+ m := http .NewServeMux ()
170+ m .HandleFunc ("/ct/" , func (w http.ResponseWriter , r * http.Request ) {
171+ decoder := json .NewDecoder (r .Body )
172+ var jsonReq ctSubmissionRequest
173+ err := decoder .Decode (& jsonReq )
174+ if err != nil {
175+ return
176+ }
177+ precert := false
178+ if r .URL .Path == "/ct/v1/add-pre-chain" {
179+ precert = true
180+ }
181+ sct := CreateTestingSignedSCT (jsonReq .Chain , k , precert , timestamp )
157182 fmt .Fprint (w , string (sct ))
158183 atomic .AddInt64 (& testLog .submissions , 1 )
159184 })
@@ -185,7 +210,7 @@ func retryableLogSrv(k *ecdsa.PrivateKey, retries int, after *int) *httptest.Ser
185210 if err != nil {
186211 return
187212 }
188- sct := CreateTestingSignedSCT (jsonReq .Chain , k , false )
213+ sct := CreateTestingSignedSCT (jsonReq .Chain , k , false , time . Now () )
189214 w .WriteHeader (http .StatusOK )
190215 fmt .Fprint (w , string (sct ))
191216 } else {
@@ -281,28 +306,88 @@ func TestBasicSuccessful(t *testing.T) {
281306
282307 // Precert
283308 trueBool := true
309+ issuerBundle , precert , err := makePrecert (k )
310+ test .AssertNotError (t , err , "Failed to create test leaf" )
311+ pub .issuerBundle = issuerBundle
312+ _ , err = pub .SubmitToSingleCTWithResult (ctx , & pubpb.Request {LogURL : & pub .ctLogs [0 ].uri , LogPublicKey : & pub .ctLogs [0 ].logID , Der : precert , Precert : & trueBool })
313+ test .AssertNotError (t , err , "Certificate submission failed" )
314+ test .AssertEquals (t , len (log .GetAllMatching ("Failed to.*" )), 0 )
315+ }
316+
317+ func makePrecert (k * ecdsa.PrivateKey ) ([]ct.ASN1Cert , []byte , error ) {
284318 rootTmpl := x509.Certificate {
285319 SerialNumber : big .NewInt (0 ),
286320 Subject : pkix.Name {CommonName : "root" },
287321 BasicConstraintsValid : true ,
288322 IsCA : true ,
289323 }
290324 rootBytes , err := x509 .CreateCertificate (rand .Reader , & rootTmpl , & rootTmpl , k .Public (), k )
291- test .AssertNotError (t , err , "Failed to create test root" )
292- pub .issuerBundle = []ct.ASN1Cert {ct.ASN1Cert {Data : rootBytes }}
325+ if err != nil {
326+ return nil , nil , err
327+ }
293328 root , err := x509 .ParseCertificate (rootBytes )
294- test .AssertNotError (t , err , "Failed to parse test root" )
329+ if err != nil {
330+ return nil , nil , err
331+ }
295332 precertTmpl := x509.Certificate {
296333 SerialNumber : big .NewInt (0 ),
297334 ExtraExtensions : []pkix.Extension {
298335 {Id : asn1.ObjectIdentifier {1 , 3 , 6 , 1 , 4 , 1 , 11129 , 2 , 4 , 3 }, Critical : true , Value : []byte {0x05 , 0x00 }},
299336 },
300337 }
301338 precert , err := x509 .CreateCertificate (rand .Reader , & precertTmpl , root , k .Public (), k )
339+ if err != nil {
340+ return nil , nil , err
341+ }
342+ return []ct.ASN1Cert {ct.ASN1Cert {Data : rootBytes }}, precert , err
343+ }
344+
345+ func TestTimestampVerificationFuture (t * testing.T ) {
346+ pub , _ , k := setup (t )
347+
348+ server := lyingLogSrv (k , time .Now ().Add (time .Hour ))
349+ defer server .Close ()
350+ port , err := getPort (server .URL )
351+ test .AssertNotError (t , err , "Failed to get test server port" )
352+ addLog (t , pub , port , & k .PublicKey )
353+
354+ // Precert
355+ trueBool := true
356+ issuerBundle , precert , err := makePrecert (k )
302357 test .AssertNotError (t , err , "Failed to create test leaf" )
358+ pub .issuerBundle = issuerBundle
359+
303360 _ , err = pub .SubmitToSingleCTWithResult (ctx , & pubpb.Request {LogURL : & pub .ctLogs [0 ].uri , LogPublicKey : & pub .ctLogs [0 ].logID , Der : precert , Precert : & trueBool })
304- test .AssertNotError (t , err , "Certificate submission failed" )
305- test .AssertEquals (t , len (log .GetAllMatching ("Failed to.*" )), 0 )
361+ if err == nil {
362+ t .Fatal ("Expected error for lying log server, got none" )
363+ }
364+ if ! strings .HasPrefix (err .Error (), "SCT Timestamp was too far in the future" ) {
365+ t .Fatalf ("Got wrong error: %s" , err )
366+ }
367+ }
368+
369+ func TestTimestampVerificationPast (t * testing.T ) {
370+ pub , _ , k := setup (t )
371+
372+ server := lyingLogSrv (k , time .Now ().Add (- time .Hour ))
373+ defer server .Close ()
374+ port , err := getPort (server .URL )
375+ test .AssertNotError (t , err , "Failed to get test server port" )
376+ addLog (t , pub , port , & k .PublicKey )
377+
378+ // Precert
379+ trueBool := true
380+ issuerBundle , precert , err := makePrecert (k )
381+ test .AssertNotError (t , err , "Failed to create test leaf" )
382+ pub .issuerBundle = issuerBundle
383+
384+ _ , err = pub .SubmitToSingleCTWithResult (ctx , & pubpb.Request {LogURL : & pub .ctLogs [0 ].uri , LogPublicKey : & pub .ctLogs [0 ].logID , Der : precert , Precert : & trueBool })
385+ if err == nil {
386+ t .Fatal ("Expected error for lying log server, got none" )
387+ }
388+ if ! strings .HasPrefix (err .Error (), "SCT Timestamp was too far in the past" ) {
389+ t .Fatalf ("Got wrong error: %s" , err )
390+ }
306391}
307392
308393func TestGoodRetry (t * testing.T ) {
0 commit comments