@protontech/openpgp 4.10.8 → 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 +41077 -41609
  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 -61152
  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 -40071
  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 -232
  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 -378
  88. package/src/key/index.js +0 -32
  89. package/src/key/key.js +0 -888
  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 -161
  109. package/src/packet/public_subkey.js +0 -44
  110. package/src/packet/secret_key.js +0 -468
  111. package/src/packet/secret_subkey.js +0 -41
  112. package/src/packet/signature.js +0 -786
  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 -84
  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 -3491
  163. package/test/general/keyring.js +0 -336
  164. package/test/general/oid.js +0 -39
  165. package/test/general/openpgp.js +0 -2577
  166. package/test/general/packet.js +0 -950
  167. package/test/general/signature.js +0 -1715
  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,2577 +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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
- 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
- 2T6cTwECAOeTJBaIinz+OInqPzWbEndnbWKIXbPhPtpvU/D2OyLquwMmma8r
172
- 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
- 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
- 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
- 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
- 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
- rwQAip3cACXdbShpxvKEsQs0oBN1H5PAx1BAGXanw+jxDFUkrDk1DOSrZFnM
178
- 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
- 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
- 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
- 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
- UyhuZ0K1VgZOj+HcDKo8jQ+aejcwjHDg02yPvfzrXHBjWAJMjglV4W+YPFYj
183
- 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
- 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
- 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
- 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
- 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
- WJfcSboagENXUYjOsLgtU/H8b9JD9CWpsd0DkcPshKAjuum6c3cUaTROYQIA
189
- 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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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
- 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
- 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
- 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
- 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
- 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
- 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
- u4R0nSAEGQEKAAYFAjioN2gACgkQJVG+vfNJQKhK6gP+LB5qXTJKCduuqZm7
210
- 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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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
- mf8q0QARAQABAAP9FZXBxWW0BtLHN7bTMdhzMDGX/phfvbJO6W1beS6Noxg6
225
- 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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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
- 9mI0O9zw7gP7RZkftiFveOGvT4Os/SvOzdpXGGWAfytHtoxmxDq66gzuZUPH
236
- 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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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
- S9AgN4nV9on6GsuK1ZpQpqcKAf4SZaF3rDXqpYfM+LDpqaIl8LZKzK7EyW2p
249
- VNV9PwnYtMXwQ7A3KAu2audWxSawHNyvgez1Ujl0J7TfKwJyVBrCDjZCJrr+
250
- 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
- hfTEDEH/giKdtzlLbkri2UYGCJqcoNl0Maz6LVUI3NCo3O77zi2v7gLtu+9h
252
- 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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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
- ghF6DA2QXEf9zz5aMQS7AgDFQxJmBzSGFCkbHbSphT37SnohLONdxyvmZqj5
262
- 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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
- }).then(function() {
810
- throw new Error('Should not decrypt with incorrect passphrase');
811
- }).catch(function(error){
812
- expect(error.message).to.match(/Incorrect key passphrase/);
813
- });
814
- });
815
- });
816
-
817
- it('Calling decrypt with not decrypted key leads to exception', async function() {
818
- const encOpt = {
819
- message: openpgp.message.fromText(plaintext),
820
- publicKeys: publicKey.keys
821
- };
822
- const decOpt = {
823
- privateKeys: privateKey.keys[0]
824
- };
825
- const encrypted = await openpgp.encrypt(encOpt);
826
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
827
- await expect(openpgp.decrypt(decOpt)).to.be.rejectedWith('Error decrypting message: Private key is not decrypted.');
828
- });
829
-
830
- tryTests('CFB mode (asm.js)', tests, {
831
- if: !(typeof window !== 'undefined' && window.Worker),
832
- beforeEach: function() {
833
- openpgp.config.aead_protect = false;
834
- }
835
- });
836
-
837
- tryTests('CFB mode (asm.js, worker)', tests, {
838
- if: typeof window !== 'undefined' && window.Worker,
839
- before: async function() {
840
- await openpgp.initWorker({ path:'../dist/openpgp.worker.js' });
841
- },
842
- beforeEach: function() {
843
- openpgp.config.aead_protect = false;
844
- },
845
- after: function() {
846
- openpgp.destroyWorker();
847
- }
848
- });
849
-
850
- tryTests('GCM mode (V5 keys)', tests, {
851
- if: true,
852
- beforeEach: function() {
853
- openpgp.config.aead_protect = true;
854
- openpgp.config.aead_mode = openpgp.enums.aead.experimental_gcm;
855
- openpgp.config.v5_keys = true;
856
-
857
- // Monkey-patch AEAD feature flag
858
- publicKey.keys[0].users[0].selfCertifications[0].features = [7];
859
- publicKey_2000_2008.keys[0].users[0].selfCertifications[0].features = [7];
860
- publicKey_2038_2045.keys[0].users[0].selfCertifications[0].features = [7];
861
- }
862
- });
863
-
864
- tryTests('EAX mode (small chunk size)', tests, {
865
- if: true,
866
- beforeEach: function() {
867
- openpgp.config.aead_protect = true;
868
- openpgp.config.aead_chunk_size_byte = 0;
869
-
870
- // Monkey-patch AEAD feature flag
871
- publicKey.keys[0].users[0].selfCertifications[0].features = [7];
872
- publicKey_2000_2008.keys[0].users[0].selfCertifications[0].features = [7];
873
- publicKey_2038_2045.keys[0].users[0].selfCertifications[0].features = [7];
874
- }
875
- });
876
-
877
- tryTests('OCB mode', tests, {
878
- if: !openpgp.config.ci,
879
- beforeEach: function() {
880
- openpgp.config.aead_protect = true;
881
- openpgp.config.aead_mode = openpgp.enums.aead.ocb;
882
-
883
- // Monkey-patch AEAD feature flag
884
- publicKey.keys[0].users[0].selfCertifications[0].features = [7];
885
- publicKey_2000_2008.keys[0].users[0].selfCertifications[0].features = [7];
886
- publicKey_2038_2045.keys[0].users[0].selfCertifications[0].features = [7];
887
- }
888
- });
889
-
890
- function tests() {
891
- describe('encryptSessionKey, decryptSessionKeys', function() {
892
- const sk = new Uint8Array([0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01]);
893
-
894
- let decryptedPrivateKey;
895
- beforeEach(async function() {
896
- if (!decryptedPrivateKey) {
897
- expect(await privateKey.keys[0].decrypt(passphrase)).to.be.true;
898
- decryptedPrivateKey = privateKey;
899
- }
900
- privateKey = decryptedPrivateKey;
901
- });
902
-
903
- it('should encrypt with public key', function() {
904
- return openpgp.encryptSessionKey({
905
- data: sk,
906
- algorithm: 'aes128',
907
- publicKeys: publicKey.keys
908
- }).then(function(encrypted) {
909
- return openpgp.decryptSessionKeys({
910
- message: encrypted.message,
911
- privateKeys: privateKey.keys[0]
912
- });
913
- }).then(function(decrypted) {
914
- expect(decrypted[0].data).to.deep.equal(sk);
915
- });
916
- });
917
-
918
- it('should encrypt with password', function() {
919
- return openpgp.encryptSessionKey({
920
- data: sk,
921
- algorithm: 'aes128',
922
- passwords: password1
923
- }).then(function(encrypted) {
924
- return openpgp.decryptSessionKeys({
925
- message: encrypted.message,
926
- passwords: password1
927
- });
928
- }).then(function(decrypted) {
929
- expect(decrypted[0].data).to.deep.equal(sk);
930
- });
931
- });
932
-
933
- it('should not decrypt with a key without binding signatures', function() {
934
- return openpgp.encryptSessionKey({
935
- data: sk,
936
- algorithm: 'aes128',
937
- publicKeys: publicKey.keys
938
- }).then(async function(encrypted) {
939
- const invalidPrivateKey = (await openpgp.key.readArmored(priv_key)).keys[0];
940
- invalidPrivateKey.subKeys[0].bindingSignatures = [];
941
- return openpgp.decryptSessionKeys({
942
- message: encrypted.message,
943
- privateKeys: invalidPrivateKey
944
- }).then(() => {
945
- throw new Error('Should not decrypt with invalid key');
946
- }).catch(error => {
947
- expect(error.message).to.match(/Error decrypting session keys: Session key decryption failed./);
948
- });
949
- });
950
- });
951
-
952
- it('roundtrip workflow: encrypt, decryptSessionKeys, decrypt with pgp key pair', function () {
953
- let msgAsciiArmored;
954
- return openpgp.encrypt({
955
- message: openpgp.message.fromText(plaintext),
956
- publicKeys: publicKey.keys
957
- }).then(async function (encrypted) {
958
- msgAsciiArmored = encrypted.data;
959
- return openpgp.decryptSessionKeys({
960
- message: await openpgp.message.readArmored(msgAsciiArmored),
961
- privateKeys: privateKey.keys[0]
962
- });
963
-
964
- }).then(async function (decryptedSessionKeys) {
965
- const message = await openpgp.message.readArmored(msgAsciiArmored);
966
- return openpgp.decrypt({
967
- sessionKeys: decryptedSessionKeys[0],
968
- message
969
- });
970
- }).then(function (decrypted) {
971
- expect(decrypted.data).to.equal(plaintext);
972
- });
973
- });
974
-
975
- it('roundtrip workflow: encrypt, decryptSessionKeys, decrypt with pgp key pair -- trailing spaces', function () {
976
- const plaintext = 'space: \nspace and tab: \t\nno trailing space\n \ntab:\t\ntab and space:\t ';
977
- let msgAsciiArmored;
978
- return openpgp.encrypt({
979
- message: openpgp.message.fromText(plaintext),
980
- publicKeys: publicKey.keys
981
- }).then(async function (encrypted) {
982
- msgAsciiArmored = encrypted.data;
983
- return openpgp.decryptSessionKeys({
984
- message: await openpgp.message.readArmored(msgAsciiArmored),
985
- privateKeys: privateKey.keys[0]
986
- });
987
-
988
- }).then(async function (decryptedSessionKeys) {
989
- const message = await openpgp.message.readArmored(msgAsciiArmored);
990
- return openpgp.decrypt({
991
- sessionKeys: decryptedSessionKeys[0],
992
- message
993
- });
994
- }).then(function (decrypted) {
995
- expect(decrypted.data).to.equal(plaintext);
996
- });
997
- });
998
-
999
- it('roundtrip workflow: encrypt, decryptSessionKeys, decrypt with password', function () {
1000
- let msgAsciiArmored;
1001
- return openpgp.encrypt({
1002
- message: openpgp.message.fromText(plaintext),
1003
- passwords: password1
1004
- }).then(async function (encrypted) {
1005
- msgAsciiArmored = encrypted.data;
1006
- return openpgp.decryptSessionKeys({
1007
- message: await openpgp.message.readArmored(msgAsciiArmored),
1008
- passwords: password1
1009
- });
1010
-
1011
- }).then(async function (decryptedSessionKeys) {
1012
- return openpgp.decrypt({
1013
- sessionKeys: decryptedSessionKeys[0],
1014
- message: await openpgp.message.readArmored(msgAsciiArmored)
1015
- });
1016
-
1017
- }).then(function (decrypted) {
1018
- expect(decrypted.data).to.equal(plaintext);
1019
- });
1020
- });
1021
-
1022
- it('roundtrip workflow: encrypt with multiple passwords, decryptSessionKeys, decrypt with multiple passwords', function () {
1023
- let msgAsciiArmored;
1024
- return openpgp.encrypt({
1025
- message: openpgp.message.fromText(plaintext),
1026
- passwords: [password1, password2]
1027
- }).then(async function (encrypted) {
1028
- msgAsciiArmored = encrypted.data;
1029
- return openpgp.decryptSessionKeys({
1030
- message: await openpgp.message.readArmored(msgAsciiArmored),
1031
- passwords: [password1, password2]
1032
- });
1033
-
1034
- }).then(async function (decryptedSessionKeys) {
1035
- return openpgp.decrypt({
1036
- sessionKeys: decryptedSessionKeys,
1037
- message: await openpgp.message.readArmored(msgAsciiArmored)
1038
- });
1039
-
1040
- }).then(function (decrypted) {
1041
- expect(decrypted.data).to.equal(plaintext);
1042
- });
1043
- });
1044
-
1045
- it('roundtrip workflow: encrypt twice with one password, decryptSessionKeys, only one session key', function () {
1046
- let msgAsciiArmored;
1047
- return openpgp.encrypt({
1048
- message: openpgp.message.fromText(plaintext),
1049
- passwords: [password1, password1]
1050
- }).then(async function (encrypted) {
1051
- msgAsciiArmored = encrypted.data;
1052
- return openpgp.decryptSessionKeys({
1053
- message: await openpgp.message.readArmored(msgAsciiArmored),
1054
- passwords: password1
1055
- });
1056
- }).then(async function (decryptedSessionKeys) {
1057
- expect(decryptedSessionKeys.length).to.equal(1);
1058
- return openpgp.decrypt({
1059
- sessionKeys: decryptedSessionKeys,
1060
- message: await openpgp.message.readArmored(msgAsciiArmored)
1061
- });
1062
- }).then(function (decrypted) {
1063
- expect(decrypted.data).to.equal(plaintext);
1064
- });
1065
- });
1066
- });
1067
-
1068
- describe('AES / RSA encrypt, decrypt, sign, verify', function() {
1069
- const wrong_pubkey = '-----BEGIN PGP PUBLIC KEY BLOCK-----\r\n' +
1070
- 'Version: OpenPGP.js v0.9.0\r\n' +
1071
- 'Comment: Hoodiecrow - https://hoodiecrow.com\r\n' +
1072
- '\r\n' +
1073
- 'xk0EUlhMvAEB/2MZtCUOAYvyLFjDp3OBMGn3Ev8FwjzyPbIF0JUw+L7y2XR5\r\n' +
1074
- 'RVGvbK88unV3cU/1tOYdNsXI6pSp/Ztjyv7vbBUAEQEAAc0pV2hpdGVvdXQg\r\n' +
1075
- 'VXNlciA8d2hpdGVvdXQudGVzdEB0LW9ubGluZS5kZT7CXAQQAQgAEAUCUlhM\r\n' +
1076
- 'vQkQ9vYOm0LN/0wAAAW4Af9C+kYW1AvNWmivdtr0M0iYCUjM9DNOQH1fcvXq\r\n' +
1077
- 'IiN602mWrkd8jcEzLsW5IUNzVPLhrFIuKyBDTpLnC07Loce1\r\n' +
1078
- '=6XMW\r\n' +
1079
- '-----END PGP PUBLIC KEY BLOCK-----\r\n\r\n';
1080
-
1081
- let decryptedPrivateKey;
1082
- beforeEach(async function() {
1083
- if (!decryptedPrivateKey) {
1084
- expect(await privateKey.keys[0].decrypt(passphrase)).to.be.true;
1085
- decryptedPrivateKey = privateKey;
1086
- }
1087
- privateKey = decryptedPrivateKey;
1088
- });
1089
-
1090
- it('should encrypt then decrypt', function () {
1091
- const encOpt = {
1092
- message: openpgp.message.fromText(plaintext),
1093
- publicKeys: publicKey.keys
1094
- };
1095
- const decOpt = {
1096
- privateKeys: privateKey.keys
1097
- };
1098
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1099
- expect(encrypted.data).to.match(/^-----BEGIN PGP MESSAGE/);
1100
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1101
- return openpgp.decrypt(decOpt);
1102
- }).then(function (decrypted) {
1103
- expect(decrypted.data).to.equal(plaintext);
1104
- expect(decrypted.signatures).to.exist;
1105
- expect(decrypted.signatures.length).to.equal(0);
1106
- });
1107
- });
1108
-
1109
- it('should encrypt then decrypt with multiple private keys', async function () {
1110
- const privKeyDE = (await openpgp.key.readArmored(priv_key_de)).keys[0];
1111
- await privKeyDE.decrypt(passphrase);
1112
-
1113
- const encOpt = {
1114
- message: openpgp.message.fromText(plaintext),
1115
- publicKeys: publicKey.keys
1116
- };
1117
- const decOpt = {
1118
- privateKeys: [privKeyDE, privateKey.keys[0]]
1119
- };
1120
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1121
- expect(encrypted.data).to.match(/^-----BEGIN PGP MESSAGE/);
1122
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1123
- return openpgp.decrypt(decOpt);
1124
- }).then(function (decrypted) {
1125
- expect(decrypted.data).to.equal(plaintext);
1126
- expect(decrypted.signatures).to.exist;
1127
- expect(decrypted.signatures.length).to.equal(0);
1128
- });
1129
- });
1130
-
1131
- it('should encrypt then decrypt with wildcard', function () {
1132
- const encOpt = {
1133
- message: openpgp.message.fromText(plaintext),
1134
- publicKeys: publicKey.keys,
1135
- wildcard: true
1136
- };
1137
- const decOpt = {
1138
- privateKeys: privateKey.keys
1139
- };
1140
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1141
- expect(encrypted.data).to.match(/^-----BEGIN PGP MESSAGE/);
1142
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1143
- return openpgp.decrypt(decOpt);
1144
- }).then(function (decrypted) {
1145
- expect(decrypted.data).to.equal(plaintext);
1146
- expect(decrypted.signatures).to.exist;
1147
- expect(decrypted.signatures.length).to.equal(0);
1148
- });
1149
- });
1150
-
1151
- it('should encrypt then decrypt with wildcard with multiple private keys', async function () {
1152
- const privKeyDE = (await openpgp.key.readArmored(priv_key_de)).keys[0];
1153
- await privKeyDE.decrypt(passphrase);
1154
-
1155
- const encOpt = {
1156
- message: openpgp.message.fromText(plaintext),
1157
- publicKeys: publicKey.keys,
1158
- wildcard: true
1159
- };
1160
- const decOpt = {
1161
- privateKeys: [privKeyDE, privateKey.keys[0]]
1162
- };
1163
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1164
- expect(encrypted.data).to.match(/^-----BEGIN PGP MESSAGE/);
1165
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1166
- return openpgp.decrypt(decOpt);
1167
- }).then(function (decrypted) {
1168
- expect(decrypted.data).to.equal(plaintext);
1169
- expect(decrypted.signatures).to.exist;
1170
- expect(decrypted.signatures.length).to.equal(0);
1171
- });
1172
- });
1173
-
1174
- it('should encrypt then decrypt using returned session key', function () {
1175
- const encOpt = {
1176
- message: openpgp.message.fromText(plaintext),
1177
- publicKeys: publicKey.keys,
1178
- returnSessionKey: true
1179
- };
1180
-
1181
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1182
- expect(encrypted.data).to.match(/^-----BEGIN PGP MESSAGE/);
1183
- const decOpt = {
1184
- sessionKeys: encrypted.sessionKey,
1185
- message: await openpgp.message.readArmored(encrypted.data)
1186
- };
1187
- return openpgp.decrypt(decOpt);
1188
- }).then(function (decrypted) {
1189
- expect(decrypted.data).to.equal(plaintext);
1190
- expect(decrypted.signatures).to.exist;
1191
- expect(decrypted.signatures.length).to.equal(0);
1192
- });
1193
- });
1194
-
1195
- it('should encrypt using custom session key and decrypt using session key', async function () {
1196
- const sessionKey = {
1197
- data: await openpgp.crypto.generateSessionKey('aes256'),
1198
- algorithm: 'aes256'
1199
- };
1200
- const encOpt = {
1201
- message: openpgp.message.fromText(plaintext),
1202
- sessionKey: sessionKey,
1203
- publicKeys: publicKey.keys
1204
- };
1205
- const decOpt = {
1206
- sessionKeys: sessionKey
1207
- };
1208
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1209
- expect(encrypted.data).to.match(/^-----BEGIN PGP MESSAGE/);
1210
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1211
- expect(!!decOpt.message.packets.findPacket(openpgp.enums.packet.symEncryptedAEADProtected)).to.equal(false);
1212
- return openpgp.decrypt(decOpt);
1213
- }).then(function (decrypted) {
1214
- expect(decrypted.data).to.equal(plaintext);
1215
- });
1216
- });
1217
-
1218
- it('should encrypt using custom session key and decrypt using private key', async function () {
1219
- const sessionKey = {
1220
- data: await openpgp.crypto.generateSessionKey('aes128'),
1221
- algorithm: 'aes128'
1222
- };
1223
- const encOpt = {
1224
- message: openpgp.message.fromText(plaintext),
1225
- sessionKey: sessionKey,
1226
- publicKeys: publicKey.keys
1227
- };
1228
- const decOpt = {
1229
- privateKeys: privateKey.keys[0]
1230
- };
1231
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1232
- expect(encrypted.data).to.match(/^-----BEGIN PGP MESSAGE/);
1233
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1234
- expect(!!decOpt.message.packets.findPacket(openpgp.enums.packet.symEncryptedAEADProtected)).to.equal(false);
1235
- return openpgp.decrypt(decOpt);
1236
- }).then(function (decrypted) {
1237
- expect(decrypted.data).to.equal(plaintext);
1238
- });
1239
- });
1240
-
1241
- it('should encrypt/sign and decrypt/verify', function () {
1242
- const encOpt = {
1243
- message: openpgp.message.fromText(plaintext),
1244
- publicKeys: publicKey.keys,
1245
- privateKeys: privateKey.keys
1246
- };
1247
- const decOpt = {
1248
- privateKeys: privateKey.keys[0],
1249
- publicKeys: publicKey.keys
1250
- };
1251
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1252
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1253
- expect(!!decOpt.message.packets.findPacket(openpgp.enums.packet.symEncryptedAEADProtected)).to.equal(openpgp.config.aead_protect);
1254
- return openpgp.decrypt(decOpt);
1255
- }).then(async function (decrypted) {
1256
- expect(decrypted.data).to.equal(plaintext);
1257
- expect(decrypted.signatures[0].valid).to.be.true;
1258
- const signingKey = await privateKey.keys[0].getSigningKey();
1259
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1260
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1261
- });
1262
- });
1263
-
1264
- it('should encrypt/sign and decrypt/verify (no AEAD support)', function () {
1265
- const encOpt = {
1266
- message: openpgp.message.fromText(plaintext),
1267
- publicKeys: publicKeyNoAEAD.keys,
1268
- privateKeys: privateKey.keys
1269
- };
1270
- const decOpt = {
1271
- privateKeys: privateKey.keys[0],
1272
- publicKeys: publicKeyNoAEAD.keys
1273
- };
1274
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1275
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1276
- expect(!!decOpt.message.packets.findPacket(openpgp.enums.packet.symEncryptedAEADProtected)).to.equal(false);
1277
- return openpgp.decrypt(decOpt);
1278
- }).then(async function (decrypted) {
1279
- expect(decrypted.data).to.equal(plaintext);
1280
- expect(decrypted.signatures[0].valid).to.be.true;
1281
- const signingKey = await privateKey.keys[0].getSigningKey();
1282
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1283
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1284
- });
1285
- });
1286
-
1287
- it('should encrypt/sign and decrypt/verify with generated key', function () {
1288
- const genOpt = {
1289
- userIds: [{ name: 'Test User', email: 'text@example.com' }],
1290
- numBits: 512
1291
- };
1292
- if (openpgp.util.getWebCryptoAll()) { genOpt.numBits = 2048; } // webkit webcrypto accepts minimum 2048 bit keys
1293
-
1294
- return openpgp.generateKey(genOpt).then(async function(newKey) {
1295
- const newPublicKey = await openpgp.key.readArmored(newKey.publicKeyArmored);
1296
- const newPrivateKey = await openpgp.key.readArmored(newKey.privateKeyArmored);
1297
-
1298
- const encOpt = {
1299
- message: openpgp.message.fromText(plaintext),
1300
- publicKeys: newPublicKey.keys,
1301
- privateKeys: newPrivateKey.keys
1302
- };
1303
- const decOpt = {
1304
- privateKeys: newPrivateKey.keys[0],
1305
- publicKeys: newPublicKey.keys
1306
- };
1307
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1308
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1309
- expect(!!decOpt.message.packets.findPacket(openpgp.enums.packet.symEncryptedAEADProtected)).to.equal(openpgp.config.aead_protect);
1310
- return openpgp.decrypt(decOpt);
1311
- }).then(async function (decrypted) {
1312
- expect(decrypted.data).to.equal(plaintext);
1313
- expect(decrypted.signatures[0].valid).to.be.true;
1314
- const signingKey = await newPrivateKey.keys[0].getSigningKey();
1315
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1316
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1317
- });
1318
- });
1319
- });
1320
-
1321
- it('should encrypt/sign and decrypt/verify with generated key and detached signatures', function () {
1322
- const genOpt = {
1323
- userIds: [{ name: 'Test User', email: 'text@example.com' }],
1324
- numBits: 512
1325
- };
1326
- if (openpgp.util.getWebCryptoAll()) { genOpt.numBits = 2048; } // webkit webcrypto accepts minimum 2048 bit keys
1327
-
1328
- return openpgp.generateKey(genOpt).then(async function(newKey) {
1329
- const newPublicKey = await openpgp.key.readArmored(newKey.publicKeyArmored);
1330
- const newPrivateKey = await openpgp.key.readArmored(newKey.privateKeyArmored);
1331
-
1332
- const encOpt = {
1333
- message: openpgp.message.fromText(plaintext),
1334
- publicKeys: newPublicKey.keys,
1335
- privateKeys: newPrivateKey.keys,
1336
- detached: true
1337
- };
1338
- const decOpt = {
1339
- privateKeys: newPrivateKey.keys[0],
1340
- publicKeys: newPublicKey.keys
1341
- };
1342
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1343
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1344
- decOpt.signature = await openpgp.signature.readArmored(encrypted.signature);
1345
- expect(!!decOpt.message.packets.findPacket(openpgp.enums.packet.symEncryptedAEADProtected)).to.equal(openpgp.config.aead_protect);
1346
- return openpgp.decrypt(decOpt);
1347
- }).then(async function (decrypted) {
1348
- expect(decrypted.data).to.equal(plaintext);
1349
- expect(decrypted.signatures[0].valid).to.be.true;
1350
- const signingKey = await newPrivateKey.keys[0].getSigningKey();
1351
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1352
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1353
- });
1354
- });
1355
- });
1356
-
1357
- it('should encrypt/sign and decrypt/verify with null string input', function () {
1358
- const encOpt = {
1359
- message: openpgp.message.fromText(''),
1360
- publicKeys: publicKey.keys,
1361
- privateKeys: privateKey.keys
1362
- };
1363
- const decOpt = {
1364
- privateKeys: privateKey.keys[0],
1365
- publicKeys: publicKey.keys
1366
- };
1367
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1368
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1369
- return openpgp.decrypt(decOpt);
1370
- }).then(async function (decrypted) {
1371
- expect(decrypted.data).to.equal('');
1372
- expect(decrypted.signatures[0].valid).to.be.true;
1373
- const signingKey = await privateKey.keys[0].getSigningKey();
1374
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1375
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1376
- });
1377
- });
1378
-
1379
- it('should encrypt/sign and decrypt/verify with detached signatures', function () {
1380
- const encOpt = {
1381
- message: openpgp.message.fromText(plaintext),
1382
- publicKeys: publicKey.keys,
1383
- privateKeys: privateKey.keys,
1384
- detached: true
1385
- };
1386
- const decOpt = {
1387
- privateKeys: privateKey.keys[0],
1388
- publicKeys: publicKey.keys
1389
- };
1390
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1391
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1392
- decOpt.signature = await openpgp.signature.readArmored(encrypted.signature);
1393
- return openpgp.decrypt(decOpt);
1394
- }).then(async function (decrypted) {
1395
- expect(decrypted.data).to.equal(plaintext);
1396
- expect(decrypted.signatures[0].valid).to.be.true;
1397
- const signingKey = await privateKey.keys[0].getSigningKey();
1398
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1399
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1400
- });
1401
- });
1402
-
1403
- it('should encrypt and decrypt/verify with detached signature input and detached flag set for encryption', function () {
1404
- const signOpt = {
1405
- message: openpgp.message.fromText(plaintext),
1406
- privateKeys: privateKey.keys[0],
1407
- detached: true
1408
- };
1409
-
1410
- const encOpt = {
1411
- message: openpgp.message.fromText(plaintext),
1412
- publicKeys: publicKey.keys,
1413
- detached: true
1414
- };
1415
-
1416
- const decOpt = {
1417
- privateKeys: privateKey.keys[0],
1418
- publicKeys: publicKey.keys[0]
1419
- };
1420
-
1421
- return openpgp.sign(signOpt).then(async function (signed) {
1422
- encOpt.signature = await openpgp.signature.readArmored(signed.signature);
1423
- return openpgp.encrypt(encOpt);
1424
- }).then(async function (encrypted) {
1425
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1426
- decOpt.signature = await openpgp.signature.readArmored(encrypted.signature);
1427
- return openpgp.decrypt(decOpt);
1428
- }).then(async function (decrypted) {
1429
- expect(decrypted.data).to.equal(plaintext);
1430
- expect(decrypted.signatures[0].valid).to.be.true;
1431
- const signingKey = await privateKey.keys[0].getSigningKey();
1432
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1433
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1434
- });
1435
- });
1436
-
1437
- it('should encrypt and decrypt/verify with detached signature as input and detached flag not set for encryption', async function () {
1438
- const plaintext = "  \t┍ͤ޵၂༫዇◧˘˻ᙑ᎚⏴ំந⛑nٓኵΉⅶ⋋ŵ⋲΂ͽᣏ₅ᄶɼ┋⌔û᬴Ƚᔡᧅ≃ṱἆ⃷݂૿ӌ᰹෇ٹჵ⛇໶⛌  \t\n한국어/조선말";
1439
-
1440
- const privKeyDE = (await openpgp.key.readArmored(priv_key_de)).keys[0];
1441
- await privKeyDE.decrypt(passphrase);
1442
-
1443
- const pubKeyDE = (await openpgp.key.readArmored(pub_key_de)).keys[0];
1444
-
1445
- const signOpt = {
1446
- message: openpgp.message.fromText(plaintext),
1447
- privateKeys: privKeyDE,
1448
- detached: true
1449
- };
1450
-
1451
- const encOpt = {
1452
- message: openpgp.message.fromText(plaintext),
1453
- publicKeys: publicKey.keys,
1454
- privateKeys: privateKey.keys[0]
1455
- };
1456
-
1457
- const decOpt = {
1458
- privateKeys: privateKey.keys[0],
1459
- publicKeys: [publicKey.keys[0], pubKeyDE]
1460
- };
1461
-
1462
- return openpgp.sign(signOpt).then(async function (signed) {
1463
- encOpt.signature = await openpgp.signature.readArmored(signed.signature);
1464
- return openpgp.encrypt(encOpt);
1465
- }).then(async function (encrypted) {
1466
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1467
- return openpgp.decrypt(decOpt);
1468
- }).then(async function (decrypted) {
1469
- let signingKey;
1470
- expect(decrypted.data).to.equal(plaintext);
1471
- expect(decrypted.signatures[0].valid).to.be.true;
1472
- signingKey = await privateKey.keys[0].getSigningKey();
1473
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1474
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1475
- expect(decrypted.signatures[1].valid).to.be.true;
1476
- signingKey = await privKeyDE.getSigningKey();
1477
- expect(decrypted.signatures[1].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1478
- expect(decrypted.signatures[1].signature.packets.length).to.equal(1);
1479
- });
1480
- });
1481
-
1482
- it('should fail to encrypt and decrypt/verify with detached signature input and detached flag set for encryption with wrong public key', async function () {
1483
- const signOpt = {
1484
- message: openpgp.message.fromText(plaintext),
1485
- privateKeys: privateKey.keys,
1486
- detached: true
1487
- };
1488
-
1489
- const encOpt = {
1490
- message: openpgp.message.fromText(plaintext),
1491
- publicKeys: publicKey.keys,
1492
- detached: true
1493
- };
1494
-
1495
- const decOpt = {
1496
- privateKeys: privateKey.keys[0],
1497
- publicKeys: (await openpgp.key.readArmored(wrong_pubkey)).keys
1498
- };
1499
-
1500
- return openpgp.sign(signOpt).then(async function (signed) {
1501
- encOpt.signature = await openpgp.signature.readArmored(signed.signature);
1502
- return openpgp.encrypt(encOpt);
1503
- }).then(async function (encrypted) {
1504
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1505
- decOpt.signature = await openpgp.signature.readArmored(encrypted.signature);
1506
- return openpgp.decrypt(decOpt);
1507
- }).then(async function (decrypted) {
1508
- expect(decrypted.data).to.equal(plaintext);
1509
- expect(decrypted.signatures[0].valid).to.be.null;
1510
- const signingKey = await privateKey.keys[0].getSigningKey();
1511
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1512
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1513
- });
1514
- });
1515
-
1516
- 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 () {
1517
- const signOpt = {
1518
- message: openpgp.message.fromText(plaintext),
1519
- privateKeys: privateKey.keys,
1520
- detached: true
1521
- };
1522
-
1523
- const encOpt = {
1524
- message: openpgp.message.fromText(plaintext),
1525
- publicKeys: publicKey.keys
1526
- };
1527
-
1528
- const decOpt = {
1529
- privateKeys: privateKey.keys[0],
1530
- publicKeys: (await openpgp.key.readArmored(wrong_pubkey)).keys
1531
- };
1532
-
1533
- return openpgp.sign(signOpt).then(async function (signed) {
1534
- encOpt.signature = await openpgp.signature.readArmored(signed.signature);
1535
- return openpgp.encrypt(encOpt);
1536
- }).then(async function (encrypted) {
1537
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1538
- return openpgp.decrypt(decOpt);
1539
- }).then(async function (decrypted) {
1540
- expect(decrypted.data).to.equal(plaintext);
1541
- expect(decrypted.signatures[0].valid).to.be.null;
1542
- const signingKey = await privateKey.keys[0].getSigningKey();
1543
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1544
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1545
- });
1546
- });
1547
-
1548
- it('should fail to verify decrypted data with wrong public pgp key', async function () {
1549
- const encOpt = {
1550
- message: openpgp.message.fromText(plaintext),
1551
- publicKeys: publicKey.keys,
1552
- privateKeys: privateKey.keys
1553
- };
1554
- const decOpt = {
1555
- privateKeys: privateKey.keys[0],
1556
- publicKeys: (await openpgp.key.readArmored(wrong_pubkey)).keys
1557
- };
1558
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1559
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1560
- return openpgp.decrypt(decOpt);
1561
- }).then(async function (decrypted) {
1562
- expect(decrypted.data).to.equal(plaintext);
1563
- expect(decrypted.signatures[0].valid).to.be.null;
1564
- const signingKey = await privateKey.keys[0].getSigningKey();
1565
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1566
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1567
- });
1568
- });
1569
-
1570
- it('should fail to verify decrypted null string with wrong public pgp key', async function () {
1571
- const encOpt = {
1572
- message: openpgp.message.fromText(''),
1573
- publicKeys: publicKey.keys,
1574
- privateKeys: privateKey.keys
1575
- };
1576
- const decOpt = {
1577
- privateKeys: privateKey.keys[0],
1578
- publicKeys: (await openpgp.key.readArmored(wrong_pubkey)).keys
1579
- };
1580
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1581
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1582
- return openpgp.decrypt(decOpt);
1583
- }).then(async function (decrypted) {
1584
- expect(decrypted.data).to.equal('');
1585
- expect(decrypted.signatures[0].valid).to.be.null;
1586
- const signingKey = await privateKey.keys[0].getSigningKey();
1587
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1588
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1589
- });
1590
- });
1591
-
1592
- it('should successfully decrypt signed message without public keys to verify', async function () {
1593
- const encOpt = {
1594
- message: openpgp.message.fromText(plaintext),
1595
- publicKeys: publicKey.keys,
1596
- privateKeys: privateKey.keys
1597
- };
1598
- const decOpt = {
1599
- privateKeys: privateKey.keys[0]
1600
- };
1601
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1602
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1603
- return openpgp.decrypt(decOpt);
1604
- }).then(async function (decrypted) {
1605
- expect(decrypted.data).to.equal(plaintext);
1606
- expect(decrypted.signatures[0].valid).to.be.null;
1607
- const signingKey = await privateKey.keys[0].getSigningKey();
1608
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1609
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1610
- });
1611
- });
1612
-
1613
- it('should fail to verify decrypted data with wrong public pgp key with detached signatures', async function () {
1614
- const encOpt = {
1615
- message: openpgp.message.fromText(plaintext),
1616
- publicKeys: publicKey.keys,
1617
- privateKeys: privateKey.keys,
1618
- detached: true
1619
- };
1620
- const decOpt = {
1621
- privateKeys: privateKey.keys[0],
1622
- publicKeys: (await openpgp.key.readArmored(wrong_pubkey)).keys
1623
- };
1624
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1625
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1626
- decOpt.signature = await openpgp.signature.readArmored(encrypted.signature);
1627
- return openpgp.decrypt(decOpt);
1628
- }).then(async function (decrypted) {
1629
- expect(decrypted.data).to.equal(plaintext);
1630
- expect(decrypted.signatures[0].valid).to.be.null;
1631
- const signingKey = await privateKey.keys[0].getSigningKey();
1632
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1633
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1634
- });
1635
- });
1636
-
1637
- it('should encrypt and decrypt/verify both signatures when signed with two private keys', async function () {
1638
- const privKeyDE = (await openpgp.key.readArmored(priv_key_de)).keys[0];
1639
- await privKeyDE.decrypt(passphrase);
1640
-
1641
- const pubKeyDE = (await openpgp.key.readArmored(pub_key_de)).keys[0];
1642
-
1643
- const encOpt = {
1644
- message: openpgp.message.fromText(plaintext),
1645
- publicKeys: publicKey.keys,
1646
- privateKeys: [privateKey.keys[0], privKeyDE]
1647
- };
1648
-
1649
- const decOpt = {
1650
- privateKeys: privateKey.keys[0],
1651
- publicKeys: [publicKey.keys[0], pubKeyDE]
1652
- };
1653
-
1654
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1655
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1656
- return openpgp.decrypt(decOpt);
1657
- }).then(async function (decrypted) {
1658
- let signingKey;
1659
- expect(decrypted.data).to.equal(plaintext);
1660
- expect(decrypted.signatures[0].valid).to.be.true;
1661
- signingKey = await privateKey.keys[0].getSigningKey();
1662
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1663
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1664
- expect(decrypted.signatures[1].valid).to.be.true;
1665
- signingKey = await privKeyDE.getSigningKey();
1666
- expect(decrypted.signatures[1].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1667
- expect(decrypted.signatures[1].signature.packets.length).to.equal(1);
1668
- });
1669
- });
1670
-
1671
- it('should fail to decrypt modified message', async function() {
1672
- const { privateKeyArmored } = await openpgp.generateKey({ curve: 'curve25519', userIds: [{ email: 'test@email.com' }] });
1673
- const { keys: [key] } = await openpgp.key.readArmored(privateKeyArmored);
1674
- const { data } = await openpgp.encrypt({ message: openpgp.message.fromBinary(new Uint8Array(500)), publicKeys: [key.toPublic()] });
1675
- let badSumEncrypted = data.replace(/\n=[a-zA-Z0-9/+]{4}/, '\n=aaaa');
1676
- if (badSumEncrypted === data) { // checksum was already =aaaa
1677
- badSumEncrypted = data.replace(/\n=[a-zA-Z0-9/+]{4}/, '\n=bbbb');
1678
- }
1679
- if (badSumEncrypted === data) {
1680
- throw new Error("Was not able to successfully modify checksum");
1681
- }
1682
- const badBodyEncrypted = data.replace(/\n=([a-zA-Z0-9/+]{4})/, 'aaa\n=$1');
1683
- for (let allow_streaming = 1; allow_streaming >= 0; allow_streaming--) {
1684
- openpgp.config.allow_unauthenticated_stream = !!allow_streaming;
1685
- if (openpgp.getWorker()) {
1686
- openpgp.getWorker().workers.forEach(worker => {
1687
- worker.postMessage({ event: 'configure', config: openpgp.config });
1688
- });
1689
- }
1690
- await Promise.all([badSumEncrypted, badBodyEncrypted].map(async (encrypted, i) => {
1691
- await Promise.all([
1692
- encrypted,
1693
- openpgp.stream.toStream(encrypted),
1694
- new ReadableStream({
1695
- start() {
1696
- this.remaining = encrypted.split('\n');
1697
- },
1698
- async pull(controller) {
1699
- if (this.remaining.length) {
1700
- await new Promise(res => setTimeout(res));
1701
- controller.enqueue(this.remaining.shift() + '\n');
1702
- } else {
1703
- controller.close();
1704
- }
1705
- }
1706
- })
1707
- ].map(async (encrypted, j) => {
1708
- let stepReached = 0;
1709
- try {
1710
- const message = await openpgp.message.readArmored(encrypted);
1711
- stepReached = 1;
1712
- const { data: decrypted } = await openpgp.decrypt({ message: message, privateKeys: [key] });
1713
- stepReached = 2;
1714
- await openpgp.stream.readToEnd(decrypted);
1715
- } catch (e) {
1716
- expect(e.message).to.match(/Ascii armor integrity check on message failed/);
1717
- expect(stepReached).to.equal(
1718
- j === 0 ? 0 :
1719
- (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 :
1720
- 1
1721
- );
1722
- return;
1723
- }
1724
- throw new Error(`Expected "Ascii armor integrity check on message failed" error in subtest ${i}.${j}`);
1725
- }));
1726
- }));
1727
- }
1728
- });
1729
- });
1730
-
1731
- describe('ELG / DSA encrypt, decrypt, sign, verify', function() {
1732
-
1733
- it('round trip test', async function () {
1734
- const pubKeyDE = (await openpgp.key.readArmored(pub_key_de)).keys[0];
1735
- const privKeyDE = (await openpgp.key.readArmored(priv_key_de)).keys[0];
1736
- await privKeyDE.decrypt(passphrase);
1737
- pubKeyDE.users[0].selfCertifications[0].features = [7]; // Monkey-patch AEAD feature flag
1738
- return openpgp.encrypt({
1739
- publicKeys: pubKeyDE,
1740
- privateKeys: privKeyDE,
1741
- message: openpgp.message.fromText(plaintext)
1742
- }).then(async function (encrypted) {
1743
- return openpgp.decrypt({
1744
- privateKeys: privKeyDE,
1745
- publicKeys: pubKeyDE,
1746
- message: await openpgp.message.readArmored(encrypted.data)
1747
- });
1748
- }).then(async function (decrypted) {
1749
- expect(decrypted.data).to.exist;
1750
- expect(decrypted.data).to.equal(plaintext);
1751
- expect(decrypted.signatures[0].valid).to.be.true;
1752
- const signingKey = await privKeyDE.getSigningKey();
1753
- expect(decrypted.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1754
- expect(decrypted.signatures[0].signature.packets.length).to.equal(1);
1755
- });
1756
- });
1757
- });
1758
-
1759
- describe("3DES decrypt", function() {
1760
- const pgp_msg =
1761
- ['-----BEGIN PGP MESSAGE-----',
1762
- 'Version: GnuPG/MacGPG2 v2.0.19 (Darwin)',
1763
- 'Comment: GPGTools - https://gpgtools.org',
1764
- '',
1765
- 'hIwDBU4Dycfvp2EBA/9tuhQgOrcATcm2PRmIOcs6q947YhlsBTZZdVJDfVjkKlyM',
1766
- 'M0yE+lnNplWb041Cpfkkl6IvorKQd2iPbAkOL0IXwmVN41l+PvVgMcuFvvzetehG',
1767
- 'Ca0/VEYOaTZRNqyr9FIzcnVy1I/PaWT3iqVAYa+G8TEA5Dh9RLfsx8ZA9UNIaNI+',
1768
- 'ASm9aZ3H6FerNhm8RezDY5vRn6xw3o/wH5YEBvV2BEmmFKZ2BlqFQxqChr8UNwd1',
1769
- 'Ieebnq0HtBPE8YU/L0U=',
1770
- '=JyIa',
1771
- '-----END PGP MESSAGE-----'].join('\n');
1772
-
1773
- const priv_key =
1774
- ['-----BEGIN PGP PRIVATE KEY BLOCK-----',
1775
- 'Version: GnuPG/MacGPG2 v2.0.19 (Darwin)',
1776
- 'Comment: GPGTools - https://gpgtools.org',
1777
- '',
1778
- 'lQH+BFLqLegBBAC/rN3g30Jrcpx5lTb7Kxe+ZfS7ppOIoBjjN+qcOh81cJJVS5dT',
1779
- 'UGcDsm2tCLVS3P2dGaYhfU9fsoSq/wK/tXsdoWXvXdjHbbueyi1kTZqlnyT190UE',
1780
- 'vmDxH0yqquvUaf7+CNXC0T6l9gGS9p0x7xNydWRb7zeK1wIsYI+dRGQmzQARAQAB',
1781
- '/gMDArgQHMknurQXy0Pho3Nsdu6zCUNXuplvaSXruefKsQn6eexGPnecNTT2iy5N',
1782
- '70EK371D7GcNhhLsn8roUcj1Hi3kR14wXW7lcQBy9RRbbglIJXIqKJ8ywBEO8BaQ',
1783
- 'b0plL+w5A9EvX0BQc4d53MTqySh6POsEDOxPzH4D/JWbaozfmc4LfGDqH1gl7ebY',
1784
- 'iu81vnBuuskjpz8rxRI81MldJEIObrTE2x46DF7AmS6L6u/Qz3AAmZd89p5INCdx',
1785
- 'DemxzuMKpC3wSgdgSSKHHTKiNOMxiRd5mFH5v1KVcEG/TyXFlmah7RwA4rA4fjeo',
1786
- 'OpnbVWp6ciUniRvgLaCMMbmolAoho9zaLbPzCQVQ8F7gkrjnnPm4MKA+AUXmjt7t',
1787
- 'VrrYkyTp1pxLZyUWX9+aKoxEO9OIDz7p9Mh02BZ/tznQ7U+IV2bcNhwrL6LPk4Mb',
1788
- 'J4YF/cLVxFVVma88GSFikSjPf30AUty5nBQFtbFGqnPctCF0aHJvd2F3YXkgPHRo',
1789
- 'cm93YXdheUBleGFtcGxlLmNvbT6IuAQTAQIAIgUCUuot6AIbAwYLCQgHAwIGFQgC',
1790
- 'CQoLBBYCAwECHgECF4AACgkQkk2hoj5duD/HZQP/ZXJ8PSlA1oj1NW97ccT0LiNH',
1791
- 'WzxPPoH9a/qGQYg61jp+aTa0C5hlYY/GgeFpiZlpwVUtlkZYfslXJqbCcp3os4xt',
1792
- 'kiukDbPnq2Y41wNVxXrDw6KbOjohbhzeRUh8txbkiXGiwHtHBSJsPMntN6cB3vn3',
1793
- '08eE69vOiHPQfowa2CmdAf4EUuot6AEEAOQpNjkcTUo14JQ2o+mrpxj5yXbGtZKh',
1794
- 'D8Ll+aZZrIDIa44p9KlQ3aFzPxdmFBiBX57m1nQukr58FQ5Y/FuQ1dKYc3M8QdZL',
1795
- 'vCKDC8D9ZJf13iwUjYkfn/e/bDqCS2piyd63zI0xDJo+s2bXCIJxgrhbOqFDeFd6',
1796
- '4W8PfBOvUuRjABEBAAH+AwMCuBAcySe6tBfLV0P5MbBesR3Ifu/ppjzLoXKhwkqm',
1797
- 'PXf09taLcRfUHeMbPjboj2P2m2UOnSrbXK9qsDQ8XOMtdsEWGLWpmiqnMlkiOchv',
1798
- 'MsNRYpZ67iX3JVdxNuhs5+g5bdP1PNVbKiTzx73u1h0SS93IJp1jFj50/kyGl1Eq',
1799
- 'tkr0TWe5uXCh6cSZDPwhto0a12GeDHehdTw6Yq4KoZHccneHhN9ySFy0DZOeULIi',
1800
- 'Y61qtR0io52T7w69fBe9Q5/d5SwpwWKMpCTOqvvzdHX7JmeFtV+2vRVilIif7AfP',
1801
- 'AD+OjQ/OhMu3jYO+XNhm3raPT2tIBsBdl2UiHOnj4AUNuLuUJeVghtz4Qt6dvjyz',
1802
- 'PlBvSF+ESqALjM8IqnG15FX4LmEDFrFcfNCsnmeyZ2nr1h2mV5jOON0EmBtCyhCt',
1803
- 'D/Ivi4/SZk+tBVhsBI+7ZECZYDJzZQnyPDsUv31MU4OwdWi7FhzHvDj/0bhYY7+I',
1804
- 'nwQYAQIACQUCUuot6AIbDAAKCRCSTaGiPl24PwYAA/sGIHvCKWP5+4ZlBHuOdbP9',
1805
- '9v3PXFCm61qFEL0DTSq7NgBcuf0ASRElRI3wIKlfkwaiSzVPfNLiMTexdc7XaiTz',
1806
- 'CHaOn1Xl2gmYTq2KiJkgtLuwptYU1iSj7vvSHKy0+nYIckOZB4pRCOjknT08O4ZJ',
1807
- '22q10ausyQXoOxXfDWVwKA==',
1808
- '=IkKW',
1809
- '-----END PGP PRIVATE KEY BLOCK-----'].join('\n');
1810
-
1811
- it('Decrypt message', async function() {
1812
- const privKey = (await openpgp.key.readArmored(priv_key)).keys[0];
1813
- await privKey.decrypt('1234');
1814
- const message = await openpgp.message.readArmored(pgp_msg);
1815
-
1816
- return openpgp.decrypt({ privateKeys:privKey, message:message }).then(function(decrypted) {
1817
- expect(decrypted.data).to.equal('hello 3des\n');
1818
- expect(decrypted.signatures.length).to.equal(0);
1819
- });
1820
- });
1821
- });
1822
-
1823
- describe('AES encrypt, decrypt', function() {
1824
-
1825
- it('should encrypt and decrypt with one password', function () {
1826
- const encOpt = {
1827
- message: openpgp.message.fromText(plaintext),
1828
- passwords: password1
1829
- };
1830
- const decOpt = {
1831
- passwords: password1
1832
- };
1833
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1834
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1835
- return openpgp.decrypt(decOpt);
1836
- }).then(function (decrypted) {
1837
- expect(decrypted.data).to.equal(plaintext);
1838
- expect(decrypted.signatures.length).to.equal(0);
1839
- });
1840
- });
1841
-
1842
- it('should encrypt and decrypt with two passwords', function () {
1843
- const encOpt = {
1844
- message: openpgp.message.fromText(plaintext),
1845
- passwords: [password1, password2]
1846
- };
1847
- const decOpt = {
1848
- passwords: password2
1849
- };
1850
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1851
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1852
- return openpgp.decrypt(decOpt);
1853
- }).then(function (decrypted) {
1854
- expect(decrypted.data).to.equal(plaintext);
1855
- expect(decrypted.signatures.length).to.equal(0);
1856
- });
1857
- });
1858
-
1859
- it('should encrypt and decrypt with password and not ascii armor', function () {
1860
- const encOpt = {
1861
- message: openpgp.message.fromText(plaintext),
1862
- passwords: password1,
1863
- armor: false
1864
- };
1865
- const decOpt = {
1866
- passwords: password1
1867
- };
1868
- return openpgp.encrypt(encOpt).then(function (encrypted) {
1869
- decOpt.message = encrypted.message;
1870
- return openpgp.decrypt(decOpt);
1871
- }).then(function (decrypted) {
1872
- expect(decrypted.data).to.equal(plaintext);
1873
- expect(decrypted.signatures.length).to.equal(0);
1874
- });
1875
- });
1876
-
1877
- it('should encrypt and decrypt with binary data and transferable objects', function () {
1878
- openpgp.config.zero_copy = true; // activate transferable objects
1879
- const encOpt = {
1880
- message: openpgp.message.fromBinary(new Uint8Array([0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01])),
1881
- passwords: password1,
1882
- armor: false
1883
- };
1884
- const decOpt = {
1885
- passwords: password1,
1886
- format: 'binary'
1887
- };
1888
- return openpgp.encrypt(encOpt).then(function (encrypted) {
1889
- decOpt.message = encrypted.message;
1890
- return openpgp.decrypt(decOpt);
1891
- }).then(function (decrypted) {
1892
- if (openpgp.getWorker()) {
1893
- if (navigator.userAgent.indexOf('Safari') !== -1 && (navigator.userAgent.indexOf('Version/11.1') !== -1 || (navigator.userAgent.match(/Chrome\/(\d+)/) || [])[1] < 56)) {
1894
- expect(encOpt.message.packets[0].data.byteLength).to.equal(8); // browser doesn't support transfering buffers
1895
- } else {
1896
- expect(encOpt.message.packets[0].data.byteLength).to.equal(0); // transferred buffer should be empty
1897
- }
1898
- }
1899
- expect(decrypted.data).to.deep.equal(new Uint8Array([0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01]));
1900
- expect(decrypted.signatures.length).to.equal(0);
1901
- });
1902
- });
1903
- });
1904
-
1905
- describe('Encrypt, decrypt with compression', function() {
1906
- withCompression(function (modifyCompressionEncryptOptions, verifyCompressionDecrypted) {
1907
- it('should encrypt and decrypt with one password', function () {
1908
- const encOpt = modifyCompressionEncryptOptions({
1909
- message: openpgp.message.fromText(plaintext),
1910
- passwords: password1
1911
- });
1912
- const decOpt = {
1913
- passwords: password1
1914
- };
1915
- return openpgp.encrypt(encOpt).then(async function (encrypted) {
1916
- decOpt.message = await openpgp.message.readArmored(encrypted.data);
1917
- return openpgp.decrypt(decOpt);
1918
- }).then(function (decrypted) {
1919
- expect(decrypted.data).to.equal(plaintext);
1920
- expect(decrypted.signatures.length).to.equal(0);
1921
- verifyCompressionDecrypted(decrypted);
1922
- });
1923
- });
1924
-
1925
- it('Streaming encrypt and decrypt small message roundtrip', async function() {
1926
- let plaintext = [];
1927
- let i = 0;
1928
- const data = new ReadableStream({
1929
- async pull(controller) {
1930
- if (i++ < 4) {
1931
- let randomBytes = await openpgp.crypto.random.getRandomBytes(10);
1932
- controller.enqueue(randomBytes);
1933
- plaintext.push(randomBytes.slice());
1934
- } else {
1935
- controller.close();
1936
- }
1937
- }
1938
- });
1939
- const encrypted = await openpgp.encrypt(modifyCompressionEncryptOptions({
1940
- message: openpgp.message.fromBinary(data),
1941
- passwords: ['test'],
1942
- }));
1943
-
1944
- const msgAsciiArmored = encrypted.data;
1945
- const message = await openpgp.message.readArmored(msgAsciiArmored);
1946
- const decrypted = await openpgp.decrypt({
1947
- passwords: ['test'],
1948
- message,
1949
- format: 'binary'
1950
- });
1951
- expect(openpgp.util.isStream(decrypted.data)).to.equal('web');
1952
- expect(await openpgp.stream.readToEnd(decrypted.data)).to.deep.equal(openpgp.util.concatUint8Array(plaintext));
1953
- });
1954
- });
1955
- });
1956
-
1957
- }
1958
-
1959
- describe('AES / RSA encrypt, decrypt, sign, verify', function() {
1960
- const wrong_pubkey = '-----BEGIN PGP PUBLIC KEY BLOCK-----\r\n' +
1961
- 'Version: OpenPGP.js v0.9.0\r\n' +
1962
- 'Comment: Hoodiecrow - https://hoodiecrow.com\r\n' +
1963
- '\r\n' +
1964
- 'xk0EUlhMvAEB/2MZtCUOAYvyLFjDp3OBMGn3Ev8FwjzyPbIF0JUw+L7y2XR5\r\n' +
1965
- 'RVGvbK88unV3cU/1tOYdNsXI6pSp/Ztjyv7vbBUAEQEAAc0pV2hpdGVvdXQg\r\n' +
1966
- 'VXNlciA8d2hpdGVvdXQudGVzdEB0LW9ubGluZS5kZT7CXAQQAQgAEAUCUlhM\r\n' +
1967
- 'vQkQ9vYOm0LN/0wAAAW4Af9C+kYW1AvNWmivdtr0M0iYCUjM9DNOQH1fcvXq\r\n' +
1968
- 'IiN602mWrkd8jcEzLsW5IUNzVPLhrFIuKyBDTpLnC07Loce1\r\n' +
1969
- '=6XMW\r\n' +
1970
- '-----END PGP PUBLIC KEY BLOCK-----\r\n\r\n';
1971
-
1972
- let decryptedPrivateKey;
1973
- beforeEach(async function() {
1974
- if (!decryptedPrivateKey) {
1975
- expect(await privateKey.keys[0].decrypt(passphrase)).to.be.true;
1976
- decryptedPrivateKey = privateKey;
1977
- }
1978
- privateKey = decryptedPrivateKey;
1979
- });
1980
-
1981
- it('should sign and verify cleartext data', function () {
1982
- const message = openpgp.cleartext.fromText(plaintext);
1983
- const signOpt = {
1984
- message,
1985
- privateKeys: privateKey.keys
1986
- };
1987
- const verifyOpt = {
1988
- publicKeys: publicKey.keys
1989
- };
1990
- return openpgp.sign(signOpt).then(async function (signed) {
1991
- expect(signed.data).to.match(/-----BEGIN PGP SIGNED MESSAGE-----/);
1992
- verifyOpt.message = await openpgp.cleartext.readArmored(signed.data);
1993
- return openpgp.verify(verifyOpt);
1994
- }).then(async function (verified) {
1995
- expect(verified.data).to.equal(plaintext.replace(/[ \t]+$/mg, ''));
1996
- expect(verified.signatures[0].valid).to.be.true;
1997
- const signingKey = await privateKey.keys[0].getSigningKey();
1998
- expect(verified.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
1999
- expect(verified.signatures[0].signature.packets.length).to.equal(1);
2000
- });
2001
- });
2002
-
2003
- it('should sign and verify cleartext data with multiple private keys', async function () {
2004
- const privKeyDE = (await openpgp.key.readArmored(priv_key_de)).keys[0];
2005
- await privKeyDE.decrypt(passphrase);
2006
-
2007
- const message = openpgp.cleartext.fromText(plaintext);
2008
- const signOpt = {
2009
- message,
2010
- privateKeys: [privateKey.keys[0], privKeyDE]
2011
- };
2012
- const verifyOpt = {
2013
- publicKeys: [publicKey.keys[0], privKeyDE.toPublic()]
2014
- };
2015
- return openpgp.sign(signOpt).then(async function (signed) {
2016
- expect(signed.data).to.match(/-----BEGIN PGP SIGNED MESSAGE-----/);
2017
- verifyOpt.message = await openpgp.cleartext.readArmored(signed.data);
2018
- return openpgp.verify(verifyOpt);
2019
- }).then(async function (verified) {
2020
- let signingKey;
2021
- expect(verified.data).to.equal(plaintext.replace(/[ \t]+$/mg, ''));
2022
- expect(verified.signatures[0].valid).to.be.true;
2023
- signingKey = await privateKey.keys[0].getSigningKey();
2024
- expect(verified.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
2025
- expect(verified.signatures[0].signature.packets.length).to.equal(1);
2026
- expect(verified.signatures[1].valid).to.be.true;
2027
- signingKey = await privKeyDE.getSigningKey();
2028
- expect(verified.signatures[1].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
2029
- expect(verified.signatures[1].signature.packets.length).to.equal(1);
2030
- });
2031
- });
2032
-
2033
- it('should sign and verify cleartext data with detached signatures', function () {
2034
- const message = openpgp.cleartext.fromText(plaintext);
2035
- const signOpt = {
2036
- message,
2037
- privateKeys: privateKey.keys,
2038
- detached: true
2039
- };
2040
- const verifyOpt = {
2041
- message,
2042
- publicKeys: publicKey.keys
2043
- };
2044
- return openpgp.sign(signOpt).then(async function (signed) {
2045
- verifyOpt.signature = await openpgp.signature.readArmored(signed.signature);
2046
- return openpgp.verify(verifyOpt);
2047
- }).then(async function (verified) {
2048
- expect(verified.data).to.equal(plaintext.replace(/[ \t]+$/mg, ''));
2049
- expect(verified.signatures[0].valid).to.be.true;
2050
- const signingKey = await privateKey.keys[0].getSigningKey();
2051
- expect(verified.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
2052
- expect(verified.signatures[0].signature.packets.length).to.equal(1);
2053
- });
2054
- });
2055
-
2056
- it('should sign and fail to verify cleartext data with wrong public pgp key', async function () {
2057
- const message = openpgp.cleartext.fromText(plaintext);
2058
- const signOpt = {
2059
- message,
2060
- privateKeys: privateKey.keys
2061
- };
2062
- const verifyOpt = {
2063
- publicKeys: (await openpgp.key.readArmored(wrong_pubkey)).keys
2064
- };
2065
- return openpgp.sign(signOpt).then(async function (signed) {
2066
- verifyOpt.message = await openpgp.cleartext.readArmored(signed.data);
2067
- return openpgp.verify(verifyOpt);
2068
- }).then(async function (verified) {
2069
- expect(verified.data).to.equal(plaintext.replace(/[ \t]+$/mg, ''));
2070
- expect(verified.signatures[0].valid).to.be.null;
2071
- const signingKey = await privateKey.keys[0].getSigningKey();
2072
- expect(verified.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
2073
- expect(verified.signatures[0].signature.packets.length).to.equal(1);
2074
- });
2075
- });
2076
-
2077
- it('should sign and fail to verify cleartext data with wrong public pgp key with detached signature', async function () {
2078
- const message = openpgp.cleartext.fromText(plaintext);
2079
- const signOpt = {
2080
- message,
2081
- privateKeys: privateKey.keys,
2082
- detached: true
2083
- };
2084
- const verifyOpt = {
2085
- message,
2086
- publicKeys: (await openpgp.key.readArmored(wrong_pubkey)).keys
2087
- };
2088
- return openpgp.sign(signOpt).then(async function (signed) {
2089
- verifyOpt.signature = await openpgp.signature.readArmored(signed.signature);
2090
- return openpgp.verify(verifyOpt);
2091
- }).then(async function (verified) {
2092
- expect(verified.data).to.equal(plaintext.replace(/[ \t]+$/mg, ''));
2093
- expect(verified.signatures[0].valid).to.be.null;
2094
- const signingKey = await privateKey.keys[0].getSigningKey();
2095
- expect(verified.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
2096
- expect(verified.signatures[0].signature.packets.length).to.equal(1);
2097
- });
2098
- });
2099
-
2100
- it('should sign and verify cleartext data and not armor', function () {
2101
- const message = openpgp.cleartext.fromText(plaintext);
2102
- const signOpt = {
2103
- message,
2104
- privateKeys: privateKey.keys,
2105
- armor: false
2106
- };
2107
- const verifyOpt = {
2108
- publicKeys: publicKey.keys
2109
- };
2110
- return openpgp.sign(signOpt).then(function (signed) {
2111
- verifyOpt.message = signed.message;
2112
- return openpgp.verify(verifyOpt);
2113
- }).then(async function (verified) {
2114
- expect(verified.data).to.equal(plaintext.replace(/[ \t]+$/mg, ''));
2115
- expect(verified.signatures[0].valid).to.be.true;
2116
- const signingKey = await privateKey.keys[0].getSigningKey();
2117
- expect(verified.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
2118
- expect(verified.signatures[0].signature.packets.length).to.equal(1);
2119
- });
2120
- });
2121
-
2122
- it('should sign and verify cleartext data and not armor with detached signatures', function () {
2123
- const start = openpgp.util.normalizeDate();
2124
- const message = openpgp.cleartext.fromText(plaintext);
2125
- const signOpt = {
2126
- message,
2127
- privateKeys: privateKey.keys,
2128
- detached: true,
2129
- armor: false
2130
- };
2131
- const verifyOpt = {
2132
- message,
2133
- publicKeys: publicKey.keys
2134
- };
2135
- return openpgp.sign(signOpt).then(function (signed) {
2136
- verifyOpt.signature = signed.signature;
2137
- return openpgp.verify(verifyOpt);
2138
- }).then(async function (verified) {
2139
- expect(verified.data).to.equal(plaintext.replace(/[ \t]+$/mg, ''));
2140
- expect(+verified.signatures[0].signature.packets[0].created).to.be.lte(+openpgp.util.normalizeDate());
2141
- expect(+verified.signatures[0].signature.packets[0].created).to.be.gte(+start);
2142
- expect(verified.signatures[0].valid).to.be.true;
2143
- const signingKey = await privateKey.keys[0].getSigningKey();
2144
- expect(verified.signatures[0].keyid.toHex()).to.equal(signingKey.getKeyId().toHex());
2145
- expect(verified.signatures[0].signature.packets.length).to.equal(1);
2146
- });
2147
- });
2148
-
2149
- it('should sign and verify cleartext data with a date in the past', function () {
2150
- const message = openpgp.cleartext.fromText(plaintext);
2151
- const past = new Date(2000);
2152
- const signOpt = {
2153
- message,
2154
- privateKeys: privateKey_1337.keys,
2155
- detached: true,
2156
- date: past,
2157
- armor: false
2158
- };
2159
- const verifyOpt = {
2160
- message,
2161
- publicKeys: publicKey_1337.keys,
2162
- date: past
2163
- };
2164
- return openpgp.sign(signOpt).then(function (signed) {
2165
- verifyOpt.signature = signed.signature;
2166
- return openpgp.verify(verifyOpt).then(async function (verified) {
2167
- expect(+verified.signatures[0].signature.packets[0].created).to.equal(+past);
2168
- expect(verified.data).to.equal(plaintext.replace(/[ \t]+$/mg, ''));
2169
- expect(verified.signatures[0].valid).to.be.true;
2170
- expect(await signOpt.privateKeys[0].getSigningKey(verified.signatures[0].keyid, past))
2171
- .to.be.not.null;
2172
- expect(verified.signatures[0].signature.packets.length).to.equal(1);
2173
- // now check with expiration checking disabled
2174
- verifyOpt.date = null;
2175
- return openpgp.verify(verifyOpt);
2176
- }).then(async function (verified) {
2177
- expect(+verified.signatures[0].signature.packets[0].created).to.equal(+past);
2178
- expect(verified.data).to.equal(plaintext.replace(/[ \t]+$/mg, ''));
2179
- expect(verified.signatures[0].valid).to.be.true;
2180
- expect(await signOpt.privateKeys[0].getSigningKey(verified.signatures[0].keyid, null))
2181
- .to.be.not.null;
2182
- expect(verified.signatures[0].signature.packets.length).to.equal(1);
2183
- });
2184
- });
2185
- });
2186
-
2187
- it('should sign and verify binary data with a date in the future', function () {
2188
- const future = new Date(2040, 5, 5, 5, 5, 5, 0);
2189
- const data = new Uint8Array([3, 14, 15, 92, 65, 35, 59]);
2190
- const signOpt = {
2191
- message: openpgp.message.fromBinary(data),
2192
- privateKeys: privateKey_2038_2045.keys,
2193
- detached: true,
2194
- date: future,
2195
- armor: false
2196
- };
2197
- const verifyOpt = {
2198
- publicKeys: publicKey_2038_2045.keys,
2199
- date: future
2200
- };
2201
- return openpgp.sign(signOpt).then(function (signed) {
2202
- verifyOpt.message = openpgp.message.fromBinary(data);
2203
- verifyOpt.signature = signed.signature;
2204
- return openpgp.verify(verifyOpt);
2205
- }).then(async function (verified) {
2206
- expect(+verified.signatures[0].signature.packets[0].created).to.equal(+future);
2207
- expect([].slice.call(verified.data)).to.deep.equal([].slice.call(data));
2208
- expect(verified.signatures[0].valid).to.be.true;
2209
- expect(await signOpt.privateKeys[0].getSigningKey(verified.signatures[0].keyid, future))
2210
- .to.be.not.null;
2211
- expect(verified.signatures[0].signature.packets.length).to.equal(1);
2212
- });
2213
- });
2214
-
2215
- it('should sign and verify binary data without one-pass signature', function () {
2216
- const data = new Uint8Array([3, 14, 15, 92, 65, 35, 59]);
2217
- const signOpt = {
2218
- message: openpgp.message.fromBinary(data),
2219
- privateKeys: privateKey.keys,
2220
- armor: false
2221
- };
2222
- const verifyOpt = {
2223
- publicKeys: publicKey.keys
2224
- };
2225
- return openpgp.sign(signOpt).then(function (signed) {
2226
- const packets = new openpgp.packet.List();
2227
- packets.push(signed.message.packets.findPacket(openpgp.enums.packet.signature));
2228
- packets.push(signed.message.packets.findPacket(openpgp.enums.packet.literal));
2229
- verifyOpt.message = new openpgp.message.Message(packets);
2230
- return openpgp.verify(verifyOpt);
2231
- }).then(async function (verified) {
2232
- expect([].slice.call(verified.data)).to.deep.equal([].slice.call(data));
2233
- expect(verified.signatures[0].valid).to.be.true;
2234
- expect(await signOpt.privateKeys[0].getSigningKey(verified.signatures[0].keyid))
2235
- .to.be.not.null;
2236
- expect(verified.signatures[0].signature.packets.length).to.equal(1);
2237
- });
2238
- });
2239
-
2240
- it('should streaming sign and verify binary data without one-pass signature', function () {
2241
- const data = new Uint8Array([3, 14, 15, 92, 65, 35, 59]);
2242
- const signOpt = {
2243
- message: openpgp.message.fromBinary(data),
2244
- privateKeys: privateKey.keys,
2245
- armor: false,
2246
- streaming: 'web'
2247
- };
2248
- const verifyOpt = {
2249
- publicKeys: publicKey.keys,
2250
- streaming: 'web'
2251
- };
2252
- return openpgp.sign(signOpt).then(function (signed) {
2253
- const packets = new openpgp.packet.List();
2254
- packets.push(signed.message.packets.findPacket(openpgp.enums.packet.signature));
2255
- packets.push(signed.message.packets.findPacket(openpgp.enums.packet.literal));
2256
- verifyOpt.message = new openpgp.message.Message(packets);
2257
- return openpgp.verify(verifyOpt);
2258
- }).then(async function (verified) {
2259
- expect(openpgp.stream.isStream(verified.data)).to.equal('web');
2260
- expect([].slice.call(await openpgp.stream.readToEnd(verified.data))).to.deep.equal([].slice.call(data));
2261
- expect(await verified.signatures[0].verified).to.be.true;
2262
- expect(await signOpt.privateKeys[0].getSigningKey(verified.signatures[0].keyid))
2263
- .to.be.not.null;
2264
- expect((await verified.signatures[0].signature).packets.length).to.equal(1);
2265
- });
2266
- });
2267
-
2268
- it('should encrypt and decrypt cleartext data with a date in the future', function () {
2269
- const future = new Date(2040, 5, 5, 5, 5, 5, 0);
2270
- const encryptOpt = {
2271
- message: openpgp.message.fromText(plaintext, undefined, future),
2272
- publicKeys: publicKey_2038_2045.keys,
2273
- date: future,
2274
- armor: false
2275
- };
2276
- const decryptOpt = {
2277
- privateKeys: privateKey_2038_2045.keys,
2278
- date: future
2279
- };
2280
-
2281
- return openpgp.encrypt(encryptOpt).then(function (encrypted) {
2282
- decryptOpt.message = encrypted.message;
2283
- return encrypted.message.decrypt(decryptOpt.privateKeys);
2284
- }).then(async function (packets) {
2285
- const literals = packets.packets.filterByTag(openpgp.enums.packet.literal);
2286
- expect(literals.length).to.equal(1);
2287
- expect(+literals[0].date).to.equal(+future);
2288
- expect(await openpgp.stream.readToEnd(packets.getText())).to.equal(plaintext);
2289
- });
2290
- });
2291
-
2292
- it('should encrypt and decrypt binary data with a date in the past', function () {
2293
- const past = new Date(2005, 5, 5, 5, 5, 5, 0);
2294
- const data = new Uint8Array([3, 14, 15, 92, 65, 35, 59]);
2295
- const encryptOpt = {
2296
- message: openpgp.message.fromBinary(data, undefined, past),
2297
- publicKeys: publicKey_2000_2008.keys,
2298
- date: past,
2299
- armor: false
2300
- };
2301
- const decryptOpt = {
2302
- privateKeys: privateKey_2000_2008.keys,
2303
- date: past
2304
- };
2305
-
2306
- return openpgp.encrypt(encryptOpt).then(function (encrypted) {
2307
- decryptOpt.message = encrypted.message;
2308
- return encrypted.message.decrypt(decryptOpt.privateKeys);
2309
- }).then(async function (packets) {
2310
- const literals = packets.packets.filterByTag(openpgp.enums.packet.literal);
2311
- expect(literals.length).to.equal(1);
2312
- expect(+literals[0].date).to.equal(+past);
2313
- expect(await openpgp.stream.readToEnd(packets.getLiteralData())).to.deep.equal(data);
2314
- });
2315
- });
2316
-
2317
- it('should sign, encrypt and decrypt, verify cleartext data with a date in the past', function () {
2318
- const past = new Date(2005, 5, 5, 5, 5, 5, 0);
2319
- const encryptOpt = {
2320
- message: openpgp.message.fromText(plaintext, undefined, past),
2321
- publicKeys: publicKey_2000_2008.keys,
2322
- privateKeys: privateKey_2000_2008.keys,
2323
- date: past,
2324
- armor: false
2325
- };
2326
-
2327
- return openpgp.encrypt(encryptOpt).then(function (encrypted) {
2328
- return encrypted.message.decrypt(encryptOpt.privateKeys);
2329
- }).then(async function (packets) {
2330
- const literals = packets.packets.filterByTag(openpgp.enums.packet.literal);
2331
- expect(literals.length).to.equal(1);
2332
- expect(+literals[0].date).to.equal(+past);
2333
- const signatures = await packets.verify(encryptOpt.publicKeys, past);
2334
- expect(await openpgp.stream.readToEnd(packets.getText())).to.equal(plaintext);
2335
- expect(+(await signatures[0].signature).packets[0].created).to.equal(+past);
2336
- expect(await signatures[0].verified).to.be.true;
2337
- expect(await encryptOpt.privateKeys[0].getSigningKey(signatures[0].keyid, past))
2338
- .to.be.not.null;
2339
- expect((await signatures[0].signature).packets.length).to.equal(1);
2340
- });
2341
- });
2342
-
2343
- it('should sign, encrypt and decrypt, verify binary data with a date in the future', function () {
2344
- const future = new Date(2040, 5, 5, 5, 5, 5, 0);
2345
- const data = new Uint8Array([3, 14, 15, 92, 65, 35, 59]);
2346
- const encryptOpt = {
2347
- message: openpgp.message.fromBinary(data, undefined, future),
2348
- publicKeys: publicKey_2038_2045.keys,
2349
- privateKeys: privateKey_2038_2045.keys,
2350
- date: future,
2351
- armor: false
2352
- };
2353
-
2354
- return openpgp.encrypt(encryptOpt).then(function (encrypted) {
2355
- return encrypted.message.decrypt(encryptOpt.privateKeys);
2356
- }).then(async function (packets) {
2357
- const literals = packets.packets.filterByTag(openpgp.enums.packet.literal);
2358
- expect(literals.length).to.equal(1);
2359
- expect(literals[0].format).to.equal('binary');
2360
- expect(+literals[0].date).to.equal(+future);
2361
- const signatures = await packets.verify(encryptOpt.publicKeys, future);
2362
- expect(await openpgp.stream.readToEnd(packets.getLiteralData())).to.deep.equal(data);
2363
- expect(+(await signatures[0].signature).packets[0].created).to.equal(+future);
2364
- expect(await signatures[0].verified).to.be.true;
2365
- expect(await encryptOpt.privateKeys[0].getSigningKey(signatures[0].keyid, future))
2366
- .to.be.not.null;
2367
- expect((await signatures[0].signature).packets.length).to.equal(1);
2368
- });
2369
- });
2370
-
2371
- it('should sign, encrypt and decrypt, verify mime data with a date in the future', function () {
2372
- const future = new Date(2040, 5, 5, 5, 5, 5, 0);
2373
- const data = new Uint8Array([3, 14, 15, 92, 65, 35, 59]);
2374
- const encryptOpt = {
2375
- message: openpgp.message.fromBinary(data, undefined, future, 'mime'),
2376
- publicKeys: publicKey_2038_2045.keys,
2377
- privateKeys: privateKey_2038_2045.keys,
2378
- date: future,
2379
- armor: false
2380
- };
2381
-
2382
- return openpgp.encrypt(encryptOpt).then(function (encrypted) {
2383
- return encrypted.message.decrypt(encryptOpt.privateKeys);
2384
- }).then(async function (packets) {
2385
- const literals = packets.packets.filterByTag(openpgp.enums.packet.literal);
2386
- expect(literals.length).to.equal(1);
2387
- expect(literals[0].format).to.equal('mime');
2388
- expect(+literals[0].date).to.equal(+future);
2389
- const signatures = await packets.verify(encryptOpt.publicKeys, future);
2390
- expect(await openpgp.stream.readToEnd(packets.getLiteralData())).to.deep.equal(data);
2391
- expect(+(await signatures[0].signature).packets[0].created).to.equal(+future);
2392
- expect(await signatures[0].verified).to.be.true;
2393
- expect(await encryptOpt.privateKeys[0].getSigningKey(signatures[0].keyid, future))
2394
- .to.be.not.null;
2395
- expect((await signatures[0].signature).packets.length).to.equal(1);
2396
- });
2397
- });
2398
-
2399
- it('should fail to encrypt with revoked key', function() {
2400
- return openpgp.revokeKey({
2401
- key: privateKey.keys[0]
2402
- }).then(function(revKey) {
2403
- return openpgp.encrypt({
2404
- message: openpgp.message.fromText(plaintext),
2405
- publicKeys: revKey.publicKey
2406
- }).then(function() {
2407
- throw new Error('Should not encrypt with revoked key');
2408
- }).catch(function(error) {
2409
- expect(error.message).to.match(/Error encrypting message: Primary key is revoked/);
2410
- });
2411
- });
2412
- });
2413
-
2414
- it('should fail to encrypt with revoked subkey', async function() {
2415
- const pubKeyDE = (await openpgp.key.readArmored(pub_key_de)).keys[0];
2416
- const privKeyDE = (await openpgp.key.readArmored(priv_key_de)).keys[0];
2417
- await privKeyDE.decrypt(passphrase);
2418
- return privKeyDE.subKeys[0].revoke(privKeyDE.primaryKey).then(function(revSubKey) {
2419
- pubKeyDE.subKeys[0] = revSubKey;
2420
- return openpgp.encrypt({
2421
- message: openpgp.message.fromText(plaintext),
2422
- publicKeys: pubKeyDE
2423
- }).then(function() {
2424
- throw new Error('Should not encrypt with revoked subkey');
2425
- }).catch(function(error) {
2426
- expect(error.message).to.match(/Could not find valid encryption key packet/);
2427
- });
2428
- });
2429
- });
2430
-
2431
- it('should decrypt with revoked subkey', async function() {
2432
- const pubKeyDE = (await openpgp.key.readArmored(pub_key_de)).keys[0];
2433
- const privKeyDE = (await openpgp.key.readArmored(priv_key_de)).keys[0];
2434
- await privKeyDE.decrypt(passphrase);
2435
- const encrypted = await openpgp.encrypt({
2436
- message: openpgp.message.fromText(plaintext),
2437
- publicKeys: pubKeyDE
2438
- });
2439
- privKeyDE.subKeys[0] = await privKeyDE.subKeys[0].revoke(privKeyDE.primaryKey);
2440
- const decOpt = {
2441
- message: await openpgp.message.readArmored(encrypted.data),
2442
- privateKeys: privKeyDE
2443
- };
2444
- const decrypted = await openpgp.decrypt(decOpt);
2445
- expect(decrypted.data).to.equal(plaintext);
2446
- });
2447
-
2448
- it('should not decrypt with corrupted subkey', async function() {
2449
- const pubKeyDE = (await openpgp.key.readArmored(pub_key_de)).keys[0];
2450
- const privKeyDE = (await openpgp.key.readArmored(priv_key_de)).keys[0];
2451
- // corrupt the public key params
2452
- privKeyDE.subKeys[0].keyPacket.params[0].data[0]++;
2453
- // validation will not check the decryption subkey and will succeed
2454
- await privKeyDE.decrypt(passphrase);
2455
- const encrypted = await openpgp.encrypt({
2456
- message: openpgp.message.fromText(plaintext),
2457
- publicKeys: pubKeyDE
2458
- });
2459
- const decOpt = {
2460
- message: await openpgp.message.readArmored(encrypted.data),
2461
- privateKeys: privKeyDE
2462
- };
2463
- // binding signature is invalid
2464
- await expect(openpgp.decrypt(decOpt)).to.be.rejectedWith(/Session key decryption failed/);
2465
- });
2466
-
2467
- it('should decrypt with two passwords message which GPG fails on', async function() {
2468
- const decOpt = {
2469
- message: await openpgp.message.readArmored(twoPasswordGPGFail),
2470
- passwords: password2
2471
- };
2472
- return openpgp.decrypt(decOpt).then(function(decrypted) {
2473
- expect(decrypted.data).to.equal('short message\nnext line\n한국어/조선말');
2474
- expect(decrypted.signatures.length).to.equal(0);
2475
- });
2476
- });
2477
-
2478
- it('should decrypt with three passwords', async function() {
2479
- const messageBinary = openpgp.util.b64_to_Uint8Array('wy4ECQMIElIx/jiwJV9gp/MZ/ElZwUfHrzOBfOtM8VmgDy76F7eSGWH26tAlx3WI0kMBZv6Tlc1Y6baaZ6MEcOLTG/C7uzHH7KMfuQFd3fcMaVcDawk9EEy/CybiGBE+acT6id2pemHQy6Nk76d9UUTFubcB');
2480
- const message = await openpgp.message.read(messageBinary);
2481
- const passwords = ['Test', 'Pinata', 'a'];
2482
- const decrypted = await openpgp.decrypt({ message, passwords });
2483
- expect(decrypted.data).to.equal('Hello world');
2484
- });
2485
-
2486
- it('should decrypt broken ECC message from old OpenPGP.js', async function() {
2487
- const { keys: [key] } = await openpgp.key.readArmored(ecdh_dec_key);
2488
- const message = await openpgp.message.readArmored(ecdh_msg_bad);
2489
- await key.decrypt('12345');
2490
- const decrypted = await openpgp.decrypt({ message, privateKeys: [key] });
2491
- expect(decrypted.data).to.equal('\n');
2492
- });
2493
-
2494
- it('should decrypt broken ECC message from old go crypto', async function() {
2495
- const { keys: [key] } = await openpgp.key.readArmored(ecdh_dec_key_2);
2496
- const message = await openpgp.message.readArmored(ecdh_msg_bad_2);
2497
- await key.decrypt('12345');
2498
- const decrypted = await openpgp.decrypt({ message, privateKeys: [key] });
2499
- expect(decrypted.data).to.equal('Tesssst<br><br><br>Sent from ProtonMail mobile<br><br><br>');
2500
- });
2501
-
2502
- it('should decrypt broken Blowfish message from old OpenPGP.js', async function() {
2503
- openpgp.crypto.cipher.blowfish.blockSize = 16;
2504
- openpgp.crypto.cipher.blowfish.prototype.blockSize = 16;
2505
- const use_nativeVal = openpgp.config.use_native;
2506
- openpgp.config.use_native = false;
2507
- try {
2508
- const { data } = await openpgp.decrypt({
2509
- passwords: 'test',
2510
- message: await openpgp.message.readArmored(`-----BEGIN PGP MESSAGE-----
2511
- Version: OpenPGP.js v4.8.1
2512
- Comment: https://openpgpjs.org
2513
-
2514
- wx4EBAMI0eHVbTnl2iLg6pIJ4sWw2K7OwfxFP8bmaUvSRAGiSDGJSFNUuB4v
2515
- SU69Z1XyXiuTpD3780FnLnR4dF41nhbrTXaDG+X1b3JsZCHTFMGF7Eb+YVhh
2516
- YCXOZwd3z5lxcj/M
2517
- =oXcN
2518
- -----END PGP MESSAGE-----`)
2519
- });
2520
- expect(data).to.equal('Hello World!');
2521
- } finally {
2522
- openpgp.crypto.cipher.blowfish.blockSize = 8;
2523
- openpgp.crypto.cipher.blowfish.prototype.blockSize = 8;
2524
- openpgp.config.use_native = use_nativeVal;
2525
- }
2526
- });
2527
-
2528
- it('should decrypt correct Blowfish message from new OpenPGP.js', async function() {
2529
- const { data } = await openpgp.decrypt({
2530
- passwords: 'test',
2531
- message: await openpgp.message.readArmored(`-----BEGIN PGP MESSAGE-----
2532
- Version: OpenPGP.js v4.9.0
2533
- Comment: https://openpgpjs.org
2534
-
2535
- wx4EBAMI7Di70u7hoDfgBUJQ2+1ig6ym3KMjRS9kAovSPAGRQLIPv2DgkINL
2536
- 3DUgMNqtQCA23xWhq7Ly6o9H1lRfoAo7V5UElVCqGEX7cgyZjI97alY6Je3o
2537
- amnR6g==
2538
- =rPIK
2539
- -----END PGP MESSAGE-----`)
2540
- });
2541
- expect(data).to.equal('Hello World!');
2542
- });
2543
-
2544
- it('should normalize newlines in encrypted text message', async function() {
2545
- 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"');
2546
- const encrypted = await openpgp.encrypt({
2547
- passwords: 'test',
2548
- message
2549
- });
2550
- const decrypted = await openpgp.decrypt({
2551
- passwords: 'test',
2552
- message: await openpgp.message.readArmored(encrypted.data),
2553
- format: 'binary'
2554
- });
2555
- 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"');
2556
- });
2557
-
2558
- });
2559
-
2560
- describe('Errors', function() {
2561
-
2562
- it('Error message should contain the original error message', function() {
2563
- return openpgp.encrypt({
2564
- message: openpgp.message.fromBinary(new Uint8Array([0x01, 0x01, 0x01])),
2565
- passwords: null
2566
- }).then(function() {
2567
- throw new Error('Error expected.');
2568
- }).catch(function(error) {
2569
- expect(error.message).to.match(/No keys, passwords, or session key provided/);
2570
- });
2571
- });
2572
-
2573
- });
2574
-
2575
- });
2576
-
2577
- });