@@ -439,6 +439,42 @@ func TestOCSPDecodeMultiResponseWithoutMatchingCert(t *testing.T) {
439
439
}
440
440
}
441
441
442
+ func TestOCSPResponseWithIntermediate (t * testing.T ) {
443
+ intBlock , _ := pem .Decode ([]byte (ocspResponseWithIssuerIssuerPem ))
444
+ intCert , err := x509 .ParseCertificate (intBlock .Bytes )
445
+ if err != nil {
446
+ t .Errorf ("failed to parse issuer certificate: %v" , err )
447
+ }
448
+
449
+ ocspBlock , _ := pem .Decode ([]byte (ocspResponseWithIssuerPem ))
450
+ resp , err := ParseResponse (ocspBlock .Bytes , intCert )
451
+ if err != nil {
452
+ t .Errorf ("expected nil error when parsing OCSP response with embedded issuer equal to passed issuer; got: %v" , err )
453
+ }
454
+ if resp .Certificate == nil || ! bytes .Equal (resp .Certificate .Raw , intCert .Raw ) {
455
+ t .Errorf ("expected response to contain embedded certificate pointing to issuer" )
456
+ }
457
+
458
+ resp , err = ParseResponse (ocspBlock .Bytes , nil )
459
+ if err != nil {
460
+ t .Errorf ("expected nil error when parsing OCSP response with embedded issuer with nil passed issuer; got: %v" , err )
461
+ }
462
+ if resp .Certificate == nil || ! bytes .Equal (resp .Certificate .Raw , intCert .Raw ) {
463
+ t .Errorf ("expected response to contain embedded certificate pointing to issuer" )
464
+ }
465
+
466
+ rootBlock , _ := pem .Decode ([]byte (GTSRoot ))
467
+ rootCert , err := x509 .ParseCertificate (rootBlock .Bytes )
468
+ if err != nil {
469
+ t .Errorf ("failed to parse root certificate: %v" , err )
470
+ }
471
+
472
+ _ , err = ParseResponse (ocspBlock .Bytes , rootCert )
473
+ if err == nil {
474
+ t .Errorf ("expected error when parsing OCSP request with embedded issuer and unrelated issuer passed; got nil" )
475
+ }
476
+ }
477
+
442
478
// This OCSP response was taken from GTS's public OCSP responder.
443
479
// To recreate:
444
480
// $ openssl s_client -tls1 -showcerts -servername golang.org -connect golang.org:443
@@ -743,4 +779,61 @@ const responderCertHex = "308202e2308201caa003020102020101300d06092a864886f70d01
743
779
"66705de17afa19d6e8ae91ddf33179d16ebb6ac2c69cae8373d408ebf8c55308be6c04d9" +
744
780
"3a25439a94299a65a709756c7a3e568be049d5c38839"
745
781
782
+ // The below OCSP response and issuer certificate are from
783
+ // https://go.dev/play/p/Nr-VKOD_fxH; the OCSP response contains
784
+ // an embedded copy of the below issuer certificate.
785
+ const ocspResponseWithIssuerPem = "-----BEGIN OCSP RESPONSE-----\n " +
786
+ "MIIF2AoBAKCCBdEwggXNBgkrBgEFBQcwAQEEggW+MIIFujCBv6EvMC0xKzApBgNVBAMTImV4YW1w\n " +
787
+ "bGUuY29tIEludGVybWVkaWF0ZSBBdXRob3JpdHkYDzIwMjMwNDE0MTgzNjAwWjB7MHkwTTAJBgUr\n " +
788
+ "DgMCGgUABBQUuUZ7MA/tkAtRYo9Qxgrp+5AlEwQUOBTBNthss1lVUQGZW7AJQddI0NkCFHyAKcL4\n " +
789
+ "qKzgh1qwqIl2jZ7b1Np7gAAYDzIwMjMwNDE0MTgzNjQ4WqARGA8yMDIzMDQxNTA2MzY0OFqhAjAA\n " +
790
+ "MA0GCSqGSIb3DQEBCwUAA4IBAQAwTMgZ/ebI/hXQ0lZfPAD9i4lAIM1cvPUH+m/j4SG9s3EnFOwg\n " +
791
+ "/LdJ2WWnsafd9Eu6Lrf2mWwZtOuLp03WC4AjY7ghcQU89h1/R/6xv0cjvPIFmh1QP4/ipuGMNOfn\n " +
792
+ "Utw/0o6vFgtViryLz+mWJ+zVntcVF8eMgi/68pCJteyyi2eQZXlHWpmHzbUeVDSaCNHsB6e1gI1w\n " +
793
+ "cn0aVRG0HVfO6fHUhQlFfGPR0Zd73iU/oyx1XPxO5okBIlwoepWASflDp+11dS9ehQIJVcs9/5LB\n " +
794
+ "8RnkMAven/1WNaWWwcKBRtGN7TFdAde7sWS9RDdLfosAWsWQdF6as2JvMdYRsc8zoIID4DCCA9ww\n " +
795
+ "ggPYMIICwKADAgECAhR/tZoxrlMDTnlt++SzzH62XFNczjANBgkqhkiG9w0BAQsFADAWMRQwEgYD\n " +
796
+ "VQQDEwtleGFtcGxlLmNvbTAeFw0yMzA0MTQxODMxMzRaFw0yMzA1MTYxODMyMDRaMC0xKzApBgNV\n " +
797
+ "BAMTImV4YW1wbGUuY29tIEludGVybWVkaWF0ZSBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUA\n " +
798
+ "A4IBDwAwggEKAoIBAQCdWc6C4prDkjxrBiguqvXPNFsKY2jWpyR22ex7hbkAy+XDwjAQu2d3jnUZ\n " +
799
+ "VKSHlbvAbJlwOhZ9jiSAwotsDspoUzNnOhR7XFBR/HTcWAPXkeX16fJHmR67G7bJ35kb2r5P6vFx\n " +
800
+ "5R7mqkQqEfk9hSrcj3KVCL/wotyY++tLlIAD7XFr+Sbjqbtkq9wE1wPwVSc5nQexbjlD27T82CBi\n " +
801
+ "44D5BeQD+5N/YoWhz+MyPgKcx5UUk3Efkp2l4tEnYh9tJVcJr1o2wqwJRCnlPpY8PUuh8gZmCKIv\n " +
802
+ "w+riEEFGvopD8n29dROxjuDHs2kqyw8pp4UkkYwxjajwxyiyNI93p9X5AgMBAAGjggEFMIIBATAO\n " +
803
+ "BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTBNthss1lVUQGZW7AJ\n " +
804
+ "QddI0NkwHwYDVR0jBBgwFoAUyMh8vow7VI0BZZg/7cJldteWVpEwagYIKwYBBQUHAQEEXjBcMC0G\n " +
805
+ "CCsGAQUFBzABhiFodHRwOi8vbG9jYWxob3N0OjgzMDAvdjEvcGtpL29jc3AwKwYIKwYBBQUHMAKG\n " +
806
+ "H2h0dHA6Ly9sb2NhbGhvc3Q6ODMwMC92MS9wa2kvY2EwMgYDVR0fBCswKTAnoCWgI4YhaHR0cDov\n " +
807
+ "L2xvY2FsaG9zdDo4MzAwL3YxL3BraS9jcmxzMA0GCSqGSIb3DQEBCwUAA4IBAQBsF1JxQvASHFl0\n " +
808
+ "zPJMRscAHKRXjgOrkm1N9J4DMphC3lWZ6RRHQvLZB7rfUAx9/eVF+UCKcvx4eldZJzxp5fe5K5OR\n " +
809
+ "1Vuh65unnlq1rkNy6WqGhL8aMuUZ5NGFAKRTONEX5tKGixAy+JM4xX0iIU3OZhlfGx4J+xMyLWy/\n " +
810
+ "xRiHALqaCJsSGM8DafNawN6e73ZCQfTng7bCeiwyCV4YgvSFBXQ/zs0nZ9PFn5orDHqZOPS1s9vT\n " +
811
+ "hVGqWYJUgARvWfj3jXhAGAry9IujUmPZWeDttX8j7u4h4O2/UJ6fYCIDCGbQsA4Bwm+tCqgLZ8JQ\n " +
812
+ "vBfNItA0VDnFokkM4cWpWcfc\n " +
813
+ "-----END OCSP RESPONSE-----"
814
+
815
+ const ocspResponseWithIssuerIssuerPem = "-----BEGIN CERTIFICATE-----\n " +
816
+ "MIID2DCCAsCgAwIBAgIUf7WaMa5TA055bfvks8x+tlxTXM4wDQYJKoZIhvcNAQEL\n " +
817
+ "BQAwFjEUMBIGA1UEAxMLZXhhbXBsZS5jb20wHhcNMjMwNDE0MTgzMTM0WhcNMjMw\n " +
818
+ "NTE2MTgzMjA0WjAtMSswKQYDVQQDEyJleGFtcGxlLmNvbSBJbnRlcm1lZGlhdGUg\n " +
819
+ "QXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnVnOguKa\n " +
820
+ "w5I8awYoLqr1zzRbCmNo1qckdtnse4W5AMvlw8IwELtnd451GVSkh5W7wGyZcDoW\n " +
821
+ "fY4kgMKLbA7KaFMzZzoUe1xQUfx03FgD15Hl9enyR5keuxu2yd+ZG9q+T+rxceUe\n " +
822
+ "5qpEKhH5PYUq3I9ylQi/8KLcmPvrS5SAA+1xa/km46m7ZKvcBNcD8FUnOZ0HsW45\n " +
823
+ "Q9u0/NggYuOA+QXkA/uTf2KFoc/jMj4CnMeVFJNxH5KdpeLRJ2IfbSVXCa9aNsKs\n " +
824
+ "CUQp5T6WPD1LofIGZgiiL8Pq4hBBRr6KQ/J9vXUTsY7gx7NpKssPKaeFJJGMMY2o\n " +
825
+ "8McosjSPd6fV+QIDAQABo4IBBTCCAQEwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB\n " +
826
+ "/wQFMAMBAf8wHQYDVR0OBBYEFDgUwTbYbLNZVVEBmVuwCUHXSNDZMB8GA1UdIwQY\n " +
827
+ "MBaAFMjIfL6MO1SNAWWYP+3CZXbXllaRMGoGCCsGAQUFBwEBBF4wXDAtBggrBgEF\n " +
828
+ "BQcwAYYhaHR0cDovL2xvY2FsaG9zdDo4MzAwL3YxL3BraS9vY3NwMCsGCCsGAQUF\n " +
829
+ "BzAChh9odHRwOi8vbG9jYWxob3N0OjgzMDAvdjEvcGtpL2NhMDIGA1UdHwQrMCkw\n " +
830
+ "J6AloCOGIWh0dHA6Ly9sb2NhbGhvc3Q6ODMwMC92MS9wa2kvY3JsczANBgkqhkiG\n " +
831
+ "9w0BAQsFAAOCAQEAbBdScULwEhxZdMzyTEbHABykV44Dq5JtTfSeAzKYQt5VmekU\n " +
832
+ "R0Ly2Qe631AMff3lRflAinL8eHpXWSc8aeX3uSuTkdVboeubp55ata5DculqhoS/\n " +
833
+ "GjLlGeTRhQCkUzjRF+bShosQMviTOMV9IiFNzmYZXxseCfsTMi1sv8UYhwC6mgib\n " +
834
+ "EhjPA2nzWsDenu92QkH054O2wnosMgleGIL0hQV0P87NJ2fTxZ+aKwx6mTj0tbPb\n " +
835
+ "04VRqlmCVIAEb1n49414QBgK8vSLo1Jj2Vng7bV/I+7uIeDtv1Cen2AiAwhm0LAO\n " +
836
+ "AcJvrQqoC2fCULwXzSLQNFQ5xaJJDOHFqVnH3A==\n " +
837
+ "-----END CERTIFICATE-----"
838
+
746
839
const errorResponseHex = "30030a0101"
0 commit comments