write_test.go 5.6 KB

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