@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,950 +0,0 @@
1
- const openpgp = typeof window !== 'undefined' && window.openpgp ? window.openpgp : require('../../dist/openpgp');
2
-
3
- const stub = require('sinon/lib/sinon/stub');
4
- const chai = require('chai');
5
- chai.use(require('chai-as-promised'));
6
-
7
- const { expect } = chai;
8
- const input = require('./testInputs.js');
9
-
10
- function stringify(array) {
11
- if (openpgp.util.isStream(array)) {
12
- return openpgp.stream.readToEnd(array).then(stringify);
13
- }
14
-
15
- if (!openpgp.util.isUint8Array(array)) {
16
- throw new Error('Data must be in the form of a Uint8Array');
17
- }
18
-
19
- const result = [];
20
- for (let i = 0; i < array.length; i++) {
21
- result[i] = String.fromCharCode(array[i]);
22
- }
23
- return result.join('');
24
- }
25
-
26
- describe("Packet", function() {
27
- const armored_key =
28
- '-----BEGIN PGP PRIVATE KEY BLOCK-----\n' +
29
- 'Version: GnuPG v2.0.19 (GNU/Linux)\n' +
30
- '\n' +
31
- 'lQH+BFF79J8BBADDhRUOMUSGdYM1Kq9J/vVS3qLfaZHweycAKm9SnpLGLJE+Qbki\n' +
32
- 'JRXLAhxZ+HgVThR9VXs8wbPR2UXnDhMJGe+VcMA0jiwIOEAF0y9M3ZQsPFWguej2\n' +
33
- '1ZycgOwxYHehbKdPqRK+nFgFbhvg6f6x2Gt+a0ZbvivGL1BqSSGsL+dchQARAQAB\n' +
34
- '/gMDAijatUNeUFZSyfg16x343/1Jo6u07LVTdH6Bcbx4yBQjEHvlgb6m1eqEIbZ1\n' +
35
- 'holVzt0fSKTzmlxltDaOwFLf7i42lqNoWyfaqFrOblJ5Ays7Q+6xiJTBROG9po+j\n' +
36
- 'Z2AE+hkBIwKghB645OikchR4sn9Ej3ipea5v9+a7YimHlVmIiqgLDygQvXkzXVaf\n' +
37
- 'Zi1P2wB7eU6If2xeeX5GSR8rWo+I7ujns0W8S9PxBHlH3n1oXUmFWsWLZCY/qpkD\n' +
38
- 'I/FroBhXxBVRpQhQmdsWPUdcgmQTEj8jnP++lwSQexfgk2QboAW7ODUA8Cl9oy87\n' +
39
- 'Uor5schwwdD3oRoLGcJZfR6Dyu9dCYdQSDWj+IQs95hJQfHNcfj7XFtTyOi7Kxx0\n' +
40
- 'Jxio9De84QnxNAoNYuLtwkaRgkUVKVph2nYWJfAJunuMMosM2WdcidHJ5d6RIdxB\n' +
41
- 'U6o3T+d8BPXuRQEZH9+FkDkb4ihakKO3+Zcon85e1ZUUtB1QYXRyaWNrIDxwYXRy\n' +
42
- 'aWNrQGV4YW1wbGUuY29tPoi5BBMBAgAjBQJRe/SfAhsDBwsJCAcDAgEGFQgCCQoL\n' +
43
- 'BBYCAwECHgECF4AACgkQObliSdM/GEJbjgP/ffei4lU6fXp8Qu0ubNHh4A6swkTO\n' +
44
- 'b3suuBELE4A2/pK5YnW5yByFFSi4kq8bJp5O6p9ydXpOA38t3aQ8wrbo0yDvGekr\n' +
45
- '1S1HWOLgCaY7rEDQubuCOHd2R81/VQOJyG3zgX4KFIgkVyV9BZXUpz4PXuhMORmv\n' +
46
- '81uzej9r7BYkJ6GdAf4EUXv0nwEEAKbO02jtGEHet2fQfkAYyO+789sTxyfrUy5y\n' +
47
- 'SAf5n3GgkuiHz8dFevhgqYyMK0OYEOCZqdd1lRBjL6Us7PxTljHc2jtGhoAgE4aZ\n' +
48
- 'LKarI3j+5Oofcaq0+S0bhqiQ5hl6C4SkdYOEeJ0Hlq2008n0pJIlU4E5yIu0oNvb\n' +
49
- '4+4owTpRABEBAAH+AwMCKNq1Q15QVlLJyeuGBEA+7nXS3aSy6mE4lR5f3Ml5NRqt\n' +
50
- 'jm6Q+UUI69DzhLGX4jHRxna6NMP74S3CghOz9eChMndkfWLC/c11h1npzLci+AwJ\n' +
51
- '45xMbw/OW5PLlaxdtkg/SnsHpFGCAuTUWY87kuWoG0HSVMn9Clm+67rdicOW6L5a\n' +
52
- 'ChfyWcVZ+Hvwjx8YM0/j11If7oUkCZEstSUeJYOI10JQLhNLpDdkB89vXhAMaCuU\n' +
53
- 'Ijhdq0vvJi6JruKQGPK+jajJ4MMannpQtKAvt8aifqpdovYy8w4yh2pGkadFvrsZ\n' +
54
- 'mxpjqmmawab6zlOW5WrLxQVL1cQRdrIQ7jYtuLApGWkPfytSCBZ20pSyWnmkxd4X\n' +
55
- 'OIms6BjqrP9LxBEXsPBwdUA5Iranr+UBIPDxQrTp5k0DJhXBCpJ1k3ZT+2dxiRS2\n' +
56
- 'sk83w2VUBnXdYWZx0YlMqr3bDT6J5fO+8V8pbgY5BkHRCFMacFx45km/fvmInwQY\n' +
57
- 'AQIACQUCUXv0nwIbDAAKCRA5uWJJ0z8YQqb3A/97njLl33OQYXVp9OTk/VgE6O+w\n' +
58
- 'oSYa+6xMOzsk7tluLIRQtnIprga/e8vEZXGTomV2a77HBksg+YjlTh/l8oMuaoxG\n' +
59
- 'QNkMpoRJKPip29RTW4gLdnoJVekZ/awkBN2S3NMArOZGca8U+M1IuV7OyVchSVSl\n' +
60
- 'YRlci72GHhlyos8YHA==\n' +
61
- '=KXkj\n' +
62
- '-----END PGP PRIVATE KEY BLOCK-----';
63
-
64
- it('Symmetrically encrypted packet', async function() {
65
- const message = new openpgp.packet.List();
66
- const testText = input.createSomeMessage();
67
-
68
- const literal = new openpgp.packet.Literal();
69
- literal.setText(testText);
70
-
71
- const enc = new openpgp.packet.SymmetricallyEncrypted();
72
- message.push(enc);
73
- enc.packets.push(literal);
74
-
75
- const key = new Uint8Array([1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2]);
76
- const algo = 'aes256';
77
-
78
- await enc.encrypt(algo, key);
79
-
80
- const msg2 = new openpgp.message.Message();
81
- await msg2.packets.read(message.write());
82
- msg2.packets[0].ignore_mdc_error = true;
83
- const dec = await msg2.decrypt(null, null, [{ algorithm: algo, data: key }]);
84
-
85
- expect(await stringify(dec.packets[0].data)).to.equal(stringify(literal.data));
86
- });
87
-
88
- it('Symmetrically encrypted packet - MDC error for modern cipher', async function() {
89
- const message = new openpgp.packet.List();
90
- const testText = input.createSomeMessage();
91
-
92
- const literal = new openpgp.packet.Literal();
93
- literal.setText(testText);
94
-
95
- const enc = new openpgp.packet.SymmetricallyEncrypted();
96
- message.push(enc);
97
- await enc.packets.push(literal);
98
-
99
- const key = new Uint8Array([1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2]);
100
- const algo = 'aes256';
101
-
102
- await enc.encrypt(algo, key);
103
-
104
- const msg2 = new openpgp.packet.List();
105
- await msg2.read(message.write());
106
- await expect(msg2[0].decrypt(algo, key)).to.eventually.be.rejectedWith('Decryption failed due to missing MDC.');
107
- });
108
-
109
- it('Sym. encrypted integrity protected packet', async function() {
110
- const key = new Uint8Array([1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2]);
111
- const algo = 'aes256';
112
- const testText = input.createSomeMessage();
113
-
114
- const literal = new openpgp.packet.Literal();
115
- const enc = new openpgp.packet.SymEncryptedIntegrityProtected();
116
- const msg = new openpgp.packet.List();
117
-
118
- msg.push(enc);
119
- literal.setText(testText);
120
- enc.packets.push(literal);
121
- await enc.encrypt(algo, key);
122
-
123
- const msg2 = new openpgp.packet.List();
124
- await msg2.read(msg.write());
125
-
126
- await msg2[0].decrypt(algo, key);
127
-
128
- expect(await stringify(msg2[0].packets[0].data)).to.equal(stringify(literal.data));
129
- });
130
-
131
- it('Sym. encrypted AEAD protected packet', function() {
132
- const key = new Uint8Array([1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2]);
133
- const algo = 'aes256';
134
- const testText = input.createSomeMessage();
135
- const literal = new openpgp.packet.Literal();
136
- const enc = new openpgp.packet.SymEncryptedAEADProtected();
137
- const msg = new openpgp.packet.List();
138
-
139
- msg.push(enc);
140
- literal.setText(testText);
141
- enc.packets.push(literal);
142
-
143
- const msg2 = new openpgp.packet.List();
144
-
145
- return enc.encrypt(algo, key).then(async function() {
146
- await msg2.read(msg.write());
147
- return msg2[0].decrypt(algo, key);
148
- }).then(async function() {
149
- expect(await openpgp.stream.readToEnd(msg2[0].packets[0].data)).to.deep.equal(literal.data);
150
- });
151
- });
152
-
153
- it('Sym. encrypted AEAD protected packet (AEAD)', async function() {
154
- let aead_protectVal = openpgp.config.aead_protect;
155
- openpgp.config.aead_protect = true;
156
- const testText = input.createSomeMessage();
157
-
158
- const key = new Uint8Array([1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2]);
159
- const algo = 'aes256';
160
-
161
- const literal = new openpgp.packet.Literal();
162
- const enc = new openpgp.packet.SymEncryptedAEADProtected();
163
- const msg = new openpgp.packet.List();
164
-
165
- msg.push(enc);
166
- literal.setText(testText);
167
- enc.packets.push(literal);
168
-
169
- const msg2 = new openpgp.packet.List();
170
-
171
- try {
172
- await enc.encrypt(algo, key);
173
- await msg2.read(msg.write());
174
- await msg2[0].decrypt(algo, key);
175
- expect(await openpgp.stream.readToEnd(msg2[0].packets[0].data)).to.deep.equal(literal.data);
176
- } finally {
177
- openpgp.config.aead_protect = aead_protectVal;
178
- }
179
- });
180
-
181
- function cryptStub(webCrypto, method) {
182
- const crypt = webCrypto[method];
183
- const cryptStub = stub(webCrypto, method);
184
- let cryptCallsActive = 0;
185
- cryptStub.onCall(0).callsFake(async function() {
186
- cryptCallsActive++;
187
- try {
188
- return await crypt.apply(this, arguments);
189
- } finally {
190
- cryptCallsActive--;
191
- }
192
- });
193
- cryptStub.onCall(1).callsFake(function() {
194
- expect(cryptCallsActive).to.equal(1);
195
- return crypt.apply(this, arguments);
196
- });
197
- cryptStub.callThrough();
198
- return cryptStub;
199
- }
200
-
201
- it('Sym. encrypted AEAD protected packet is encrypted in parallel (AEAD, GCM)', async function() {
202
- const webCrypto = openpgp.util.getWebCrypto();
203
- if (!webCrypto) return;
204
- const encryptStub = cryptStub(webCrypto, 'encrypt');
205
- const decryptStub = cryptStub(webCrypto, 'decrypt');
206
-
207
- let aead_protectVal = openpgp.config.aead_protect;
208
- let aead_chunk_size_byteVal = openpgp.config.aead_chunk_size_byte;
209
- openpgp.config.aead_protect = true;
210
- openpgp.config.aead_chunk_size_byte = 0;
211
- const testText = input.createSomeMessage();
212
-
213
- const key = new Uint8Array([1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2]);
214
- const algo = 'aes256';
215
-
216
- const literal = new openpgp.packet.Literal();
217
- const enc = new openpgp.packet.SymEncryptedAEADProtected();
218
- const msg = new openpgp.packet.List();
219
- enc.aeadAlgorithm = 'experimental_gcm';
220
-
221
- msg.push(enc);
222
- literal.setText(testText);
223
- enc.packets.push(literal);
224
-
225
- const msg2 = new openpgp.packet.List();
226
-
227
- try {
228
- await enc.encrypt(algo, key);
229
- await msg2.read(msg.write());
230
- await msg2[0].decrypt(algo, key);
231
- expect(await openpgp.stream.readToEnd(msg2[0].packets[0].data)).to.deep.equal(literal.data);
232
- expect(encryptStub.callCount > 1).to.be.true;
233
- expect(decryptStub.callCount > 1).to.be.true;
234
- } finally {
235
- openpgp.config.aead_protect = aead_protectVal;
236
- openpgp.config.aead_chunk_size_byte = aead_chunk_size_byteVal;
237
- encryptStub.restore();
238
- decryptStub.restore();
239
- }
240
- });
241
-
242
- it('Sym. encrypted AEAD protected packet test vector (AEAD)', async function() {
243
- // From https://gitlab.com/openpgp-wg/rfc4880bis/commit/00b20923e6233fb6ff1666ecd5acfefceb32907d
244
-
245
- let packetBytes = openpgp.util.hex_to_Uint8Array(`
246
- d4 4a 01 07 01 0e b7 32 37 9f 73 c4 92 8d e2 5f
247
- ac fe 65 17 ec 10 5d c1 1a 81 dc 0c b8 a2 f6 f3
248
- d9 00 16 38 4a 56 fc 82 1a e1 1a e8 db cb 49 86
249
- 26 55 de a8 8d 06 a8 14 86 80 1b 0f f3 87 bd 2e
250
- ab 01 3d e1 25 95 86 90 6e ab 24 76
251
- `.replace(/\s+/g, ''));
252
-
253
- let aead_protectVal = openpgp.config.aead_protect;
254
- let aead_chunk_size_byteVal = openpgp.config.aead_chunk_size_byte;
255
- openpgp.config.aead_protect = true;
256
- openpgp.config.aead_chunk_size_byte = 14;
257
-
258
- const iv = openpgp.util.hex_to_Uint8Array('b7 32 37 9f 73 c4 92 8d e2 5f ac fe 65 17 ec 10'.replace(/\s+/g, ''));
259
- const key = openpgp.util.hex_to_Uint8Array('86 f1 ef b8 69 52 32 9f 24 ac d3 bf d0 e5 34 6d'.replace(/\s+/g, ''));
260
- const algo = 'aes128';
261
-
262
- const literal = new openpgp.packet.Literal(0);
263
- const enc = new openpgp.packet.SymEncryptedAEADProtected();
264
- const msg = new openpgp.packet.List();
265
-
266
- msg.push(enc);
267
- literal.setBytes(openpgp.util.str_to_Uint8Array('Hello, world!\n'), openpgp.enums.literal.binary);
268
- literal.filename = '';
269
- enc.packets.push(literal);
270
-
271
- const msg2 = new openpgp.packet.List();
272
-
273
- let randomBytesStub = stub(openpgp.crypto.random, 'getRandomBytes');
274
- randomBytesStub.returns(resolves(iv));
275
-
276
- try {
277
- await enc.encrypt(algo, key);
278
- const data = msg.write();
279
- expect(await openpgp.stream.readToEnd(openpgp.stream.clone(data))).to.deep.equal(packetBytes);
280
- await msg2.read(data);
281
- await msg2[0].decrypt(algo, key);
282
- expect(await openpgp.stream.readToEnd(msg2[0].packets[0].data)).to.deep.equal(literal.data);
283
- } finally {
284
- openpgp.config.aead_protect = aead_protectVal;
285
- openpgp.config.aead_chunk_size_byte = aead_chunk_size_byteVal;
286
- randomBytesStub.restore();
287
- }
288
- });
289
-
290
- it('Sym encrypted session key with a compressed packet', async function() {
291
- const msg =
292
- '-----BEGIN PGP MESSAGE-----\n' +
293
- 'Version: GnuPG v2.0.19 (GNU/Linux)\n' +
294
- '\n' +
295
- 'jA0ECQMCpo7I8WqsebTJ0koBmm6/oqdHXJU9aPe+Po+nk/k4/PZrLmlXwz2lhqBg\n' +
296
- 'GAlY9rxVStLBrg0Hn+5gkhyHI9B85rM1BEYXQ8pP5CSFuTwbJ3O2s67dzQ==\n' +
297
- '=VZ0/\n' +
298
- '-----END PGP MESSAGE-----';
299
-
300
- const msgbytes = (await openpgp.armor.decode(msg)).data;
301
-
302
- const parsed = new openpgp.packet.List();
303
- await parsed.read(msgbytes);
304
-
305
- return parsed[0].decrypt('test').then(() => {
306
- const key = parsed[0].sessionKey;
307
- return parsed[1].decrypt(parsed[0].sessionKeyAlgorithm, key).then(async () => {
308
- const compressed = parsed[1].packets[0];
309
-
310
- const result = await stringify(compressed.packets[0].data);
311
-
312
- expect(result).to.equal('Hello world!\n');
313
- });
314
- });
315
- });
316
-
317
- it('Public key encrypted symmetric key packet', function() {
318
- const rsa = openpgp.crypto.publicKey.rsa;
319
- const keySize = openpgp.util.getWebCryptoAll() ? 2048 : 512; // webkit webcrypto accepts minimum 2048 bit keys
320
-
321
- return rsa.generate(keySize, "10001").then(function(mpiGen) {
322
-
323
- let mpi = [mpiGen.n, mpiGen.e, mpiGen.d, mpiGen.p, mpiGen.q, mpiGen.u];
324
- mpi = mpi.map(function(k) {
325
- return new openpgp.MPI(k);
326
- });
327
-
328
- const enc = new openpgp.packet.PublicKeyEncryptedSessionKey();
329
- const msg = new openpgp.packet.List();
330
- const msg2 = new openpgp.packet.List();
331
-
332
- enc.sessionKey = new Uint8Array([1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2]);
333
- enc.publicKeyAlgorithm = 'rsa_encrypt_sign';
334
- enc.sessionKeyAlgorithm = 'aes256';
335
- enc.publicKeyId.bytes = '12345678';
336
- return enc.encrypt({ params: mpi, getFingerprintBytes() {} }).then(async () => {
337
-
338
- msg.push(enc);
339
-
340
- await msg2.read(msg.write());
341
-
342
- return msg2[0].decrypt({ algorithm: 'rsa_encrypt_sign', params: mpi, getFingerprintBytes() {} }).then(() => {
343
-
344
- expect(stringify(msg2[0].sessionKey)).to.equal(stringify(enc.sessionKey));
345
- expect(msg2[0].sessionKeyAlgorithm).to.equal(enc.sessionKeyAlgorithm);
346
- });
347
- });
348
- });
349
- });
350
-
351
- it('Secret key packet (reading, unencrypted)', async function() {
352
- const armored_key =
353
- '-----BEGIN PGP PRIVATE KEY BLOCK-----\n' +
354
- 'Version: GnuPG v2.0.19 (GNU/Linux)\n' +
355
- '\n' +
356
- 'lQHYBFF33iMBBAC9YfOYahJlWrVj2J1TjQiZLunWljI4G9e6ARTyD99nfOkV3swh\n' +
357
- '0WaOse4Utj7BfTqdYcoezhCaQpuExUupKWZqmduBcwSmEBfNu1XyKcxlDQuuk0Vk\n' +
358
- 'viGC3kFRce/cJaKVFSRU8V5zPgt6KQNv/wNz7ydEisaSoNbk51vQt5oGfwARAQAB\n' +
359
- 'AAP5AVL8xWMuKgLj9g7/wftMH+jO7vhAxje2W3Y+8r8TnOSn0536lQvzl/eQyeLC\n' +
360
- 'VK2k3+7+trgO7I4KuXCXZqgAbEi3niDYXDaCJ+8gdR9qvPM2gi9NM71TGXZvGE0w\n' +
361
- 'X8gIZfqLTQWKm9TIS/3tdrth4nwhiye0ASychOboIiN6VIECAMbCQ4/noxGV6yTK\n' +
362
- 'VezsGSz+iCMxz2lV270/Ac2C5WPk+OlxXloxUXeEkGIr6Xkmhhpceed2KL41UC8Y\n' +
363
- 'w5ttGIECAPPsahniKGyqp9CHy6W0B83yhhcIbmLlaVG2ftKyUEDxIggzOlXuVrue\n' +
364
- 'z9XRd6wFqwDd1QMFW0uUyHPDCIFPnv8CAJaDFSZutuWdWMt15NZXjfgRgfJuDrtv\n' +
365
- 'E7yFY/p0el8lCihOT8WoHbTn1PbCYMzNBc0IhHaZKAtA2pjkE+wzz9ClP7QbR2Vv\n' +
366
- 'cmdlIDxnZW9yZ2VAZXhhbXBsZS5jb20+iLkEEwECACMFAlF33iMCGwMHCwkIBwMC\n' +
367
- 'AQYVCAIJCgsEFgIDAQIeAQIXgAAKCRBcqs36fwJCXRbvA/9LPiK6WFKcFoNBnLEJ\n' +
368
- 'mS/CNkL8yTpkslpCP6+TwJMc8uXqwYl9/PW2+CwmzZjs6JsvTzMcR/ZbfZJuSW6Y\n' +
369
- 'EsLNejsSpgcY9aiewGtE+53e5oKYnlmVMTWOPywciIgMvXlzdGhxcwqJ8u0hT+ug\n' +
370
- '9CjcAfuX9yw85LwXtdGwNh7J8Q==\n' +
371
- '=lKiS\n' +
372
- '-----END PGP PRIVATE KEY BLOCK-----';
373
-
374
- let key = new openpgp.packet.List();
375
- await key.read((await openpgp.armor.decode(armored_key)).data);
376
- key = key[0];
377
-
378
- const enc = new openpgp.packet.PublicKeyEncryptedSessionKey();
379
- const secret = new Uint8Array([1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2]);
380
-
381
- enc.sessionKey = secret;
382
- enc.publicKeyAlgorithm = 'rsa_encrypt_sign';
383
- enc.sessionKeyAlgorithm = 'aes256';
384
- enc.publicKeyId.bytes = '12345678';
385
-
386
- return enc.encrypt(key).then(() => {
387
- return enc.decrypt(key).then(() => {
388
- expect(stringify(enc.sessionKey)).to.equal(stringify(secret));
389
- });
390
- });
391
- });
392
-
393
- it('Public key encrypted packet (reading, GPG)', async function() {
394
- const armored_key =
395
- '-----BEGIN PGP PRIVATE KEY BLOCK-----\n' +
396
- 'Version: GnuPG v2.0.19 (GNU/Linux)\n' +
397
- '\n' +
398
- 'lQHYBFF6gtkBBADKUOWZK6/V75MNwBS+hLYicoS0Sojbo3qWXXpS7eM+uhiDm4bP\n' +
399
- 'DNjdNVA0R+TCjvhWbc3W6cvdHYTmHRMhTIOefncZRt3OwF7AvVk53fKKPiNNv5C9\n' +
400
- 'IK8bcDhAknSOg1TXRSpXLHtYy36A6iDgffNSjoCOVaeKpuRDMA37PvJWFQARAQAB\n' +
401
- 'AAP+KxHbOwcrnPPuXppCYEew3Xb7LMWESpvMFFgsmxx1COzFnLjek1P1E+yOWT7n\n' +
402
- '4opcsEuaazLk+TrYSMOuR6O6DgGg5c+ctVPU+NGNNCiiTkOzuD+8ow8NgsoINOxi\n' +
403
- '481qLK0NYpc5sEg394J3fRuzpfEi6DTS/RzCN7YDiGFccNECAM71NuaAzH5LrZ+B\n' +
404
- '4Okwy9CQQbgoYrdaia24CjEaUODaROnyNsvOb0ydEebVAbGzrsBr6LrisTidyZsG\n' +
405
- 't2T+L7ECAPpCFzZIwwk6giZ10HmXEhXZLXYmdhQD/1fwegpTrEciMA6MCcdkcCyO\n' +
406
- '2/J+S+NXM62ykMGDhg2cjhU1rj/uaaUCAJfCjkwpxMsDKHYDFDXyjJFy2vEmA3s8\n' +
407
- 'cnmAUDF1caPyEcPEZmYJRE+KdroOD6IGhzp7oA34Ef3D6HOCovH9YaCgbbQbSm9o\n' +
408
- 'bm55IDxqb2hubnlAZXhhbXBsZS5jb20+iLkEEwECACMFAlF6gtkCGwMHCwkIBwMC\n' +
409
- 'AQYVCAIJCgsEFgIDAQIeAQIXgAAKCRA6HTM8yP08keZgA/4vL273zrqnmOrqmo/K\n' +
410
- 'UxQgD0vMhM58d25UjGYI6LAZkAls/k4FvFt5GUHVWJR3HBRuuNlB7UndH/uYlU7j\n' +
411
- 'm/bQLiP4uvFQuRGuG76f0O5t/KyeUdzrpNiJpe8tYDAnoPxUzENYsIv0fm2ZISo1\n' +
412
- 'QnnXX2WuVZGMZH1YhQoakZxbnp0B2ARReoLZAQQAvQvPp2MLu9vnRvZ3Py559kQf\n' +
413
- '0Z5AnEXVokALTn5A2m51dLekQ9T3Rhz8p9I6C/XjVQwBkp1USOaDUz+L7lsbNdY4\n' +
414
- 'YbUi3eIA5RImVXeTIrD1hE4CllDNKmqT5wFN07eEu7QhDEuYioO+4gtjjhUDYeIA\n' +
415
- 'dCVtVO//q8rP8ukZEc8AEQEAAQAD/RHlttyNe3RnDr/AoKx6HXDLpUmGlm5VDDMm\n' +
416
- 'pgth14j2cSdCJYqIdHqOTvsiY31zY3jPQKzdOTgHnsI4X2qK9InbwXepSBkaOJzY\n' +
417
- 'iNhifPSUs9qoNawDqbFJ8PMXd4QQGgM93w+tudKC650Zuq7M7eWSdQg0u9aoLY97\n' +
418
- 'MpKx3DUFAgDA/RgoO8xYMgkKN1tuKWa61qesLdJRAZI/3cnvtsmmEBt9tdbcDoBz\n' +
419
- 'gOIAAvUFgipuP6dBWLyf2NRNRVVQdNTlAgD6xS7S87g3kTa3GLcEI2cveaP1WWNK\n' +
420
- 'rKFnVWsjBKArKFzMQ5N6FMnFD4T96i3sYlACE5UjH90SpOgBKOpdKzSjAf9nghrw\n' +
421
- 'kbFbF708ZIpVEwxvp/JoSutYUQ4v01MImnCGqzDVuSef3eutLLu4ZG7kLekxNauV\n' +
422
- '8tGFwxsdtv30RL/3nW+InwQYAQIACQUCUXqC2QIbDAAKCRA6HTM8yP08kRXjBACu\n' +
423
- 'RtEwjU+p6qqm3pmh7xz1CzhQN1F7VOj9dFUeECJJ1iv8J71w5UINH0otIceeBeWy\n' +
424
- 'NLA/QvK8+4/b9QW+S8aDZyeZpYg37gBwdTNGNT7TsEAxz9SUbx9uRja0wNmtb5xW\n' +
425
- 'mG+VE8CBXNkp8JTWx05AHwtK3baWlHWwpwnRlbU94Q==\n' +
426
- '=FSwA\n' +
427
- '-----END PGP PRIVATE KEY BLOCK-----';
428
-
429
- const armored_msg =
430
- '-----BEGIN PGP MESSAGE-----\n' +
431
- 'Version: GnuPG v2.0.19 (GNU/Linux)\n' +
432
- '\n' +
433
- 'hIwDFYET+7bfx/ABA/95Uc9942Tg8oqpO0vEu2eSKwPALM3a0DrVdAiFOIK/dJmZ\n' +
434
- 'YrtPRw3EEwHZjl6CO9RD+95iE27tPbsICw1K43gofSV/wWsPO6vvs3eftQYHSxxa\n' +
435
- 'IQbTPImiRaJ73Mf7iM3CNtQM4iUBsx1HnUGl+rtD0nz3fLm6i3CjwiNQWW42I9JH\n' +
436
- 'AWv8EvvpxZ8X2ClFfSW3UVBoROHe9CAWHM/40nGutAZK8MIgmUI4xqkLFBbqqTyx\n' +
437
- '/cDSC4Q+sv65UX4urbfc7uJuk1Cpj54=\n' +
438
- '=iSaK\n' +
439
- '-----END PGP MESSAGE-----';
440
-
441
- let key = new openpgp.packet.List();
442
- await key.read((await openpgp.armor.decode(armored_key)).data);
443
- key = key[3];
444
-
445
- const msg = new openpgp.packet.List();
446
- await msg.read((await openpgp.armor.decode(armored_msg)).data);
447
-
448
- return msg[0].decrypt(key).then(async () => {
449
- await msg[1].decrypt(msg[0].sessionKeyAlgorithm, msg[0].sessionKey);
450
-
451
- const text = await stringify(msg[1].packets[0].packets[0].data);
452
-
453
- expect(text).to.equal('Hello world!');
454
- });
455
- });
456
-
457
- it('Sym. encrypted session key reading/writing', async function() {
458
- const passphrase = 'hello';
459
- const algo = 'aes256';
460
- const testText = input.createSomeMessage();
461
-
462
- const literal = new openpgp.packet.Literal();
463
- const key_enc = new openpgp.packet.SymEncryptedSessionKey();
464
- const enc = new openpgp.packet.SymEncryptedIntegrityProtected();
465
- const msg = new openpgp.packet.List();
466
-
467
- msg.push(key_enc);
468
- msg.push(enc);
469
-
470
- key_enc.sessionKeyAlgorithm = algo;
471
- await key_enc.encrypt(passphrase);
472
-
473
- const key = key_enc.sessionKey;
474
-
475
- literal.setText(testText);
476
- enc.packets.push(literal);
477
- await enc.encrypt(algo, key);
478
-
479
- const msg2 = new openpgp.packet.List();
480
- await msg2.read(msg.write());
481
-
482
- await msg2[0].decrypt(passphrase);
483
- const key2 = msg2[0].sessionKey;
484
- await msg2[1].decrypt(msg2[0].sessionKeyAlgorithm, key2);
485
-
486
- expect(await stringify(msg2[1].packets[0].data)).to.equal(stringify(literal.data));
487
- });
488
-
489
- it('Sym. encrypted session key reading/writing (AEAD)', async function() {
490
- let aead_protectVal = openpgp.config.aead_protect;
491
- openpgp.config.aead_protect = true;
492
-
493
- try {
494
- const passphrase = 'hello';
495
- const algo = 'aes256';
496
- const testText = input.createSomeMessage();
497
-
498
- const literal = new openpgp.packet.Literal();
499
- const key_enc = new openpgp.packet.SymEncryptedSessionKey();
500
- const enc = new openpgp.packet.SymEncryptedAEADProtected();
501
- const msg = new openpgp.packet.List();
502
-
503
- msg.push(key_enc);
504
- msg.push(enc);
505
-
506
- key_enc.sessionKeyAlgorithm = algo;
507
- await key_enc.encrypt(passphrase);
508
-
509
- const key = key_enc.sessionKey;
510
-
511
- literal.setText(testText);
512
- enc.packets.push(literal);
513
- await enc.encrypt(algo, key);
514
-
515
- const msg2 = new openpgp.packet.List();
516
- await msg2.read(msg.write());
517
-
518
- await msg2[0].decrypt(passphrase);
519
- const key2 = msg2[0].sessionKey;
520
- await msg2[1].decrypt(msg2[0].sessionKeyAlgorithm, key2);
521
-
522
- expect(await stringify(msg2[1].packets[0].data)).to.equal(stringify(literal.data));
523
- } finally {
524
- openpgp.config.aead_protect = aead_protectVal;
525
- }
526
- });
527
-
528
- it('Sym. encrypted session key reading/writing test vector (EAX, AEAD)', async function() {
529
- // From https://gitlab.com/openpgp-wg/rfc4880bis/blob/00b20923/back.mkd#sample-aead-eax-encryption-and-decryption
530
-
531
- let aead_protectVal = openpgp.config.aead_protect;
532
- let aead_chunk_size_byteVal = openpgp.config.aead_chunk_size_byte;
533
- let s2k_iteration_count_byteVal = openpgp.config.s2k_iteration_count_byte;
534
- openpgp.config.aead_protect = true;
535
- openpgp.config.aead_chunk_size_byte = 14;
536
- openpgp.config.s2k_iteration_count_byte = 0x90;
537
-
538
- let salt = openpgp.util.hex_to_Uint8Array(`cd5a9f70fbe0bc65`);
539
- let sessionKey = openpgp.util.hex_to_Uint8Array(`86 f1 ef b8 69 52 32 9f 24 ac d3 bf d0 e5 34 6d`.replace(/\s+/g, ''));
540
- let sessionIV = openpgp.util.hex_to_Uint8Array(`bc 66 9e 34 e5 00 dc ae dc 5b 32 aa 2d ab 02 35`.replace(/\s+/g, ''));
541
- let dataIV = openpgp.util.hex_to_Uint8Array(`b7 32 37 9f 73 c4 92 8d e2 5f ac fe 65 17 ec 10`.replace(/\s+/g, ''));
542
-
543
- let randomBytesStub = stub(openpgp.crypto.random, 'getRandomBytes');
544
- randomBytesStub.onCall(0).returns(resolves(salt));
545
- randomBytesStub.onCall(1).returns(resolves(sessionKey));
546
- randomBytesStub.onCall(2).returns(resolves(sessionIV));
547
- randomBytesStub.onCall(3).returns(resolves(dataIV));
548
-
549
- let packetBytes = openpgp.util.hex_to_Uint8Array(`
550
- c3 3e 05 07 01 03 08 cd 5a 9f 70 fb e0 bc 65 90
551
- bc 66 9e 34 e5 00 dc ae dc 5b 32 aa 2d ab 02 35
552
- 9d ee 19 d0 7c 34 46 c4 31 2a 34 ae 19 67 a2 fb
553
- 7e 92 8e a5 b4 fa 80 12 bd 45 6d 17 38 c6 3c 36
554
-
555
- d4 4a 01 07 01 0e b7 32 37 9f 73 c4 92 8d e2 5f
556
- ac fe 65 17 ec 10 5d c1 1a 81 dc 0c b8 a2 f6 f3
557
- d9 00 16 38 4a 56 fc 82 1a e1 1a e8 db cb 49 86
558
- 26 55 de a8 8d 06 a8 14 86 80 1b 0f f3 87 bd 2e
559
- ab 01 3d e1 25 95 86 90 6e ab 24 76
560
- `.replace(/\s+/g, ''));
561
-
562
- try {
563
- const passphrase = 'password';
564
- const algo = 'aes128';
565
-
566
- const literal = new openpgp.packet.Literal(0);
567
- const key_enc = new openpgp.packet.SymEncryptedSessionKey();
568
- const enc = new openpgp.packet.SymEncryptedAEADProtected();
569
- const msg = new openpgp.packet.List();
570
-
571
- msg.push(key_enc);
572
- msg.push(enc);
573
-
574
- key_enc.sessionKeyAlgorithm = algo;
575
- await key_enc.encrypt(passphrase);
576
-
577
- const key = key_enc.sessionKey;
578
-
579
- literal.setBytes(openpgp.util.str_to_Uint8Array('Hello, world!\n'), openpgp.enums.literal.binary);
580
- literal.filename = '';
581
- enc.packets.push(literal);
582
- await enc.encrypt(algo, key);
583
-
584
- const data = msg.write();
585
- expect(await openpgp.stream.readToEnd(openpgp.stream.clone(data))).to.deep.equal(packetBytes);
586
-
587
- const msg2 = new openpgp.packet.List();
588
- await msg2.read(data);
589
-
590
- await msg2[0].decrypt(passphrase);
591
- const key2 = msg2[0].sessionKey;
592
- await msg2[1].decrypt(msg2[0].sessionKeyAlgorithm, key2);
593
-
594
- expect(await stringify(msg2[1].packets[0].data)).to.equal(stringify(literal.data));
595
- } finally {
596
- openpgp.config.aead_protect = aead_protectVal;
597
- openpgp.config.aead_chunk_size_byte = aead_chunk_size_byteVal;
598
- openpgp.config.s2k_iteration_count_byte = s2k_iteration_count_byteVal;
599
- randomBytesStub.restore();
600
- }
601
- });
602
-
603
- it('Sym. encrypted session key reading/writing test vector (AEAD, OCB)', async function() {
604
- // From https://gitlab.com/openpgp-wg/rfc4880bis/blob/00b20923/back.mkd#sample-aead-ocb-encryption-and-decryption
605
-
606
- let aead_protectVal = openpgp.config.aead_protect;
607
- let aead_chunk_size_byteVal = openpgp.config.aead_chunk_size_byte;
608
- let s2k_iteration_count_byteVal = openpgp.config.s2k_iteration_count_byte;
609
- openpgp.config.aead_protect = true;
610
- openpgp.config.aead_chunk_size_byte = 14;
611
- openpgp.config.s2k_iteration_count_byte = 0x90;
612
-
613
- let salt = openpgp.util.hex_to_Uint8Array(`9f0b7da3e5ea6477`);
614
- let sessionKey = openpgp.util.hex_to_Uint8Array(`d1 f0 1b a3 0e 13 0a a7 d2 58 2c 16 e0 50 ae 44`.replace(/\s+/g, ''));
615
- let sessionIV = openpgp.util.hex_to_Uint8Array(`99 e3 26 e5 40 0a 90 93 6c ef b4 e8 eb a0 8c`.replace(/\s+/g, ''));
616
- let dataIV = openpgp.util.hex_to_Uint8Array(`5e d2 bc 1e 47 0a be 8f 1d 64 4c 7a 6c 8a 56`.replace(/\s+/g, ''));
617
-
618
- let randomBytesStub = stub(openpgp.crypto.random, 'getRandomBytes');
619
- randomBytesStub.onCall(0).returns(resolves(salt));
620
- randomBytesStub.onCall(1).returns(resolves(sessionKey));
621
- randomBytesStub.onCall(2).returns(resolves(sessionIV));
622
- randomBytesStub.onCall(3).returns(resolves(dataIV));
623
-
624
- let packetBytes = openpgp.util.hex_to_Uint8Array(`
625
- c3 3d 05 07 02 03 08 9f 0b 7d a3 e5 ea 64 77 90
626
- 99 e3 26 e5 40 0a 90 93 6c ef b4 e8 eb a0 8c 67
627
- 73 71 6d 1f 27 14 54 0a 38 fc ac 52 99 49 da c5
628
- 29 d3 de 31 e1 5b 4a eb 72 9e 33 00 33 db ed
629
-
630
- d4 49 01 07 02 0e 5e d2 bc 1e 47 0a be 8f 1d 64
631
- 4c 7a 6c 8a 56 7b 0f 77 01 19 66 11 a1 54 ba 9c
632
- 25 74 cd 05 62 84 a8 ef 68 03 5c 62 3d 93 cc 70
633
- 8a 43 21 1b b6 ea f2 b2 7f 7c 18 d5 71 bc d8 3b
634
- 20 ad d3 a0 8b 73 af 15 b9 a0 98
635
- `.replace(/\s+/g, ''));
636
-
637
- try {
638
- const passphrase = 'password';
639
- const algo = 'aes128';
640
-
641
- const literal = new openpgp.packet.Literal(0);
642
- const key_enc = new openpgp.packet.SymEncryptedSessionKey();
643
- const enc = new openpgp.packet.SymEncryptedAEADProtected();
644
- const msg = new openpgp.packet.List();
645
- enc.aeadAlgorithm = key_enc.aeadAlgorithm = 'ocb';
646
-
647
- msg.push(key_enc);
648
- msg.push(enc);
649
-
650
- key_enc.sessionKeyAlgorithm = algo;
651
- await key_enc.encrypt(passphrase);
652
-
653
- const key = key_enc.sessionKey;
654
-
655
- literal.setBytes(openpgp.util.str_to_Uint8Array('Hello, world!\n'), openpgp.enums.literal.binary);
656
- literal.filename = '';
657
- enc.packets.push(literal);
658
- await enc.encrypt(algo, key);
659
-
660
- const data = msg.write();
661
- expect(await openpgp.stream.readToEnd(openpgp.stream.clone(data))).to.deep.equal(packetBytes);
662
-
663
- const msg2 = new openpgp.packet.List();
664
- await msg2.read(data);
665
-
666
- await msg2[0].decrypt(passphrase);
667
- const key2 = msg2[0].sessionKey;
668
- await msg2[1].decrypt(msg2[0].sessionKeyAlgorithm, key2);
669
-
670
- expect(await stringify(msg2[1].packets[0].data)).to.equal(stringify(literal.data));
671
- } finally {
672
- openpgp.config.aead_protect = aead_protectVal;
673
- openpgp.config.aead_chunk_size_byte = aead_chunk_size_byteVal;
674
- openpgp.config.s2k_iteration_count_byte = s2k_iteration_count_byteVal;
675
- randomBytesStub.restore();
676
- }
677
- });
678
-
679
- it('Secret key encryption/decryption test', async function() {
680
- const armored_msg =
681
- '-----BEGIN PGP MESSAGE-----\n' +
682
- 'Version: GnuPG v2.0.19 (GNU/Linux)\n' +
683
- '\n' +
684
- 'hIwD95D9aHS5fxEBA/98CwH54XZmwobOmHUcvWcDDQysBEC4uf7wASiGcRbejDaO\n' +
685
- 'aJqcrK/3k8sBQMO7yOhvrCRqqpGDqnmx7IaaKLnZS7nYAZoHEsK9UyG0hDa8Cfbo\n' +
686
- 'CP4xZVcgIvIfAW/in1LeT2td0QcQNbeewBmPea+vQEEvRgIP10tlE7MK8Ay48dJH\n' +
687
- 'AagMgNYg7MBUjpuOCVrjM1pWja8uzbULfYhTq3IJ8H3QhbdT+k9khY9f0aJPEeYi\n' +
688
- 'dVv6DK9uviMGc/DsVCw5K8lQRLlkcHc=\n' +
689
- '=pR+C\n' +
690
- '-----END PGP MESSAGE-----';
691
-
692
- let key = new openpgp.packet.List();
693
- await key.read((await openpgp.armor.decode(armored_key)).data);
694
- key = key[3];
695
- await key.decrypt('test');
696
-
697
- const msg = new openpgp.packet.List();
698
- await msg.read((await openpgp.armor.decode(armored_msg)).data);
699
-
700
- return msg[0].decrypt(key).then(async () => {
701
- await msg[1].decrypt(msg[0].sessionKeyAlgorithm, msg[0].sessionKey);
702
-
703
- const text = await stringify(msg[1].packets[0].packets[0].data);
704
-
705
- expect(text).to.equal('Hello world!');
706
- });
707
- });
708
-
709
- it('Secret key reading with signature verification.', async function() {
710
- const key = new openpgp.packet.List();
711
- await key.read((await openpgp.armor.decode(armored_key)).data);
712
- return Promise.all([
713
- expect(key[2].verify(key[0],
714
- openpgp.enums.signature.cert_generic,
715
- {
716
- userId: key[1],
717
- key: key[0]
718
- })).to.eventually.be.true,
719
- expect(key[4].verify(key[0],
720
- openpgp.enums.signature.key_binding,
721
- {
722
- key: key[0],
723
- bind: key[3]
724
- })).to.eventually.be.true
725
- ]);
726
- });
727
-
728
- it('Reading a signed, encrypted message.', async function() {
729
- const armored_msg =
730
- '-----BEGIN PGP MESSAGE-----\n' +
731
- 'Version: GnuPG v2.0.19 (GNU/Linux)\n' +
732
- '\n' +
733
- 'hIwD95D9aHS5fxEBA/4/X4myvH+jB1HYNeZvdK+WsBNDMfLsBGOf205Rxr3vSob/\n' +
734
- 'A09boj8/9lFaipqu+AEdQKEjCB8sZ+OY0WiQPEPpuhG+mVqDqEiPFkdpcqNtS0VV\n' +
735
- 'pwqplHo6QnH2MHfxprZHYuwcEC9ynJCxJ6kSCD8Xs99h+PjxNNw7NhMjkF+N69LA\n' +
736
- 'NwGPtbLx2/r2nR4gO8gV92A2RQCOwPP7ZV+6fXgWIs+mhyCHFP3xUP5DaFCNM8mo\n' +
737
- 'PN97i659ucxF6IbOoK56FEaUbOPTD6xdyhWamxKfMsIb0UJgVUNhGaq+VlvOJxaB\n' +
738
- 'iRcnY5UxsypKgtqfcKIseb21MIo4vcNdogyxBIDlAO472Zfxn0udzr6W2aQ77+NK\n' +
739
- 'FE1O0kCXS+DTFOYYVD7X8rXGSglQsdXJmHd89sdYFQkO7D7bOLdRJuXgdgH2czCs\n' +
740
- 'UBGuHZzsGbTdyKvpVBuS3rnyHHBk6oCnsm1Nl7eLs64VkZUxjEUbq5pb4dlr1pw2\n' +
741
- 'ztpmpAnRcmM=\n' +
742
- '=htrB\n' +
743
- '-----END PGP MESSAGE-----';
744
-
745
- const key = new openpgp.packet.List();
746
- await key.read((await openpgp.armor.decode(armored_key)).data);
747
- await key[3].decrypt('test');
748
-
749
- const msg = new openpgp.packet.List();
750
- await msg.read((await openpgp.armor.decode(armored_msg)).data);
751
-
752
- return msg[0].decrypt(key[3]).then(async () => {
753
- await msg[1].decrypt(msg[0].sessionKeyAlgorithm, msg[0].sessionKey);
754
-
755
- const payload = msg[1].packets[0].packets;
756
- payload.concat(await openpgp.stream.readToEnd(payload.stream, arr => arr));
757
-
758
- await Promise.all([
759
- expect(payload[2].verify(
760
- key[0], openpgp.enums.signature.binary, payload[1]
761
- )).to.eventually.be.true,
762
- openpgp.stream.pipe(payload[1].getBytes(), new WritableStream())
763
- ]);
764
- });
765
- });
766
-
767
- it('Reading signersUserId from armored signature', async function() {
768
- const armored_sig =
769
- `-----BEGIN PGP SIGNATURE-----
770
-
771
- iQFKBAEBCgA0FiEEdOyNPagqedqiXfEMa6Ve2Dq64bsFAlszXwQWHHRlc3Qtd2tk
772
- QG1ldGFjb2RlLmJpegAKCRBrpV7YOrrhuw1PB/9KhFRR/M3OR6NmIent6ri1ekWn
773
- vlcnVqj6N4Xqi1ahRVw19/Jx36mGyijxNwqqGrziqRiPCdT0pKfCfv7nXQf2Up1Z
774
- LoR1StqpBMSDQfuF6JAJmJuB9T+mPQO8wYeUp+O63vQnm5CgqyoRlIoqX8MN6GTY
775
- xK5PdTRjw6IEIGr9uLgSoUwTd0ECY1F9ptyuLGD5ET5ZtyUenQSbX+cw5WCGLFzi
776
- 7TwKTY+kGQpkwDJKZJSGpoP7ob6xdDfZx6dHV6IfIJg8/F9gtAXFp8uE51L90cV2
777
- kePFjAnu9cpynKXu3usf8+FuBw2zLsg1Id1n7ttxoAte416KjBN9lFBt8mcu
778
- =wEIR
779
- -----END PGP SIGNATURE-----`;
780
-
781
- const signature = await openpgp.signature.readArmored(armored_sig);
782
-
783
- expect(signature.packets[0].signersUserId).to.equal('test-wkd@metacode.biz');
784
- });
785
-
786
- it('Reading notations from armored key', async function() {
787
- const pubkey =
788
- `-----BEGIN PGP PUBLIC KEY BLOCK-----
789
-
790
- mQENBFzQOToBCADd0Pwh8edZ6gR3x49L1PaBPtiAQUr1QDUDWeNes8co5MTFl5hG
791
- lHzptt+VD0JGucuIkvi34f5z2ZbInAV/xYDX3kSYefy6LB8XJD527I/o9bqY1P7T
792
- PjtTZ4emcqNGkGhV2hNGV+hFcTevUS9Ty4vGg6P7X6RjfjeTrClHelJT8+9IiH+4
793
- 0h4X/Y1hwoijRWanYnZjuAUIrOXnG76iknXQRGc8th8iI0oIZfKQomfF0K5lXFhH
794
- SU8Yvmik3vCTLHC6Ce0GVRCTIcU0/Xi2MK/Yrg9bGzSblHxomLU0NT6pee+2UjqR
795
- BZXOAPLY66Lsh1oqxQ6ihVnOmbraU9glAGm1ABEBAAG0EFRlc3R0IDx0ZXN0QGV4
796
- YT6JAYoEEwEIAHQCGwMFCQPCZwAFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AWIQQZ
797
- jHIqS6wzbp2qrkRXnQGzq+FUDgUCXNA5VBoUgAAAAAAQAAF0ZXN0QGV4YW1wbGUu
798
- Y29tMhoUgAAAAAAQAAF0ZXN0QGV4YW1wbGUuY29tMwAKCRBXnQGzq+FUDoLiCACn
799
- ls1iy0hT59Xt3o3tmmxe1jLzkbQEprR6MMfZamtex5/BHViu2HPAu5i13mXyBRnJ
800
- 4Zvd/HUxJukP3tdQyJIlZFe8XwloMoRAA37KOZ5QGyKH8Jxq3LcAcQOOkFtWgr+Z
801
- JbjUKF1IuqCsK6SYB8f7SVKgpZk/kqG3HE3gk72ONnqdvwOa9cIhAuZScdgZ+PLC
802
- 6W/0+IrnQIasvKeEWeK4u6/NYT35HUsUE/9Z6WKF+qxJnp5Pi2Q5cio6bFlGDNQb
803
- +MiuiEb3Mzb3ev2PVg7WELBRXOg8QlCxrghqfi1SH791mmiyGK+GIQgnjRwMejTh
804
- dNsnHYag/KAewag55AQvuQENBFzQOToBCADJD+auK+Opo1q3ZLxODMyw5//XHJH4
805
- 0vQPNawyBiOdBuneWHF3jfDwGa+lOftUx1abSwsq+Qs955THgLVSiJvivHWVy8pN
806
- tPv0XLa9rMj2wh/OmckbcgzSMeJJIz09bTj095ONPGYW2D4AcpkOc+b5bkqV6r+N
807
- yk9nopPJNCNqYYJtecTClDT5haRKBP5XjXRVsIXva/nHZGXKQLX8iWG2D5DOJNDP
808
- ZkAEoIPg+7J85Q3u2iSFPnLPzKHlMAoQW8d9RAEYyJ6WqiILUIDShhvXg+RIkzri
809
- wY/WkvhB/Kpj0r1SRbNhWRpmOWCR+0a2uHaLz9X0KTP7WMqQbmIdpRgZABEBAAGJ
810
- ATwEGAEIACYWIQQZjHIqS6wzbp2qrkRXnQGzq+FUDgUCXNA5OgIbDAUJA8JnAAAK
811
- CRBXnQGzq+FUDgI6B/9Far0CUR6rWvUiviBY4P5oe44I9P9P7ilWmum1cIQWxMyF
812
- 0sc5tRcVLpMomURlrDz0TR5GNs+nuGAHTRBfN7VO0Y+R/LyEd1Rf80ONObXOqzMp
813
- vF9CdW3a7W4WicZwnGgUOImTICazR2VmR+RREdZshqrOCaOnuKmN3QwGH1zzFwJA
814
- sTbLoNMdBv8SEARaRVOWPM1HwJ701mMYF48FqhHd5uinH/ZCeBhqrBfhmXa68FWx
815
- xuyJz6ttl5Fp4nsB3waQdgPGZJ9NUrGfopLUZ44xDuJjBONd7rbYOh71TWbHd8wG
816
- V+HOQJQxXJkVRYa3QrFUehiMzTeqqMdgC6ZqJy7+
817
- =et/d
818
- -----END PGP PUBLIC KEY BLOCK-----`;
819
-
820
- const key = (await openpgp.key.readArmored(pubkey)).keys[0];
821
-
822
- const { notations, rawNotations } = key.users[0].selfCertifications[0];
823
-
824
- // Even though there are two notations with the same keys
825
- // the `notations` property reads only the single one:
826
- // the last one encountered during parse
827
- expect(Object.keys(notations).length).to.equal(1);
828
- expect(notations['test@example.com']).to.equal('3');
829
-
830
- // On the other hand `rawNotations` property provides access to all
831
- // notations, even non human-readable. The values are not deserialized
832
- // and they are byte-arrays.
833
- expect(rawNotations.length).to.equal(2);
834
-
835
- expect(rawNotations[0].name).to.equal('test@example.com');
836
- expect(rawNotations[0].value).to.deep.equal(Uint8Array.from(['2'.charCodeAt(0)]));
837
- expect(rawNotations[0].humanReadable).to.equal(true);
838
-
839
- expect(rawNotations[1].name).to.equal('test@example.com');
840
- expect(rawNotations[1].value).to.deep.equal(Uint8Array.from(['3'.charCodeAt(0)]));
841
- expect(rawNotations[1].humanReadable).to.equal(true);
842
- });
843
-
844
- it('Writing and encryption of a secret key packet.', function() {
845
- const key = new openpgp.packet.List();
846
- key.push(new openpgp.packet.SecretKey());
847
-
848
- const rsa = openpgp.crypto.publicKey.rsa;
849
- const keySize = openpgp.util.getWebCryptoAll() ? 2048 : 512; // webkit webcrypto accepts minimum 2048 bit keys
850
-
851
- return rsa.generate(keySize, "10001").then(async function(mpiGen) {
852
- let mpi = [mpiGen.n, mpiGen.e, mpiGen.d, mpiGen.p, mpiGen.q, mpiGen.u];
853
- mpi = mpi.map(function(k) {
854
- return new openpgp.MPI(k);
855
- });
856
-
857
- key[0].params = mpi;
858
- key[0].algorithm = "rsa_sign";
859
- key[0].isEncrypted = false;
860
- await key[0].encrypt('hello');
861
-
862
- const raw = key.write();
863
-
864
- const key2 = new openpgp.packet.List();
865
- await key2.read(raw);
866
- await key2[0].decrypt('hello');
867
-
868
- expect(key[0].params.toString()).to.equal(key2[0].params.toString());
869
- });
870
- });
871
-
872
- it('Writing and encryption of a secret key packet. (AEAD)', async function() {
873
- let aead_protectVal = openpgp.config.aead_protect;
874
- openpgp.config.aead_protect = true;
875
-
876
- const key = new openpgp.packet.List();
877
- key.push(new openpgp.packet.SecretKey());
878
-
879
- const rsa = openpgp.crypto.publicKey.rsa;
880
- const keySize = openpgp.util.getWebCryptoAll() ? 2048 : 512; // webkit webcrypto accepts minimum 2048 bit keys
881
-
882
- try {
883
- const mpiGen = await rsa.generate(keySize, "10001");
884
- let mpi = [mpiGen.n, mpiGen.e, mpiGen.d, mpiGen.p, mpiGen.q, mpiGen.u];
885
- mpi = mpi.map(function(k) {
886
- return new openpgp.MPI(k);
887
- });
888
-
889
- key[0].params = mpi;
890
- key[0].algorithm = "rsa_sign";
891
- key[0].isEncrypted = false;
892
- await key[0].encrypt('hello');
893
-
894
- const raw = key.write();
895
-
896
- const key2 = new openpgp.packet.List();
897
- await key2.read(raw);
898
- await key2[0].decrypt('hello');
899
-
900
- expect(key[0].params.toString()).to.equal(key2[0].params.toString());
901
- } finally {
902
- openpgp.config.aead_protect = aead_protectVal;
903
- }
904
- });
905
-
906
- it('Writing and verification of a signature packet.', function() {
907
- const key = new openpgp.packet.SecretKey();
908
-
909
- const rsa = openpgp.crypto.publicKey.rsa;
910
- const keySize = openpgp.util.getWebCryptoAll() ? 2048 : 512; // webkit webcrypto accepts minimum 2048 bit keys
911
-
912
- return rsa.generate(keySize, "10001").then(function(mpiGen) {
913
- let mpi = [mpiGen.n, mpiGen.e, mpiGen.d, mpiGen.p, mpiGen.q, mpiGen.u];
914
- mpi = mpi.map(function(k) {
915
- return new openpgp.MPI(k);
916
- });
917
- const testText = input.createSomeMessage();
918
-
919
- key.params = mpi;
920
- key.algorithm = "rsa_sign";
921
-
922
- const signed = new openpgp.packet.List();
923
- const literal = new openpgp.packet.Literal();
924
- const signature = new openpgp.packet.Signature();
925
-
926
- literal.setText(testText);
927
-
928
- signature.hashAlgorithm = 'sha256';
929
- signature.publicKeyAlgorithm = 'rsa_sign';
930
- signature.signatureType = 'text';
931
-
932
- return signature.sign(key, literal).then(async () => {
933
-
934
- signed.push(literal);
935
- signed.push(signature);
936
-
937
- const raw = signed.write();
938
-
939
- const signed2 = new openpgp.packet.List();
940
- await signed2.read(raw);
941
- signed2.concat(await openpgp.stream.readToEnd(signed2.stream, arr => arr));
942
-
943
- await Promise.all([
944
- expect(signed2[1].verify(key, openpgp.enums.signature.text, signed2[0])).to.eventually.be.true,
945
- openpgp.stream.pipe(signed2[0].getBytes(), new WritableStream())
946
- ]);
947
- });
948
- });
949
- });
950
- });