write_test.go 5.5 KB

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