keys_test.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. package ssh
  2. import (
  3. "crypto/dsa"
  4. "crypto/ecdsa"
  5. "crypto/elliptic"
  6. "crypto/rand"
  7. "crypto/rsa"
  8. "reflect"
  9. "strings"
  10. "testing"
  11. )
  12. var (
  13. ecdsaKey Signer
  14. ecdsa384Key Signer
  15. ecdsa521Key Signer
  16. testCertKey Signer
  17. )
  18. type testSigner struct {
  19. Signer
  20. pub PublicKey
  21. }
  22. func (ts *testSigner) PublicKey() PublicKey {
  23. if ts.pub != nil {
  24. return ts.pub
  25. }
  26. return ts.Signer.PublicKey()
  27. }
  28. func init() {
  29. raw256, _ := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
  30. ecdsaKey, _ = NewSignerFromKey(raw256)
  31. raw384, _ := ecdsa.GenerateKey(elliptic.P384(), rand.Reader)
  32. ecdsa384Key, _ = NewSignerFromKey(raw384)
  33. raw521, _ := ecdsa.GenerateKey(elliptic.P521(), rand.Reader)
  34. ecdsa521Key, _ = NewSignerFromKey(raw521)
  35. // Create a cert and sign it for use in tests.
  36. testCert := &OpenSSHCertV01{
  37. Nonce: []byte{}, // To pass reflect.DeepEqual after marshal & parse, this must be non-nil
  38. Key: ecdsaKey.PublicKey(),
  39. ValidPrincipals: []string{"gopher1", "gopher2"}, // increases test coverage
  40. ValidAfter: 0, // unix epoch
  41. ValidBefore: maxUint64, // The end of currently representable time.
  42. Reserved: []byte{}, // To pass reflect.DeepEqual after marshal & parse, this must be non-nil
  43. SignatureKey: rsaKey.PublicKey(),
  44. }
  45. sigBytes, _ := rsaKey.Sign(rand.Reader, testCert.BytesForSigning())
  46. testCert.Signature = &signature{
  47. Format: testCert.SignatureKey.PublicKeyAlgo(),
  48. Blob: sigBytes,
  49. }
  50. testCertKey = &testSigner{
  51. Signer: ecdsaKey,
  52. pub: testCert,
  53. }
  54. }
  55. func rawKey(pub PublicKey) interface{} {
  56. switch k := pub.(type) {
  57. case *rsaPublicKey:
  58. return (*rsa.PublicKey)(k)
  59. case *dsaPublicKey:
  60. return (*dsa.PublicKey)(k)
  61. case *ecdsaPublicKey:
  62. return (*ecdsa.PublicKey)(k)
  63. case *OpenSSHCertV01:
  64. return k
  65. }
  66. panic("unknown key type")
  67. }
  68. func TestKeyMarshalParse(t *testing.T) {
  69. keys := []Signer{rsaKey, dsaKey, ecdsaKey, ecdsa384Key, ecdsa521Key, testCertKey}
  70. for _, priv := range keys {
  71. pub := priv.PublicKey()
  72. roundtrip, rest, ok := ParsePublicKey(MarshalPublicKey(pub))
  73. if !ok {
  74. t.Errorf("ParsePublicKey(%T) failed", pub)
  75. }
  76. if len(rest) > 0 {
  77. t.Errorf("ParsePublicKey(%T): trailing junk", pub)
  78. }
  79. k1 := rawKey(pub)
  80. k2 := rawKey(roundtrip)
  81. if !reflect.DeepEqual(k1, k2) {
  82. t.Errorf("got %#v in roundtrip, want %#v", k2, k1)
  83. }
  84. }
  85. }
  86. func TestUnsupportedCurves(t *testing.T) {
  87. raw, err := ecdsa.GenerateKey(elliptic.P224(), rand.Reader)
  88. if err != nil {
  89. t.Fatalf("GenerateKey: %v", err)
  90. }
  91. if _, err = NewSignerFromKey(raw); err == nil || !strings.Contains(err.Error(), "only P256") {
  92. t.Fatalf("NewPrivateKey should not succeed with P224, got: %v", err)
  93. }
  94. if _, err = NewPublicKey(&raw.PublicKey); err == nil || !strings.Contains(err.Error(), "only P256") {
  95. t.Fatalf("NewPublicKey should not succeed with P224, got: %v", err)
  96. }
  97. }
  98. func TestNewPublicKey(t *testing.T) {
  99. keys := []Signer{rsaKey, dsaKey, ecdsaKey}
  100. for _, k := range keys {
  101. raw := rawKey(k.PublicKey())
  102. pub, err := NewPublicKey(raw)
  103. if err != nil {
  104. t.Errorf("NewPublicKey(%#v): %v", raw, err)
  105. }
  106. if !reflect.DeepEqual(k.PublicKey(), pub) {
  107. t.Errorf("NewPublicKey(%#v) = %#v, want %#v", raw, pub, k.PublicKey())
  108. }
  109. }
  110. }
  111. func TestKeySignVerify(t *testing.T) {
  112. keys := []Signer{rsaKey, dsaKey, ecdsaKey, testCertKey}
  113. for _, priv := range keys {
  114. pub := priv.PublicKey()
  115. data := []byte("sign me")
  116. sig, err := priv.Sign(rand.Reader, data)
  117. if err != nil {
  118. t.Fatalf("Sign(%T): %v", priv, err)
  119. }
  120. if !pub.Verify(data, sig) {
  121. t.Errorf("publicKey.Verify(%T) failed", priv)
  122. }
  123. }
  124. }
  125. func TestParseRSAPrivateKey(t *testing.T) {
  126. key, err := ParsePrivateKey([]byte(testServerPrivateKey))
  127. if err != nil {
  128. t.Fatalf("ParsePrivateKey: %v", err)
  129. }
  130. rsa, ok := key.(*rsaPrivateKey)
  131. if !ok {
  132. t.Fatalf("got %T, want *rsa.PrivateKey", rsa)
  133. }
  134. if err := rsa.Validate(); err != nil {
  135. t.Errorf("Validate: %v", err)
  136. }
  137. }
  138. func TestParseECPrivateKey(t *testing.T) {
  139. // Taken from the data in test/ .
  140. pem := []byte(`-----BEGIN EC PRIVATE KEY-----
  141. MHcCAQEEINGWx0zo6fhJ/0EAfrPzVFyFC9s18lBt3cRoEDhS3ARooAoGCCqGSM49
  142. AwEHoUQDQgAEi9Hdw6KvZcWxfg2IDhA7UkpDtzzt6ZqJXSsFdLd+Kx4S3Sx4cVO+
  143. 6/ZOXRnPmNAlLUqjShUsUBBngG0u2fqEqA==
  144. -----END EC PRIVATE KEY-----`)
  145. key, err := ParsePrivateKey(pem)
  146. if err != nil {
  147. t.Fatalf("ParsePrivateKey: %v", err)
  148. }
  149. ecKey, ok := key.(*ecdsaPrivateKey)
  150. if !ok {
  151. t.Fatalf("got %T, want *ecdsaPrivateKey", ecKey)
  152. }
  153. if !validateECPublicKey(ecKey.Curve, ecKey.X, ecKey.Y) {
  154. t.Fatalf("public key does not validate.")
  155. }
  156. }
  157. // ssh-keygen -t dsa -f /tmp/idsa.pem
  158. var dsaPEM = `-----BEGIN DSA PRIVATE KEY-----
  159. MIIBuwIBAAKBgQD6PDSEyXiI9jfNs97WuM46MSDCYlOqWw80ajN16AohtBncs1YB
  160. lHk//dQOvCYOsYaE+gNix2jtoRjwXhDsc25/IqQbU1ahb7mB8/rsaILRGIbA5WH3
  161. EgFtJmXFovDz3if6F6TzvhFpHgJRmLYVR8cqsezL3hEZOvvs2iH7MorkxwIVAJHD
  162. nD82+lxh2fb4PMsIiaXudAsBAoGAQRf7Q/iaPRn43ZquUhd6WwvirqUj+tkIu6eV
  163. 2nZWYmXLlqFQKEy4Tejl7Wkyzr2OSYvbXLzo7TNxLKoWor6ips0phYPPMyXld14r
  164. juhT24CrhOzuLMhDduMDi032wDIZG4Y+K7ElU8Oufn8Sj5Wge8r6ANmmVgmFfynr
  165. FhdYCngCgYEA3ucGJ93/Mx4q4eKRDxcWD3QzWyqpbRVRRV1Vmih9Ha/qC994nJFz
  166. DQIdjxDIT2Rk2AGzMqFEB68Zc3O+Wcsmz5eWWzEwFxaTwOGWTyDqsDRLm3fD+QYj
  167. nOwuxb0Kce+gWI8voWcqC9cyRm09jGzu2Ab3Bhtpg8JJ8L7gS3MRZK4CFEx4UAfY
  168. Fmsr0W6fHB9nhS4/UXM8
  169. -----END DSA PRIVATE KEY-----`
  170. func TestParseDSA(t *testing.T) {
  171. s, err := ParsePrivateKey([]byte(dsaPEM))
  172. if err != nil {
  173. t.Fatalf("ParsePrivateKey returned error: %s", err)
  174. }
  175. data := []byte("sign me")
  176. sig, err := s.Sign(rand.Reader, data)
  177. if err != nil {
  178. t.Fatalf("dsa.Sign: %v", err)
  179. }
  180. if !s.PublicKey().Verify(data, sig) {
  181. t.Error("Verify failed.")
  182. }
  183. }