clearsign_test.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. // Copyright 2012 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package clearsign
  5. import (
  6. "bytes"
  7. "code.google.com/p/go.crypto/openpgp"
  8. "testing"
  9. )
  10. func TestParse(t *testing.T) {
  11. b, rest := Decode(clearsignInput)
  12. if b == nil {
  13. t.Fatal("failed to decode clearsign message")
  14. }
  15. if !bytes.Equal(rest, []byte("trailing")) {
  16. t.Errorf("unexpected remaining bytes returned: %s", string(rest))
  17. }
  18. if b.ArmoredSignature.Type != "PGP SIGNATURE" {
  19. t.Errorf("bad armor type, got:%s, want:PGP SIGNATURE", b.ArmoredSignature.Type)
  20. }
  21. expected := []byte("Hello world\r\nline 2")
  22. if !bytes.Equal(b.Bytes, expected) {
  23. t.Errorf("bad body, got:%x want:%x", b.Bytes, expected)
  24. }
  25. expected = []byte("Hello world\nline 2\n")
  26. if !bytes.Equal(b.Plaintext, expected) {
  27. t.Errorf("bad plaintext, got:%x want:%x", b.Plaintext, expected)
  28. }
  29. keyring, err := openpgp.ReadArmoredKeyRing(bytes.NewBufferString(signingKey))
  30. if err != nil {
  31. t.Errorf("failed to parse public key: %s", err)
  32. }
  33. if _, err := openpgp.CheckDetachedSignature(keyring, bytes.NewBuffer(b.Bytes), b.ArmoredSignature.Body); err != nil {
  34. t.Errorf("failed to check signature: %s", err)
  35. }
  36. }
  37. func TestParseWithNoNewlineAtEnd(t *testing.T) {
  38. input := clearsignInput
  39. input = input[:len(input)-len("trailing")-1]
  40. b, rest := Decode(input)
  41. if b == nil {
  42. t.Fatal("failed to decode clearsign message")
  43. }
  44. if len(rest) > 0 {
  45. t.Errorf("unexpected remaining bytes returned: %s", string(rest))
  46. }
  47. }
  48. var signingTests = []struct {
  49. in, signed, plaintext string
  50. }{
  51. {"", "", ""},
  52. {"a", "a", "a\n"},
  53. {"a\n", "a", "a\n"},
  54. {"-a\n", "-a", "-a\n"},
  55. {"--a\nb", "--a\r\nb", "--a\nb\n"},
  56. }
  57. func TestSigning(t *testing.T) {
  58. keyring, err := openpgp.ReadArmoredKeyRing(bytes.NewBufferString(signingKey))
  59. if err != nil {
  60. t.Errorf("failed to parse public key: %s", err)
  61. }
  62. for i, test := range signingTests {
  63. var buf bytes.Buffer
  64. plaintext, err := Encode(&buf, keyring[0].PrivateKey, nil)
  65. if err != nil {
  66. t.Errorf("#%d: error from Encode: %s", i, err)
  67. continue
  68. }
  69. if _, err := plaintext.Write([]byte(test.in)); err != nil {
  70. t.Errorf("#%d: error from Write: %s", i, err)
  71. continue
  72. }
  73. if err := plaintext.Close(); err != nil {
  74. t.Fatalf("#%d: error from Close: %s", i, err)
  75. continue
  76. }
  77. b, _ := Decode(buf.Bytes())
  78. if b == nil {
  79. t.Errorf("#%d: failed to decode clearsign message", i)
  80. continue
  81. }
  82. if !bytes.Equal(b.Bytes, []byte(test.signed)) {
  83. t.Errorf("#%d: bad result, got:%x, want:%x", i, b.Bytes, test.signed)
  84. continue
  85. }
  86. if !bytes.Equal(b.Plaintext, []byte(test.plaintext)) {
  87. t.Errorf("#%d: bad result, got:%x, want:%x", i, b.Plaintext, test.plaintext)
  88. continue
  89. }
  90. if _, err := openpgp.CheckDetachedSignature(keyring, bytes.NewBuffer(b.Bytes), b.ArmoredSignature.Body); err != nil {
  91. t.Errorf("#%d: failed to check signature: %s", i, err)
  92. }
  93. }
  94. }
  95. var clearsignInput = []byte(`
  96. ;lasjlkfdsa
  97. -----BEGIN PGP SIGNED MESSAGE-----
  98. Hash: SHA1
  99. Hello world
  100. line 2
  101. -----BEGIN PGP SIGNATURE-----
  102. Version: GnuPG v1.4.10 (GNU/Linux)
  103. iJwEAQECAAYFAk8kMuEACgkQO9o98PRieSpMsAQAhmY/vwmNpflrPgmfWsYhk5O8
  104. pjnBUzZwqTDoDeINjZEoPDSpQAHGhjFjgaDx/Gj4fAl0dM4D0wuUEBb6QOrwflog
  105. 2A2k9kfSOMOtk0IH/H5VuFN1Mie9L/erYXjTQIptv9t9J7NoRBMU0QOOaFU0JaO9
  106. MyTpno24AjIAGb+mH1U=
  107. =hIJ6
  108. -----END PGP SIGNATURE-----
  109. trailing`)
  110. var signingKey = `-----BEGIN PGP PRIVATE KEY BLOCK-----
  111. Version: GnuPG v1.4.10 (GNU/Linux)
  112. lQHYBE2rFNoBBADFwqWQIW/DSqcB4yCQqnAFTJ27qS5AnB46ccAdw3u4Greeu3Bp
  113. idpoHdjULy7zSKlwR1EA873dO/k/e11Ml3dlAFUinWeejWaK2ugFP6JjiieSsrKn
  114. vWNicdCS4HTWn0X4sjl0ZiAygw6GNhqEQ3cpLeL0g8E9hnYzJKQ0LWJa0QARAQAB
  115. AAP/TB81EIo2VYNmTq0pK1ZXwUpxCrvAAIG3hwKjEzHcbQznsjNvPUihZ+NZQ6+X
  116. 0HCfPAdPkGDCLCb6NavcSW+iNnLTrdDnSI6+3BbIONqWWdRDYJhqZCkqmG6zqSfL
  117. IdkJgCw94taUg5BWP/AAeQrhzjChvpMQTVKQL5mnuZbUCeMCAN5qrYMP2S9iKdnk
  118. VANIFj7656ARKt/nf4CBzxcpHTyB8+d2CtPDKCmlJP6vL8t58Jmih+kHJMvC0dzn
  119. gr5f5+sCAOOe5gt9e0am7AvQWhdbHVfJU0TQJx+m2OiCJAqGTB1nvtBLHdJnfdC9
  120. TnXXQ6ZXibqLyBies/xeY2sCKL5qtTMCAKnX9+9d/5yQxRyrQUHt1NYhaXZnJbHx
  121. q4ytu0eWz+5i68IYUSK69jJ1NWPM0T6SkqpB3KCAIv68VFm9PxqG1KmhSrQIVGVz
  122. dCBLZXmIuAQTAQIAIgUCTasU2gIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AA
  123. CgkQO9o98PRieSoLhgQAkLEZex02Qt7vGhZzMwuN0R22w3VwyYyjBx+fM3JFETy1
  124. ut4xcLJoJfIaF5ZS38UplgakHG0FQ+b49i8dMij0aZmDqGxrew1m4kBfjXw9B/v+
  125. eIqpODryb6cOSwyQFH0lQkXC040pjq9YqDsO5w0WYNXYKDnzRV0p4H1pweo2VDid
  126. AdgETasU2gEEAN46UPeWRqKHvA99arOxee38fBt2CI08iiWyI8T3J6ivtFGixSqV
  127. bRcPxYO/qLpVe5l84Nb3X71GfVXlc9hyv7CD6tcowL59hg1E/DC5ydI8K8iEpUmK
  128. /UnHdIY5h8/kqgGxkY/T/hgp5fRQgW1ZoZxLajVlMRZ8W4tFtT0DeA+JABEBAAEA
  129. A/0bE1jaaZKj6ndqcw86jd+QtD1SF+Cf21CWRNeLKnUds4FRRvclzTyUMuWPkUeX
  130. TaNNsUOFqBsf6QQ2oHUBBK4VCHffHCW4ZEX2cd6umz7mpHW6XzN4DECEzOVksXtc
  131. lUC1j4UB91DC/RNQqwX1IV2QLSwssVotPMPqhOi0ZLNY7wIA3n7DWKInxYZZ4K+6
  132. rQ+POsz6brEoRHwr8x6XlHenq1Oki855pSa1yXIARoTrSJkBtn5oI+f8AzrnN0BN
  133. oyeQAwIA/7E++3HDi5aweWrViiul9cd3rcsS0dEnksPhvS0ozCJiHsq/6GFmy7J8
  134. QSHZPteedBnZyNp5jR+H7cIfVN3KgwH/Skq4PsuPhDq5TKK6i8Pc1WW8MA6DXTdU
  135. nLkX7RGmMwjC0DBf7KWAlPjFaONAX3a8ndnz//fy1q7u2l9AZwrj1qa1iJ8EGAEC
  136. AAkFAk2rFNoCGwwACgkQO9o98PRieSo2/QP/WTzr4ioINVsvN1akKuekmEMI3LAp
  137. BfHwatufxxP1U+3Si/6YIk7kuPB9Hs+pRqCXzbvPRrI8NHZBmc8qIGthishdCYad
  138. AHcVnXjtxrULkQFGbGvhKURLvS9WnzD/m1K2zzwxzkPTzT9/Yf06O6Mal5AdugPL
  139. VrM0m72/jnpKo04=
  140. =zNCn
  141. -----END PGP PRIVATE KEY BLOCK-----
  142. `