|
| 1 | +//go:build go1.11 || go1.12 || go1.13 || go1.14 || go1.15 |
| 2 | + |
| 3 | +package pkcs7 |
| 4 | + |
| 5 | +import ( |
| 6 | + "crypto/x509" |
| 7 | + "encoding/pem" |
| 8 | + "io/ioutil" |
| 9 | + "os" |
| 10 | + "os/exec" |
| 11 | + "testing" |
| 12 | +) |
| 13 | + |
| 14 | +func TestVerifyEC2(t *testing.T) { |
| 15 | + fixture := UnmarshalDSATestFixture(EC2IdentityDocumentFixture) |
| 16 | + p7, err := Parse(fixture.Input) |
| 17 | + if err != nil { |
| 18 | + t.Errorf("Parse encountered unexpected error: %v", err) |
| 19 | + } |
| 20 | + p7.Certificates = []*x509.Certificate{fixture.Certificate} |
| 21 | + if err := p7.Verify(); err != nil { |
| 22 | + t.Errorf("Verify failed with error: %v", err) |
| 23 | + } |
| 24 | +} |
| 25 | + |
| 26 | +var EC2IdentityDocumentFixture = ` |
| 27 | +-----BEGIN PKCS7----- |
| 28 | +MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAaCA |
| 29 | +JIAEggGmewogICJwcml2YXRlSXAiIDogIjE3Mi4zMC4wLjI1MiIsCiAgImRldnBh |
| 30 | +eVByb2R1Y3RDb2RlcyIgOiBudWxsLAogICJhdmFpbGFiaWxpdHlab25lIiA6ICJ1 |
| 31 | +cy1lYXN0LTFhIiwKICAidmVyc2lvbiIgOiAiMjAxMC0wOC0zMSIsCiAgImluc3Rh |
| 32 | +bmNlSWQiIDogImktZjc5ZmU1NmMiLAogICJiaWxsaW5nUHJvZHVjdHMiIDogbnVs |
| 33 | +bCwKICAiaW5zdGFuY2VUeXBlIiA6ICJ0Mi5taWNybyIsCiAgImFjY291bnRJZCIg |
| 34 | +OiAiMTIxNjU5MDE0MzM0IiwKICAiaW1hZ2VJZCIgOiAiYW1pLWZjZTNjNjk2IiwK |
| 35 | +ICAicGVuZGluZ1RpbWUiIDogIjIwMTYtMDQtMDhUMDM6MDE6MzhaIiwKICAiYXJj |
| 36 | +aGl0ZWN0dXJlIiA6ICJ4ODZfNjQiLAogICJrZXJuZWxJZCIgOiBudWxsLAogICJy |
| 37 | +YW1kaXNrSWQiIDogbnVsbCwKICAicmVnaW9uIiA6ICJ1cy1lYXN0LTEiCn0AAAAA |
| 38 | +AAAxggEYMIIBFAIBATBpMFwxCzAJBgNVBAYTAlVTMRkwFwYDVQQIExBXYXNoaW5n |
| 39 | +dG9uIFN0YXRlMRAwDgYDVQQHEwdTZWF0dGxlMSAwHgYDVQQKExdBbWF6b24gV2Vi |
| 40 | +IFNlcnZpY2VzIExMQwIJAJa6SNnlXhpnMAkGBSsOAwIaBQCgXTAYBgkqhkiG9w0B |
| 41 | +CQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0xNjA0MDgwMzAxNDRaMCMG |
| 42 | +CSqGSIb3DQEJBDEWBBTuUc28eBXmImAautC+wOjqcFCBVjAJBgcqhkjOOAQDBC8w |
| 43 | +LQIVAKA54NxGHWWCz5InboDmY/GHs33nAhQ6O/ZI86NwjA9Vz3RNMUJrUPU5tAAA |
| 44 | +AAAAAA== |
| 45 | +-----END PKCS7----- |
| 46 | +-----BEGIN CERTIFICATE----- |
| 47 | +MIIC7TCCAq0CCQCWukjZ5V4aZzAJBgcqhkjOOAQDMFwxCzAJBgNVBAYTAlVTMRkw |
| 48 | +FwYDVQQIExBXYXNoaW5ndG9uIFN0YXRlMRAwDgYDVQQHEwdTZWF0dGxlMSAwHgYD |
| 49 | +VQQKExdBbWF6b24gV2ViIFNlcnZpY2VzIExMQzAeFw0xMjAxMDUxMjU2MTJaFw0z |
| 50 | +ODAxMDUxMjU2MTJaMFwxCzAJBgNVBAYTAlVTMRkwFwYDVQQIExBXYXNoaW5ndG9u |
| 51 | +IFN0YXRlMRAwDgYDVQQHEwdTZWF0dGxlMSAwHgYDVQQKExdBbWF6b24gV2ViIFNl |
| 52 | +cnZpY2VzIExMQzCCAbcwggEsBgcqhkjOOAQBMIIBHwKBgQCjkvcS2bb1VQ4yt/5e |
| 53 | +ih5OO6kK/n1Lzllr7D8ZwtQP8fOEpp5E2ng+D6Ud1Z1gYipr58Kj3nssSNpI6bX3 |
| 54 | +VyIQzK7wLclnd/YozqNNmgIyZecN7EglK9ITHJLP+x8FtUpt3QbyYXJdmVMegN6P |
| 55 | +hviYt5JH/nYl4hh3Pa1HJdskgQIVALVJ3ER11+Ko4tP6nwvHwh6+ERYRAoGBAI1j |
| 56 | +k+tkqMVHuAFcvAGKocTgsjJem6/5qomzJuKDmbJNu9Qxw3rAotXau8Qe+MBcJl/U |
| 57 | +hhy1KHVpCGl9fueQ2s6IL0CaO/buycU1CiYQk40KNHCcHfNiZbdlx1E9rpUp7bnF |
| 58 | +lRa2v1ntMX3caRVDdbtPEWmdxSCYsYFDk4mZrOLBA4GEAAKBgEbmeve5f8LIE/Gf |
| 59 | +MNmP9CM5eovQOGx5ho8WqD+aTebs+k2tn92BBPqeZqpWRa5P/+jrdKml1qx4llHW |
| 60 | +MXrs3IgIb6+hUIB+S8dz8/mmO0bpr76RoZVCXYab2CZedFut7qc3WUH9+EUAH5mw |
| 61 | +vSeDCOUMYQR7R9LINYwouHIziqQYMAkGByqGSM44BAMDLwAwLAIUWXBlk40xTwSw |
| 62 | +7HX32MxXYruse9ACFBNGmdX2ZBrVNGrN9N2f6ROk0k9K |
| 63 | +-----END CERTIFICATE-----` |
| 64 | + |
| 65 | +func TestDSASignWithOpenSSLAndVerify(t *testing.T) { |
| 66 | + content := []byte(` |
| 67 | +A ship in port is safe, |
| 68 | +but that's not what ships are built for. |
| 69 | +-- Grace Hopper`) |
| 70 | + // write the content to a temp file |
| 71 | + tmpContentFile, err := ioutil.TempFile("", "TestDSASignWithOpenSSLAndVerify_content") |
| 72 | + if err != nil { |
| 73 | + t.Fatal(err) |
| 74 | + } |
| 75 | + ioutil.WriteFile(tmpContentFile.Name(), content, 0o755) |
| 76 | + |
| 77 | + // write the signer cert to a temp file |
| 78 | + tmpSignerCertFile, err := ioutil.TempFile("", "TestDSASignWithOpenSSLAndVerify_signer") |
| 79 | + if err != nil { |
| 80 | + t.Fatal(err) |
| 81 | + } |
| 82 | + ioutil.WriteFile(tmpSignerCertFile.Name(), dsaPublicCert, 0o755) |
| 83 | + |
| 84 | + // write the signer key to a temp file |
| 85 | + tmpSignerKeyFile, err := ioutil.TempFile("", "TestDSASignWithOpenSSLAndVerify_key") |
| 86 | + if err != nil { |
| 87 | + t.Fatal(err) |
| 88 | + } |
| 89 | + ioutil.WriteFile(tmpSignerKeyFile.Name(), dsaPrivateKey, 0o755) |
| 90 | + |
| 91 | + tmpSignedFile, err := ioutil.TempFile("", "TestDSASignWithOpenSSLAndVerify_signature") |
| 92 | + if err != nil { |
| 93 | + t.Fatal(err) |
| 94 | + } |
| 95 | + // call openssl to sign the content |
| 96 | + opensslCMD := exec.Command("openssl", "smime", "-sign", "-nodetach", "-md", "sha1", |
| 97 | + "-in", tmpContentFile.Name(), "-out", tmpSignedFile.Name(), |
| 98 | + "-signer", tmpSignerCertFile.Name(), "-inkey", tmpSignerKeyFile.Name(), |
| 99 | + "-certfile", tmpSignerCertFile.Name(), "-outform", "PEM") |
| 100 | + out, err := opensslCMD.CombinedOutput() |
| 101 | + if err != nil { |
| 102 | + t.Fatalf("openssl command failed with %s: %s", err, out) |
| 103 | + } |
| 104 | + |
| 105 | + // verify the signed content |
| 106 | + pemSignature, err := ioutil.ReadFile(tmpSignedFile.Name()) |
| 107 | + if err != nil { |
| 108 | + t.Fatal(err) |
| 109 | + } |
| 110 | + t.Logf("%s\n", pemSignature) |
| 111 | + derBlock, _ := pem.Decode(pemSignature) |
| 112 | + if derBlock == nil { |
| 113 | + t.Fatalf("failed to read DER block from signature PEM %s", tmpSignedFile.Name()) |
| 114 | + } |
| 115 | + p7, err := Parse(derBlock.Bytes) |
| 116 | + if err != nil { |
| 117 | + t.Fatalf("Parse encountered unexpected error: %v", err) |
| 118 | + } |
| 119 | + if err := p7.Verify(); err != nil { |
| 120 | + t.Fatalf("Verify failed with error: %v", err) |
| 121 | + } |
| 122 | + os.Remove(tmpSignerCertFile.Name()) // clean up |
| 123 | + os.Remove(tmpSignerKeyFile.Name()) // clean up |
| 124 | + os.Remove(tmpContentFile.Name()) // clean up |
| 125 | +} |
| 126 | + |
| 127 | +var dsaPrivateKey = []byte(`-----BEGIN PRIVATE KEY----- |
| 128 | +MIIBSwIBADCCASwGByqGSM44BAEwggEfAoGBAP1/U4EddRIpUt9KnC7s5Of2EbdS |
| 129 | +PO9EAMMeP4C2USZpRV1AIlH7WT2NWPq/xfW6MPbLm1Vs14E7gB00b/JmYLdrmVCl |
| 130 | +pJ+f6AR7ECLCT7up1/63xhv4O1fnxqimFQ8E+4P208UewwI1VBNaFpEy9nXzrith |
| 131 | +1yrv8iIDGZ3RSAHHAhUAl2BQjxUjC8yykrmCouuEC/BYHPUCgYEA9+GghdabPd7L |
| 132 | +vKtcNrhXuXmUr7v6OuqC+VdMCz0HgmdRWVeOutRZT+ZxBxCBgLRJFnEj6EwoFhO3 |
| 133 | +zwkyjMim4TwWeotUfI0o4KOuHiuzpnWRbqN/C/ohNWLx+2J6ASQ7zKTxvqhRkImo |
| 134 | +g9/hWuWfBpKLZl6Ae1UlZAFMO/7PSSoEFgIUfW4aPdQBn9gJZp2KuNpzgHzvfsE= |
| 135 | +-----END PRIVATE KEY-----`) |
| 136 | + |
| 137 | +var dsaPublicCert = []byte(`-----BEGIN CERTIFICATE----- |
| 138 | +MIIDOjCCAvWgAwIBAgIEPCY/UDANBglghkgBZQMEAwIFADBsMRAwDgYDVQQGEwdV |
| 139 | +bmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYD |
| 140 | +VQQKEwdVbmtub3duMRAwDgYDVQQLEwdVbmtub3duMRAwDgYDVQQDEwdVbmtub3du |
| 141 | +MB4XDTE4MTAyMjEzNDMwN1oXDTQ2MDMwOTEzNDMwN1owbDEQMA4GA1UEBhMHVW5r |
| 142 | +bm93bjEQMA4GA1UECBMHVW5rbm93bjEQMA4GA1UEBxMHVW5rbm93bjEQMA4GA1UE |
| 143 | +ChMHVW5rbm93bjEQMA4GA1UECxMHVW5rbm93bjEQMA4GA1UEAxMHVW5rbm93bjCC |
| 144 | +AbgwggEsBgcqhkjOOAQBMIIBHwKBgQD9f1OBHXUSKVLfSpwu7OTn9hG3UjzvRADD |
| 145 | +Hj+AtlEmaUVdQCJR+1k9jVj6v8X1ujD2y5tVbNeBO4AdNG/yZmC3a5lQpaSfn+gE |
| 146 | +exAiwk+7qdf+t8Yb+DtX58aophUPBPuD9tPFHsMCNVQTWhaRMvZ1864rYdcq7/Ii |
| 147 | +Axmd0UgBxwIVAJdgUI8VIwvMspK5gqLrhAvwWBz1AoGBAPfhoIXWmz3ey7yrXDa4 |
| 148 | +V7l5lK+7+jrqgvlXTAs9B4JnUVlXjrrUWU/mcQcQgYC0SRZxI+hMKBYTt88JMozI |
| 149 | +puE8FnqLVHyNKOCjrh4rs6Z1kW6jfwv6ITVi8ftiegEkO8yk8b6oUZCJqIPf4Vrl |
| 150 | +nwaSi2ZegHtVJWQBTDv+z0kqA4GFAAKBgQDCriMPbEVBoRK4SOUeFwg7+VRf4TTp |
| 151 | +rcOQC9IVVoCjXzuWEGrp3ZI7YWJSpFnSch4lk29RH8O0HpI/NOzKnOBtnKr782pt |
| 152 | +1k/bJVMH9EaLd6MKnAVjrCDMYBB0MhebZ8QHY2elZZCWoqDYAcIDOsEx+m4NLErT |
| 153 | +ypPnjS5M0jm1PKMhMB8wHQYDVR0OBBYEFC0Yt5XdM0Kc95IX8NQ8XRssGPx7MA0G |
| 154 | +CWCGSAFlAwQDAgUAAzAAMC0CFQCIgQtrZZ9hdZG1ROhR5hc8nYEmbgIUAIlgC688 |
| 155 | +qzy/7yePTlhlpj+ahMM= |
| 156 | +-----END CERTIFICATE-----`) |
| 157 | + |
| 158 | +type DSATestFixture struct { |
| 159 | + Input []byte |
| 160 | + Certificate *x509.Certificate |
| 161 | +} |
| 162 | + |
| 163 | +func UnmarshalDSATestFixture(testPEMBlock string) DSATestFixture { |
| 164 | + var result DSATestFixture |
| 165 | + var derBlock *pem.Block |
| 166 | + pemBlock := []byte(testPEMBlock) |
| 167 | + for { |
| 168 | + derBlock, pemBlock = pem.Decode(pemBlock) |
| 169 | + if derBlock == nil { |
| 170 | + break |
| 171 | + } |
| 172 | + switch derBlock.Type { |
| 173 | + case "PKCS7": |
| 174 | + result.Input = derBlock.Bytes |
| 175 | + case "CERTIFICATE": |
| 176 | + result.Certificate, _ = x509.ParseCertificate(derBlock.Bytes) |
| 177 | + } |
| 178 | + } |
| 179 | + |
| 180 | + return result |
| 181 | +} |
0 commit comments