@protontech/openpgp 4.10.5 → 5.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/README.md +311 -239
  2. package/dist/lightweight/bn.interface.min.mjs +3 -0
  3. package/dist/lightweight/bn.interface.min.mjs.map +1 -0
  4. package/dist/lightweight/bn.interface.mjs +340 -0
  5. package/dist/lightweight/bn.min.mjs +3 -0
  6. package/dist/lightweight/bn.min.mjs.map +1 -0
  7. package/dist/lightweight/bn.mjs +3434 -0
  8. package/dist/lightweight/elliptic.min.mjs +3 -0
  9. package/dist/lightweight/elliptic.min.mjs.map +1 -0
  10. package/dist/lightweight/elliptic.mjs +4313 -0
  11. package/dist/lightweight/openpgp.min.mjs +3 -0
  12. package/dist/lightweight/openpgp.min.mjs.map +1 -0
  13. package/dist/lightweight/openpgp.mjs +31375 -0
  14. package/dist/lightweight/ponyfill.es6.min.mjs +3 -0
  15. package/dist/lightweight/ponyfill.es6.min.mjs.map +1 -0
  16. package/dist/lightweight/ponyfill.es6.mjs +3831 -0
  17. package/dist/lightweight/web-streams-adapter.min.mjs +17 -0
  18. package/dist/lightweight/web-streams-adapter.min.mjs.map +1 -0
  19. package/dist/lightweight/web-streams-adapter.mjs +561 -0
  20. package/dist/node/openpgp.js +43943 -0
  21. package/dist/node/openpgp.min.js +17 -0
  22. package/dist/node/openpgp.min.js.map +1 -0
  23. package/dist/node/openpgp.min.mjs +17 -0
  24. package/dist/node/openpgp.min.mjs.map +1 -0
  25. package/dist/node/openpgp.mjs +43880 -0
  26. package/dist/openpgp.js +41080 -41565
  27. package/dist/openpgp.min.js +17 -2
  28. package/dist/openpgp.min.js.map +1 -0
  29. package/dist/openpgp.min.mjs +17 -0
  30. package/dist/openpgp.min.mjs.map +1 -0
  31. package/dist/openpgp.mjs +43868 -0
  32. package/lightweight/package.json +5 -0
  33. package/openpgp.d.ts +889 -0
  34. package/package.json +63 -57
  35. package/dist/compat/openpgp.js +0 -61067
  36. package/dist/compat/openpgp.min.js +0 -2
  37. package/dist/compat/openpgp.worker.js +0 -173
  38. package/dist/compat/openpgp.worker.min.js +0 -2
  39. package/dist/lightweight/elliptic.min.js +0 -5
  40. package/dist/lightweight/openpgp.js +0 -40024
  41. package/dist/lightweight/openpgp.min.js +0 -2
  42. package/dist/lightweight/openpgp.worker.js +0 -173
  43. package/dist/lightweight/openpgp.worker.min.js +0 -2
  44. package/dist/openpgp.worker.js +0 -173
  45. package/dist/openpgp.worker.min.js +0 -2
  46. package/src/cleartext.js +0 -220
  47. package/src/config/config.js +0 -224
  48. package/src/config/index.js +0 -7
  49. package/src/config/localStorage.js +0 -35
  50. package/src/crypto/aes_kw.js +0 -153
  51. package/src/crypto/cfb.js +0 -169
  52. package/src/crypto/cipher/aes.js +0 -27
  53. package/src/crypto/cipher/blowfish.js +0 -398
  54. package/src/crypto/cipher/cast5.js +0 -610
  55. package/src/crypto/cipher/des.js +0 -476
  56. package/src/crypto/cipher/index.js +0 -91
  57. package/src/crypto/cipher/twofish.js +0 -346
  58. package/src/crypto/cmac.js +0 -98
  59. package/src/crypto/crypto.js +0 -394
  60. package/src/crypto/eax.js +0 -172
  61. package/src/crypto/gcm.js +0 -141
  62. package/src/crypto/hash/index.js +0 -163
  63. package/src/crypto/hash/md5.js +0 -205
  64. package/src/crypto/index.js +0 -57
  65. package/src/crypto/ocb.js +0 -274
  66. package/src/crypto/pkcs1.js +0 -170
  67. package/src/crypto/pkcs5.js +0 -55
  68. package/src/crypto/public_key/dsa.js +0 -188
  69. package/src/crypto/public_key/elgamal.js +0 -137
  70. package/src/crypto/public_key/elliptic/curves.js +0 -385
  71. package/src/crypto/public_key/elliptic/ecdh.js +0 -414
  72. package/src/crypto/public_key/elliptic/ecdsa.js +0 -348
  73. package/src/crypto/public_key/elliptic/eddsa.js +0 -119
  74. package/src/crypto/public_key/elliptic/index.js +0 -34
  75. package/src/crypto/public_key/elliptic/indutnyKey.js +0 -85
  76. package/src/crypto/public_key/index.js +0 -28
  77. package/src/crypto/public_key/prime.js +0 -275
  78. package/src/crypto/public_key/rsa.js +0 -597
  79. package/src/crypto/random.js +0 -145
  80. package/src/crypto/signature.js +0 -137
  81. package/src/encoding/armor.js +0 -433
  82. package/src/encoding/base64.js +0 -96
  83. package/src/enums.js +0 -493
  84. package/src/hkp.js +0 -89
  85. package/src/index.js +0 -161
  86. package/src/key/factory.js +0 -326
  87. package/src/key/helper.js +0 -363
  88. package/src/key/index.js +0 -32
  89. package/src/key/key.js +0 -890
  90. package/src/key/subkey.js +0 -187
  91. package/src/key/user.js +0 -230
  92. package/src/keyring/index.js +0 -12
  93. package/src/keyring/keyring.js +0 -229
  94. package/src/keyring/localstore.js +0 -119
  95. package/src/lightweight_helper.js +0 -26
  96. package/src/message.js +0 -825
  97. package/src/openpgp.js +0 -717
  98. package/src/packet/all_packets.js +0 -116
  99. package/src/packet/clone.js +0 -189
  100. package/src/packet/compressed.js +0 -194
  101. package/src/packet/index.js +0 -20
  102. package/src/packet/literal.js +0 -168
  103. package/src/packet/marker.js +0 -62
  104. package/src/packet/one_pass_signature.js +0 -156
  105. package/src/packet/packet.js +0 -300
  106. package/src/packet/packetlist.js +0 -232
  107. package/src/packet/public_key.js +0 -280
  108. package/src/packet/public_key_encrypted_session_key.js +0 -156
  109. package/src/packet/public_subkey.js +0 -44
  110. package/src/packet/secret_key.js +0 -448
  111. package/src/packet/secret_subkey.js +0 -41
  112. package/src/packet/signature.js +0 -782
  113. package/src/packet/sym_encrypted_aead_protected.js +0 -189
  114. package/src/packet/sym_encrypted_integrity_protected.js +0 -139
  115. package/src/packet/sym_encrypted_session_key.js +0 -204
  116. package/src/packet/symmetrically_encrypted.js +0 -118
  117. package/src/packet/trust.js +0 -35
  118. package/src/packet/user_attribute.js +0 -94
  119. package/src/packet/userid.js +0 -87
  120. package/src/polyfills.js +0 -64
  121. package/src/signature.js +0 -73
  122. package/src/type/ecdh_symkey.js +0 -69
  123. package/src/type/kdf_params.js +0 -114
  124. package/src/type/keyid.js +0 -110
  125. package/src/type/mpi.js +0 -138
  126. package/src/type/oid.js +0 -110
  127. package/src/type/s2k.js +0 -203
  128. package/src/util.js +0 -836
  129. package/src/wkd.js +0 -88
  130. package/src/worker/async_proxy.js +0 -190
  131. package/src/worker/worker.js +0 -167
  132. package/test/crypto/aes_kw.js +0 -57
  133. package/test/crypto/cipher/aes.js +0 -86
  134. package/test/crypto/cipher/blowfish.js +0 -58
  135. package/test/crypto/cipher/cast5.js +0 -25
  136. package/test/crypto/cipher/des.js +0 -143
  137. package/test/crypto/cipher/index.js +0 -7
  138. package/test/crypto/cipher/twofish.js +0 -71
  139. package/test/crypto/crypto.js +0 -383
  140. package/test/crypto/eax.js +0 -150
  141. package/test/crypto/ecdh.js +0 -359
  142. package/test/crypto/elliptic.js +0 -251
  143. package/test/crypto/elliptic_data.js +0 -102
  144. package/test/crypto/hash/index.js +0 -5
  145. package/test/crypto/hash/md5.js +0 -16
  146. package/test/crypto/hash/ripemd.js +0 -14
  147. package/test/crypto/hash/sha.js +0 -20
  148. package/test/crypto/index.js +0 -14
  149. package/test/crypto/ocb.js +0 -183
  150. package/test/crypto/pkcs5.js +0 -39
  151. package/test/crypto/random.js +0 -79
  152. package/test/crypto/rsa.js +0 -180
  153. package/test/crypto/validate.js +0 -387
  154. package/test/general/armor.js +0 -408
  155. package/test/general/brainpool.js +0 -360
  156. package/test/general/decompression.js +0 -60
  157. package/test/general/ecc_nist.js +0 -115
  158. package/test/general/ecc_secp256k1.js +0 -242
  159. package/test/general/forwarding.js +0 -43
  160. package/test/general/hkp.js +0 -165
  161. package/test/general/index.js +0 -20
  162. package/test/general/key.js +0 -3402
  163. package/test/general/keyring.js +0 -336
  164. package/test/general/oid.js +0 -39
  165. package/test/general/openpgp.js +0 -2542
  166. package/test/general/packet.js +0 -937
  167. package/test/general/signature.js +0 -1665
  168. package/test/general/streaming.js +0 -944
  169. package/test/general/testInputs.js +0 -18
  170. package/test/general/util.js +0 -183
  171. package/test/general/wkd.js +0 -48
  172. package/test/general/x25519.js +0 -556
  173. package/test/unittests.js +0 -64
