@@ -200,121 +200,138 @@ func TestOCSPRequest(t *testing.T) {
200
200
}
201
201
202
202
func TestOCSPResponse (t * testing.T ) {
203
- leafCert , _ := hex .DecodeString (leafCertHex )
204
- leaf , err := x509 .ParseCertificate (leafCert )
205
- if err != nil {
206
- t .Fatal (err )
207
- }
208
-
209
- issuerCert , _ := hex .DecodeString (issuerCertHex )
210
- issuer , err := x509 .ParseCertificate (issuerCert )
211
- if err != nil {
212
- t .Fatal (err )
213
- }
214
-
215
- responderCert , _ := hex .DecodeString (responderCertHex )
216
- responder , err := x509 .ParseCertificate (responderCert )
217
- if err != nil {
218
- t .Fatal (err )
219
- }
220
-
221
- responderPrivateKeyDER , _ := hex .DecodeString (responderPrivateKeyHex )
222
- responderPrivateKey , err := x509 .ParsePKCS1PrivateKey (responderPrivateKeyDER )
223
- if err != nil {
224
- t .Fatal (err )
225
- }
226
-
227
- extensionBytes , _ := hex .DecodeString (ocspExtensionValueHex )
228
- extensions := []pkix.Extension {
229
- {
230
- Id : ocspExtensionOID ,
231
- Critical : false ,
232
- Value : extensionBytes ,
233
- },
234
- }
235
-
236
- thisUpdate := time .Date (2010 , 7 , 7 , 15 , 1 , 5 , 0 , time .UTC )
237
- nextUpdate := time .Date (2010 , 7 , 7 , 18 , 35 , 17 , 0 , time .UTC )
238
- template := Response {
239
- Status : Revoked ,
240
- SerialNumber : leaf .SerialNumber ,
241
- ThisUpdate : thisUpdate ,
242
- NextUpdate : nextUpdate ,
243
- RevokedAt : thisUpdate ,
244
- RevocationReason : KeyCompromise ,
245
- Certificate : responder ,
246
- ExtraExtensions : extensions ,
247
- }
248
-
249
- template .IssuerHash = crypto .MD5
250
- _ , err = CreateResponse (issuer , responder , template , responderPrivateKey )
251
- if err == nil {
252
- t .Fatal ("CreateResponse didn't fail with non-valid template.IssuerHash value crypto.MD5" )
253
- }
254
-
255
203
testCases := []struct {
256
- name string
257
- issuerHash crypto.Hash
204
+ name string
205
+ responderCertHex string
206
+ responderPrivateKeyHex string
258
207
}{
259
- {"Zero value" , 0 },
260
- {"crypto.SHA1" , crypto .SHA1 },
261
- {"crypto.SHA256" , crypto .SHA256 },
262
- {"crypto.SHA384" , crypto .SHA384 },
263
- {"crypto.SHA512" , crypto .SHA512 },
208
+ {"RSA" , rsaResponderCertHex , rsaResponderPrivateKeyHex },
209
+ {"ECDSA" , ecdsaResponderCertHex , ecdsaResponderPrivateKeyHex },
210
+ {"Ed25519" , ed25519ResponderCertHex , ed25519ResponderPrivateKeyHex },
264
211
}
265
212
for _ , tc := range testCases {
266
213
t .Run (tc .name , func (t * testing.T ) {
267
- template . IssuerHash = tc . issuerHash
268
- responseBytes , err := CreateResponse ( issuer , responder , template , responderPrivateKey )
214
+ leafCert , _ := hex . DecodeString ( leafCertHex )
215
+ leaf , err := x509 . ParseCertificate ( leafCert )
269
216
if err != nil {
270
- t .Fatalf ( "CreateResponse failed: %s" , err )
217
+ t .Fatal ( err )
271
218
}
272
219
273
- resp , err := ParseResponse (responseBytes , nil )
220
+ issuerCert , _ := hex .DecodeString (issuerCertHex )
221
+ issuer , err := x509 .ParseCertificate (issuerCert )
274
222
if err != nil {
275
- t .Fatalf ("ParseResponse failed: %s" , err )
276
- }
277
-
278
- if ! reflect .DeepEqual (resp .ThisUpdate , template .ThisUpdate ) {
279
- t .Errorf ("resp.ThisUpdate: got %v, want %v" , resp .ThisUpdate , template .ThisUpdate )
280
- }
281
-
282
- if ! reflect .DeepEqual (resp .NextUpdate , template .NextUpdate ) {
283
- t .Errorf ("resp.NextUpdate: got %v, want %v" , resp .NextUpdate , template .NextUpdate )
223
+ t .Fatal (err )
284
224
}
285
225
286
- if ! reflect .DeepEqual (resp .RevokedAt , template .RevokedAt ) {
287
- t .Errorf ("resp.RevokedAt: got %v, want %v" , resp .RevokedAt , template .RevokedAt )
226
+ responderCert , _ := hex .DecodeString (tc .responderCertHex )
227
+ responder , err := x509 .ParseCertificate (responderCert )
228
+ if err != nil {
229
+ t .Fatal (err )
288
230
}
289
231
290
- if ! reflect .DeepEqual (resp .Extensions , template .ExtraExtensions ) {
291
- t .Errorf ("resp.Extensions: got %v, want %v" , resp .Extensions , template .ExtraExtensions )
232
+ responderPrivateKeyDER , _ := hex .DecodeString (tc .responderPrivateKeyHex )
233
+ _responderPrivateKey , err := x509 .ParsePKCS8PrivateKey (responderPrivateKeyDER )
234
+ if err != nil {
235
+ t .Fatal (err )
292
236
}
293
-
294
- delay := time .Since (resp .ProducedAt )
295
- if delay < - time .Hour || delay > time .Hour {
296
- t .Errorf ("resp.ProducedAt: got %s, want close to current time (%s)" , resp .ProducedAt , time .Now ())
237
+ responderPrivateKey , ok := _responderPrivateKey .(crypto.Signer )
238
+ if ! ok {
239
+ t .Fatal ("responderPrivateKey is not a crypto.Signer" )
297
240
}
298
241
299
- if resp .Status != template .Status {
300
- t .Errorf ("resp.Status: got %d, want %d" , resp .Status , template .Status )
242
+ extensionBytes , _ := hex .DecodeString (ocspExtensionValueHex )
243
+ extensions := []pkix.Extension {
244
+ {
245
+ Id : ocspExtensionOID ,
246
+ Critical : false ,
247
+ Value : extensionBytes ,
248
+ },
301
249
}
302
250
303
- if resp .SerialNumber .Cmp (template .SerialNumber ) != 0 {
304
- t .Errorf ("resp.SerialNumber: got %x, want %x" , resp .SerialNumber , template .SerialNumber )
251
+ thisUpdate := time .Date (2010 , 7 , 7 , 15 , 1 , 5 , 0 , time .UTC )
252
+ nextUpdate := time .Date (2010 , 7 , 7 , 18 , 35 , 17 , 0 , time .UTC )
253
+ template := Response {
254
+ Status : Revoked ,
255
+ SerialNumber : leaf .SerialNumber ,
256
+ ThisUpdate : thisUpdate ,
257
+ NextUpdate : nextUpdate ,
258
+ RevokedAt : thisUpdate ,
259
+ RevocationReason : KeyCompromise ,
260
+ Certificate : responder ,
261
+ ExtraExtensions : extensions ,
305
262
}
306
263
307
- if resp .RevocationReason != template .RevocationReason {
308
- t .Errorf ("resp.RevocationReason: got %d, want %d" , resp .RevocationReason , template .RevocationReason )
264
+ template .IssuerHash = crypto .MD5
265
+ _ , err = CreateResponse (issuer , responder , template , responderPrivateKey )
266
+ if err == nil {
267
+ t .Fatal ("CreateResponse didn't fail with non-valid template.IssuerHash value crypto.MD5" )
309
268
}
310
269
311
- expectedHash := tc .issuerHash
312
- if tc .issuerHash == 0 {
313
- expectedHash = crypto .SHA1
270
+ hashTestCases := []struct {
271
+ name string
272
+ issuerHash crypto.Hash
273
+ }{
274
+ {"Zero value" , 0 },
275
+ {"crypto.SHA1" , crypto .SHA1 },
276
+ {"crypto.SHA256" , crypto .SHA256 },
277
+ {"crypto.SHA384" , crypto .SHA384 },
278
+ {"crypto.SHA512" , crypto .SHA512 },
314
279
}
315
-
316
- if resp .IssuerHash != expectedHash {
317
- t .Errorf ("resp.IssuerHash: got %d, want %d" , resp .IssuerHash , expectedHash )
280
+ for _ , htc := range hashTestCases {
281
+ t .Run (htc .name , func (t * testing.T ) {
282
+ template .IssuerHash = htc .issuerHash
283
+ responseBytes , err := CreateResponse (issuer , responder , template , responderPrivateKey )
284
+ if err != nil {
285
+ t .Fatalf ("CreateResponse failed: %s" , err )
286
+ }
287
+
288
+ resp , err := ParseResponse (responseBytes , nil )
289
+ if err != nil {
290
+ t .Fatalf ("ParseResponse failed: %s" , err )
291
+ }
292
+
293
+ if ! reflect .DeepEqual (resp .ThisUpdate , template .ThisUpdate ) {
294
+ t .Errorf ("resp.ThisUpdate: got %v, want %v" , resp .ThisUpdate , template .ThisUpdate )
295
+ }
296
+
297
+ if ! reflect .DeepEqual (resp .NextUpdate , template .NextUpdate ) {
298
+ t .Errorf ("resp.NextUpdate: got %v, want %v" , resp .NextUpdate , template .NextUpdate )
299
+ }
300
+
301
+ if ! reflect .DeepEqual (resp .RevokedAt , template .RevokedAt ) {
302
+ t .Errorf ("resp.RevokedAt: got %v, want %v" , resp .RevokedAt , template .RevokedAt )
303
+ }
304
+
305
+ if ! reflect .DeepEqual (resp .Extensions , template .ExtraExtensions ) {
306
+ t .Errorf ("resp.Extensions: got %v, want %v" , resp .Extensions , template .ExtraExtensions )
307
+ }
308
+
309
+ delay := time .Since (resp .ProducedAt )
310
+ if delay < - time .Hour || delay > time .Hour {
311
+ t .Errorf ("resp.ProducedAt: got %s, want close to current time (%s)" , resp .ProducedAt , time .Now ())
312
+ }
313
+
314
+ if resp .Status != template .Status {
315
+ t .Errorf ("resp.Status: got %d, want %d" , resp .Status , template .Status )
316
+ }
317
+
318
+ if resp .SerialNumber .Cmp (template .SerialNumber ) != 0 {
319
+ t .Errorf ("resp.SerialNumber: got %x, want %x" , resp .SerialNumber , template .SerialNumber )
320
+ }
321
+
322
+ if resp .RevocationReason != template .RevocationReason {
323
+ t .Errorf ("resp.RevocationReason: got %d, want %d" , resp .RevocationReason , template .RevocationReason )
324
+ }
325
+
326
+ expectedHash := htc .issuerHash
327
+ if htc .issuerHash == 0 {
328
+ expectedHash = crypto .SHA1
329
+ }
330
+
331
+ if resp .IssuerHash != expectedHash {
332
+ t .Errorf ("resp.IssuerHash: got %d, want %d" , resp .IssuerHash , expectedHash )
333
+ }
334
+ })
318
335
}
319
336
})
320
337
}
@@ -683,42 +700,42 @@ const issuerCertHex = "30820383308202eca003020102021046fcebbab4d02f0f926098233f9
683
700
// Key and certificate for the OCSP responder were not taken from the Thawte
684
701
// responder, since CreateResponse requires that we have the private key.
685
702
// Instead, they were generated randomly.
686
- const responderPrivateKeyHex = "308204a40201000282010100e8155f2d3e6f2e8d14c62a788bd462f9f844e7a6977c83ef " +
687
- "1099f0f6616ec5265b56f356e62c5400f0b06a2e7945a82752c636df32a895152d6074df " +
688
- "1701dc6ccfbcbec75a70bd2b55ae2be7e6cad3b5fd4cd5b7790ab401a436d3f5f346074f " +
689
- "fde8a99d5b723350f0a112076614b12ef79c78991b119453445acf2416ab0046b540db14 " +
690
- "c9fc0f27b8989ad0f63aa4b8aefc91aa8a72160c36307c60fec78a93d3fddf4259902aa7 " +
691
- "7e7332971c7d285b6a04f648993c6922a3e9da9adf5f81508c3228791843e5d49f24db2f " +
692
- "1290bafd97e655b1049a199f652cd603c4fafa330c390b0da78fbbc67e8fa021cbd74eb9 " +
693
- "6222b12ace31a77dcf920334dc94581b02030100010282010100bcf0b93d7238bda329a8 " +
694
- "72e7149f61bcb37c154330ccb3f42a85c9002c2e2bdea039d77d8581cd19bed94078794e " +
695
- "56293d601547fc4bf6a2f9002fe5772b92b21b254403b403585e3130cc99ccf08f0ef81a " +
696
- "575b38f597ba4660448b54f44bfbb97072b5a2bf043bfeca828cf7741d13698e3f38162b " +
697
- "679faa646b82abd9a72c5c7d722c5fc577a76d2c2daac588accad18516d1bbad10b0dfa2 " +
698
- "05cfe246b59e28608a43942e1b71b0c80498075121de5b900d727c31c42c78cf1db5c0aa " +
699
- "5b491e10ea4ed5c0962aaf2ae025dd81fa4ce490d9d6b4a4465411d8e542fc88617e5695 " +
700
- "1aa4fc8ea166f2b4d0eb89ef17f2b206bd5f1014bf8fe0e71fe62f2cccf102818100f2dc " +
701
- "ddf878d553286daad68bac4070a82ffec3dc4666a2750f47879eec913f91836f1d976b60 " +
702
- "daf9356e078446dafab5bd2e489e5d64f8572ba24a4ba4f3729b5e106c4dd831cc2497a7 " +
703
- "e6c7507df05cb64aeb1bbc81c1e340d58b5964cf39cff84ea30c29ec5d3f005ee1362698 " +
704
- "07395037955955655292c3e85f6187fa1f9502818100f4a33c102630840705f8c778a47b " +
705
- "87e8da31e68809af981ac5e5999cf1551685d761cdf0d6520361b99aebd5777a940fa64d " +
706
- "327c09fa63746fbb3247ec73a86edf115f1fe5c83598db803881ade71c33c6e956118345 " +
707
- "497b98b5e07bb5be75971465ec78f2f9467e1b74956ca9d4c7c3e314e742a72d8b33889c " +
708
- "6c093a466cef0281801d3df0d02124766dd0be98349b19eb36a508c4e679e793ba0a8bef " +
709
- "4d786888c1e9947078b1ea28938716677b4ad8c5052af12eb73ac194915264a913709a0b " +
710
- "7b9f98d4a18edd781a13d49899f91c20dbd8eb2e61d991ba19b5cdc08893f5cb9d39e5a6 " +
711
- "0629ea16d426244673b1b3ee72bd30e41fac8395acac40077403de5efd028180050731dd " +
712
- "d71b1a2b96c8d538ba90bb6b62c8b1c74c03aae9a9f59d21a7a82b0d572ef06fa9c807bf " +
713
- "c373d6b30d809c7871df96510c577421d9860c7383fda0919ece19996b3ca13562159193 " +
714
- "c0c246471e287f975e8e57034e5136aaf44254e2650def3d51292474c515b1588969112e " +
715
- "0a85cc77073e9d64d2c2fc497844284b02818100d71d63eabf416cf677401ebf965f8314 " +
716
- "120b568a57dd3bd9116c629c40dc0c6948bab3a13cc544c31c7da40e76132ef5dd3f7534 " +
717
- "45a635930c74326ae3df0edd1bfb1523e3aa259873ac7cf1ac31151ec8f37b528c275622 " +
718
- "48f99b8bed59fd4da2576aa6ee20d93a684900bf907e80c66d6e2261ae15e55284b4ed9d " +
719
- "6bdaa059 "
720
-
721
- const responderCertHex = "308202e2308201caa003020102020101300d06092a864886f70d01010b05003019311730" +
703
+ const rsaResponderPrivateKeyHex = "308204be020100300d06092a864886f70d0101010500048204a8308204a4020100028201 " +
704
+ "0100e8155f2d3e6f2e8d14c62a788bd462f9f844e7a6977c83ef1099f0f6616ec5265b56 " +
705
+ "f356e62c5400f0b06a2e7945a82752c636df32a895152d6074df1701dc6ccfbcbec75a70 " +
706
+ "bd2b55ae2be7e6cad3b5fd4cd5b7790ab401a436d3f5f346074ffde8a99d5b723350f0a1 " +
707
+ "12076614b12ef79c78991b119453445acf2416ab0046b540db14c9fc0f27b8989ad0f63a " +
708
+ "a4b8aefc91aa8a72160c36307c60fec78a93d3fddf4259902aa77e7332971c7d285b6a04 " +
709
+ "f648993c6922a3e9da9adf5f81508c3228791843e5d49f24db2f1290bafd97e655b1049a " +
710
+ "199f652cd603c4fafa330c390b0da78fbbc67e8fa021cbd74eb96222b12ace31a77dcf92 " +
711
+ "0334dc94581b02030100010282010100bcf0b93d7238bda329a872e7149f61bcb37c1543 " +
712
+ "30ccb3f42a85c9002c2e2bdea039d77d8581cd19bed94078794e56293d601547fc4bf6a2 " +
713
+ "f9002fe5772b92b21b254403b403585e3130cc99ccf08f0ef81a575b38f597ba4660448b " +
714
+ "54f44bfbb97072b5a2bf043bfeca828cf7741d13698e3f38162b679faa646b82abd9a72c " +
715
+ "5c7d722c5fc577a76d2c2daac588accad18516d1bbad10b0dfa205cfe246b59e28608a43 " +
716
+ "942e1b71b0c80498075121de5b900d727c31c42c78cf1db5c0aa5b491e10ea4ed5c0962a " +
717
+ "af2ae025dd81fa4ce490d9d6b4a4465411d8e542fc88617e56951aa4fc8ea166f2b4d0eb " +
718
+ "89ef17f2b206bd5f1014bf8fe0e71fe62f2cccf102818100f2dcddf878d553286daad68b " +
719
+ "ac4070a82ffec3dc4666a2750f47879eec913f91836f1d976b60daf9356e078446dafab5 " +
720
+ "bd2e489e5d64f8572ba24a4ba4f3729b5e106c4dd831cc2497a7e6c7507df05cb64aeb1b " +
721
+ "bc81c1e340d58b5964cf39cff84ea30c29ec5d3f005ee136269807395037955955655292 " +
722
+ "c3e85f6187fa1f9502818100f4a33c102630840705f8c778a47b87e8da31e68809af981a " +
723
+ "c5e5999cf1551685d761cdf0d6520361b99aebd5777a940fa64d327c09fa63746fbb3247 " +
724
+ "ec73a86edf115f1fe5c83598db803881ade71c33c6e956118345497b98b5e07bb5be7597 " +
725
+ "1465ec78f2f9467e1b74956ca9d4c7c3e314e742a72d8b33889c6c093a466cef0281801d " +
726
+ "3df0d02124766dd0be98349b19eb36a508c4e679e793ba0a8bef4d786888c1e9947078b1 " +
727
+ "ea28938716677b4ad8c5052af12eb73ac194915264a913709a0b7b9f98d4a18edd781a13 " +
728
+ "d49899f91c20dbd8eb2e61d991ba19b5cdc08893f5cb9d39e5a60629ea16d426244673b1 " +
729
+ "b3ee72bd30e41fac8395acac40077403de5efd028180050731ddd71b1a2b96c8d538ba90 " +
730
+ "bb6b62c8b1c74c03aae9a9f59d21a7a82b0d572ef06fa9c807bfc373d6b30d809c7871df " +
731
+ "96510c577421d9860c7383fda0919ece19996b3ca13562159193c0c246471e287f975e8e " +
732
+ "57034e5136aaf44254e2650def3d51292474c515b1588969112e0a85cc77073e9d64d2c2 " +
733
+ "fc497844284b02818100d71d63eabf416cf677401ebf965f8314120b568a57dd3bd9116c " +
734
+ "629c40dc0c6948bab3a13cc544c31c7da40e76132ef5dd3f753445a635930c74326ae3df " +
735
+ "0edd1bfb1523e3aa259873ac7cf1ac31151ec8f37b528c27562248f99b8bed59fd4da257 " +
736
+ "6aa6ee20d93a684900bf907e80c66d6e2261ae15e55284b4ed9d6bdaa059 "
737
+
738
+ const rsaResponderCertHex = "308202e2308201caa003020102020101300d06092a864886f70d01010b05003019311730" +
722
739
"150603550403130e4f43535020526573706f6e646572301e170d31353031333031353530" +
723
740
"33335a170d3136303133303135353033335a3019311730150603550403130e4f43535020" +
724
741
"526573706f6e64657230820122300d06092a864886f70d01010105000382010f00308201" +
@@ -740,4 +757,34 @@ const responderCertHex = "308202e2308201caa003020102020101300d06092a864886f70d01
740
757
"66705de17afa19d6e8ae91ddf33179d16ebb6ac2c69cae8373d408ebf8c55308be6c04d9" +
741
758
"3a25439a94299a65a709756c7a3e568be049d5c38839"
742
759
760
+ const ecdsaResponderPrivateKeyHex = "308187020100301306072a8648ce3d020106082a8648ce3d030107046d306b0201010420" +
761
+ "5dd8e9178c5b128fba83d5c81e49cef542ab6842e1cd18b770c9f3614b8d7438a1440342" +
762
+ "0004a52207efe819d77b9d328b78755d601a7855ffab373d44c9062dd28f31a1d633e5b7" +
763
+ "3756df93d80bb900fbaebcadccce9433b0fe8addee516d948e17896f455b"
764
+
765
+ const ecdsaResponderCertHex = "308201793082011ea003020102020101300a06082a8648ce3d0403023019311730150603" +
766
+ "550403130e4f43535020526573706f6e646572301e170d3135303133303135353033335a" +
767
+ "170d3136303133303135353033335a3019311730150603550403130e4f43535020526573" +
768
+ "706f6e6465723059301306072a8648ce3d020106082a8648ce3d03010703420004a52207" +
769
+ "efe819d77b9d328b78755d601a7855ffab373d44c9062dd28f31a1d633e5b73756df93d8" +
770
+ "0bb900fbaebcadccce9433b0fe8addee516d948e17896f455ba3573055300e0603551d0f" +
771
+ "0101ff0404030201a230130603551d25040c300a06082b06010505070309300f0603551d" +
772
+ "130101ff040530030101ff301d0603551d0e04160414421320f1eacd914ec0389858b60e" +
773
+ "9fa7e049564b300a06082a8648ce3d0403020349003046022100d7885be1521aaf8df531" +
774
+ "58249159b39f7012396ee16a3d757b3673cf8a6823db022100d20933c864e91775b93614" +
775
+ "c48e86691f0b00bea01301e4c30da2a0afcff2eed3"
776
+
777
+ const ed25519ResponderPrivateKeyHex = "302e020100300506032b657004220420ccbc03926a70ed37b0cda03f019cc03510c9a66a" +
778
+ "47595cd8fe752c1b0be82df3"
779
+
780
+ const ed25519ResponderCertHex = "308201373081eaa003020102020101300506032b65703019311730150603550403130e4f" +
781
+ "43535020526573706f6e646572301e170d3135303133303135353033335a170d31363031" +
782
+ "33303135353033335a3019311730150603550403130e4f43535020526573706f6e646572" +
783
+ "302a300506032b6570032100772a18db327e1b0c4b45c4e77a6c9e4fac2fb9ce8aebfa9f" +
784
+ "246d64f390236276a3573055300e0603551d0f0101ff0404030201a230130603551d2504" +
785
+ "0c300a06082b06010505070309300f0603551d130101ff040530030101ff301d0603551d" +
786
+ "0e041604146868b9858eaeccb65ad2b3b19fc966d3cc843028300506032b657003410076" +
787
+ "6fdf217788bebb35996ca39b2770a7ca2f2f3f26b274ce3ab91f1005b89b20cd59182690" +
788
+ "3616e03a1b9755d8266938740c9e851f52f2ede6873f9ce705ea04"
789
+
743
790
const errorResponseHex = "30030a0101"
0 commit comments