| // Copyright 2015 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package main |
| |
| import ( |
| "crypto/rand" |
| "crypto/x509" |
| "encoding/pem" |
| "io/ioutil" |
| "os" |
| "os/exec" |
| "testing" |
| ) |
| |
| func TestSignPKCS7(t *testing.T) { |
| // Setup RSA key. |
| block, _ := pem.Decode([]byte(testKey)) |
| if block == nil { |
| t.Fatal("no cert") |
| } |
| privKey, err := x509.ParsePKCS1PrivateKey(block.Bytes) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| content := "Hello world,\nThis is signed." |
| cert, err := signPKCS7(rand.Reader, privKey, []byte(content)) |
| if err != nil { |
| t.Fatal(err) |
| } |
| sig, err := ioutil.TempFile("", "content.rsa") |
| if err != nil { |
| t.Fatal(err) |
| } |
| sigPath := sig.Name() |
| defer os.Remove(sigPath) |
| if _, err := sig.Write(cert); err != nil { |
| t.Fatal(err) |
| } |
| if err := sig.Close(); err != nil { |
| t.Fatal(err) |
| } |
| |
| if openssl, err := exec.LookPath("openssl"); err != nil { |
| t.Log("command openssl not found, skipping") |
| } else { |
| cmd := exec.Command( |
| openssl, "asn1parse", |
| "-inform", "DER", |
| "-i", |
| "-in", sigPath, |
| ) |
| if err := cmd.Run(); err != nil { |
| t.Errorf("bad asn.1: %v", err) |
| } |
| } |
| |
| if keytool, err := exec.LookPath("keytool"); err != nil { |
| t.Log("command keytool not found, skipping") |
| } else if err := exec.Command(keytool, "-v").Run(); err != nil { |
| t.Logf("command keytool not functioning: %s, skipping", err) |
| } else { |
| cmd := exec.Command(keytool, "-v", "-printcert", "-file", sigPath) |
| out, err := cmd.CombinedOutput() |
| t.Logf("%v:\n%s", cmd.Args, out) |
| if err != nil { |
| t.Errorf("keytool cannot parse signature: %v", err) |
| } |
| } |
| } |
| |
| const testKey = ` |
| -----BEGIN RSA PRIVATE KEY----- |
| MIIEowIBAAKCAQEAy6ItnWZJ8DpX9R5FdWbS9Kr1U8Z7mKgqNByGU7No99JUnmyu |
| NQ6Uy6Nj0Gz3o3c0BXESECblOC13WdzjsH1Pi7/L9QV8jXOXX8cvkG5SJAyj6hcO |
| LOapjDiN89NXjXtyv206JWYvRtpexyVrmHJgRAw3fiFI+m4g4Qop1CxcIF/EgYh7 |
| rYrqh4wbCM1OGaCleQWaOCXxZGm+J5YNKQcWpjZRrDrb35IZmlT0bK46CXUKvCqK |
| x7YXHgfhC8ZsXCtsScKJVHs7gEsNxz7A0XoibFw6DoxtjKzUCktnT0w3wxdY7OTj |
| 9AR8mobFlM9W3yirX8TtwekWhDNTYEu8dwwykwIDAQABAoIBAA2hjpIhvcNR9H9Z |
| BmdEecydAQ0ZlT5zy1dvrWI++UDVmIp+Ve8BSd6T0mOqV61elmHi3sWsBN4M1Rdz |
| 3N38lW2SajG9q0fAvBpSOBHgAKmfGv3Ziz5gNmtHgeEXfZ3f7J95zVGhlHqWtY95 |
| JsmuplkHxFMyITN6WcMWrhQg4A3enKLhJLlaGLJf9PeBrvVxHR1/txrfENd2iJBH |
| FmxVGILL09fIIktJvoScbzVOneeWXj5vJGzWVhB17DHBbANGvVPdD5f+k/s5aooh |
| hWAy/yLKocr294C4J+gkO5h2zjjjSGcmVHfrhlXQoEPX+iW1TGoF8BMtl4Llc+jw |
| lKWKfpECgYEA9C428Z6CvAn+KJ2yhbAtuRo41kkOVoiQPtlPeRYs91Pq4+NBlfKO |
| 2nWLkyavVrLx4YQeCeaEU2Xoieo9msfLZGTVxgRlztylOUR+zz2FzDBYGicuUD3s |
| EqC0Wv7tiX6dumpWyOcVVLmR9aKlOUzA9xemzIsWUwL3PpyONhKSq7kCgYEA1X2F |
| f2jKjoOVzglhtuX4/SP9GxS4gRf9rOQ1Q8DzZhyH2LZ6Dnb1uEQvGhiqJTU8CXxb |
| 7odI0fgyNXq425Nlxc1Tu0G38TtJhwrx7HWHuFcbI/QpRtDYLWil8Zr7Q3BT9rdh |
| moo4m937hLMvqOG9pyIbyjOEPK2WBCtKW5yabqsCgYEAu9DkUBr1Qf+Jr+IEU9I8 |
| iRkDSMeusJ6gHMd32pJVCfRRQvIlG1oTyTMKpafmzBAd/rFpjYHynFdRcutqcShm |
| aJUq3QG68U9EAvWNeIhA5tr0mUEz3WKTt4xGzYsyWES8u4tZr3QXMzD9dOuinJ1N |
| +4EEumXtSPKKDG3M8Qh+KnkCgYBUEVSTYmF5EynXc2xOCGsuy5AsrNEmzJqxDUBI |
| SN/P0uZPmTOhJIkIIZlmrlW5xye4GIde+1jajeC/nG7U0EsgRAV31J4pWQ5QJigz |
| 0+g419wxIUFryGuIHhBSfpP472+w1G+T2mAGSLh1fdYDq7jx6oWE7xpghn5vb9id |
| EKLjdwKBgBtz9mzbzutIfAW0Y8F23T60nKvQ0gibE92rnUbjPnw8HjL3AZLU05N+ |
| cSL5bhq0N5XHK77sscxW9vXjG0LJMXmFZPp9F6aV6ejkMIXyJ/Yz/EqeaJFwilTq |
| Mc6xR47qkdzu0dQ1aPm4XD7AWDtIvPo/GG2DKOucLBbQc2cOWtKS |
| -----END RSA PRIVATE KEY----- |
| ` |