@@ -1,2542 +0,0 @@
1
- /* globals tryTests: true */
2
-
3
- const openpgp = typeof window !== 'undefined' && window.openpgp ? window.openpgp : require('../../dist/openpgp');
4
-
5
- const spy = require('sinon/lib/sinon/spy');
6
- const stub = require('sinon/lib/sinon/stub');
7
- const input = require('./testInputs.js');
8
- const chai = require('chai');
9
- chai.use(require('chai-as-promised'));
10
-
11
- const expect = chai.expect;
12
-
13
- const pub_key =
14
- ['-----BEGIN PGP PUBLIC KEY BLOCK-----',
15
- 'Version: GnuPG v2.0.19 (GNU/Linux)',
16
- '',
17
- 'mI0EUmEvTgEEANyWtQQMOybQ9JltDqmaX0WnNPJeLILIM36sw6zL0nfTQ5zXSS3+',
18
- 'fIF6P29lJFxpblWk02PSID5zX/DYU9/zjM2xPO8Oa4xo0cVTOTLj++Ri5mtr//f5',
19
- 'GLsIXxFrBJhD/ghFsL3Op0GXOeLJ9A5bsOn8th7x6JucNKuaRB6bQbSPABEBAAG0',
20
- 'JFRlc3QgTWNUZXN0aW5ndG9uIDx0ZXN0QGV4YW1wbGUuY29tPoi5BBMBAgAjBQJS',
21
- 'YS9OAhsvBwsJCAcDAgEGFQgCCQoLBBYCAwECHgECF4AACgkQSmNhOk1uQJQwDAP6',
22
- 'AgrTyqkRlJVqz2pb46TfbDM2TDF7o9CBnBzIGoxBhlRwpqALz7z2kxBDmwpQa+ki',
23
- 'Bq3jZN/UosY9y8bhwMAlnrDY9jP1gdCo+H0sD48CdXybblNwaYpwqC8VSpDdTndf',
24
- '9j2wE/weihGp/DAdy/2kyBCaiOY1sjhUfJ1GogF49rC4jQRSYS9OAQQA6R/PtBFa',
25
- 'JaT4jq10yqASk4sqwVMsc6HcifM5lSdxzExFP74naUMMyEsKHP53QxTF0Grqusag',
26
- 'Qg/ZtgT0CN1HUM152y7ACOdp1giKjpMzOTQClqCoclyvWOFB+L/SwGEIJf7LSCEr',
27
- 'woBuJifJc8xAVr0XX0JthoW+uP91eTQ3XpsAEQEAAYkBPQQYAQIACQUCUmEvTgIb',
28
- 'LgCoCRBKY2E6TW5AlJ0gBBkBAgAGBQJSYS9OAAoJEOCE90RsICyXuqIEANmmiRCA',
29
- 'SF7YK7PvFkieJNwzeK0V3F2lGX+uu6Y3Q/Zxdtwc4xR+me/CSBmsURyXTO29OWhP',
30
- 'GLszPH9zSJU9BdDi6v0yNprmFPX/1Ng0Abn/sCkwetvjxC1YIvTLFwtUL/7v6NS2',
31
- 'bZpsUxRTg9+cSrMWWSNjiY9qUKajm1tuzPDZXAUEAMNmAN3xXN/Kjyvj2OK2ck0X',
32
- 'W748sl/tc3qiKPMJ+0AkMF7Pjhmh9nxqE9+QCEl7qinFqqBLjuzgUhBU4QlwX1GD',
33
- 'AtNTq6ihLMD5v1d82ZC7tNatdlDMGWnIdvEMCv2GZcuIqDQ9rXWs49e7tq1NncLY',
34
- 'hz3tYjKhoFTKEIq3y3Pp',
35
- '=h/aX',
36
- '-----END PGP PUBLIC KEY BLOCK-----'].join('\n');
37
-
38
- const priv_key =
39
- ['-----BEGIN PGP PRIVATE KEY BLOCK-----',
40
- 'Version: GnuPG v2.0.19 (GNU/Linux)',
41
- '',
42
- 'lQH+BFJhL04BBADclrUEDDsm0PSZbQ6pml9FpzTyXiyCyDN+rMOsy9J300Oc10kt',
43
- '/nyBej9vZSRcaW5VpNNj0iA+c1/w2FPf84zNsTzvDmuMaNHFUzky4/vkYuZra//3',
44
- '+Ri7CF8RawSYQ/4IRbC9zqdBlzniyfQOW7Dp/LYe8eibnDSrmkQem0G0jwARAQAB',
45
- '/gMDAu7L//czBpE40p1ZqO8K3k7UejemjsQqc7kOqnlDYd1Z6/3NEA/UM30Siipr',
46
- 'KjdIFY5+hp0hcs6EiiNq0PDfm/W2j+7HfrZ5kpeQVxDek4irezYZrl7JS2xezaLv',
47
- 'k0Fv/6fxasnFtjOM6Qbstu67s5Gpl9y06ZxbP3VpT62+Xeibn/swWrfiJjuGEEhM',
48
- 'bgnsMpHtzAz/L8y6KSzViG/05hBaqrvk3/GeEA6nE+o0+0a6r0LYLTemmq6FbaA1',
49
- 'PHo+x7k7oFcBFUUeSzgx78GckuPwqr2mNfeF+IuSRnrlpZl3kcbHASPAOfEkyMXS',
50
- 'sWGE7grCAjbyQyM3OEXTSyqnehvGS/1RdB6kDDxGwgE/QFbwNyEh6K4eaaAThW2j',
51
- 'IEEI0WEnRkPi9fXyxhFsCLSI1XhqTaq7iDNqJTxE+AX2b9ZuZXAxI3Tc/7++vEyL',
52
- '3p18N/MB2kt1Wb1azmXWL2EKlT1BZ5yDaJuBQ8BhphM3tCRUZXN0IE1jVGVzdGlu',
53
- 'Z3RvbiA8dGVzdEBleGFtcGxlLmNvbT6IuQQTAQIAIwUCUmEvTgIbLwcLCQgHAwIB',
54
- 'BhUIAgkKCwQWAgMBAh4BAheAAAoJEEpjYTpNbkCUMAwD+gIK08qpEZSVas9qW+Ok',
55
- '32wzNkwxe6PQgZwcyBqMQYZUcKagC8+89pMQQ5sKUGvpIgat42Tf1KLGPcvG4cDA',
56
- 'JZ6w2PYz9YHQqPh9LA+PAnV8m25TcGmKcKgvFUqQ3U53X/Y9sBP8HooRqfwwHcv9',
57
- 'pMgQmojmNbI4VHydRqIBePawnQH+BFJhL04BBADpH8+0EVolpPiOrXTKoBKTiyrB',
58
- 'UyxzodyJ8zmVJ3HMTEU/vidpQwzISwoc/ndDFMXQauq6xqBCD9m2BPQI3UdQzXnb',
59
- 'LsAI52nWCIqOkzM5NAKWoKhyXK9Y4UH4v9LAYQgl/stIISvCgG4mJ8lzzEBWvRdf',
60
- 'Qm2Ghb64/3V5NDdemwARAQAB/gMDAu7L//czBpE40iPcpLzL7GwBbWFhSWgSLy53',
61
- 'Md99Kxw3cApWCok2E8R9/4VS0490xKZIa5y2I/K8thVhqk96Z8Kbt7MRMC1WLHgC',
62
- 'qJvkeQCI6PrFM0PUIPLHAQtDJYKtaLXxYuexcAdKzZj3FHdtLNWCooK6n3vJlL1c',
63
- 'WjZcHJ1PH7USlj1jup4XfxsbziuysRUSyXkjn92GZLm+64vCIiwhqAYoizF2NHHG',
64
- 'hRTN4gQzxrxgkeVchl+ag7DkQUDANIIVI+A63JeLJgWJiH1fbYlwESByHW+zBFNt',
65
- 'qStjfIOhjrfNIc3RvsggbDdWQLcbxmLZj4sB0ydPSgRKoaUdRHJY0S4vp9ouKOtl',
66
- '2au/P1BP3bhD0fDXl91oeheYth+MSmsJFDg/vZJzCJhFaQ9dp+2EnjN5auNCNbaI',
67
- 'beFJRHFf9cha8p3hh+AK54NRCT++B2MXYf+TPwqX88jYMBv8kk8vYUgo8128r1zQ',
68
- 'EzjviQE9BBgBAgAJBQJSYS9OAhsuAKgJEEpjYTpNbkCUnSAEGQECAAYFAlJhL04A',
69
- 'CgkQ4IT3RGwgLJe6ogQA2aaJEIBIXtgrs+8WSJ4k3DN4rRXcXaUZf667pjdD9nF2',
70
- '3BzjFH6Z78JIGaxRHJdM7b05aE8YuzM8f3NIlT0F0OLq/TI2muYU9f/U2DQBuf+w',
71
- 'KTB62+PELVgi9MsXC1Qv/u/o1LZtmmxTFFOD35xKsxZZI2OJj2pQpqObW27M8Nlc',
72
- 'BQQAw2YA3fFc38qPK+PY4rZyTRdbvjyyX+1zeqIo8wn7QCQwXs+OGaH2fGoT35AI',
73
- 'SXuqKcWqoEuO7OBSEFThCXBfUYMC01OrqKEswPm/V3zZkLu01q12UMwZach28QwK',
74
- '/YZly4ioND2tdazj17u2rU2dwtiHPe1iMqGgVMoQirfLc+k=',
75
- '=lw5e',
76
- '-----END PGP PRIVATE KEY BLOCK-----'].join('\n');
77
-
78
- const pub_key_de =
79
- ['-----BEGIN PGP PUBLIC KEY BLOCK-----',
80
- 'Version: GnuPG v2.0.22 (GNU/Linux)',
81
- '',
82
- 'mQMuBFLVgdQRCACOlpq0cd1IazNjOEpWPZvx/O3JMbdDs3B3iCG0Mo5OUZ8lpKU5',
83
- 'EslVgTd8IcUU14ZMOO7y91dw0KP4q61b4OIy7oVxzfFfKCC1s0Dc7GTay+qo5afJ',
84
- 'wbWcgTyCIahTRmi5UepU7xdRHRMlqAclOwY2no8fw0JRQfFwRFCjbMdmvzC/k+Wo',
85
- 'A42nn8YaSAG2v7OqF3rkYjkv/7iak48PO/l0Q13USAJLIWdHvRTir78mQUsEY0qR',
86
- 'VoNqz5sMqakzhTvTav07EVy/1xC6GKoWXA9sdB/4r7+blVuu9M4yD40GkE69oAXO',
87
- 'mz6tG3lRq41S0OSzNyDWtUQgMVF6wYqVxUGrAQDJM5A1rF1RKzFiHdkyy57E8LC1',
88
- 'SIJyIXWJ0c5b8/olWQf9G5a17fMjkRTC3FO+ZHwFE1jIM6znYOF2GltDToLuJPq9',
89
- 'lWrI7zVP9AJPwrUt7FK2MBNAvd1jKyIhdU98PBQ2pr+jmyqIycl9iDGXLDO7D7E/',
90
- 'TBnxwQzoL/5b7UnPImuXOwv5JhVmyV2t003xjzb1EGggOnpKugUtVLps8JiLl9n+',
91
- 'Nkj5wpU7NXbuHj2XGkkGmKkCIz4l0dJQR9V6svJV9By0RPgfGPXlN1VR6f2ounNy',
92
- '6REnDCQP9S3Li5eNcxlSGDIxIZL22j63sU/68GVlzqhVdGXxofv5jGtajiNSpPot',
93
- 'ElZU0dusna4PzYmiBCsyN8jENWSzHLJ37N4ScN4b/gf6Axf9FU0PjzPBN1o9W6zj',
94
- 'kpfhlSWDjE3BK8jJ7KvzecM2QE/iJsbuyKEsklw1v0MsRDsox5QlQJcKOoUHC+OT',
95
- 'iKm8cnPckLQNPOw/kb+5Auz7TXBQ63dogDuqO8QGGOpjh8SIYbblYQI5ueo1Tix3',
96
- 'PlSU36SzOQfxSOCeIomEmaFQcU57O1CLsRl//+5lezMFDovJyQHQZfiTxSGfPHij',
97
- 'oQzEUyEWYHKQhIRV6s5VGvF3hN0t8fo0o57bzhV6E7IaSz2Cnm0O0S2PZt8DBN9l',
98
- 'LYNw3cFgzMb/qdFJGR0JXz+moyAYh/fYMiryb6d8ghhvrRy0CrRlC3U5K6qiYfKu',
99
- 'lLQURFNBL0VMRyA8ZHNhQGVsZy5qcz6IewQTEQgAIwUCUtWB1AIbAwcLCQgHAwIB',
100
- 'BhUIAgkKCwQWAgMBAh4BAheAAAoJELqZP8Ku4Yo6Aa0A/1Kz5S8d9czLiDbrhSa/',
101
- 'C1rQ5qiWpFq9UNTFg2P/gASvAP92TzUMLK2my8ew1xXShtrfXked5fkSuFrPlZBs',
102
- 'b4Ta67kCDQRS1YHUEAgAxOKx4y5QD78uPLlgNBHXrcncUNBIt4IXBGjQTxpFcn5j',
103
- 'rSuj+ztvXJQ8wCkx+TTb2yuL5M+nXd7sx4s+M4KZ/MZfI6ZX4lhcoUdAbB9FWiV7',
104
- 'uNntyeFo8qgGM5at/Q0EsyzMSqbeBxk4bpd5MfYGThn0Ae2xaw3X94KaZ3LjtHo2',
105
- 'V27FD+jvmmoAj9b1+zcO/pJ8SuojQmcnS4VDVV+Ba5WPTav0LzDdQXyGMZI9PDxC',
106
- 'jAI2f1HjTuxIt8X8rAQSQdoMIcQRYEjolsXS6iob1eVigyL86hLJjI3VPn6kBCv3',
107
- 'Tb+WXX+9LgSAt9yvv4HMwBLK33k6IH7M72SqQulZywADBQgAt2xVTMjdVyMniMLj',
108
- 'Ed4HbUgwyCPkVkcA4zTXqfKu+dAe4dK5tre0clkXZVtR1V8RDAD0zaVyM030e2zb',
109
- 'zn4cGKDL2dmwk2ZBeXWZDgGKoKvGKYf8PRpTAYweFzol3OUdfXH5SngOylCD4OCL',
110
- 's4RSVkSsllIWqLpnS5IJFgt6PDVcQgGXo2ZhVYkoLNhWTIEBuJWIyc4Vj20YpTms',
111
- 'lgHnjeq5rP6781MwAJQnViyJ2SziGK4/+3CoDiQLO1zId42otXBvsbUuLSL5peX4',
112
- 'v2XNVMLJMY5iSfzbBWczecyapiQ3fbVtWgucgrqlrqM3546v+GdATBhGOu8ppf5j',
113
- '7d1A7ohhBBgRCAAJBQJS1YHUAhsMAAoJELqZP8Ku4Yo6SgoBAIVcZstwz4lyA2et',
114
- 'y61IhKbJCOlQxyem+kepjNapkhKDAQDIDL38bZWU4Rm0nq82Xb4yaI0BCWDcFkHV',
115
- 'og2umGfGng==',
116
- '=v3+L',
117
- '-----END PGP PUBLIC KEY BLOCK-----'].join('\n');
118
-
119
- const priv_key_de =
120
- ['-----BEGIN PGP PRIVATE KEY BLOCK-----',
121
- 'Version: GnuPG v2.0.22 (GNU/Linux)',
122
- '',
123
- 'lQN5BFLVgdQRCACOlpq0cd1IazNjOEpWPZvx/O3JMbdDs3B3iCG0Mo5OUZ8lpKU5',
124
- 'EslVgTd8IcUU14ZMOO7y91dw0KP4q61b4OIy7oVxzfFfKCC1s0Dc7GTay+qo5afJ',
125
- 'wbWcgTyCIahTRmi5UepU7xdRHRMlqAclOwY2no8fw0JRQfFwRFCjbMdmvzC/k+Wo',
126
- 'A42nn8YaSAG2v7OqF3rkYjkv/7iak48PO/l0Q13USAJLIWdHvRTir78mQUsEY0qR',
127
- 'VoNqz5sMqakzhTvTav07EVy/1xC6GKoWXA9sdB/4r7+blVuu9M4yD40GkE69oAXO',
128
- 'mz6tG3lRq41S0OSzNyDWtUQgMVF6wYqVxUGrAQDJM5A1rF1RKzFiHdkyy57E8LC1',
129
- 'SIJyIXWJ0c5b8/olWQf9G5a17fMjkRTC3FO+ZHwFE1jIM6znYOF2GltDToLuJPq9',
130
- 'lWrI7zVP9AJPwrUt7FK2MBNAvd1jKyIhdU98PBQ2pr+jmyqIycl9iDGXLDO7D7E/',
131
- 'TBnxwQzoL/5b7UnPImuXOwv5JhVmyV2t003xjzb1EGggOnpKugUtVLps8JiLl9n+',
132
- 'Nkj5wpU7NXbuHj2XGkkGmKkCIz4l0dJQR9V6svJV9By0RPgfGPXlN1VR6f2ounNy',
133
- '6REnDCQP9S3Li5eNcxlSGDIxIZL22j63sU/68GVlzqhVdGXxofv5jGtajiNSpPot',
134
- 'ElZU0dusna4PzYmiBCsyN8jENWSzHLJ37N4ScN4b/gf6Axf9FU0PjzPBN1o9W6zj',
135
- 'kpfhlSWDjE3BK8jJ7KvzecM2QE/iJsbuyKEsklw1v0MsRDsox5QlQJcKOoUHC+OT',
136
- 'iKm8cnPckLQNPOw/kb+5Auz7TXBQ63dogDuqO8QGGOpjh8SIYbblYQI5ueo1Tix3',
137
- 'PlSU36SzOQfxSOCeIomEmaFQcU57O1CLsRl//+5lezMFDovJyQHQZfiTxSGfPHij',
138
- 'oQzEUyEWYHKQhIRV6s5VGvF3hN0t8fo0o57bzhV6E7IaSz2Cnm0O0S2PZt8DBN9l',
139
- 'LYNw3cFgzMb/qdFJGR0JXz+moyAYh/fYMiryb6d8ghhvrRy0CrRlC3U5K6qiYfKu',
140
- 'lP4DAwJta87fJ43wickVqBNBfgrPyVInvHC/MjSTKzD/9fFin7zYPUofXjj/EZMN',
141
- '4IqNqDd1aI5vo67jF0nGvpcgU5qabYWDgq2wKrQURFNBL0VMRyA8ZHNhQGVsZy5q',
142
- 'cz6IewQTEQgAIwUCUtWB1AIbAwcLCQgHAwIBBhUIAgkKCwQWAgMBAh4BAheAAAoJ',
143
- 'ELqZP8Ku4Yo6Aa0A/1Kz5S8d9czLiDbrhSa/C1rQ5qiWpFq9UNTFg2P/gASvAP92',
144
- 'TzUMLK2my8ew1xXShtrfXked5fkSuFrPlZBsb4Ta650CYwRS1YHUEAgAxOKx4y5Q',
145
- 'D78uPLlgNBHXrcncUNBIt4IXBGjQTxpFcn5jrSuj+ztvXJQ8wCkx+TTb2yuL5M+n',
146
- 'Xd7sx4s+M4KZ/MZfI6ZX4lhcoUdAbB9FWiV7uNntyeFo8qgGM5at/Q0EsyzMSqbe',
147
- 'Bxk4bpd5MfYGThn0Ae2xaw3X94KaZ3LjtHo2V27FD+jvmmoAj9b1+zcO/pJ8Suoj',
148
- 'QmcnS4VDVV+Ba5WPTav0LzDdQXyGMZI9PDxCjAI2f1HjTuxIt8X8rAQSQdoMIcQR',
149
- 'YEjolsXS6iob1eVigyL86hLJjI3VPn6kBCv3Tb+WXX+9LgSAt9yvv4HMwBLK33k6',
150
- 'IH7M72SqQulZywADBQgAt2xVTMjdVyMniMLjEd4HbUgwyCPkVkcA4zTXqfKu+dAe',
151
- '4dK5tre0clkXZVtR1V8RDAD0zaVyM030e2zbzn4cGKDL2dmwk2ZBeXWZDgGKoKvG',
152
- 'KYf8PRpTAYweFzol3OUdfXH5SngOylCD4OCLs4RSVkSsllIWqLpnS5IJFgt6PDVc',
153
- 'QgGXo2ZhVYkoLNhWTIEBuJWIyc4Vj20YpTmslgHnjeq5rP6781MwAJQnViyJ2Szi',
154
- 'GK4/+3CoDiQLO1zId42otXBvsbUuLSL5peX4v2XNVMLJMY5iSfzbBWczecyapiQ3',
155
- 'fbVtWgucgrqlrqM3546v+GdATBhGOu8ppf5j7d1A7v4DAwJta87fJ43wicncdV+Y',
156
- '7ess/j8Rx6/4Jt7ptmRjJNRNbB0ORLZ5BA9544qzAWNtfPOs2PUEDT1L+ChXfD4w',
157
- 'ZG3Yk5hE+PsgbSbGQ5iTSTg9XJYqiGEEGBEIAAkFAlLVgdQCGwwACgkQupk/wq7h',
158
- 'ijpKCgD9HC+RyNOutHhPFbgSvyH3cY6Rbnh1MFAUH3SG4gmiE8kA/A679f/+Izs1',
159
- 'DHTORVqAOdoOcu5Qh7AQg1GdSmfFAsx2',
160
- '=kyeP',
161
- '-----END PGP PRIVATE KEY BLOCK-----'].join('\n');
162
-
163
- const priv_key_2000_2008 = `-----BEGIN PGP PRIVATE KEY BLOCK-----
164
-
165
- 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
- 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
- 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
- +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
- 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
- PcnSBM7SNZrUlOIBN9u6U4McnNYdEhyARIf+Qm9NGTbzZCoZ13f40/QjX2TG
171
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- aohuoJrYyoE/RkLz061g8tFc/KETmnyJAcXL/PPic3tPCCs1cphVAsAjELsY
179
- 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
- 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
- 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
- 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
- ABEBAAEAA/9FbqPXagPXgssG8A3DNQOg3MxM1yhk8CzLoHKdVSNwMsAIqJs0
184
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- /ENJxzybgdKLQBhF8RN3xb1V8DiYFtfgDkboavjiSD7PVEDNO286cLoe/uAk
199
- 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
- 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
- tAGSQbdSqKj7ySE3+Vyl/Bq8p7xyt0t0Mxpqk/ChJTThYUBsXExVF70YiBQK
202
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
215
- t/ia1kMpSEiOVLlX5dfHZzhR3WNtBqU=
216
- =C0fJ
217
- -----END PGP PRIVATE KEY BLOCK-----`;
218
-
219
- const priv_key_2038_2045 = `-----BEGIN PGP PRIVATE KEY BLOCK-----
220
-
221
- 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
- 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
- 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
- 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
- 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
- JPhG0EcVenx2f/V12cq9O+mKIXkfqnc9n9Wd8uVwav6HQsBFcPcmqj/Y5EAw
227
- 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
- cIkUfG10tm0aRz4LJ74jgfEf+34RZVAzlJsCAMVNWQaSQ2zGmMB+CM73BCXb
229
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- bQMngnA9MioHRQ5vsI5ksUgvzE+9hSzlAgDEhH0b68DTJRDZHFeOIltZhcgC
244
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- gfwS6dudEWy3zeYziQLVaZ2wSUiw46Vs8wumAV4lFzEa0nRBMFsAEQEAAQAD
257
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- +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
271
- 0uyeibPdgJTjARMuQzDFA8bdbM540vBf5Q==
272
- =WLIN
273
- -----END PGP PRIVATE KEY BLOCK-----`;
274
-
275
- const priv_key_expires_1337 = `-----BEGIN PGP PRIVATE KEY BLOCK-----
276
-
277
- xcA4BAAAAAEBAgCgONc0J8rfO6cJw5YTP38x1ze2tAYIO7EcmRCNYwMkXngb
278
- 0Qdzg34Q5RW0rNiR56VB6KElPUhePRPVklLFiIvHABEBAAEAAf9qabYMzsz/
279
- /LeRVZSsTgTljmJTdzd2ambUbpi+vt8MXJsbaWh71vjoLMWSXajaKSPDjVU5
280
- waFNt9kLqwGGGLqpAQD5ZdMH2XzTq6GU9Ka69iZs6Pbnzwdz59Vc3i8hXlUj
281
- zQEApHargCTsrtvSrm+hK/pN51/BHAy9lxCAw9f2etx+AeMA/RGrijkFZtYt
282
- jeWdv/usXL3mgHvEcJv63N5zcEvDX5X4W1bND3Rlc3QxIDxhQGIuY29tPsJ7
283
- BBABCAAvBQIAAAABBQMAAAU5BgsJBwgDAgkQzcF99nGrkAkEFQgKAgMWAgEC
284
- GQECGwMCHgEAABAlAfwPehmLZs+gOhOTTaSslqQ50bl/REjmv42Nyr1ZBlQS
285
- DECl1Qu4QyeXin29uEXWiekMpNlZVsEuc8icCw6ABhIZ
286
- =/7PI
287
- -----END PGP PRIVATE KEY BLOCK-----`;
288
-
289
- const passphrase = 'hello world';
290
- const plaintext = input.createSomeMessage();
291
- const password1 = 'I am a password';
292
- const password2 = 'I am another password';
293
- const password3 = 'I am a third password';
294
-
295
- const twoPasswordGPGFail = ['-----BEGIN PGP MESSAGE-----',
296
- 'Version: OpenPGP.js v3.0.0',
297
- 'Comment: https://openpgpjs.org',
298
- '',
299
- 'wy4ECQMIWjj3WEfWxGpgrfb3vXu0TS9L8UNTBvNZFIjltGjMVkLFD+/afgs5',
300
- 'aXt0wy4ECQMIrFo3TFN5xqtgtB+AaAjBcWJrA4bvIPBpJ38PbMWeF0JQgrqg',
301
- 'j3uehxXy0mUB5i7B61g0ho+YplyFGM0s9XayJCnu40tWmr5LqqsRxuwrhJKR',
302
- 'migslOF/l6Y9F0F9xGIZWGhxp3ugQPjVKjj8fOH7ap14mLm60C8q8AOxiSmL',
303
- 'ubsd/hL7FPZatUYAAZVA0a6hmQ==',
304
- '=cHCV',
305
- '-----END PGP MESSAGE-----'].join('\n');
306
-
307
- const ecdh_msg_bad = `-----BEGIN PGP MESSAGE-----
308
- Version: ProtonMail
309
- Comment: https://protonmail.com
310
-
311
- wV4DlF328rtCW+wSAQdA9FsAz4rCdoxY/oZaa68WMPMXbO+wtHs4ZXtAOJOs
312
- SlwwDaABXYC2dt0hUS2zRAL3gBGf4udH/CKJ1vPE58sNeh0ERYLxPHgwrpqI
313
- oNVWOWH50kUBIdqd7by8RwLOk9GyV6008iFOlOG90mfjvt2g5DsnSB4wEeMg
314
- pVu3fXj8iAKvFxvihwv1M7gNtP14StP6CngvyGVVEHQ=
315
- =mvcB
316
- -----END PGP MESSAGE-----`;
317
-
318
- const ecdh_dec_key = `-----BEGIN PGP PRIVATE KEY BLOCK-----
319
- Version: OpenPGP.js v4.4.6
320
- Comment: https://openpgpjs.org
321
-
322
- xYYEXEBTPxYJKwYBBAHaRw8BAQdAbXBY+2lpOatB+ZLokS/JIWqrVOseja9S
323
- ewQxMKN6ueT+CQMIuUXr0XofC6VgJvFLyLwDlyyvT4I1HWGKZ6W9HUaslKvS
324
- rw362rbMZKKfUtfjRJvpqiIU3Dr7iDkHB5vT7Tp5S7AZ2tNKoh/bwfTKdHsT
325
- 1803InFhX3Rlc3RlcjJAcHJvdG9ubWFpbC5jb20iIDxxYV90ZXN0ZXIyQHBy
326
- b3Rvbm1haWwuY29tPsJ3BBAWCgAfBQJcQFM/BgsJBwgDAgQVCAoCAxYCAQIZ
327
- AQIbAwIeAQAKCRClzcrGJTMHyTpjAQCJZ7p0TJBZyPQ8m64N24glaM6oM78q
328
- 2Ogpc0e9LcrPowD6AssY2YfUwJNzVFVzR+Lulzu6XVPjn0pXGMhOl03SrQ3H
329
- iwRcQFM/EgorBgEEAZdVAQUBAQdAAgJJUhKvjGWMq1sDhrJgvqbHK1t1W5RF
330
- Xoet5noIlAADAQgH/gkDCOFdJ7Yv2cTZYETRT5+ak/ntmslcAqtk3ebd7Ok3
331
- tQIjO3TYUbkV1eqrpA4I42kGCUkU4Dy26wxuaLRSsO1u/RgXjExZLP9FlWFI
332
- h6lLS1bCYQQYFggACQUCXEBTPwIbDAAKCRClzcrGJTMHyfNBAP9sdyU3GHNR
333
- 7+QdwYvQp7wN+2VUd8vIf7iwAHOK1Cj4ywD+NhzjFfGYESJ68nnkrYlYdf+u
334
- OBqYz6mzZAWQZqsjbg4=
335
- =zrks
336
- -----END PGP PRIVATE KEY BLOCK-----`;
337
-
338
- const ecdh_msg_bad_2 = `-----BEGIN PGP MESSAGE-----
339
- Version: ProtonMail
340
- Comment: https://protonmail.com
341
-
342
- wV4DtM+8giJEGNISAQhA2rYu8+B41rJi6Gsr4TVeKyDtI0KjhhlLZs891rCG
343
- 6X4wxNkxCuTJZax7gQZbDKh2kETK/RH75s9g7H/WV9kZ192NTGmMFiKiautH
344
- c5BGRGxM0sDfAQZb3ZsAUORHKPP7FczMv5aMU2Ko7O2FHc06bMdnZ/ag7GMF
345
- Bdl4EizttNTQ5sNCAdIXUoA8BJLHPgPiglnfTqqx3ynkBNMzfH46oKf08oJ+
346
- 6CAQhJdif67/iDX8BRtaKDICBpv3b5anJht7irOBqf9XX13SGkmqKYF3T8eB
347
- W7ZV5EdCTC9KU+1BBPfPEi93F4OHsG/Jo80e5MDN24/wNxC67h7kUQiy3H4s
348
- al+5mSAKcIfZJA4NfPJg9zSoHgfRNGI8Q7ao+c8CLPiefGcMsakNsWUdRyBT
349
- SSLH3z/7AH4GxBvhDEEG3cZwmXzZAJMZmzTa+SrsxZzRpGB/aawyRntOWm8w
350
- 6Lq9ntq4S8suj/YK62dJpJxFl8xs+COngpMDvCexX9lYlh/r/y4JRQl06oUK
351
- wv7trvi89TkK3821qHxr7XwI1Ncr2qDJVNlN4W+b6WFyLXnXaJAUMyZ/6inm
352
- RR8BoR2KkEAku3Ne/G5QI51ktNJ7cCodeVOkZj8+iip1/AGyjxZCybq/N8rc
353
- bpOWdMhJ6Hy+JzGNY1qNXcHJPw==
354
- =99Fs
355
- -----END PGP MESSAGE-----`;
356
-
357
- const ecdh_dec_key_2 = `-----BEGIN PGP PRIVATE KEY BLOCK-----
358
- Version: OpenPGP.js v4.4.9
359
- Comment: https://openpgpjs.org
360
-
361
- xYYEXEg93hYJKwYBBAHaRw8BAQdAeoA+T4vr3P0hFFsbzJpgy7/ZnKCrlehr
362
- Myk5QAsBYgf+CQMIQ76YL5sEx+Zgr7DLZ5fhQn1U9+8aLIQaIbaT51nEjEMD
363
- 7h6mrJmp7oIr4PyijsIU+0LasXh/qlNeVQVWSygDq9L4nXDEGQhlMq3oH1FN
364
- NM07InBha292c2thdGVzdEBwcm90b25tYWlsLmNvbSIgPHBha292c2thdGVz
365
- dEBwcm90b25tYWlsLmNvbT7CdwQQFgoAHwUCXEg93gYLCQcIAwIEFQgKAgMW
366
- AgECGQECGwMCHgEACgkQp7+eOYEhwd6x5AD9E0LA62odFFDH76wjEYrPCvOH
367
- cYM56/5ZqZoGPPmbE98BAKCz/SQ90tiCMmlLEDXGX+a1bi6ttozqrnSQigic
368
- DI4Ix4sEXEg93hIKKwYBBAGXVQEFAQEHQPDXy2mDfbMKOpCBZB2Ic5bfoWGV
369
- iXvCFMnTLRWfGHUkAwEIB/4JAwhxMnjHjyALomBWSsoYxxB6rj6JKnWeikyj
370
- yjXZdZqdK5F+0rk4M0l7lF0wt5PhT2uMCLB7aH/mSFN1cz7sBeJl3w2soJsT
371
- ve/fP/8NfzP0wmEEGBYIAAkFAlxIPd4CGwwACgkQp7+eOYEhwd5MWQEAp0E4
372
- QTnEnG8lYXhOqnOw676oV2kEU6tcTj3DdM+cW/sA/jH3FQQjPf+mA/7xqKIv
373
- EQr2Mx42THr260IFYp5E/rIA
374
- =oA0b
375
- -----END PGP PRIVATE KEY BLOCK-----`;
376
-
377
- function withCompression(tests) {
378
- const compressionTypes = Object.keys(openpgp.enums.compression).map(k => openpgp.enums.compression[k]);
379
-
380
- compressionTypes.forEach(function (compression) {
381
- const compressionName = openpgp.enums.read(openpgp.enums.compression, compression);
382
- if (compressionName === 'bzip2') {
383
- return; // bzip2 compression is not supported.
384
- }
385
- const group = `compression - ${compressionName}`;
386
-
387
- describe(group, function() {
388
- let compressSpy;
389
- let decompressSpy;
390
-
391
- beforeEach(function () {
392
- compressSpy = spy(openpgp.packet.Compressed.prototype, 'compress');
393
- decompressSpy = spy(openpgp.packet.Compressed.prototype, 'decompress');
394
- });
395
-
396
- afterEach(function () {
397
- compressSpy.restore();
398
- decompressSpy.restore();
399
- });
400
-
401
- tests(
402
- function(options) {
403
- options.compression = compression;
404
- return options;
405
- },
406
- function() {
407
- // Disable the call expectations when using the web worker because it's not possible to spy on what functions get called.
408
- if (openpgp.getWorker()) {
409
- return;
410
- }
411
-
412
- if (compression === openpgp.enums.compression.uncompressed) {
413
- expect(compressSpy.called).to.be.false;
414
- expect(decompressSpy.called).to.be.false;
415
- return;
416
- }
417
-
418
- expect(compressSpy.called).to.be.true;
419
- expect(compressSpy.thisValues[0].algorithm).to.equal(compressionName);
420
- expect(decompressSpy.called).to.be.true;
421
- expect(decompressSpy.thisValues[0].algorithm).to.equal(compressionName);
422
- }
423
- );
424
- });
425
- });
426
- }
427
-
428
- describe('OpenPGP.js public api tests', function() {
429
-
430
- let rsaGenStub;
431
- let rsaGenValue = openpgp.crypto.publicKey.rsa.generate(openpgp.util.getWebCryptoAll() ? 2048 : 512, "10001");
432
-
433
- beforeEach(function() {
434
- rsaGenStub = stub(openpgp.crypto.publicKey.rsa, 'generate');
435
- rsaGenStub.returns(rsaGenValue);
436
- });
437
-
438
- afterEach(function() {
439
- rsaGenStub.restore();
440
- });
441
-
442
- describe('initWorker, getWorker, destroyWorker - unit tests', function() {
443
- afterEach(function() {
444
- openpgp.destroyWorker(); // cleanup worker in case of failure
445
- });
446
-
447
- it('should work', async function() {
448
- const workerStub = {
449
- postMessage: function() {},
450
- terminate: function() {}
451
- };
452
- await Promise.all([
453
- openpgp.initWorker({
454
- workers: [workerStub]
455
- }),
456
- workerStub.onmessage({ data: { event: 'loaded' } })
457
- ]);
458
- expect(openpgp.getWorker()).to.exist;
459
- openpgp.destroyWorker();
460
- expect(openpgp.getWorker()).to.not.exist;
461
- });
462
- });
463
-
464
- describe('generateKey - validate user ids', function() {
465
- it('should fail for invalid user name', async function() {
466
- const opt = {
467
- userIds: [{ name: {}, email: 'text@example.com' }]
468
- };
469
- const test = openpgp.generateKey(opt);
470
- await expect(test).to.eventually.be.rejectedWith(/Invalid user id format/);
471
- });
472
-
473
- it('should fail for invalid user email address', async function() {
474
- const opt = {
475
- userIds: [{ name: 'Test User', email: 'textexample.com' }]
476
- };
477
- const test = openpgp.generateKey(opt);
478
- await expect(test).to.eventually.be.rejectedWith(/Invalid user id format/);
479
- });
480
-
481
- it('should fail for invalid user email address', async function() {
482
- const opt = {
483
- userIds: [{ name: 'Test User', email: 'text@examplecom' }]
484
- };
485
- const test = openpgp.generateKey(opt);
486
- await expect(test).to.eventually.be.rejectedWith(/Invalid user id format/);
487
- });
488
-
489
- it('should fail for invalid string user id', async function() {
490
- const opt = {
491
- userIds: ['Test User text@example.com>']
492
- };
493
- const test = openpgp.generateKey(opt);
494
- await expect(test).to.eventually.be.rejectedWith(/Invalid user id format/);
495
- });
496
-
497
- it('should fail for invalid single string user id', async function() {
498
- const opt = {
499
- userIds: 'Test User text@example.com>'
500
- };
501
- const test = openpgp.generateKey(opt);
502
- await expect(test).to.eventually.be.rejectedWith(/Invalid user id format/);
503
- });
504
-
505
- it('should work for valid single string user id', function() {
506
- const opt = {
507
- userIds: 'Test User <text@example.com>'
508
- };
509
- return openpgp.generateKey(opt);
510
- });
511
-
512
- it('should work for valid string user id', function() {
513
- const opt = {
514
- userIds: ['Test User <text@example.com>']
515
- };
516
- return openpgp.generateKey(opt);
517
- });
518
-
519
- it('should work for valid single user id hash', function() {
520
- const opt = {
521
- userIds: { name: 'Test User', email: 'text@example.com' }
522
- };
523
- return openpgp.generateKey(opt);
524
- });
525
-
526
- it('should work for valid single user id hash', function() {
527
- const opt = {
528
- userIds: [{ name: 'Test User', email: 'text@example.com' }]
529
- };
530
- return openpgp.generateKey(opt);
531
- });
532
-
533
- it('should work for an empty name', function() {
534
- const opt = {
535
- userIds: { email: 'text@example.com' }
536
- };
537
- return openpgp.generateKey(opt);
538
- });
539
-
540
- it('should work for an empty email address', function() {
541
- const opt = {
542
- userIds: { name: 'Test User' }
543
- };
544
- return openpgp.generateKey(opt);
545
- });
546
- });
547
-
548
- describe('generateKey - unit tests', function() {
549
- let keyGenStub;
550
- let keyObjStub;
551
- let getWebCryptoAllStub;
552
-
553
- beforeEach(function() {
554
- keyObjStub = {
555
- armor: function() {
556
- return 'priv_key';
557
- },
558
- toPublic: function() {
559
- return {
560
- armor: function() {
561
- return 'pub_key';
562
- }
563
- };
564
- },
565
- getRevocationCertificate: function() {}
566
- };
567
- keyGenStub = stub(openpgp.key, 'generate');
568
- keyGenStub.returns(resolves(keyObjStub));
569
- getWebCryptoAllStub = stub(openpgp.util, 'getWebCryptoAll');
570
- });
571
-
572
- afterEach(function() {
573
- keyGenStub.restore();
574
- openpgp.destroyWorker();
575
- getWebCryptoAllStub.restore();
576
- });
577
-
578
- it('should have default params set', function() {
579
- const now = openpgp.util.normalizeDate(new Date());
580
- const opt = {
581
- userIds: { name: 'Test User', email: 'text@example.com' },
582
- passphrase: 'secret',
583
- date: now,
584
- subkeys: []
585
- };
586
- return openpgp.generateKey(opt).then(function(newKey) {
587
- expect(keyGenStub.withArgs({
588
- userIds: [{ name: 'Test User', email: 'text@example.com' }],
589
- passphrase: 'secret',
590
- rsaBits: 2048,
591
- keyExpirationTime: 0,
592
- curve: "",
593
- date: now,
594
- subkeys: []
595
- }).calledOnce).to.be.true;
596
- expect(newKey.key).to.exist;
597
- expect(newKey.privateKeyArmored).to.exist;
598
- expect(newKey.publicKeyArmored).to.exist;
599
- });
600
- });
601
-
602
- it('should delegate to async proxy', async function() {
603
- const workerStub = {
604
- postMessage: function() {},
605
- terminate: function() {}
606
- };
607
- await Promise.all([
608
- openpgp.initWorker({
609
- workers: [workerStub]
610
- }),
611
- workerStub.onmessage({ data: { event: 'loaded' } })
612
- ]);
613
- const proxyGenStub = stub(openpgp.getWorker(), 'delegate');
614
- getWebCryptoAllStub.returns();
615
-
616
- const opt = {
617
- userIds: { name: 'Test User', email: 'text@example.com' },
618
- passphrase: 'secret',
619
- subkeys: []
620
- };
621
- openpgp.generateKey(opt);
622
- expect(proxyGenStub.calledOnce).to.be.true;
623
- expect(keyGenStub.calledOnce).to.be.false;
624
- });
625
- });
626
-
627
- describe('generateKey - integration tests', function() {
628
- let use_nativeVal;
629
-
630
- beforeEach(function() {
631
- use_nativeVal = openpgp.config.use_native;
632
- });
633
-
634
- afterEach(function() {
635
- openpgp.config.use_native = use_nativeVal;
636
- openpgp.destroyWorker();
637
- });
638
-
639
- it('should work in JS (without worker)', function() {
640
- openpgp.config.use_native = false;
641
- openpgp.destroyWorker();
642
- const opt = {
643
- userIds: [{ name: 'Test User', email: 'text@example.com' }],
644
- numBits: 512
645
- };
646
-
647
- return openpgp.generateKey(opt).then(function(newKey) {
648
- expect(newKey.key.getUserIds()[0]).to.equal('Test User <text@example.com>');
649
- expect(newKey.publicKeyArmored).to.match(/^-----BEGIN PGP PUBLIC/);
650
- expect(newKey.privateKeyArmored).to.match(/^-----BEGIN PGP PRIVATE/);
651
- });
652
- });
653
-
654
- it('should work in JS (with worker)', async function() {
655
- openpgp.config.use_native = false;
656
- await openpgp.initWorker({ path:'../dist/openpgp.worker.js' });
657
- const opt = {
658
- userIds: [{ name: 'Test User', email: 'text@example.com' }],
659
- numBits: 512
660
- };
661
-
662
- return openpgp.generateKey(opt).then(function(newKey) {
663
- expect(newKey.key.getUserIds()[0]).to.equal('Test User <text@example.com>');
664
- expect(newKey.publicKeyArmored).to.match(/^-----BEGIN PGP PUBLIC/);
665
- expect(newKey.privateKeyArmored).to.match(/^-----BEGIN PGP PRIVATE/);
666
- });
667
- });
668
-
669
- it('should work in with native crypto', function() {
670
- openpgp.config.use_native = true;
671
- const opt = {
672
- userIds: [{ name: 'Test User', email: 'text@example.com' }],
673
- numBits: 512
674
- };
675
- if (openpgp.util.getWebCryptoAll()) { opt.numBits = 2048; } // webkit webcrypto accepts minimum 2048 bit keys
676
-
677
- return openpgp.generateKey(opt).then(function(newKey) {
678
- expect(newKey.key.getUserIds()[0]).to.equal('Test User <text@example.com>');
679
- expect(newKey.publicKeyArmored).to.match(/^-----BEGIN PGP PUBLIC/);
680
- expect(newKey.privateKeyArmored).to.match(/^-----BEGIN PGP PRIVATE/);
681
- });
682
- });
683
- });
684
-
685
- describe('encrypt, decrypt, sign, verify - integration tests', function() {
686
- let privateKey_2000_2008;
687
- let publicKey_2000_2008;
688
- let privateKey_2038_2045;
689
- let publicKey_2038_2045;
690
- let privateKey_1337;
691
- let publicKey_1337;
692
- let privateKey;
693
- let publicKey;
694
- let publicKeyNoAEAD;
695
- let zero_copyVal;
696
- let use_nativeVal;
697
- let aead_protectVal;
698
- let aead_modeVal;
699
- let aead_chunk_size_byteVal;
700
- let v5_keysVal;
701
-
702
- beforeEach(async function() {
703
- publicKey = await openpgp.key.readArmored(pub_key);
704
- expect(publicKey.keys).to.have.length(1);
705
- expect(publicKey.err).to.not.exist;
706
- publicKeyNoAEAD = await openpgp.key.readArmored(pub_key);
707
- privateKey = await openpgp.key.readArmored(priv_key);
708
- expect(privateKey.keys).to.have.length(1);
709
- expect(privateKey.err).to.not.exist;
710
- privateKey_2000_2008 = await openpgp.key.readArmored(priv_key_2000_2008);
711
- expect(privateKey_2000_2008.keys).to.have.length(1);
712
- expect(privateKey_2000_2008.err).to.not.exist;
713
- publicKey_2000_2008 = { keys: [ privateKey_2000_2008.keys[0].toPublic() ] };
714
- privateKey_2038_2045 = await openpgp.key.readArmored(priv_key_2038_2045);
715
- expect(privateKey_2038_2045.keys).to.have.length(1);
716
- expect(privateKey_2038_2045.err).to.not.exist;
717
- publicKey_2038_2045 = { keys: [ privateKey_2038_2045.keys[0].toPublic() ] };
718
- privateKey_1337 = await openpgp.key.readArmored(priv_key_expires_1337);
719
- expect(privateKey_1337.keys).to.have.length(1);
720
- expect(privateKey_1337.err).to.not.exist;
721
- publicKey_1337 = { keys: [ privateKey_1337.keys[0].toPublic() ] };
722
- zero_copyVal = openpgp.config.zero_copy;
723
- use_nativeVal = openpgp.config.use_native;
724
- aead_protectVal = openpgp.config.aead_protect;
725
- aead_modeVal = openpgp.config.aead_mode;
726
- aead_chunk_size_byteVal = openpgp.config.aead_chunk_size_byte;
727
- v5_keysVal = openpgp.config.v5_keys;
728
- });
729
-
730
- afterEach(function() {
731
- openpgp.config.zero_copy = zero_copyVal;
732
- openpgp.config.use_native = use_nativeVal;
733
- openpgp.config.aead_protect = aead_protectVal;
734
- openpgp.config.aead_mode = aead_modeVal;
735
- openpgp.config.aead_chunk_size_byte = aead_chunk_size_byteVal;
736
- openpgp.config.v5_keys = v5_keysVal;
737
- });
738
-
739
- it('Configuration', async function() {
740
- openpgp.config.show_version = false;
741
- openpgp.config.commentstring = 'different';
742
- if (openpgp.getWorker()) { // init again to trigger config event
743
- await openpgp.initWorker({ path:'../dist/openpgp.worker.js' });
744
- }
745
- return openpgp.encrypt({ publicKeys:publicKey.keys, message:openpgp.message.fromText(plaintext) }).then(function(encrypted) {
746
- expect(encrypted.data).to.exist;
747
- expect(encrypted.data).not.to.match(/^Version:/);
748
- expect(encrypted.data).to.match(/Comment: different/);
749
- });
750
- });
751
-
752
- it('Test multiple workers', async function() {
753
- openpgp.config.show_version = false;
754
- openpgp.config.commentstring = 'different';
755
- if (!openpgp.getWorker()) {
756
- return;
757
- }
758
- const { workers } = openpgp.getWorker();
759
- try {
760
- await privateKey.keys[0].decrypt(passphrase)
761
- await openpgp.initWorker({path: '../dist/openpgp.worker.js', workers, n: 2});
762
-
763
- const workerTest = (_, index) => {
764
- const plaintext = input.createSomeMessage() + index;
765
- return openpgp.encrypt({
766
- publicKeys: publicKey.keys,
767
- data: plaintext
768
- }).then(function (encrypted) {
769
- expect(encrypted.data).to.exist;
770
- expect(encrypted.data).not.to.match(/^Version:/);
771
- expect(encrypted.data).to.match(/Comment: different/);
772
- return openpgp.decrypt({
773
- privateKeys: privateKey.keys[0],
774
- message: openpgp.message.readArmored(encrypted.data)
775
- });
776
- }).then(function (decrypted) {
777
- expect(decrypted.data).to.equal(plaintext);
778
- });
779
- };
780
- await Promise.all(Array(10).fill(null).map(workerTest));
781
- } finally {
782
- await openpgp.initWorker({path: '../dist/openpgp.worker.js', workers, n: 1 });
783
- }
784
- });
785
-
786
- it('Decrypting key with wrong passphrase rejected', async function () {
787
- await expect(privateKey.keys[0].decrypt('wrong passphrase')).to.eventually.be.rejectedWith('Incorrect key passphrase');
788
- });
789
-
790
- it('Decrypting key with correct passphrase returns true', async function () {
791
- expect(await privateKey.keys[0].decrypt(passphrase)).to.be.true;
792
- });
793
-
794
- describe('decryptKey', function() {
795
- it('should work for correct passphrase', function() {
796
- return openpgp.decryptKey({
797
- privateKey: privateKey.keys[0],
798
- passphrase: passphrase
799
- }).then(function(unlocked){
800
- expect(unlocked.key.getKeyId().toHex()).to.equal(privateKey.keys[0].getKeyId().toHex());
801
- expect(unlocked.key.isDecrypted()).to.be.true;
802
- });
803
- });
804
-
805
- it('should fail for incorrect passphrase', function() {
806
- return openpgp.decryptKey({
807
- privateKey: privateKey.keys[0],
808
- passphrase: 'incorrect'
809
- }).catch(function(error){
810
- expect(error.message).to.match(/Incorrect key passphrase/);
811
- });
812
- });
813
- });
814
-
815
- it('Calling decrypt with not decrypted key leads to exception', function() {
816
- const encOpt = {
817
- message: openpgp.message.fromText(plaintext),
818
- publicKeys: publicKey.keys
819
- };
820
- const decOpt = {
821
- privateKeys: privateKey.keys[0]
822
- };
823
- return openpgp.encrypt(encOpt).then(async function(encrypted) {
824
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
825
- return openpgp.decrypt(decOpt);
826
- }).catch(function(error) {
827
- expect(error.message).to.match(/not decrypted/);
828
- });
829
- });
830
-
831
- tryTests('CFB mode (asm.js)', tests, {
832
- if: !(typeof window !== 'undefined' && window.Worker),
833
- beforeEach: function() {
834
- openpgp.config.aead_protect = false;
835
- }
836
- });
837
-
838
- tryTests('CFB mode (asm.js, worker)', tests, {
839
- if: typeof window !== 'undefined' && window.Worker,
840
- before: async function() {
841
- await openpgp.initWorker({ path:'../dist/openpgp.worker.js' });
842
- },
843
- beforeEach: function() {
844
- openpgp.config.aead_protect = false;
845
- },
846
- after: function() {
847
- openpgp.destroyWorker();
848
- }
849
- });
850
-
851
- tryTests('GCM mode (V5 keys)', tests, {
852
- if: true,
853
- beforeEach: function() {
854
- openpgp.config.aead_protect = true;
855
- openpgp.config.aead_mode = openpgp.enums.aead.experimental_gcm;
856
- openpgp.config.v5_keys = true;
857
-
858
- // Monkey-patch AEAD feature flag
859
- publicKey.keys[0].users[0].selfCertifications[0].features = [7];
860
- publicKey_2000_2008.keys[0].users[0].selfCertifications[0].features = [7];
861
- publicKey_2038_2045.keys[0].users[0].selfCertifications[0].features = [7];
862
- }
863
- });
864
-
865
- tryTests('EAX mode (small chunk size)', tests, {
866
- if: true,
867
- beforeEach: function() {
868
- openpgp.config.aead_protect = true;
869
- openpgp.config.aead_chunk_size_byte = 0;
870
-
871
- // Monkey-patch AEAD feature flag
872
- publicKey.keys[0].users[0].selfCertifications[0].features = [7];
873
- publicKey_2000_2008.keys[0].users[0].selfCertifications[0].features = [7];
874
- publicKey_2038_2045.keys[0].users[0].selfCertifications[0].features = [7];
875
- }
876
- });
877
-
878
- tryTests('OCB mode', tests, {
879
- if: !openpgp.config.ci,
880
- beforeEach: function() {
881
- openpgp.config.aead_protect = true;
882
- openpgp.config.aead_mode = openpgp.enums.aead.ocb;
883
-
884
- // Monkey-patch AEAD feature flag
885
- publicKey.keys[0].users[0].selfCertifications[0].features = [7];
886
- publicKey_2000_2008.keys[0].users[0].selfCertifications[0].features = [7];
887
- publicKey_2038_2045.keys[0].users[0].selfCertifications[0].features = [7];
888
- }
889
- });
890
-
891
- function tests() {
892
- describe('encryptSessionKey, decryptSessionKeys', function() {
893
- const sk = new Uint8Array([0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01]);
894
-
895
- let decryptedPrivateKey;
896
- beforeEach(async function() {
897
- if (!decryptedPrivateKey) {
898
- expect(await privateKey.keys[0].decrypt(passphrase)).to.be.true;
899
- decryptedPrivateKey = privateKey;
900
- }
901
- privateKey = decryptedPrivateKey;
902
- });
903
-
904
- it('should encrypt with public key', function() {
905
- return openpgp.encryptSessionKey({
906
- data: sk,
907
- algorithm: 'aes128',
908
- publicKeys: publicKey.keys
909
- }).then(function(encrypted) {
910
- return openpgp.decryptSessionKeys({
911
- message: encrypted.message,
912
- privateKeys: privateKey.keys[0]
913
- });
914
- }).then(function(decrypted) {
915
- expect(decrypted[0].data).to.deep.equal(sk);
916
- });
917
- });
918
-
919
- it('should encrypt with password', function() {
920
- return openpgp.encryptSessionKey({
921
- data: sk,
922
- algorithm: 'aes128',
923
- passwords: password1
924
- }).then(function(encrypted) {
925
- return openpgp.decryptSessionKeys({
926
- message: encrypted.message,
927
- passwords: password1
928
- });
929
- }).then(function(decrypted) {
930
- expect(decrypted[0].data).to.deep.equal(sk);
931
- });
932
- });
933
-
934
- it('should not decrypt with a key without binding signatures', function() {
935
- return openpgp.encryptSessionKey({
936
- data: sk,
937
- algorithm: 'aes128',
938
- publicKeys: publicKey.keys
939
- }).then(async function(encrypted) {
940
- const invalidPrivateKey = (await openpgp.key.readArmored(priv_key)).keys[0];
941
- invalidPrivateKey.subKeys[0].bindingSignatures = [];
942
- return openpgp.decryptSessionKeys({
943
- message: encrypted.message,
944
- privateKeys: invalidPrivateKey
945
- }).catch(error => {
946
- expect(error.message).to.match(/Error decrypting session keys: Session key decryption failed./);
947
- });
948
- });
949
- });
950
-
951
- it('roundtrip workflow: encrypt, decryptSessionKeys, decrypt with pgp key pair', function () {
952
- let msgAsciiArmored;
953
- return openpgp.encrypt({
954
- message: openpgp.message.fromText(plaintext),
955
- publicKeys: publicKey.keys
956
- }).then(async function (encrypted) {
957
- msgAsciiArmored = encrypted.data;
958
- return openpgp.decryptSessionKeys({
959
- message: await openpgp.message.readArmored(msgAsciiArmored),
960
- privateKeys: privateKey.keys[0]
961
- });
962
-
963
- }).then(async function (decryptedSessionKeys) {
964
- const message = await openpgp.message.readArmored(msgAsciiArmored);
965
- return openpgp.decrypt({
966
- sessionKeys: decryptedSessionKeys[0],
967
- message
968
- });
969
- }).then(function (decrypted) {
970
- expect(decrypted.data).to.equal(plaintext);
971
- });
972
- });
973
-
974
- it('roundtrip workflow: encrypt, decryptSessionKeys, decrypt with pgp key pair -- trailing spaces', function () {
975
- const plaintext = 'space: \nspace and tab: \t\nno trailing space\n \ntab:\t\ntab and space:\t ';
976
- let msgAsciiArmored;
977
- return openpgp.encrypt({
978
- message: openpgp.message.fromText(plaintext),
979
- publicKeys: publicKey.keys
980
- }).then(async function (encrypted) {
981
- msgAsciiArmored = encrypted.data;
982
- return openpgp.decryptSessionKeys({
983
- message: await openpgp.message.readArmored(msgAsciiArmored),
984
- privateKeys: privateKey.keys[0]
985
- });
986
-
987
- }).then(async function (decryptedSessionKeys) {
988
- const message = await openpgp.message.readArmored(msgAsciiArmored);
989
- return openpgp.decrypt({
990
- sessionKeys: decryptedSessionKeys[0],
991
- message
992
- });
993
- }).then(function (decrypted) {
994
- expect(decrypted.data).to.equal(plaintext);
995
- });
996
- });
997
-
998
- it('roundtrip workflow: encrypt, decryptSessionKeys, decrypt with password', function () {
999
- let msgAsciiArmored;
1000
- return openpgp.encrypt({
1001
- message: openpgp.message.fromText(plaintext),
1002
- passwords: password1
1003
- }).then(async function (encrypted) {
1004
- msgAsciiArmored = encrypted.data;
1005
- return openpgp.decryptSessionKeys({
1006
- message: await openpgp.message.readArmored(msgAsciiArmored),
1007
- passwords: password1
1008
- });
1009
-
1010
- }).then(async function (decryptedSessionKeys) {
1011
- return openpgp.decrypt({
1012
- sessionKeys: decryptedSessionKeys[0],
1013
- message: await openpgp.message.readArmored(msgAsciiArmored)
1014
- });
1015
-
1016
- }).then(function (decrypted) {
1017
- expect(decrypted.data).to.equal(plaintext);
1018
- });
1019
- });
1020
-
1021
- it('roundtrip workflow: encrypt with multiple passwords, decryptSessionKeys, decrypt with multiple passwords', function () {
1022
- let msgAsciiArmored;
1023
- return openpgp.encrypt({
1024
- message: openpgp.message.fromText(plaintext),
1025
- passwords: [password1, password2]
1026
- }).then(async function (encrypted) {
1027
- msgAsciiArmored = encrypted.data;
1028
- return openpgp.decryptSessionKeys({
1029
- message: await openpgp.message.readArmored(msgAsciiArmored),
1030
- passwords: [password1, password2]
1031
- });
1032
-
1033
- }).then(async function (decryptedSessionKeys) {
1034
- return openpgp.decrypt({
1035
- sessionKeys: decryptedSessionKeys,
1036
- message: await openpgp.message.readArmored(msgAsciiArmored)
1037
- });
1038
-
1039
- }).then(function (decrypted) {
1040
- expect(decrypted.data).to.equal(plaintext);
1041
- });
1042
- });
1043
-
1044
- it('roundtrip workflow: encrypt twice with one password, decryptSessionKeys, only one session key', function () {
1045
- let msgAsciiArmored;
1046
- return openpgp.encrypt({
1047
- message: openpgp.message.fromText(plaintext),
1048
- passwords: [password1, password1]
1049
- }).then(async function (encrypted) {
1050
- msgAsciiArmored = encrypted.data;
1051
- return openpgp.decryptSessionKeys({
1052
- message: await openpgp.message.readArmored(msgAsciiArmored),
1053
- passwords: password1
1054
- });
1055
- }).then(async function (decryptedSessionKeys) {
1056
- expect(decryptedSessionKeys.length).to.equal(1);
1057
- return openpgp.decrypt({
1058
- sessionKeys: decryptedSessionKeys,
1059
- message: await openpgp.message.readArmored(msgAsciiArmored)
1060
- });
1061
- }).then(function (decrypted) {
1062
- expect(decrypted.data).to.equal(plaintext);
1063
- });
1064
- });
1065
- });
1066
-
1067
- describe('AES / RSA encrypt, decrypt, sign, verify', function() {
1068
- const wrong_pubkey = '-----BEGIN PGP PUBLIC KEY BLOCK-----\r\n' +
1069
- 'Version: OpenPGP.js v0.9.0\r\n' +
1070
- 'Comment: Hoodiecrow - https://hoodiecrow.com\r\n' +
1071
- '\r\n' +
1072
- 'xk0EUlhMvAEB/2MZtCUOAYvyLFjDp3OBMGn3Ev8FwjzyPbIF0JUw+L7y2XR5\r\n' +
1073
- 'RVGvbK88unV3cU/1tOYdNsXI6pSp/Ztjyv7vbBUAEQEAAc0pV2hpdGVvdXQg\r\n' +
1074
- 'VXNlciA8d2hpdGVvdXQudGVzdEB0LW9ubGluZS5kZT7CXAQQAQgAEAUCUlhM\r\n' +
1075
- 'vQkQ9vYOm0LN/0wAAAW4Af9C+kYW1AvNWmivdtr0M0iYCUjM9DNOQH1fcvXq\r\n' +
1076
- 'IiN602mWrkd8jcEzLsW5IUNzVPLhrFIuKyBDTpLnC07Loce1\r\n' +
1077
- '=6XMW\r\n' +
1078
- '-----END PGP PUBLIC KEY BLOCK-----\r\n\r\n';
1079
-
1080
- let decryptedPrivateKey;
1081
- beforeEach(async function() {
1082
- if (!decryptedPrivateKey) {
1083
- expect(await privateKey.keys[0].decrypt(passphrase)).to.be.true;
1084
- decryptedPrivateKey = privateKey;
1085
- }
1086
- privateKey = decryptedPrivateKey;
1087
- });
1088
-
1089
- it('should encrypt then decrypt', function () {
1090
- const encOpt = {
1091
- message: openpgp.message.fromText(plaintext),
1092
- publicKeys: publicKey.keys
1093
- };
1094
- const decOpt = {
1095
- privateKeys: privateKey.keys
1096
- };
1097
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1098
- expect(encrypted.data).to.match(/^-----BEGIN PGP MESSAGE/);
1099
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1100
- return openpgp.decrypt(decOpt);
1101
- }).then(function (decrypted) {
1102
- expect(decrypted.data).to.equal(plaintext);
1103
- expect(decrypted.signatures).to.exist;
1104
- expect(decrypted.signatures.length).to.equal(0);
1105
- });
1106
- });
1107
-
1108
- it('should encrypt then decrypt with multiple private keys', async function () {
1109
- const privKeyDE = (await openpgp.key.readArmored(priv_key_de)).keys[0];
1110
- await privKeyDE.decrypt(passphrase);
1111
-
1112
- const encOpt = {
1113
- message: openpgp.message.fromText(plaintext),
1114
- publicKeys: publicKey.keys
1115
- };
1116
- const decOpt = {
1117
- privateKeys: [privKeyDE, privateKey.keys[0]]
1118
- };
1119
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1120
- expect(encrypted.data).to.match(/^-----BEGIN PGP MESSAGE/);
1121
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1122
- return openpgp.decrypt(decOpt);
1123
- }).then(function (decrypted) {
1124
- expect(decrypted.data).to.equal(plaintext);
1125
- expect(decrypted.signatures).to.exist;
1126
- expect(decrypted.signatures.length).to.equal(0);
1127
- });
1128
- });
1129
-
1130
- it('should encrypt then decrypt with wildcard', function () {
1131
- const encOpt = {
1132
- message: openpgp.message.fromText(plaintext),
1133
- publicKeys: publicKey.keys,
1134
- wildcard: true
1135
- };
1136
- const decOpt = {
1137
- privateKeys: privateKey.keys
1138
- };
1139
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1140
- expect(encrypted.data).to.match(/^-----BEGIN PGP MESSAGE/);
1141
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1142
- return openpgp.decrypt(decOpt);
1143
- }).then(function (decrypted) {
1144
- expect(decrypted.data).to.equal(plaintext);
1145
- expect(decrypted.signatures).to.exist;
1146
- expect(decrypted.signatures.length).to.equal(0);
1147
- });
1148
- });
1149
-
1150
- it('should encrypt then decrypt with wildcard with multiple private keys', async function () {
1151
- const privKeyDE = (await openpgp.key.readArmored(priv_key_de)).keys[0];
1152
- await privKeyDE.decrypt(passphrase);
1153
-
1154
- const encOpt = {
1155
- message: openpgp.message.fromText(plaintext),
1156
- publicKeys: publicKey.keys,
1157
- wildcard: true
1158
- };
1159
- const decOpt = {
1160
- privateKeys: [privKeyDE, privateKey.keys[0]]
1161
- };
1162
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1163
- expect(encrypted.data).to.match(/^-----BEGIN PGP MESSAGE/);
1164
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1165
- return openpgp.decrypt(decOpt);
1166
- }).then(function (decrypted) {
1167
- expect(decrypted.data).to.equal(plaintext);
1168
- expect(decrypted.signatures).to.exist;
1169
- expect(decrypted.signatures.length).to.equal(0);
1170
- });
1171
- });
1172
-
1173
- it('should encrypt then decrypt using returned session key', function () {
1174
- const encOpt = {
1175
- message: openpgp.message.fromText(plaintext),
1176
- publicKeys: publicKey.keys,
1177
- returnSessionKey: true
1178
- };
1179
-
1180
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1181
- expect(encrypted.data).to.match(/^-----BEGIN PGP MESSAGE/);
1182
- const decOpt = {
1183
- sessionKeys: encrypted.sessionKey,
1184
- message: await openpgp.message.readArmored(encrypted.data)
1185
- };
1186
- return openpgp.decrypt(decOpt);
1187
- }).then(function (decrypted) {
1188
- expect(decrypted.data).to.equal(plaintext);
1189
- expect(decrypted.signatures).to.exist;
1190
- expect(decrypted.signatures.length).to.equal(0);
1191
- });
1192
- });
1193
-
1194
- it('should encrypt using custom session key and decrypt using session key', async function () {
1195
- const sessionKey = {
1196
- data: await openpgp.crypto.generateSessionKey('aes256'),
1197
- algorithm: 'aes256'
1198
- };
1199
- const encOpt = {
1200
- message: openpgp.message.fromText(plaintext),
1201
- sessionKey: sessionKey,
1202
- publicKeys: publicKey.keys
1203
- };
1204
- const decOpt = {
1205
- sessionKeys: sessionKey
1206
- };
1207
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1208
- expect(encrypted.data).to.match(/^-----BEGIN PGP MESSAGE/);
1209
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1210
- expect(!!decOpt.message.packets.findPacket(openpgp.enums.packet.symEncryptedAEADProtected)).to.equal(false);
1211
- return openpgp.decrypt(decOpt);
1212
- }).then(function (decrypted) {
1213
- expect(decrypted.data).to.equal(plaintext);
1214
- });
1215
- });
1216
-
1217
- it('should encrypt using custom session key and decrypt using private key', async function () {
1218
- const sessionKey = {
1219
- data: await openpgp.crypto.generateSessionKey('aes128'),
1220
- algorithm: 'aes128'
1221
- };
1222
- const encOpt = {
1223
- message: openpgp.message.fromText(plaintext),
1224
- sessionKey: sessionKey,
1225
- publicKeys: publicKey.keys
1226
- };
1227
- const decOpt = {
1228
- privateKeys: privateKey.keys[0]
1229
- };
1230
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1231
- expect(encrypted.data).to.match(/^-----BEGIN PGP MESSAGE/);
1232
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1233
- expect(!!decOpt.message.packets.findPacket(openpgp.enums.packet.symEncryptedAEADProtected)).to.equal(false);
1234
- return openpgp.decrypt(decOpt);
1235
- }).then(function (decrypted) {
1236
- expect(decrypted.data).to.equal(plaintext);
1237
- });
1238
- });
1239
-
1240
- it('should encrypt/sign and decrypt/verify', function () {
1241
- const encOpt = {
1242
- message: openpgp.message.fromText(plaintext),
1243
- publicKeys: publicKey.keys,
1244
- privateKeys: privateKey.keys
1245
- };
1246
- const decOpt = {
1247
- privateKeys: privateKey.keys[0],
1248
- publicKeys: publicKey.keys
1249
- };
1250
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1251
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1252
- expect(!!decOpt.message.packets.findPacket(openpgp.enums.packet.symEncryptedAEADProtected)).to.equal(openpgp.config.aead_protect);
1253
- return openpgp.decrypt(decOpt);
1254
- }).then(async function (decrypted) {
1255
- expect(decrypted.data).to.equal(plaintext);
1256
- expect(decrypted.signatures[0].valid).to.be.true;
1257
- const signingKey = await privateKey.keys[0].getSigningKey();
1258
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1259
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1260
- });
1261
- });
1262
-
1263
- it('should encrypt/sign and decrypt/verify (no AEAD support)', function () {
1264
- const encOpt = {
1265
- message: openpgp.message.fromText(plaintext),
1266
- publicKeys: publicKeyNoAEAD.keys,
1267
- privateKeys: privateKey.keys
1268
- };
1269
- const decOpt = {
1270
- privateKeys: privateKey.keys[0],
1271
- publicKeys: publicKeyNoAEAD.keys
1272
- };
1273
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1274
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1275
- expect(!!decOpt.message.packets.findPacket(openpgp.enums.packet.symEncryptedAEADProtected)).to.equal(false);
1276
- return openpgp.decrypt(decOpt);
1277
- }).then(async function (decrypted) {
1278
- expect(decrypted.data).to.equal(plaintext);
1279
- expect(decrypted.signatures[0].valid).to.be.true;
1280
- const signingKey = await privateKey.keys[0].getSigningKey();
1281
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1282
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1283
- });
1284
- });
1285
-
1286
- it('should encrypt/sign and decrypt/verify with generated key', function () {
1287
- const genOpt = {
1288
- userIds: [{ name: 'Test User', email: 'text@example.com' }],
1289
- numBits: 512
1290
- };
1291
- if (openpgp.util.getWebCryptoAll()) { genOpt.numBits = 2048; } // webkit webcrypto accepts minimum 2048 bit keys
1292
-
1293
- return openpgp.generateKey(genOpt).then(async function(newKey) {
1294
- const newPublicKey = await openpgp.key.readArmored(newKey.publicKeyArmored);
1295
- const newPrivateKey = await openpgp.key.readArmored(newKey.privateKeyArmored);
1296
-
1297
- const encOpt = {
1298
- message: openpgp.message.fromText(plaintext),
1299
- publicKeys: newPublicKey.keys,
1300
- privateKeys: newPrivateKey.keys
1301
- };
1302
- const decOpt = {
1303
- privateKeys: newPrivateKey.keys[0],
1304
- publicKeys: newPublicKey.keys
1305
- };
1306
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1307
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1308
- expect(!!decOpt.message.packets.findPacket(openpgp.enums.packet.symEncryptedAEADProtected)).to.equal(openpgp.config.aead_protect);
1309
- return openpgp.decrypt(decOpt);
1310
- }).then(async function (decrypted) {
1311
- expect(decrypted.data).to.equal(plaintext);
1312
- expect(decrypted.signatures[0].valid).to.be.true;
1313
- const signingKey = await newPrivateKey.keys[0].getSigningKey();
1314
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1315
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1316
- });
1317
- });
1318
- });
1319
-
1320
- it('should encrypt/sign and decrypt/verify with generated key and detached signatures', function () {
1321
- const genOpt = {
1322
- userIds: [{ name: 'Test User', email: 'text@example.com' }],
1323
- numBits: 512
1324
- };
1325
- if (openpgp.util.getWebCryptoAll()) { genOpt.numBits = 2048; } // webkit webcrypto accepts minimum 2048 bit keys
1326
-
1327
- return openpgp.generateKey(genOpt).then(async function(newKey) {
1328
- const newPublicKey = await openpgp.key.readArmored(newKey.publicKeyArmored);
1329
- const newPrivateKey = await openpgp.key.readArmored(newKey.privateKeyArmored);
1330
-
1331
- const encOpt = {
1332
- message: openpgp.message.fromText(plaintext),
1333
- publicKeys: newPublicKey.keys,
1334
- privateKeys: newPrivateKey.keys,
1335
- detached: true
1336
- };
1337
- const decOpt = {
1338
- privateKeys: newPrivateKey.keys[0],
1339
- publicKeys: newPublicKey.keys
1340
- };
1341
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1342
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1343
- decOpt.signature = await openpgp.signature.readArmored(encrypted.signature);
1344
- expect(!!decOpt.message.packets.findPacket(openpgp.enums.packet.symEncryptedAEADProtected)).to.equal(openpgp.config.aead_protect);
1345
- return openpgp.decrypt(decOpt);
1346
- }).then(async function (decrypted) {
1347
- expect(decrypted.data).to.equal(plaintext);
1348
- expect(decrypted.signatures[0].valid).to.be.true;
1349
- const signingKey = await newPrivateKey.keys[0].getSigningKey();
1350
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1351
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1352
- });
1353
- });
1354
- });
1355
-
1356
- it('should encrypt/sign and decrypt/verify with null string input', function () {
1357
- const encOpt = {
1358
- message: openpgp.message.fromText(''),
1359
- publicKeys: publicKey.keys,
1360
- privateKeys: privateKey.keys
1361
- };
1362
- const decOpt = {
1363
- privateKeys: privateKey.keys[0],
1364
- publicKeys: publicKey.keys
1365
- };
1366
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1367
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1368
- return openpgp.decrypt(decOpt);
1369
- }).then(async function (decrypted) {
1370
- expect(decrypted.data).to.equal('');
1371
- expect(decrypted.signatures[0].valid).to.be.true;
1372
- const signingKey = await privateKey.keys[0].getSigningKey();
1373
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1374
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1375
- });
1376
- });
1377
-
1378
- it('should encrypt/sign and decrypt/verify with detached signatures', function () {
1379
- const encOpt = {
1380
- message: openpgp.message.fromText(plaintext),
1381
- publicKeys: publicKey.keys,
1382
- privateKeys: privateKey.keys,
1383
- detached: true
1384
- };
1385
- const decOpt = {
1386
- privateKeys: privateKey.keys[0],
1387
- publicKeys: publicKey.keys
1388
- };
1389
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1390
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1391
- decOpt.signature = await openpgp.signature.readArmored(encrypted.signature);
1392
- return openpgp.decrypt(decOpt);
1393
- }).then(async function (decrypted) {
1394
- expect(decrypted.data).to.equal(plaintext);
1395
- expect(decrypted.signatures[0].valid).to.be.true;
1396
- const signingKey = await privateKey.keys[0].getSigningKey();
1397
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1398
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1399
- });
1400
- });
1401
-
1402
- it('should encrypt and decrypt/verify with detached signature input and detached flag set for encryption', function () {
1403
- const signOpt = {
1404
- message: openpgp.message.fromText(plaintext),
1405
- privateKeys: privateKey.keys[0],
1406
- detached: true
1407
- };
1408
-
1409
- const encOpt = {
1410
- message: openpgp.message.fromText(plaintext),
1411
- publicKeys: publicKey.keys,
1412
- detached: true
1413
- };
1414
-
1415
- const decOpt = {
1416
- privateKeys: privateKey.keys[0],
1417
- publicKeys: publicKey.keys[0]
1418
- };
1419
-
1420
- return openpgp.sign(signOpt).then(async function (signed) {
1421
- encOpt.signature = await openpgp.signature.readArmored(signed.signature);
1422
- return openpgp.encrypt(encOpt);
1423
- }).then(async function (encrypted) {
1424
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1425
- decOpt.signature = await openpgp.signature.readArmored(encrypted.signature);
1426
- return openpgp.decrypt(decOpt);
1427
- }).then(async function (decrypted) {
1428
- expect(decrypted.data).to.equal(plaintext);
1429
- expect(decrypted.signatures[0].valid).to.be.true;
1430
- const signingKey = await privateKey.keys[0].getSigningKey();
1431
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1432
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1433
- });
1434
- });
1435
-
1436
- it('should encrypt and decrypt/verify with detached signature as input and detached flag not set for encryption', async function () {
1437
- const plaintext = "  \t┍ͤ޵၂༫዇◧˘˻ᙑ᎚⏴ំந⛑nٓኵΉⅶ⋋ŵ⋲΂ͽᣏ₅ᄶɼ┋⌔û᬴Ƚᔡᧅ≃ṱἆ⃷݂૿ӌ᰹෇ٹჵ⛇໶⛌  \t\n한국어/조선말";
1438
-
1439
- const privKeyDE = (await openpgp.key.readArmored(priv_key_de)).keys[0];
1440
- await privKeyDE.decrypt(passphrase);
1441
-
1442
- const pubKeyDE = (await openpgp.key.readArmored(pub_key_de)).keys[0];
1443
-
1444
- const signOpt = {
1445
- message: openpgp.message.fromText(plaintext),
1446
- privateKeys: privKeyDE,
1447
- detached: true
1448
- };
1449
-
1450
- const encOpt = {
1451
- message: openpgp.message.fromText(plaintext),
1452
- publicKeys: publicKey.keys,
1453
- privateKeys: privateKey.keys[0]
1454
- };
1455
-
1456
- const decOpt = {
1457
- privateKeys: privateKey.keys[0],
1458
- publicKeys: [publicKey.keys[0], pubKeyDE]
1459
- };
1460
-
1461
- return openpgp.sign(signOpt).then(async function (signed) {
1462
- encOpt.signature = await openpgp.signature.readArmored(signed.signature);
1463
- return openpgp.encrypt(encOpt);
1464
- }).then(async function (encrypted) {
1465
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1466
- return openpgp.decrypt(decOpt);
1467
- }).then(async function (decrypted) {
1468
- let signingKey;
1469
- expect(decrypted.data).to.equal(plaintext);
1470
- expect(decrypted.signatures[0].valid).to.be.true;
1471
- signingKey = await privateKey.keys[0].getSigningKey();
1472
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1473
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1474
- expect(decrypted.signatures[1].valid).to.be.true;
1475
- signingKey = await privKeyDE.getSigningKey();
1476
- expect(decrypted.signatures[1].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1477
- expect(decrypted.signatures[1].signature.packets.length).to.equal(1);
1478
- });
1479
- });
1480
-
1481
- it('should fail to encrypt and decrypt/verify with detached signature input and detached flag set for encryption with wrong public key', async function () {
1482
- const signOpt = {
1483
- message: openpgp.message.fromText(plaintext),
1484
- privateKeys: privateKey.keys,
1485
- detached: true
1486
- };
1487
-
1488
- const encOpt = {
1489
- message: openpgp.message.fromText(plaintext),
1490
- publicKeys: publicKey.keys,
1491
- detached: true
1492
- };
1493
-
1494
- const decOpt = {
1495
- privateKeys: privateKey.keys[0],
1496
- publicKeys: (await openpgp.key.readArmored(wrong_pubkey)).keys
1497
- };
1498
-
1499
- return openpgp.sign(signOpt).then(async function (signed) {
1500
- encOpt.signature = await openpgp.signature.readArmored(signed.signature);
1501
- return openpgp.encrypt(encOpt);
1502
- }).then(async function (encrypted) {
1503
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1504
- decOpt.signature = await openpgp.signature.readArmored(encrypted.signature);
1505
- return openpgp.decrypt(decOpt);
1506
- }).then(async function (decrypted) {
1507
- expect(decrypted.data).to.equal(plaintext);
1508
- expect(decrypted.signatures[0].valid).to.be.null;
1509
- const signingKey = await privateKey.keys[0].getSigningKey();
1510
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1511
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1512
- });
1513
- });
1514
-
1515
- it('should fail to encrypt and decrypt/verify with detached signature as input and detached flag not set for encryption with wrong public key', async function () {
1516
- const signOpt = {
1517
- message: openpgp.message.fromText(plaintext),
1518
- privateKeys: privateKey.keys,
1519
- detached: true
1520
- };
1521
-
1522
- const encOpt = {
1523
- message: openpgp.message.fromText(plaintext),
1524
- publicKeys: publicKey.keys
1525
- };
1526
-
1527
- const decOpt = {
1528
- privateKeys: privateKey.keys[0],
1529
- publicKeys: (await openpgp.key.readArmored(wrong_pubkey)).keys
1530
- };
1531
-
1532
- return openpgp.sign(signOpt).then(async function (signed) {
1533
- encOpt.signature = await openpgp.signature.readArmored(signed.signature);
1534
- return openpgp.encrypt(encOpt);
1535
- }).then(async function (encrypted) {
1536
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1537
- return openpgp.decrypt(decOpt);
1538
- }).then(async function (decrypted) {
1539
- expect(decrypted.data).to.equal(plaintext);
1540
- expect(decrypted.signatures[0].valid).to.be.null;
1541
- const signingKey = await privateKey.keys[0].getSigningKey();
1542
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1543
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1544
- });
1545
- });
1546
-
1547
- it('should fail to verify decrypted data with wrong public pgp key', async function () {
1548
- const encOpt = {
1549
- message: openpgp.message.fromText(plaintext),
1550
- publicKeys: publicKey.keys,
1551
- privateKeys: privateKey.keys
1552
- };
1553
- const decOpt = {
1554
- privateKeys: privateKey.keys[0],
1555
- publicKeys: (await openpgp.key.readArmored(wrong_pubkey)).keys
1556
- };
1557
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1558
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1559
- return openpgp.decrypt(decOpt);
1560
- }).then(async function (decrypted) {
1561
- expect(decrypted.data).to.equal(plaintext);
1562
- expect(decrypted.signatures[0].valid).to.be.null;
1563
- const signingKey = await privateKey.keys[0].getSigningKey();
1564
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1565
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1566
- });
1567
- });
1568
-
1569
- it('should fail to verify decrypted null string with wrong public pgp key', async function () {
1570
- const encOpt = {
1571
- message: openpgp.message.fromText(''),
1572
- publicKeys: publicKey.keys,
1573
- privateKeys: privateKey.keys
1574
- };
1575
- const decOpt = {
1576
- privateKeys: privateKey.keys[0],
1577
- publicKeys: (await openpgp.key.readArmored(wrong_pubkey)).keys
1578
- };
1579
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1580
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1581
- return openpgp.decrypt(decOpt);
1582
- }).then(async function (decrypted) {
1583
- expect(decrypted.data).to.equal('');
1584
- expect(decrypted.signatures[0].valid).to.be.null;
1585
- const signingKey = await privateKey.keys[0].getSigningKey();
1586
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1587
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1588
- });
1589
- });
1590
-
1591
- it('should successfully decrypt signed message without public keys to verify', async function () {
1592
- const encOpt = {
1593
- message: openpgp.message.fromText(plaintext),
1594
- publicKeys: publicKey.keys,
1595
- privateKeys: privateKey.keys
1596
- };
1597
- const decOpt = {
1598
- privateKeys: privateKey.keys[0]
1599
- };
1600
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1601
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1602
- return openpgp.decrypt(decOpt);
1603
- }).then(async function (decrypted) {
1604
- expect(decrypted.data).to.equal(plaintext);
1605
- expect(decrypted.signatures[0].valid).to.be.null;
1606
- const signingKey = await privateKey.keys[0].getSigningKey();
1607
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1608
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1609
- });
1610
- });
1611
-
1612
- it('should fail to verify decrypted data with wrong public pgp key with detached signatures', async function () {
1613
- const encOpt = {
1614
- message: openpgp.message.fromText(plaintext),
1615
- publicKeys: publicKey.keys,
1616
- privateKeys: privateKey.keys,
1617
- detached: true
1618
- };
1619
- const decOpt = {
1620
- privateKeys: privateKey.keys[0],
1621
- publicKeys: (await openpgp.key.readArmored(wrong_pubkey)).keys
1622
- };
1623
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1624
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1625
- decOpt.signature = await openpgp.signature.readArmored(encrypted.signature);
1626
- return openpgp.decrypt(decOpt);
1627
- }).then(async function (decrypted) {
1628
- expect(decrypted.data).to.equal(plaintext);
1629
- expect(decrypted.signatures[0].valid).to.be.null;
1630
- const signingKey = await privateKey.keys[0].getSigningKey();
1631
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1632
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1633
- });
1634
- });
1635
-
1636
- it('should encrypt and decrypt/verify both signatures when signed with two private keys', async function () {
1637
- const privKeyDE = (await openpgp.key.readArmored(priv_key_de)).keys[0];
1638
- await privKeyDE.decrypt(passphrase);
1639
-
1640
- const pubKeyDE = (await openpgp.key.readArmored(pub_key_de)).keys[0];
1641
-
1642
- const encOpt = {
1643
- message: openpgp.message.fromText(plaintext),
1644
- publicKeys: publicKey.keys,
1645
- privateKeys: [privateKey.keys[0], privKeyDE]
1646
- };
1647
-
1648
- const decOpt = {
1649
- privateKeys: privateKey.keys[0],
1650
- publicKeys: [publicKey.keys[0], pubKeyDE]
1651
- };
1652
-
1653
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1654
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1655
- return openpgp.decrypt(decOpt);
1656
- }).then(async function (decrypted) {
1657
- let signingKey;
1658
- expect(decrypted.data).to.equal(plaintext);
1659
- expect(decrypted.signatures[0].valid).to.be.true;
1660
- signingKey = await privateKey.keys[0].getSigningKey();
1661
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1662
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1663
- expect(decrypted.signatures[1].valid).to.be.true;
1664
- signingKey = await privKeyDE.getSigningKey();
1665
- expect(decrypted.signatures[1].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1666
- expect(decrypted.signatures[1].signature.packets.length).to.equal(1);
1667
- });
1668
- });
1669
-
1670
- it('should fail to decrypt modified message', async function() {
1671
- const { privateKeyArmored } = await openpgp.generateKey({ curve: 'curve25519', userIds: [{ email: 'test@email.com' }] });
1672
- const { keys: [key] } = await openpgp.key.readArmored(privateKeyArmored);
1673
- const { data } = await openpgp.encrypt({ message: openpgp.message.fromBinary(new Uint8Array(500)), publicKeys: [key.toPublic()] });
1674
- let badSumEncrypted = data.replace(/\n=[a-zA-Z0-9/+]{4}/, '\n=aaaa');
1675
- if (badSumEncrypted === data) { // checksum was already =aaaa
1676
- badSumEncrypted = data.replace(/\n=[a-zA-Z0-9/+]{4}/, '\n=bbbb');
1677
- }
1678
- if (badSumEncrypted === data) {
1679
- throw new Error("Was not able to successfully modify checksum");
1680
- }
1681
- const badBodyEncrypted = data.replace(/\n=([a-zA-Z0-9/+]{4})/, 'aaa\n=$1');
1682
- for (let allow_streaming = 1; allow_streaming >= 0; allow_streaming--) {
1683
- openpgp.config.allow_unauthenticated_stream = !!allow_streaming;
1684
- if (openpgp.getWorker()) {
1685
- openpgp.getWorker().workers.forEach(worker => {
1686
- worker.postMessage({ event: 'configure', config: openpgp.config });
1687
- });
1688
- }
1689
- await Promise.all([badSumEncrypted, badBodyEncrypted].map(async (encrypted, i) => {
1690
- await Promise.all([
1691
- encrypted,
1692
- openpgp.stream.toStream(encrypted),
1693
- new ReadableStream({
1694
- start() {
1695
- this.remaining = encrypted.split('\n');
1696
- },
1697
- async pull(controller) {
1698
- if (this.remaining.length) {
1699
- await new Promise(res => setTimeout(res));
1700
- controller.enqueue(this.remaining.shift() + '\n');
1701
- } else {
1702
- controller.close();
1703
- }
1704
- }
1705
- })
1706
- ].map(async (encrypted, j) => {
1707
- let stepReached = 0;
1708
- try {
1709
- const message = await openpgp.message.readArmored(encrypted);
1710
- stepReached = 1;
1711
- const { data: decrypted } = await openpgp.decrypt({ message: message, privateKeys: [key] });
1712
- stepReached = 2;
1713
- await openpgp.stream.readToEnd(decrypted);
1714
- } catch (e) {
1715
- expect(e.message).to.match(/Ascii armor integrity check on message failed/);
1716
- expect(stepReached).to.equal(
1717
- j === 0 ? 0 :
1718
- (openpgp.config.aead_chunk_size_byte === 0 && (j === 2 || openpgp.util.detectNode() || openpgp.util.getHardwareConcurrency() < 8)) || (!openpgp.config.aead_protect && openpgp.config.allow_unauthenticated_stream) ? 2 :
1719
- 1
1720
- );
1721
- return;
1722
- }
1723
- throw new Error(`Expected "Ascii armor integrity check on message failed" error in subtest ${i}.${j}`);
1724
- }));
1725
- }));
1726
- }
1727
- });
1728
- });
1729
-
1730
- describe('ELG / DSA encrypt, decrypt, sign, verify', function() {
1731
-
1732
- it('round trip test', async function () {
1733
- const pubKeyDE = (await openpgp.key.readArmored(pub_key_de)).keys[0];
1734
- const privKeyDE = (await openpgp.key.readArmored(priv_key_de)).keys[0];
1735
- await privKeyDE.decrypt(passphrase);
1736
- pubKeyDE.users[0].selfCertifications[0].features = [7]; // Monkey-patch AEAD feature flag
1737
- return openpgp.encrypt({
1738
- publicKeys: pubKeyDE,
1739
- privateKeys: privKeyDE,
1740
- message: openpgp.message.fromText(plaintext)
1741
- }).then(async function (encrypted) {
1742
- return openpgp.decrypt({
1743
- privateKeys: privKeyDE,
1744
- publicKeys: pubKeyDE,
1745
- message: await openpgp.message.readArmored(encrypted.data)
1746
- });
1747
- }).then(async function (decrypted) {
1748
- expect(decrypted.data).to.exist;
1749
- expect(decrypted.data).to.equal(plaintext);
1750
- expect(decrypted.signatures[0].valid).to.be.true;
1751
- const signingKey = await privKeyDE.getSigningKey();
1752
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1753
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1754
- });
1755
- });
1756
- });
1757
-
1758
- describe("3DES decrypt", function() {
1759
- const pgp_msg =
1760
- ['-----BEGIN PGP MESSAGE-----',
1761
- 'Version: GnuPG/MacGPG2 v2.0.19 (Darwin)',
1762
- 'Comment: GPGTools - https://gpgtools.org',
1763
- '',
1764
- 'hIwDBU4Dycfvp2EBA/9tuhQgOrcATcm2PRmIOcs6q947YhlsBTZZdVJDfVjkKlyM',
1765
- 'M0yE+lnNplWb041Cpfkkl6IvorKQd2iPbAkOL0IXwmVN41l+PvVgMcuFvvzetehG',
1766
- 'Ca0/VEYOaTZRNqyr9FIzcnVy1I/PaWT3iqVAYa+G8TEA5Dh9RLfsx8ZA9UNIaNI+',
1767
- 'ASm9aZ3H6FerNhm8RezDY5vRn6xw3o/wH5YEBvV2BEmmFKZ2BlqFQxqChr8UNwd1',
1768
- 'Ieebnq0HtBPE8YU/L0U=',
1769
- '=JyIa',
1770
- '-----END PGP MESSAGE-----'].join('\n');
1771
-
1772
- const priv_key =
1773
- ['-----BEGIN PGP PRIVATE KEY BLOCK-----',
1774
- 'Version: GnuPG/MacGPG2 v2.0.19 (Darwin)',
1775
- 'Comment: GPGTools - https://gpgtools.org',
1776
- '',
1777
- 'lQH+BFLqLegBBAC/rN3g30Jrcpx5lTb7Kxe+ZfS7ppOIoBjjN+qcOh81cJJVS5dT',
1778
- 'UGcDsm2tCLVS3P2dGaYhfU9fsoSq/wK/tXsdoWXvXdjHbbueyi1kTZqlnyT190UE',
1779
- 'vmDxH0yqquvUaf7+CNXC0T6l9gGS9p0x7xNydWRb7zeK1wIsYI+dRGQmzQARAQAB',
1780
- '/gMDArgQHMknurQXy0Pho3Nsdu6zCUNXuplvaSXruefKsQn6eexGPnecNTT2iy5N',
1781
- '70EK371D7GcNhhLsn8roUcj1Hi3kR14wXW7lcQBy9RRbbglIJXIqKJ8ywBEO8BaQ',
1782
- 'b0plL+w5A9EvX0BQc4d53MTqySh6POsEDOxPzH4D/JWbaozfmc4LfGDqH1gl7ebY',
1783
- 'iu81vnBuuskjpz8rxRI81MldJEIObrTE2x46DF7AmS6L6u/Qz3AAmZd89p5INCdx',
1784
- 'DemxzuMKpC3wSgdgSSKHHTKiNOMxiRd5mFH5v1KVcEG/TyXFlmah7RwA4rA4fjeo',
1785
- 'OpnbVWp6ciUniRvgLaCMMbmolAoho9zaLbPzCQVQ8F7gkrjnnPm4MKA+AUXmjt7t',
1786
- 'VrrYkyTp1pxLZyUWX9+aKoxEO9OIDz7p9Mh02BZ/tznQ7U+IV2bcNhwrL6LPk4Mb',
1787
- 'J4YF/cLVxFVVma88GSFikSjPf30AUty5nBQFtbFGqnPctCF0aHJvd2F3YXkgPHRo',
1788
- 'cm93YXdheUBleGFtcGxlLmNvbT6IuAQTAQIAIgUCUuot6AIbAwYLCQgHAwIGFQgC',
1789
- 'CQoLBBYCAwECHgECF4AACgkQkk2hoj5duD/HZQP/ZXJ8PSlA1oj1NW97ccT0LiNH',
1790
- 'WzxPPoH9a/qGQYg61jp+aTa0C5hlYY/GgeFpiZlpwVUtlkZYfslXJqbCcp3os4xt',
1791
- 'kiukDbPnq2Y41wNVxXrDw6KbOjohbhzeRUh8txbkiXGiwHtHBSJsPMntN6cB3vn3',
1792
- '08eE69vOiHPQfowa2CmdAf4EUuot6AEEAOQpNjkcTUo14JQ2o+mrpxj5yXbGtZKh',
1793
- 'D8Ll+aZZrIDIa44p9KlQ3aFzPxdmFBiBX57m1nQukr58FQ5Y/FuQ1dKYc3M8QdZL',
1794
- 'vCKDC8D9ZJf13iwUjYkfn/e/bDqCS2piyd63zI0xDJo+s2bXCIJxgrhbOqFDeFd6',
1795
- '4W8PfBOvUuRjABEBAAH+AwMCuBAcySe6tBfLV0P5MbBesR3Ifu/ppjzLoXKhwkqm',
1796
- 'PXf09taLcRfUHeMbPjboj2P2m2UOnSrbXK9qsDQ8XOMtdsEWGLWpmiqnMlkiOchv',
1797
- 'MsNRYpZ67iX3JVdxNuhs5+g5bdP1PNVbKiTzx73u1h0SS93IJp1jFj50/kyGl1Eq',
1798
- 'tkr0TWe5uXCh6cSZDPwhto0a12GeDHehdTw6Yq4KoZHccneHhN9ySFy0DZOeULIi',
1799
- 'Y61qtR0io52T7w69fBe9Q5/d5SwpwWKMpCTOqvvzdHX7JmeFtV+2vRVilIif7AfP',
1800
- 'AD+OjQ/OhMu3jYO+XNhm3raPT2tIBsBdl2UiHOnj4AUNuLuUJeVghtz4Qt6dvjyz',
1801
- 'PlBvSF+ESqALjM8IqnG15FX4LmEDFrFcfNCsnmeyZ2nr1h2mV5jOON0EmBtCyhCt',
1802
- 'D/Ivi4/SZk+tBVhsBI+7ZECZYDJzZQnyPDsUv31MU4OwdWi7FhzHvDj/0bhYY7+I',
1803
- 'nwQYAQIACQUCUuot6AIbDAAKCRCSTaGiPl24PwYAA/sGIHvCKWP5+4ZlBHuOdbP9',
1804
- '9v3PXFCm61qFEL0DTSq7NgBcuf0ASRElRI3wIKlfkwaiSzVPfNLiMTexdc7XaiTz',
1805
- 'CHaOn1Xl2gmYTq2KiJkgtLuwptYU1iSj7vvSHKy0+nYIckOZB4pRCOjknT08O4ZJ',
1806
- '22q10ausyQXoOxXfDWVwKA==',
1807
- '=IkKW',
1808
- '-----END PGP PRIVATE KEY BLOCK-----'].join('\n');
1809
-
1810
- it('Decrypt message', async function() {
1811
- const privKey = (await openpgp.key.readArmored(priv_key)).keys[0];
1812
- await privKey.decrypt('1234');
1813
- const message = await openpgp.message.readArmored(pgp_msg);
1814
-
1815
- return openpgp.decrypt({ privateKeys:privKey, message:message }).then(function(decrypted) {
1816
- expect(decrypted.data).to.equal('hello 3des\n');
1817
- expect(decrypted.signatures.length).to.equal(0);
1818
- });
1819
- });
1820
- });
1821
-
1822
- describe('AES encrypt, decrypt', function() {
1823
-
1824
- it('should encrypt and decrypt with one password', function () {
1825
- const encOpt = {
1826
- message: openpgp.message.fromText(plaintext),
1827
- passwords: password1
1828
- };
1829
- const decOpt = {
1830
- passwords: password1
1831
- };
1832
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1833
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1834
- return openpgp.decrypt(decOpt);
1835
- }).then(function (decrypted) {
1836
- expect(decrypted.data).to.equal(plaintext);
1837
- expect(decrypted.signatures.length).to.equal(0);
1838
- });
1839
- });
1840
-
1841
- it('should encrypt and decrypt with two passwords', function () {
1842
- const encOpt = {
1843
- message: openpgp.message.fromText(plaintext),
1844
- passwords: [password1, password2]
1845
- };
1846
- const decOpt = {
1847
- passwords: password2
1848
- };
1849
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1850
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1851
- return openpgp.decrypt(decOpt);
1852
- }).then(function (decrypted) {
1853
- expect(decrypted.data).to.equal(plaintext);
1854
- expect(decrypted.signatures.length).to.equal(0);
1855
- });
1856
- });
1857
-
1858
- it('should encrypt and decrypt with password and not ascii armor', function () {
1859
- const encOpt = {
1860
- message: openpgp.message.fromText(plaintext),
1861
- passwords: password1,
1862
- armor: false
1863
- };
1864
- const decOpt = {
1865
- passwords: password1
1866
- };
1867
- return openpgp.encrypt(encOpt).then(function (encrypted) {
1868
- decOpt.message = encrypted.message;
1869
- return openpgp.decrypt(decOpt);
1870
- }).then(function (decrypted) {
1871
- expect(decrypted.data).to.equal(plaintext);
1872
- expect(decrypted.signatures.length).to.equal(0);
1873
- });
1874
- });
1875
-
1876
- it('should encrypt and decrypt with binary data and transferable objects', function () {
1877
- openpgp.config.zero_copy = true; // activate transferable objects
1878
- const encOpt = {
1879
- message: openpgp.message.fromBinary(new Uint8Array([0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01])),
1880
- passwords: password1,
1881
- armor: false
1882
- };
1883
- const decOpt = {
1884
- passwords: password1,
1885
- format: 'binary'
1886
- };
1887
- return openpgp.encrypt(encOpt).then(function (encrypted) {
1888
- decOpt.message = encrypted.message;
1889
- return openpgp.decrypt(decOpt);
1890
- }).then(function (decrypted) {
1891
- if (openpgp.getWorker()) {
1892
- if (navigator.userAgent.indexOf('Safari') !== -1 && (navigator.userAgent.indexOf('Version/11.1') !== -1 || (navigator.userAgent.match(/Chrome\/(\d+)/) || [])[1] < 56)) {
1893
- expect(encOpt.message.packets[0].data.byteLength).to.equal(8); // browser doesn't support transfering buffers
1894
- } else {
1895
- expect(encOpt.message.packets[0].data.byteLength).to.equal(0); // transferred buffer should be empty
1896
- }
1897
- }
1898
- expect(decrypted.data).to.deep.equal(new Uint8Array([0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01]));
1899
- expect(decrypted.signatures.length).to.equal(0);
1900
- });
1901
- });
1902
- });
1903
-
1904
- describe('Encrypt, decrypt with compression', function() {
1905
- withCompression(function (modifyCompressionEncryptOptions, verifyCompressionDecrypted) {
1906
- it('should encrypt and decrypt with one password', function () {
1907
- const encOpt = modifyCompressionEncryptOptions({
1908
- message: openpgp.message.fromText(plaintext),
1909
- passwords: password1
1910
- });
1911
- const decOpt = {
1912
- passwords: password1
1913
- };
1914
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1915
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1916
- return openpgp.decrypt(decOpt);
1917
- }).then(function (decrypted) {
1918
- expect(decrypted.data).to.equal(plaintext);
1919
- expect(decrypted.signatures.length).to.equal(0);
1920
- verifyCompressionDecrypted(decrypted);
1921
- });
1922
- });
1923
-
1924
- it('Streaming encrypt and decrypt small message roundtrip', async function() {
1925
- let plaintext = [];
1926
- let i = 0;
1927
- const data = new ReadableStream({
1928
- async pull(controller) {
1929
- if (i++ < 4) {
1930
- let randomBytes = await openpgp.crypto.random.getRandomBytes(10);
1931
- controller.enqueue(randomBytes);
1932
- plaintext.push(randomBytes.slice());
1933
- } else {
1934
- controller.close();
1935
- }
1936
- }
1937
- });
1938
- const encrypted = await openpgp.encrypt(modifyCompressionEncryptOptions({
1939
- message: openpgp.message.fromBinary(data),
1940
- passwords: ['test'],
1941
- }));
1942
-
1943
- const msgAsciiArmored = encrypted.data;
1944
- const message = await openpgp.message.readArmored(msgAsciiArmored);
1945
- const decrypted = await openpgp.decrypt({
1946
- passwords: ['test'],
1947
- message,
1948
- format: 'binary'
1949
- });
1950
- expect(openpgp.util.isStream(decrypted.data)).to.equal('web');
1951
- expect(await openpgp.stream.readToEnd(decrypted.data)).to.deep.equal(openpgp.util.concatUint8Array(plaintext));
1952
- });
1953
- });
1954
- });
1955
-
1956
- }
1957
-
1958
- describe('AES / RSA encrypt, decrypt, sign, verify', function() {
1959
- const wrong_pubkey = '-----BEGIN PGP PUBLIC KEY BLOCK-----\r\n' +
1960
- 'Version: OpenPGP.js v0.9.0\r\n' +
1961
- 'Comment: Hoodiecrow - https://hoodiecrow.com\r\n' +
1962
- '\r\n' +
1963
- 'xk0EUlhMvAEB/2MZtCUOAYvyLFjDp3OBMGn3Ev8FwjzyPbIF0JUw+L7y2XR5\r\n' +
1964
- 'RVGvbK88unV3cU/1tOYdNsXI6pSp/Ztjyv7vbBUAEQEAAc0pV2hpdGVvdXQg\r\n' +
1965
- 'VXNlciA8d2hpdGVvdXQudGVzdEB0LW9ubGluZS5kZT7CXAQQAQgAEAUCUlhM\r\n' +
1966
- 'vQkQ9vYOm0LN/0wAAAW4Af9C+kYW1AvNWmivdtr0M0iYCUjM9DNOQH1fcvXq\r\n' +
1967
- 'IiN602mWrkd8jcEzLsW5IUNzVPLhrFIuKyBDTpLnC07Loce1\r\n' +
1968
- '=6XMW\r\n' +
1969
- '-----END PGP PUBLIC KEY BLOCK-----\r\n\r\n';
1970
-
1971
- let decryptedPrivateKey;
1972
- beforeEach(async function() {
1973
- if (!decryptedPrivateKey) {
1974
- expect(await privateKey.keys[0].decrypt(passphrase)).to.be.true;
1975
- decryptedPrivateKey = privateKey;
1976
- }
1977
- privateKey = decryptedPrivateKey;
1978
- });
1979
-
1980
- it('should sign and verify cleartext data', function () {
1981
- const message = openpgp.cleartext.fromText(plaintext);
1982
- const signOpt = {
1983
- message,
1984
- privateKeys: privateKey.keys
1985
- };
1986
- const verifyOpt = {
1987
- publicKeys: publicKey.keys
1988
- };
1989
- return openpgp.sign(signOpt).then(async function (signed) {
1990
- expect(signed.data).to.match(/-----BEGIN PGP SIGNED MESSAGE-----/);
1991
- verifyOpt.message = await openpgp.cleartext.readArmored(signed.data);
1992
- return openpgp.verify(verifyOpt);
1993
- }).then(async function (verified) {
1994
- expect(verified.data).to.equal(plaintext.replace(/[ \t]+$/mg, ''));
1995
- expect(verified.signatures[0].valid).to.be.true;
1996
- const signingKey = await privateKey.keys[0].getSigningKey();
1997
- expect(verified.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1998
- expect(verified.signatures[0].signature.packets.length).to.equal(1);
1999
- });
2000
- });
2001
-
2002
- it('should sign and verify cleartext data with multiple private keys', async function () {
2003
- const privKeyDE = (await openpgp.key.readArmored(priv_key_de)).keys[0];
2004
- await privKeyDE.decrypt(passphrase);
2005
-
2006
- const message = openpgp.cleartext.fromText(plaintext);
2007
- const signOpt = {
2008
- message,
2009
- privateKeys: [privateKey.keys[0], privKeyDE]
2010
- };
2011
- const verifyOpt = {
2012
- publicKeys: [publicKey.keys[0], privKeyDE.toPublic()]
2013
- };
2014
- return openpgp.sign(signOpt).then(async function (signed) {
2015
- expect(signed.data).to.match(/-----BEGIN PGP SIGNED MESSAGE-----/);
2016
- verifyOpt.message = await openpgp.cleartext.readArmored(signed.data);
2017
- return openpgp.verify(verifyOpt);
2018
- }).then(async function (verified) {
2019
- let signingKey;
2020
- expect(verified.data).to.equal(plaintext.replace(/[ \t]+$/mg, ''));
2021
- expect(verified.signatures[0].valid).to.be.true;
2022
- signingKey = await privateKey.keys[0].getSigningKey();
2023
- expect(verified.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
2024
- expect(verified.signatures[0].signature.packets.length).to.equal(1);
2025
- expect(verified.signatures[1].valid).to.be.true;
2026
- signingKey = await privKeyDE.getSigningKey();
2027
- expect(verified.signatures[1].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
2028
- expect(verified.signatures[1].signature.packets.length).to.equal(1);
2029
- });
2030
- });
2031
-
2032
- it('should sign and verify cleartext data with detached signatures', function () {
2033
- const message = openpgp.cleartext.fromText(plaintext);
2034
- const signOpt = {
2035
- message,
2036
- privateKeys: privateKey.keys,
2037
- detached: true
2038
- };
2039
- const verifyOpt = {
2040
- message,
2041
- publicKeys: publicKey.keys
2042
- };
2043
- return openpgp.sign(signOpt).then(async function (signed) {
2044
- verifyOpt.signature = await openpgp.signature.readArmored(signed.signature);
2045
- return openpgp.verify(verifyOpt);
2046
- }).then(async function (verified) {
2047
- expect(verified.data).to.equal(plaintext.replace(/[ \t]+$/mg, ''));
2048
- expect(verified.signatures[0].valid).to.be.true;
2049
- const signingKey = await privateKey.keys[0].getSigningKey();
2050
- expect(verified.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
2051
- expect(verified.signatures[0].signature.packets.length).to.equal(1);
2052
- });
2053
- });
2054
-
2055
- it('should sign and fail to verify cleartext data with wrong public pgp key', async function () {
2056
- const message = openpgp.cleartext.fromText(plaintext);
2057
- const signOpt = {
2058
- message,
2059
- privateKeys: privateKey.keys
2060
- };
2061
- const verifyOpt = {
2062
- publicKeys: (await openpgp.key.readArmored(wrong_pubkey)).keys
2063
- };
2064
- return openpgp.sign(signOpt).then(async function (signed) {
2065
- verifyOpt.message = await openpgp.cleartext.readArmored(signed.data);
2066
- return openpgp.verify(verifyOpt);
2067
- }).then(async function (verified) {
2068
- expect(verified.data).to.equal(plaintext.replace(/[ \t]+$/mg, ''));
2069
- expect(verified.signatures[0].valid).to.be.null;
2070
- const signingKey = await privateKey.keys[0].getSigningKey();
2071
- expect(verified.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
2072
- expect(verified.signatures[0].signature.packets.length).to.equal(1);
2073
- });
2074
- });
2075
-
2076
- it('should sign and fail to verify cleartext data with wrong public pgp key with detached signature', async function () {
2077
- const message = openpgp.cleartext.fromText(plaintext);
2078
- const signOpt = {
2079
- message,
2080
- privateKeys: privateKey.keys,
2081
- detached: true
2082
- };
2083
- const verifyOpt = {
2084
- message,
2085
- publicKeys: (await openpgp.key.readArmored(wrong_pubkey)).keys
2086
- };
2087
- return openpgp.sign(signOpt).then(async function (signed) {
2088
- verifyOpt.signature = await openpgp.signature.readArmored(signed.signature);
2089
- return openpgp.verify(verifyOpt);
2090
- }).then(async function (verified) {
2091
- expect(verified.data).to.equal(plaintext.replace(/[ \t]+$/mg, ''));
2092
- expect(verified.signatures[0].valid).to.be.null;
2093
- const signingKey = await privateKey.keys[0].getSigningKey();
2094
- expect(verified.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
2095
- expect(verified.signatures[0].signature.packets.length).to.equal(1);
2096
- });
2097
- });
2098
-
2099
- it('should sign and verify cleartext data and not armor', function () {
2100
- const message = openpgp.cleartext.fromText(plaintext);
2101
- const signOpt = {
2102
- message,
2103
- privateKeys: privateKey.keys,
2104
- armor: false
2105
- };
2106
- const verifyOpt = {
2107
- publicKeys: publicKey.keys
2108
- };
2109
- return openpgp.sign(signOpt).then(function (signed) {
2110
- verifyOpt.message = signed.message;
2111
- return openpgp.verify(verifyOpt);
2112
- }).then(async function (verified) {
2113
- expect(verified.data).to.equal(plaintext.replace(/[ \t]+$/mg, ''));
2114
- expect(verified.signatures[0].valid).to.be.true;
2115
- const signingKey = await privateKey.keys[0].getSigningKey();
2116
- expect(verified.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
2117
- expect(verified.signatures[0].signature.packets.length).to.equal(1);
2118
- });
2119
- });
2120
-
2121
- it('should sign and verify cleartext data and not armor with detached signatures', function () {
2122
- const start = openpgp.util.normalizeDate();
2123
- const message = openpgp.cleartext.fromText(plaintext);
2124
- const signOpt = {
2125
- message,
2126
- privateKeys: privateKey.keys,
2127
- detached: true,
2128
- armor: false
2129
- };
2130
- const verifyOpt = {
2131
- message,
2132
- publicKeys: publicKey.keys
2133
- };
2134
- return openpgp.sign(signOpt).then(function (signed) {
2135
- verifyOpt.signature = signed.signature;
2136
- return openpgp.verify(verifyOpt);
2137
- }).then(async function (verified) {
2138
- expect(verified.data).to.equal(plaintext.replace(/[ \t]+$/mg, ''));
2139
- expect(+verified.signatures[0].signature.packets[0].created).to.be.lte(+openpgp.util.normalizeDate());
2140
- expect(+verified.signatures[0].signature.packets[0].created).to.be.gte(+start);
2141
- expect(verified.signatures[0].valid).to.be.true;
2142
- const signingKey = await privateKey.keys[0].getSigningKey();
2143
- expect(verified.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
2144
- expect(verified.signatures[0].signature.packets.length).to.equal(1);
2145
- });
2146
- });
2147
-
2148
- it('should sign and verify cleartext data with a date in the past', function () {
2149
- const message = openpgp.cleartext.fromText(plaintext);
2150
- const past = new Date(2000);
2151
- const signOpt = {
2152
- message,
2153
- privateKeys: privateKey_1337.keys,
2154
- detached: true,
2155
- date: past,
2156
- armor: false
2157
- };
2158
- const verifyOpt = {
2159
- message,
2160
- publicKeys: publicKey_1337.keys,
2161
- date: past
2162
- };
2163
- return openpgp.sign(signOpt).then(function (signed) {
2164
- verifyOpt.signature = signed.signature;
2165
- return openpgp.verify(verifyOpt).then(async function (verified) {
2166
- expect(+verified.signatures[0].signature.packets[0].created).to.equal(+past);
2167
- expect(verified.data).to.equal(plaintext.replace(/[ \t]+$/mg, ''));
2168
- expect(verified.signatures[0].valid).to.be.true;
2169
- expect(await signOpt.privateKeys[0].getSigningKey(verified.signatures[0].keyid, past))
2170
- .to.be.not.null;
2171
- expect(verified.signatures[0].signature.packets.length).to.equal(1);
2172
- // now check with expiration checking disabled
2173
- verifyOpt.date = null;
2174
- return openpgp.verify(verifyOpt);
2175
- }).then(async function (verified) {
2176
- expect(+verified.signatures[0].signature.packets[0].created).to.equal(+past);
2177
- expect(verified.data).to.equal(plaintext.replace(/[ \t]+$/mg, ''));
2178
- expect(verified.signatures[0].valid).to.be.true;
2179
- expect(await signOpt.privateKeys[0].getSigningKey(verified.signatures[0].keyid, null))
2180
- .to.be.not.null;
2181
- expect(verified.signatures[0].signature.packets.length).to.equal(1);
2182
- });
2183
- });
2184
- });
2185
-
2186
- it('should sign and verify binary data with a date in the future', function () {
2187
- const future = new Date(2040, 5, 5, 5, 5, 5, 0);
2188
- const data = new Uint8Array([3, 14, 15, 92, 65, 35, 59]);
2189
- const signOpt = {
2190
- message: openpgp.message.fromBinary(data),
2191
- privateKeys: privateKey_2038_2045.keys,
2192
- detached: true,
2193
- date: future,
2194
- armor: false
2195
- };
2196
- const verifyOpt = {
2197
- publicKeys: publicKey_2038_2045.keys,
2198
- date: future
2199
- };
2200
- return openpgp.sign(signOpt).then(function (signed) {
2201
- verifyOpt.message = openpgp.message.fromBinary(data);
2202
- verifyOpt.signature = signed.signature;
2203
- return openpgp.verify(verifyOpt);
2204
- }).then(async function (verified) {
2205
- expect(+verified.signatures[0].signature.packets[0].created).to.equal(+future);
2206
- expect([].slice.call(verified.data)).to.deep.equal([].slice.call(data));
2207
- expect(verified.signatures[0].valid).to.be.true;
2208
- expect(await signOpt.privateKeys[0].getSigningKey(verified.signatures[0].keyid, future))
2209
- .to.be.not.null;
2210
- expect(verified.signatures[0].signature.packets.length).to.equal(1);
2211
- });
2212
- });
2213
-
2214
- it('should sign and verify binary data without one-pass signature', function () {
2215
- const data = new Uint8Array([3, 14, 15, 92, 65, 35, 59]);
2216
- const signOpt = {
2217
- message: openpgp.message.fromBinary(data),
2218
- privateKeys: privateKey.keys,
2219
- armor: false
2220
- };
2221
- const verifyOpt = {
2222
- publicKeys: publicKey.keys
2223
- };
2224
- return openpgp.sign(signOpt).then(function (signed) {
2225
- const packets = new openpgp.packet.List();
2226
- packets.push(signed.message.packets.findPacket(openpgp.enums.packet.signature));
2227
- packets.push(signed.message.packets.findPacket(openpgp.enums.packet.literal));
2228
- verifyOpt.message = new openpgp.message.Message(packets);
2229
- return openpgp.verify(verifyOpt);
2230
- }).then(async function (verified) {
2231
- expect([].slice.call(verified.data)).to.deep.equal([].slice.call(data));
2232
- expect(verified.signatures[0].valid).to.be.true;
2233
- expect(await signOpt.privateKeys[0].getSigningKey(verified.signatures[0].keyid))
2234
- .to.be.not.null;
2235
- expect(verified.signatures[0].signature.packets.length).to.equal(1);
2236
- });
2237
- });
2238
-
2239
- it('should streaming sign and verify binary data without one-pass signature', function () {
2240
- const data = new Uint8Array([3, 14, 15, 92, 65, 35, 59]);
2241
- const signOpt = {
2242
- message: openpgp.message.fromBinary(data),
2243
- privateKeys: privateKey.keys,
2244
- armor: false,
2245
- streaming: 'web'
2246
- };
2247
- const verifyOpt = {
2248
- publicKeys: publicKey.keys,
2249
- streaming: 'web'
2250
- };
2251
- return openpgp.sign(signOpt).then(function (signed) {
2252
- const packets = new openpgp.packet.List();
2253
- packets.push(signed.message.packets.findPacket(openpgp.enums.packet.signature));
2254
- packets.push(signed.message.packets.findPacket(openpgp.enums.packet.literal));
2255
- verifyOpt.message = new openpgp.message.Message(packets);
2256
- return openpgp.verify(verifyOpt);
2257
- }).then(async function (verified) {
2258
- expect(openpgp.stream.isStream(verified.data)).to.equal('web');
2259
- expect([].slice.call(await openpgp.stream.readToEnd(verified.data))).to.deep.equal([].slice.call(data));
2260
- expect(await verified.signatures[0].verified).to.be.true;
2261
- expect(await signOpt.privateKeys[0].getSigningKey(verified.signatures[0].keyid))
2262
- .to.be.not.null;
2263
- expect((await verified.signatures[0].signature).packets.length).to.equal(1);
2264
- });
2265
- });
2266
-
2267
- it('should encrypt and decrypt cleartext data with a date in the future', function () {
2268
- const future = new Date(2040, 5, 5, 5, 5, 5, 0);
2269
- const encryptOpt = {
2270
- message: openpgp.message.fromText(plaintext, undefined, future),
2271
- publicKeys: publicKey_2038_2045.keys,
2272
- date: future,
2273
- armor: false
2274
- };
2275
- const decryptOpt = {
2276
- privateKeys: privateKey_2038_2045.keys,
2277
- date: future
2278
- };
2279
-
2280
- return openpgp.encrypt(encryptOpt).then(function (encrypted) {
2281
- decryptOpt.message = encrypted.message;
2282
- return encrypted.message.decrypt(decryptOpt.privateKeys);
2283
- }).then(async function (packets) {
2284
- const literals = packets.packets.filterByTag(openpgp.enums.packet.literal);
2285
- expect(literals.length).to.equal(1);
2286
- expect(+literals[0].date).to.equal(+future);
2287
- expect(await openpgp.stream.readToEnd(packets.getText())).to.equal(plaintext);
2288
- });
2289
- });
2290
-
2291
- it('should encrypt and decrypt binary data with a date in the past', function () {
2292
- const past = new Date(2005, 5, 5, 5, 5, 5, 0);
2293
- const data = new Uint8Array([3, 14, 15, 92, 65, 35, 59]);
2294
- const encryptOpt = {
2295
- message: openpgp.message.fromBinary(data, undefined, past),
2296
- publicKeys: publicKey_2000_2008.keys,
2297
- date: past,
2298
- armor: false
2299
- };
2300
- const decryptOpt = {
2301
- privateKeys: privateKey_2000_2008.keys,
2302
- date: past
2303
- };
2304
-
2305
- return openpgp.encrypt(encryptOpt).then(function (encrypted) {
2306
- decryptOpt.message = encrypted.message;
2307
- return encrypted.message.decrypt(decryptOpt.privateKeys);
2308
- }).then(async function (packets) {
2309
- const literals = packets.packets.filterByTag(openpgp.enums.packet.literal);
2310
- expect(literals.length).to.equal(1);
2311
- expect(+literals[0].date).to.equal(+past);
2312
- expect(await openpgp.stream.readToEnd(packets.getLiteralData())).to.deep.equal(data);
2313
- });
2314
- });
2315
-
2316
- it('should sign, encrypt and decrypt, verify cleartext data with a date in the past', function () {
2317
- const past = new Date(2005, 5, 5, 5, 5, 5, 0);
2318
- const encryptOpt = {
2319
- message: openpgp.message.fromText(plaintext, undefined, past),
2320
- publicKeys: publicKey_2000_2008.keys,
2321
- privateKeys: privateKey_2000_2008.keys,
2322
- date: past,
2323
- armor: false
2324
- };
2325
-
2326
- return openpgp.encrypt(encryptOpt).then(function (encrypted) {
2327
- return encrypted.message.decrypt(encryptOpt.privateKeys);
2328
- }).then(async function (packets) {
2329
- const literals = packets.packets.filterByTag(openpgp.enums.packet.literal);
2330
- expect(literals.length).to.equal(1);
2331
- expect(+literals[0].date).to.equal(+past);
2332
- const signatures = await packets.verify(encryptOpt.publicKeys, past);
2333
- expect(await openpgp.stream.readToEnd(packets.getText())).to.equal(plaintext);
2334
- expect(+(await signatures[0].signature).packets[0].created).to.equal(+past);
2335
- expect(await signatures[0].verified).to.be.true;
2336
- expect(await encryptOpt.privateKeys[0].getSigningKey(signatures[0].keyid, past))
2337
- .to.be.not.null;
2338
- expect((await signatures[0].signature).packets.length).to.equal(1);
2339
- });
2340
- });
2341
-
2342
- it('should sign, encrypt and decrypt, verify binary data with a date in the future', function () {
2343
- const future = new Date(2040, 5, 5, 5, 5, 5, 0);
2344
- const data = new Uint8Array([3, 14, 15, 92, 65, 35, 59]);
2345
- const encryptOpt = {
2346
- message: openpgp.message.fromBinary(data, undefined, future),
2347
- publicKeys: publicKey_2038_2045.keys,
2348
- privateKeys: privateKey_2038_2045.keys,
2349
- date: future,
2350
- armor: false
2351
- };
2352
-
2353
- return openpgp.encrypt(encryptOpt).then(function (encrypted) {
2354
- return encrypted.message.decrypt(encryptOpt.privateKeys);
2355
- }).then(async function (packets) {
2356
- const literals = packets.packets.filterByTag(openpgp.enums.packet.literal);
2357
- expect(literals.length).to.equal(1);
2358
- expect(literals[0].format).to.equal('binary');
2359
- expect(+literals[0].date).to.equal(+future);
2360
- const signatures = await packets.verify(encryptOpt.publicKeys, future);
2361
- expect(await openpgp.stream.readToEnd(packets.getLiteralData())).to.deep.equal(data);
2362
- expect(+(await signatures[0].signature).packets[0].created).to.equal(+future);
2363
- expect(await signatures[0].verified).to.be.true;
2364
- expect(await encryptOpt.privateKeys[0].getSigningKey(signatures[0].keyid, future))
2365
- .to.be.not.null;
2366
- expect((await signatures[0].signature).packets.length).to.equal(1);
2367
- });
2368
- });
2369
-
2370
- it('should sign, encrypt and decrypt, verify mime data with a date in the future', function () {
2371
- const future = new Date(2040, 5, 5, 5, 5, 5, 0);
2372
- const data = new Uint8Array([3, 14, 15, 92, 65, 35, 59]);
2373
- const encryptOpt = {
2374
- message: openpgp.message.fromBinary(data, undefined, future, 'mime'),
2375
- publicKeys: publicKey_2038_2045.keys,
2376
- privateKeys: privateKey_2038_2045.keys,
2377
- date: future,
2378
- armor: false
2379
- };
2380
-
2381
- return openpgp.encrypt(encryptOpt).then(function (encrypted) {
2382
- return encrypted.message.decrypt(encryptOpt.privateKeys);
2383
- }).then(async function (packets) {
2384
- const literals = packets.packets.filterByTag(openpgp.enums.packet.literal);
2385
- expect(literals.length).to.equal(1);
2386
- expect(literals[0].format).to.equal('mime');
2387
- expect(+literals[0].date).to.equal(+future);
2388
- const signatures = await packets.verify(encryptOpt.publicKeys, future);
2389
- expect(await openpgp.stream.readToEnd(packets.getLiteralData())).to.deep.equal(data);
2390
- expect(+(await signatures[0].signature).packets[0].created).to.equal(+future);
2391
- expect(await signatures[0].verified).to.be.true;
2392
- expect(await encryptOpt.privateKeys[0].getSigningKey(signatures[0].keyid, future))
2393
- .to.be.not.null;
2394
- expect((await signatures[0].signature).packets.length).to.equal(1);
2395
- });
2396
- });
2397
-
2398
- it('should fail to encrypt with revoked key', function() {
2399
- return openpgp.revokeKey({
2400
- key: privateKey.keys[0]
2401
- }).then(function(revKey) {
2402
- return openpgp.encrypt({
2403
- message: openpgp.message.fromText(plaintext),
2404
- publicKeys: revKey.publicKey
2405
- }).then(function(encrypted) {
2406
- throw new Error('Should not encrypt with revoked key');
2407
- }).catch(function(error) {
2408
- expect(error.message).to.match(/Error encrypting message: Primary key is revoked/);
2409
- });
2410
- });
2411
- });
2412
-
2413
- it('should fail to encrypt with revoked subkey', async function() {
2414
- const pubKeyDE = (await openpgp.key.readArmored(pub_key_de)).keys[0];
2415
- const privKeyDE = (await openpgp.key.readArmored(priv_key_de)).keys[0];
2416
- await privKeyDE.decrypt(passphrase);
2417
- return privKeyDE.subKeys[0].revoke(privKeyDE.primaryKey).then(function(revSubKey) {
2418
- pubKeyDE.subKeys[0] = revSubKey;
2419
- return openpgp.encrypt({
2420
- message: openpgp.message.fromText(plaintext),
2421
- publicKeys: pubKeyDE
2422
- }).then(function(encrypted) {
2423
- throw new Error('Should not encrypt with revoked subkey');
2424
- }).catch(function(error) {
2425
- expect(error.message).to.match(/Could not find valid encryption key packet/);
2426
- });
2427
- });
2428
- });
2429
-
2430
- it('should decrypt with two passwords message which GPG fails on', async function() {
2431
- const decOpt = {
2432
- message: await openpgp.message.readArmored(twoPasswordGPGFail),
2433
- passwords: password2
2434
- };
2435
- return openpgp.decrypt(decOpt).then(function(decrypted) {
2436
- expect(decrypted.data).to.equal('short message\nnext line\n한국어/조선말');
2437
- expect(decrypted.signatures.length).to.equal(0);
2438
- });
2439
- });
2440
-
2441
- it('should decrypt with three passwords', async function() {
2442
- const messageBinary = openpgp.util.b64_to_Uint8Array('wy4ECQMIElIx/jiwJV9gp/MZ/ElZwUfHrzOBfOtM8VmgDy76F7eSGWH26tAlx3WI0kMBZv6Tlc1Y6baaZ6MEcOLTG/C7uzHH7KMfuQFd3fcMaVcDawk9EEy/CybiGBE+acT6id2pemHQy6Nk76d9UUTFubcB');
2443
- const message = await openpgp.message.read(messageBinary);
2444
- const passwords = ['Test', 'Pinata', 'a'];
2445
- const decrypted = await openpgp.decrypt({ message, passwords });
2446
- expect(decrypted.data).to.equal('Hello world');
2447
- });
2448
-
2449
- it('should decrypt broken ECC message from old OpenPGP.js', async function() {
2450
- const { keys: [key] } = await openpgp.key.readArmored(ecdh_dec_key);
2451
- const message = await openpgp.message.readArmored(ecdh_msg_bad);
2452
- await key.decrypt('12345');
2453
- const decrypted = await openpgp.decrypt({ message, privateKeys: [key] });
2454
- expect(decrypted.data).to.equal('\n');
2455
- });
2456
-
2457
- it('should decrypt broken ECC message from old go crypto', async function() {
2458
- const { keys: [key] } = await openpgp.key.readArmored(ecdh_dec_key_2);
2459
- const message = await openpgp.message.readArmored(ecdh_msg_bad_2);
2460
- await key.decrypt('12345');
2461
- const decrypted = await openpgp.decrypt({ message, privateKeys: [key] });
2462
- expect(decrypted.data).to.equal('Tesssst<br><br><br>Sent from ProtonMail mobile<br><br><br>');
2463
- });
2464
-
2465
- it('should decrypt broken Blowfish message from old OpenPGP.js', async function() {
2466
- openpgp.crypto.cipher.blowfish.blockSize = 16;
2467
- openpgp.crypto.cipher.blowfish.prototype.blockSize = 16;
2468
- const use_nativeVal = openpgp.config.use_native;
2469
- openpgp.config.use_native = false;
2470
- try {
2471
- const { data } = await openpgp.decrypt({
2472
- passwords: 'test',
2473
- message: await openpgp.message.readArmored(`-----BEGIN PGP MESSAGE-----
2474
- Version: OpenPGP.js v4.8.1
2475
- Comment: https://openpgpjs.org
2476
-
2477
- wx4EBAMI0eHVbTnl2iLg6pIJ4sWw2K7OwfxFP8bmaUvSRAGiSDGJSFNUuB4v
2478
- SU69Z1XyXiuTpD3780FnLnR4dF41nhbrTXaDG+X1b3JsZCHTFMGF7Eb+YVhh
2479
- YCXOZwd3z5lxcj/M
2480
- =oXcN
2481
- -----END PGP MESSAGE-----`)
2482
- });
2483
- expect(data).to.equal('Hello World!');
2484
- } finally {
2485
- openpgp.crypto.cipher.blowfish.blockSize = 8;
2486
- openpgp.crypto.cipher.blowfish.prototype.blockSize = 8;
2487
- openpgp.config.use_native = use_nativeVal;
2488
- }
2489
- });
2490
-
2491
- it('should decrypt correct Blowfish message from new OpenPGP.js', async function() {
2492
- const { data } = await openpgp.decrypt({
2493
- passwords: 'test',
2494
- message: await openpgp.message.readArmored(`-----BEGIN PGP MESSAGE-----
2495
- Version: OpenPGP.js v4.9.0
2496
- Comment: https://openpgpjs.org
2497
-
2498
- wx4EBAMI7Di70u7hoDfgBUJQ2+1ig6ym3KMjRS9kAovSPAGRQLIPv2DgkINL
2499
- 3DUgMNqtQCA23xWhq7Ly6o9H1lRfoAo7V5UElVCqGEX7cgyZjI97alY6Je3o
2500
- amnR6g==
2501
- =rPIK
2502
- -----END PGP MESSAGE-----`)
2503
- });
2504
- expect(data).to.equal('Hello World!');
2505
- });
2506
-
2507
- it('should normalize newlines in encrypted text message', async function() {
2508
- const message = openpgp.message.fromText('"BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\r\nUID:123\r\nDTSTART:20191211T121212Z\r\nDTEND:20191212T121212Z\r\nEND:VEVENT\nEND:VCALENDAR"');
2509
- const encrypted = await openpgp.encrypt({
2510
- passwords: 'test',
2511
- message
2512
- });
2513
- const decrypted = await openpgp.decrypt({
2514
- passwords: 'test',
2515
- message: await openpgp.message.readArmored(encrypted.data),
2516
- format: 'binary'
2517
- });
2518
- expect(openpgp.util.decode_utf8(decrypted.data)).to.equal('"BEGIN:VCALENDAR\r\nVERSION:2.0\r\nBEGIN:VEVENT\r\nUID:123\r\nDTSTART:20191211T121212Z\r\nDTEND:20191212T121212Z\r\nEND:VEVENT\r\nEND:VCALENDAR"');
2519
- });
2520
-
2521
- });
2522
-
2523
- describe('Errors', function() {
2524
-
2525
- it('Error message should contain the original error message', function() {
2526
- return openpgp.encrypt({
2527
- message: openpgp.message.fromBinary(new Uint8Array([0x01, 0x01, 0x01])),
2528
- passwords: null
2529
- })
2530
- .then(function() {
2531
- throw new Error('Error expected.');
2532
- })
2533
- .catch(function(error) {
2534
- expect(error.message).to.match(/No keys, passwords, or session key provided/);
2535
- });
2536
- });
2537
-
2538
- });
2539
-
2540
- });
2541
-
2542
- });