write_test.go 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  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. "golang.org/x/crypto/openpgp/packet"
  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, nil)
  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, nil)
  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, nil)
  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. // Check bit-length with no config.
  48. e, err := NewEntity("Test User", "test", "test@example.com", nil)
  49. if err != nil {
  50. t.Errorf("failed to create entity: %s", err)
  51. return
  52. }
  53. bl, err := e.PrimaryKey.BitLength()
  54. if err != nil {
  55. t.Errorf("failed to find bit length: %s", err)
  56. }
  57. if int(bl) != defaultRSAKeyBits {
  58. t.Errorf("BitLength %v, expected %v", defaultRSAKeyBits)
  59. }
  60. // Check bit-length with a config.
  61. cfg := &packet.Config{RSABits: 1024}
  62. e, err = NewEntity("Test User", "test", "test@example.com", cfg)
  63. if err != nil {
  64. t.Errorf("failed to create entity: %s", err)
  65. return
  66. }
  67. bl, err = e.PrimaryKey.BitLength()
  68. if err != nil {
  69. t.Errorf("failed to find bit length: %s", err)
  70. }
  71. if int(bl) != cfg.RSABits {
  72. t.Errorf("BitLength %v, expected %v", bl, cfg.RSABits)
  73. }
  74. w := bytes.NewBuffer(nil)
  75. if err := e.SerializePrivate(w, nil); err != nil {
  76. t.Errorf("failed to serialize entity: %s", err)
  77. return
  78. }
  79. serialized := w.Bytes()
  80. el, err := ReadKeyRing(w)
  81. if err != nil {
  82. t.Errorf("failed to reparse entity: %s", err)
  83. return
  84. }
  85. if len(el) != 1 {
  86. t.Errorf("wrong number of entities found, got %d, want 1", len(el))
  87. }
  88. w = bytes.NewBuffer(nil)
  89. if err := e.SerializePrivate(w, nil); err != nil {
  90. t.Errorf("failed to serialize entity second time: %s", err)
  91. return
  92. }
  93. if !bytes.Equal(w.Bytes(), serialized) {
  94. t.Errorf("results differed")
  95. }
  96. }
  97. func TestSymmetricEncryption(t *testing.T) {
  98. buf := new(bytes.Buffer)
  99. plaintext, err := SymmetricallyEncrypt(buf, []byte("testing"), nil, nil)
  100. if err != nil {
  101. t.Errorf("error writing headers: %s", err)
  102. return
  103. }
  104. message := []byte("hello world\n")
  105. _, err = plaintext.Write(message)
  106. if err != nil {
  107. t.Errorf("error writing to plaintext writer: %s", err)
  108. }
  109. err = plaintext.Close()
  110. if err != nil {
  111. t.Errorf("error closing plaintext writer: %s", err)
  112. }
  113. md, err := ReadMessage(buf, nil, func(keys []Key, symmetric bool) ([]byte, error) {
  114. return []byte("testing"), nil
  115. }, nil)
  116. if err != nil {
  117. t.Errorf("error rereading message: %s", err)
  118. }
  119. messageBuf := bytes.NewBuffer(nil)
  120. _, err = io.Copy(messageBuf, md.UnverifiedBody)
  121. if err != nil {
  122. t.Errorf("error rereading message: %s", err)
  123. }
  124. if !bytes.Equal(message, messageBuf.Bytes()) {
  125. t.Errorf("recovered message incorrect got '%s', want '%s'", messageBuf.Bytes(), message)
  126. }
  127. }
  128. var testEncryptionTests = []struct {
  129. keyRingHex string
  130. isSigned bool
  131. }{
  132. {
  133. testKeys1And2PrivateHex,
  134. false,
  135. },
  136. {
  137. testKeys1And2PrivateHex,
  138. true,
  139. },
  140. {
  141. dsaElGamalTestKeysHex,
  142. false,
  143. },
  144. {
  145. dsaElGamalTestKeysHex,
  146. true,
  147. },
  148. }
  149. func TestEncryption(t *testing.T) {
  150. for i, test := range testEncryptionTests {
  151. kring, _ := ReadKeyRing(readerFromHex(test.keyRingHex))
  152. passphrase := []byte("passphrase")
  153. for _, entity := range kring {
  154. if entity.PrivateKey != nil && entity.PrivateKey.Encrypted {
  155. err := entity.PrivateKey.Decrypt(passphrase)
  156. if err != nil {
  157. t.Errorf("#%d: failed to decrypt key", i)
  158. }
  159. }
  160. for _, subkey := range entity.Subkeys {
  161. if subkey.PrivateKey != nil && subkey.PrivateKey.Encrypted {
  162. err := subkey.PrivateKey.Decrypt(passphrase)
  163. if err != nil {
  164. t.Errorf("#%d: failed to decrypt subkey", i)
  165. }
  166. }
  167. }
  168. }
  169. var signed *Entity
  170. if test.isSigned {
  171. signed = kring[0]
  172. }
  173. buf := new(bytes.Buffer)
  174. w, err := Encrypt(buf, kring[:1], signed, nil /* no hints */, nil)
  175. if err != nil {
  176. t.Errorf("#%d: error in Encrypt: %s", i, err)
  177. continue
  178. }
  179. const message = "testing"
  180. _, err = w.Write([]byte(message))
  181. if err != nil {
  182. t.Errorf("#%d: error writing plaintext: %s", i, err)
  183. continue
  184. }
  185. err = w.Close()
  186. if err != nil {
  187. t.Errorf("#%d: error closing WriteCloser: %s", i, err)
  188. continue
  189. }
  190. md, err := ReadMessage(buf, kring, nil /* no prompt */, nil)
  191. if err != nil {
  192. t.Errorf("#%d: error reading message: %s", i, err)
  193. continue
  194. }
  195. testTime, _ := time.Parse("2006-01-02", "2013-07-01")
  196. if test.isSigned {
  197. signKey, _ := kring[0].signingKey(testTime)
  198. expectedKeyId := signKey.PublicKey.KeyId
  199. if md.SignedByKeyId != expectedKeyId {
  200. t.Errorf("#%d: message signed by wrong key id, got: %d, want: %d", i, *md.SignedBy, expectedKeyId)
  201. }
  202. if md.SignedBy == nil {
  203. t.Errorf("#%d: failed to find the signing Entity", i)
  204. }
  205. }
  206. plaintext, err := ioutil.ReadAll(md.UnverifiedBody)
  207. if err != nil {
  208. t.Errorf("#%d: error reading encrypted contents: %s", i, err)
  209. continue
  210. }
  211. encryptKey, _ := kring[0].encryptionKey(testTime)
  212. expectedKeyId := encryptKey.PublicKey.KeyId
  213. if len(md.EncryptedToKeyIds) != 1 || md.EncryptedToKeyIds[0] != expectedKeyId {
  214. t.Errorf("#%d: expected message to be encrypted to %v, but got %#v", i, expectedKeyId, md.EncryptedToKeyIds)
  215. }
  216. if string(plaintext) != message {
  217. t.Errorf("#%d: got: %s, want: %s", i, string(plaintext), message)
  218. }
  219. if test.isSigned {
  220. if md.SignatureError != nil {
  221. t.Errorf("#%d: signature error: %s", i, md.SignatureError)
  222. }
  223. if md.Signature == nil {
  224. t.Error("signature missing")
  225. }
  226. }
  227. }
  228. }