write_test.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. // Copyright 2011 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 openpgp
  5. import (
  6. "bytes"
  7. "io"
  8. "io/ioutil"
  9. "testing"
  10. )
  11. func TestSignDetached(t *testing.T) {
  12. kring, _ := ReadKeyRing(readerFromHex(testKeys1And2PrivateHex))
  13. out := bytes.NewBuffer(nil)
  14. message := bytes.NewBufferString(signedInput)
  15. err := DetachSign(out, kring[0], message, nil)
  16. if err != nil {
  17. t.Error(err)
  18. }
  19. testDetachedSignature(t, kring, out, signedInput, "check", testKey1KeyId)
  20. }
  21. func TestSignTextDetached(t *testing.T) {
  22. kring, _ := ReadKeyRing(readerFromHex(testKeys1And2PrivateHex))
  23. out := bytes.NewBuffer(nil)
  24. message := bytes.NewBufferString(signedInput)
  25. err := DetachSignText(out, kring[0], message, nil)
  26. if err != nil {
  27. t.Error(err)
  28. }
  29. testDetachedSignature(t, kring, out, signedInput, "check", testKey1KeyId)
  30. }
  31. func TestSignDetachedDSA(t *testing.T) {
  32. kring, _ := ReadKeyRing(readerFromHex(dsaTestKeyPrivateHex))
  33. out := bytes.NewBuffer(nil)
  34. message := bytes.NewBufferString(signedInput)
  35. err := DetachSign(out, kring[0], message, nil)
  36. if err != nil {
  37. t.Error(err)
  38. }
  39. testDetachedSignature(t, kring, out, signedInput, "check", testKey3KeyId)
  40. }
  41. func TestNewEntity(t *testing.T) {
  42. if testing.Short() {
  43. return
  44. }
  45. e, err := NewEntity("Test User", "test", "test@example.com", nil)
  46. if err != nil {
  47. t.Errorf("failed to create entity: %s", err)
  48. return
  49. }
  50. w := bytes.NewBuffer(nil)
  51. if err := e.SerializePrivate(w, nil); err != nil {
  52. t.Errorf("failed to serialize entity: %s", err)
  53. return
  54. }
  55. serialized := w.Bytes()
  56. el, err := ReadKeyRing(w)
  57. if err != nil {
  58. t.Errorf("failed to reparse entity: %s", err)
  59. return
  60. }
  61. if len(el) != 1 {
  62. t.Errorf("wrong number of entities found, got %d, want 1", len(el))
  63. }
  64. w = bytes.NewBuffer(nil)
  65. if err := e.SerializePrivate(w, nil); err != nil {
  66. t.Errorf("failed to serialize entity second time: %s", err)
  67. return
  68. }
  69. if !bytes.Equal(w.Bytes(), serialized) {
  70. t.Errorf("results differed")
  71. }
  72. }
  73. func TestSymmetricEncryption(t *testing.T) {
  74. buf := new(bytes.Buffer)
  75. plaintext, err := SymmetricallyEncrypt(buf, []byte("testing"), nil, nil)
  76. if err != nil {
  77. t.Errorf("error writing headers: %s", err)
  78. return
  79. }
  80. message := []byte("hello world\n")
  81. _, err = plaintext.Write(message)
  82. if err != nil {
  83. t.Errorf("error writing to plaintext writer: %s", err)
  84. }
  85. err = plaintext.Close()
  86. if err != nil {
  87. t.Errorf("error closing plaintext writer: %s", err)
  88. }
  89. md, err := ReadMessage(buf, nil, func(keys []Key, symmetric bool) ([]byte, error) {
  90. return []byte("testing"), nil
  91. }, nil)
  92. if err != nil {
  93. t.Errorf("error rereading message: %s", err)
  94. }
  95. messageBuf := bytes.NewBuffer(nil)
  96. _, err = io.Copy(messageBuf, md.UnverifiedBody)
  97. if err != nil {
  98. t.Errorf("error rereading message: %s", err)
  99. }
  100. if !bytes.Equal(message, messageBuf.Bytes()) {
  101. t.Errorf("recovered message incorrect got '%s', want '%s'", messageBuf.Bytes(), message)
  102. }
  103. }
  104. var testEncryptionTests = []struct {
  105. keyRingHex string
  106. isSigned bool
  107. }{
  108. {
  109. testKeys1And2PrivateHex,
  110. false,
  111. },
  112. {
  113. testKeys1And2PrivateHex,
  114. true,
  115. },
  116. {
  117. dsaElGamalTestKeysHex,
  118. false,
  119. },
  120. {
  121. dsaElGamalTestKeysHex,
  122. true,
  123. },
  124. }
  125. func TestEncryption(t *testing.T) {
  126. for i, test := range testEncryptionTests {
  127. kring, _ := ReadKeyRing(readerFromHex(test.keyRingHex))
  128. passphrase := []byte("passphrase")
  129. for _, entity := range kring {
  130. if entity.PrivateKey != nil && entity.PrivateKey.Encrypted {
  131. err := entity.PrivateKey.Decrypt(passphrase)
  132. if err != nil {
  133. t.Errorf("#%d: failed to decrypt key", i)
  134. }
  135. }
  136. for _, subkey := range entity.Subkeys {
  137. if subkey.PrivateKey != nil && subkey.PrivateKey.Encrypted {
  138. err := subkey.PrivateKey.Decrypt(passphrase)
  139. if err != nil {
  140. t.Errorf("#%d: failed to decrypt subkey", i)
  141. }
  142. }
  143. }
  144. }
  145. var signed *Entity
  146. if test.isSigned {
  147. signed = kring[0]
  148. }
  149. buf := new(bytes.Buffer)
  150. w, err := Encrypt(buf, kring[:1], signed, nil /* no hints */, nil)
  151. if err != nil {
  152. t.Errorf("#%d: error in Encrypt: %s", i, err)
  153. continue
  154. }
  155. const message = "testing"
  156. _, err = w.Write([]byte(message))
  157. if err != nil {
  158. t.Errorf("#%d: error writing plaintext: %s", i, err)
  159. continue
  160. }
  161. err = w.Close()
  162. if err != nil {
  163. t.Errorf("#%d: error closing WriteCloser: %s", i, err)
  164. continue
  165. }
  166. md, err := ReadMessage(buf, kring, nil /* no prompt */, nil)
  167. if err != nil {
  168. t.Errorf("#%d: error reading message: %s", i, err)
  169. continue
  170. }
  171. if test.isSigned {
  172. expectedKeyId := kring[0].signingKey().PublicKey.KeyId
  173. if md.SignedByKeyId != expectedKeyId {
  174. t.Errorf("#%d: message signed by wrong key id, got: %d, want: %d", i, *md.SignedBy, expectedKeyId)
  175. }
  176. if md.SignedBy == nil {
  177. t.Errorf("#%d: failed to find the signing Entity", i)
  178. }
  179. }
  180. plaintext, err := ioutil.ReadAll(md.UnverifiedBody)
  181. if err != nil {
  182. t.Errorf("#%d: error reading encrypted contents: %s", i, err)
  183. continue
  184. }
  185. expectedKeyId := kring[0].encryptionKey().PublicKey.KeyId
  186. if len(md.EncryptedToKeyIds) != 1 || md.EncryptedToKeyIds[0] != expectedKeyId {
  187. t.Errorf("#%d: expected message to be encrypted to %v, but got %#v", i, expectedKeyId, md.EncryptedToKeyIds)
  188. }
  189. if string(plaintext) != message {
  190. t.Errorf("#%d: got: %s, want: %s", i, string(plaintext), message)
  191. }
  192. if test.isSigned {
  193. if md.SignatureError != nil {
  194. t.Errorf("#%d: signature error: %s", i, md.SignatureError)
  195. }
  196. if md.Signature == nil {
  197. t.Error("signature missing")
  198. }
  199. }
  200. }
  201. }