@sendsafely/sendsafely 2.0.0 → 2.0.2

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.
package/README.md CHANGED
@@ -3,6 +3,12 @@
3
3
 
4
4
  The SendSafely JavaScript API for Node.js lets you integrate SendSafely secure data transfer capabilities directly into your Node.js application.
5
5
 
6
+ ## Requirements
7
+
8
+ - **Node.js**: v18 or higher *(required starting from SDK v2.0.0)*
9
+
10
+ Please ensure you upgrade to Node v18 to take advantage of the latest features and maintain compatibility with our SDK v2.0.0 and later.
11
+
6
12
  ## Quickstart
7
13
  The example below shows you how to install the package and use it as a CommonJS module.
8
14
 
package/lib/SendSafely.js CHANGED
@@ -1,4 +1,6 @@
1
1
  const URL = require('url').URL;
2
+ const { ReadableStream, WritableStream, TransformStream } = require('stream/web');
3
+ Object.assign(globalThis, {ReadableStream, WritableStream, TransformStream});
2
4
  const Window = require('./window');
3
5
  const window = new Window();
4
6
  const self = window;
@@ -3941,7 +3943,7 @@ function GenerateKeyPair(eventHandler) {
3941
3943
  }
3942
3944
 
3943
3945
  function buildNameStr() {
3944
- return {name:myself.NAME, email:myself.EMAIL};
3946
+ return myself.NAME + ' <' + myself.EMAIL + '>';
3945
3947
  }
3946
3948
 
3947
3949
  }
@@ -1,47 +1,40 @@
1
- if(typeof window === 'undefined') {
1
+ try {
2
+ if (window === undefined) {
3
+ window = globalThis;
4
+ }
5
+ } catch (err) {
2
6
  window = {};
3
7
  }
4
8
 
5
- window.crypto = {
6
- getRandomValues: function (buf) {
7
- for(var i = 0; i<buf.length; i++)
8
- {
9
- if((self.randomCounter%20) === 0) {
10
- reportProgress(self.randomCounter);
11
- }
12
- if((self.randomCounter % 512) === 0)
13
- {
14
- self.send({'cmd': 'randBuff', 'bytes': 64});
15
- }
16
- buf[i] = self.randomness[self.randomCounter++].charCodeAt();
17
- }
18
- }
19
- };
20
-
21
- self.randomCounter = 0;
22
-
23
- self.addEventListener('message', async function(e) {
9
+ self.addEventListener('message', function(e) {
24
10
  var data = e.data;
25
11
  switch (data.cmd) {
26
12
  case 'generate_key':
27
13
  debug("Starting to generate key..");
28
- self.randomCounter = 0;
29
- self.randomness = data.randomness;
30
14
 
31
- var bits = data.bits;
32
15
  var userStr = data.userStr;
16
+ var splitUserStr = userStr.split('<');
17
+ var userObj = {};
18
+ if (splitUserStr.length > 1) {
19
+ var name = splitUserStr[0].substring(0, splitUserStr[0].length-1);
20
+ var email = splitUserStr[1].substring(0, splitUserStr[1].length-1);
21
+ userObj = {
22
+ email: email,
23
+ name: name
24
+ }
25
+ }
26
+
27
+ var options = {};
28
+ options.rsaBits = 2048;
29
+ options.type = 'rsa';
30
+ options.userIDs = [userObj];
31
+ options.format = 'armored';
32
+ options.config = {showComment: true, showVersion: true};
33
33
 
34
-
35
- var options =
36
- {
37
- userIds: [userStr], // multiple user IDs
38
- numBits: 2048
39
- };
40
-
41
34
  openpgp.generateKey(options).then(function(key) {
42
- var privateKey = key.privateKeyArmored;
43
- var publicKey = key.publicKeyArmored;
44
-
35
+ debug("Generated key!");
36
+ var privateKey = key.privateKey;
37
+ var publicKey = key.publicKey;
45
38
  self.send({'cmd': 'key_generated', 'privateKey': privateKey, 'publicKey': publicKey});
46
39
  }, function(err) {
47
40
  debug("An Unknown Error Occurred While Generating the key");
@@ -49,66 +42,119 @@ self.addEventListener('message', async function(e) {
49
42
  });
50
43
  break;
51
44
  case 'convert_key':
52
- self.randomCounter = 0;
53
- self.randomness = data.randomness;
54
45
  var result = convertRawKey(data.rsaKeys, data.userStr);
55
46
  self.send({'cmd': 'key_converted', 'privateKey': result.privateKeyArmored, 'publicKey': result.publicKeyArmored});
56
47
  break;
57
48
  case 'encrypt_keycode':
58
- self.randomCounter = 0;
59
- self.randomness = data.randomness;
60
-
61
49
  debug(data.publicKey);
62
- var publicKeys = await openpgp.key.readArmored(data.publicKey);
63
-
64
- if(publicKeys.keys.length > 0) {
65
- var pubKey = publicKeys.keys[0];
66
-
67
- var options = {
68
- message: openpgp.message.fromText(data.keyCode),
69
- publicKeys: [pubKey]
70
- }
71
-
72
- openpgp.encrypt(options).then(function(encryptedMessage) {
73
- self.send({'cmd': 'keycode_encrypted', 'encryptedKeyCode': encryptedMessage.data});
74
- }, function(err) {
75
- debug('ERROR');
76
- debug(err);
77
- });
78
- }
50
+ // Read in armored keys
51
+ openpgp.readKeys({"armoredKeys": data.publicKey})
52
+ .then(function(publicKeys) {
53
+ if(publicKeys.length > 0) {
54
+ // Create open PGP message
55
+ openpgp.createMessage({"text": data.keyCode})
56
+ .then(function(message) {
57
+ var options = {
58
+ message,
59
+ encryptionKeys: publicKeys,
60
+ config: {
61
+ s2kIterationCountByte: 96,
62
+ allowMissingKeyFlags: true
63
+ }
64
+ }
65
+
66
+ // Encrypt open PGP message
67
+ openpgp.encrypt(options)
68
+ .then(function(encryptedMessage) {
69
+ self.send({'cmd': 'keycode_encrypted', 'encryptedKeyCode': encryptedMessage});
70
+ }, function(err) {
71
+ debug('ERROR');
72
+ debug(err);
73
+ sendError(err);
74
+ });
75
+ }, function(err) {
76
+ debug('ERROR');
77
+ debug(err);
78
+ sendError(err);
79
+ });
80
+ }
81
+ }, function(err) {
82
+ console.error(err);
83
+ sendError(err);
84
+ });
79
85
  break;
80
86
  case 'decrypt_keycode':
81
- try {
82
- self.randomCounter = 0;
83
- self.randomness = data.randomness;
84
- var privKeys = await openpgp.key.readArmored(data.privateKey);
85
- privKey = privKeys.keys[0];
86
- var message = await openpgp.message.readArmored(data.keyCode);
87
-
88
- options =
89
- {
90
- message: message, // parse armored message
91
- privateKeys: [privKey] // for decryption
92
- };
93
-
94
- openpgp.decrypt(options).then(function(plaintext) {
95
- self.send({'cmd': 'keycode_decrypted', 'decryptedKeycode': plaintext.data});
96
- }, function(err) {
97
- debug('ERROR');
98
- debug(err);
99
- sendError(err);
100
- });
101
- } catch (err) {
102
- sendError(err);
103
- }
87
+ decryptKeycode(data.privateKey, data.keyCode, 0);
104
88
  break;
105
- case 'randBuff':
106
- self.randomness += data.randomness;
107
89
  default:
108
90
  ;
109
91
  };
110
92
  }, false);
111
93
 
94
+ function decryptKeycode(privateKey, keyCode, failback) {
95
+ // read in armored private key
96
+ openpgp.readKeys({"armoredKeys": privateKey}).then(function (privateKeys) {
97
+ if (privateKeys != undefined && privateKeys.length > 0) {
98
+ // Read encrypted message from key code
99
+ openpgp.readMessage({"armoredMessage": keyCode}).then(async function (encryptedMessage) {
100
+ let options = {
101
+ message: encryptedMessage,
102
+ decryptionKeys: privateKeys
103
+ }
104
+ if (failback === 1) {
105
+ options.config = {
106
+ allowInsecureDecryptionWithSigningKeys: true
107
+ }
108
+ } else if (failback === 2) {
109
+ options.config = {
110
+ allowInsecureDecryptionWithSigningKeys: true,
111
+ allowUnauthenticatedMessages: true
112
+ }
113
+ } else if (failback === 3) {
114
+ options.config = {
115
+ allowMissingKeyFlags: true
116
+ }
117
+ } else if (failback === 4) {
118
+ options.config = {
119
+ allowInsecureDecryptionWithSigningKeys: true,
120
+ allowUnauthenticatedMessages: true,
121
+ allowMissingKeyFlags: true
122
+ }
123
+ }
124
+ try {
125
+ let {data: decrypted} = await openpgp.decrypt(options);
126
+ self.send({'cmd': 'keycode_decrypted', 'decryptedKeycode': decrypted});
127
+ } catch (e) {
128
+ if (e.message === 'Error decrypting message: No decryption key packets found') {
129
+ // this might be a keycode encrypted with our old Java or .NET API that was incorrectly encrypting keycodes with the signing key
130
+ // update the config to bypass this and try again.
131
+ decryptKeycode(privateKey, keyCode, 1)
132
+ } else if (e.message === 'Error decrypting message: Message is not authenticated.' && failback !== 3) {
133
+ // this might be a keycode encrypted with our old Java API that wasn't setting setWithIntegrity = true.
134
+ // update the config to bypass this and try again.
135
+ decryptKeycode(privateKey, keyCode, 2)
136
+ } else if (e.message === 'Error decrypting message: None of the key flags is set: consider passing `config.allowMissingKeyFlags`') {
137
+ // this might be a keycode encrypted with an incorrectly formatted SCEAR key
138
+ // update the config to bypass this and try again.
139
+ decryptKeycode(privateKey, keyCode, 3)
140
+ } else if (e.message === 'Error decrypting message: Message is not authenticated.' && failback === 3) {
141
+ // this might be a keycode encrypted with our old Java API that wasn't setting setWithIntegrity = true,
142
+ // and the keycode was encrypted with an incorrectly formatted SCEAR key
143
+ // update the config to bypass this and try again.
144
+ decryptKeycode(privateKey, keyCode, 4)
145
+ } else {
146
+ // something else is the issue so log it
147
+ debug('ERROR');
148
+ debug(e);
149
+ console.log(e);
150
+ sendError(e);
151
+ }
152
+ }
153
+ });
154
+ }
155
+ });
156
+ }
157
+
112
158
  function convertRawKey(rsaKeys, userStr) {
113
159
 
114
160
  var secretKey = createSecretKey(rsaKeys.privateKey);
@@ -125,33 +171,33 @@ function convertRawKey(rsaKeys, userStr) {
125
171
 
126
172
  function wrapKeyObject(userId, secretKeyPacket, secretSubkeyPacket)
127
173
  {
128
- packetlist = new window.openpgp.packet.List();
174
+ var packetlist = new openpgp.PacketList();
129
175
 
130
- userIdPacket = new window.openpgp.packet.Userid();
176
+ var userIdPacket = new openpgp.UserIDPacket();
131
177
  userIdPacket.read(userId);
132
178
 
133
179
  dataToSign = {};
134
180
  dataToSign.userid = userIdPacket;
135
181
  dataToSign.key = secretKeyPacket;
136
- signaturePacket = new window.openpgp.packet.Signature();
137
- signaturePacket.signatureType = window.openpgp.enums.signature.cert_generic;
138
- signaturePacket.publicKeyAlgorithm = window.openpgp.enums.publicKey.rsa_encrypt_sign;
139
- signaturePacket.hashAlgorithm = window.openpgp.config.prefer_hash_algorithm;
140
- signaturePacket.keyFlags = [window.openpgp.enums.keyFlags.certify_keys | window.openpgp.enums.keyFlags.sign_data];
182
+ var signaturePacket = new openpgp.Signature();
183
+ signaturePacket.signatureType = openpgp.enums.signature.cert_generic;
184
+ signaturePacket.publicKeyAlgorithm = openpgp.enums.publicKey.rsa_encrypt_sign;
185
+ signaturePacket.hashAlgorithm = openpgp.config.prefer_hash_algorithm;
186
+ signaturePacket.keyFlags = [openpgp.enums.keyFlags.certify_keys | openpgp.enums.keyFlags.sign_data];
141
187
  signaturePacket.preferredSymmetricAlgorithms = [];
142
- signaturePacket.preferredSymmetricAlgorithms.push(window.openpgp.enums.symmetric.aes256);
143
- signaturePacket.preferredSymmetricAlgorithms.push(window.openpgp.enums.symmetric.aes192);
144
- signaturePacket.preferredSymmetricAlgorithms.push(window.openpgp.enums.symmetric.aes128);
145
- signaturePacket.preferredSymmetricAlgorithms.push(window.openpgp.enums.symmetric.cast5);
146
- signaturePacket.preferredSymmetricAlgorithms.push(window.openpgp.enums.symmetric.tripledes);
188
+ signaturePacket.preferredSymmetricAlgorithms.push(openpgp.enums.symmetric.aes256);
189
+ signaturePacket.preferredSymmetricAlgorithms.push(openpgp.enums.symmetric.aes192);
190
+ signaturePacket.preferredSymmetricAlgorithms.push(openpgp.enums.symmetric.aes128);
191
+ signaturePacket.preferredSymmetricAlgorithms.push(openpgp.enums.symmetric.cast5);
192
+ signaturePacket.preferredSymmetricAlgorithms.push(openpgp.enums.symmetric.tripledes);
147
193
  signaturePacket.preferredHashAlgorithms = [];
148
- signaturePacket.preferredHashAlgorithms.push(window.openpgp.enums.hash.sha256);
149
- signaturePacket.preferredHashAlgorithms.push(window.openpgp.enums.hash.sha1);
150
- signaturePacket.preferredHashAlgorithms.push(window.openpgp.enums.hash.sha512);
194
+ signaturePacket.preferredHashAlgorithms.push(openpgp.enums.hash.sha256);
195
+ signaturePacket.preferredHashAlgorithms.push(openpgp.enums.hash.sha1);
196
+ signaturePacket.preferredHashAlgorithms.push(openpgp.enums.hash.sha512);
151
197
  signaturePacket.preferredCompressionAlgorithms = [];
152
- signaturePacket.preferredCompressionAlgorithms.push(window.openpgp.enums.compression.zlib);
153
- signaturePacket.preferredCompressionAlgorithms.push(window.openpgp.enums.compression.zip);
154
- if (window.openpgp.config.integrity_protect) {
198
+ signaturePacket.preferredCompressionAlgorithms.push(openpgp.enums.compression.zlib);
199
+ signaturePacket.preferredCompressionAlgorithms.push(openpgp.enums.compression.zip);
200
+ if (openpgp.config.integrity_protect) {
155
201
  signaturePacket.features = [];
156
202
  signaturePacket.features.push(1); // Modification Detection
157
203
  }
@@ -160,11 +206,11 @@ function wrapKeyObject(userId, secretKeyPacket, secretSubkeyPacket)
160
206
  dataToSign = {};
161
207
  dataToSign.key = secretKeyPacket;
162
208
  dataToSign.bind = secretSubkeyPacket;
163
- subkeySignaturePacket = new window.openpgp.packet.Signature();
164
- subkeySignaturePacket.signatureType = window.openpgp.enums.signature.subkey_binding;
165
- subkeySignaturePacket.publicKeyAlgorithm = window.openpgp.enums.publicKey.rsa_encrypt_sign;
166
- subkeySignaturePacket.hashAlgorithm = window.openpgp.config.prefer_hash_algorithm;
167
- subkeySignaturePacket.keyFlags = [window.openpgp.enums.keyFlags.encrypt_communication | window.openpgp.enums.keyFlags.encrypt_storage];
209
+ var subkeySignaturePacket = new openpgp.Signature();
210
+ subkeySignaturePacket.signatureType = openpgp.enums.signature.subkey_binding;
211
+ subkeySignaturePacket.publicKeyAlgorithm = openpgp.enums.publicKey.rsa_encrypt_sign;
212
+ subkeySignaturePacket.hashAlgorithm = openpgp.config.prefer_hash_algorithm;
213
+ subkeySignaturePacket.keyFlags = [openpgp.enums.keyFlags.encrypt_communication | openpgp.enums.keyFlags.encrypt_storage];
168
214
  subkeySignaturePacket.sign(secretKeyPacket, dataToSign);
169
215
 
170
216
  packetlist.push(secretKeyPacket);
@@ -173,20 +219,20 @@ function wrapKeyObject(userId, secretKeyPacket, secretSubkeyPacket)
173
219
  packetlist.push(secretSubkeyPacket);
174
220
  packetlist.push(subkeySignaturePacket);
175
221
 
176
- return new window.openpgp.key.Key(packetlist);
222
+ return new openpgp.Key(packetlist);
177
223
  }
178
224
 
179
225
  function createSecretKey(key)
180
226
  {
181
227
  var mpiList = createMPIList(key);
182
- var packet = createSecretKeyPacketFromList(mpiList, window.openpgp.packet.SecretKey);
228
+ var packet = createSecretKeyPacketFromList(mpiList, openpgp.SecretKeyPacket);
183
229
  return packet;
184
230
  }
185
231
 
186
232
  function createSecretSubKey(key)
187
233
  {
188
234
  var mpiList = createMPIList(key);
189
- var packet = createSecretKeyPacketFromList(mpiList, window.openpgp.packet.SecretSubkey);
235
+ var packet = createSecretKeyPacketFromList(mpiList, openpgp.SecretSubkeyPacket);
190
236
  return packet;
191
237
  }
192
238
 
@@ -195,7 +241,7 @@ function createSecretKeyPacketFromList(mpiList, PacketType)
195
241
  var secretKeyPacket = new PacketType();
196
242
  secretKeyPacket.mpi = mpiList;
197
243
  secretKeyPacket.isDecrypted = true;
198
- secretKeyPacket.algorithm = window.openpgp.enums.read(window.openpgp.enums.publicKey, window.openpgp.enums.publicKey.rsa_encrypt_sign);
244
+ secretKeyPacket.algorithm = openpgp.enums.read(openpgp.enums.publicKey, openpgp.enums.publicKey.rsa_encrypt_sign);
199
245
  return secretKeyPacket;
200
246
  }
201
247
 
@@ -218,13 +264,13 @@ function createMPIList(privateKey)
218
264
 
219
265
  function createMPI(value, radix)
220
266
  {
221
- var BigInteger = window.openpgp.crypto.publicKey.jsbn;
267
+ var BigInteger = openpgp.crypto.publicKey.jsbn;
222
268
  var bn = new BigInteger(value, radix);
223
269
  return createMPIFromBI(bn);
224
270
  }
225
271
 
226
272
  function createMPIFromBI(bigIntegeger) {
227
- var mpi = new window.openpgp.MPI();
273
+ var mpi = new openpgp.MPI();
228
274
  mpi.fromBigInteger(bigIntegeger);
229
275
  return mpi;
230
276
  }
@@ -248,7 +294,7 @@ function sendError(err) {
248
294
  function SecureRandom() {
249
295
  function nextBytes(byteArray) {
250
296
  for (var n = 0; n < byteArray.length; n++) {
251
- byteArray[n] = window.openpgp.crypto.random.getSecureRandomOctet();
297
+ byteArray[n] = openpgp.crypto.random.getSecureRandomOctet();
252
298
  }
253
299
  }
254
300
  this.nextBytes = nextBytes;
@@ -261,26 +307,8 @@ function debug(msg) {
261
307
 
262
308
  function send(content) {
263
309
  if(self.postMessage != undefined) {
264
- self.postMessage(content);
310
+ self.postMessage(content, '*');
265
311
  } else {
266
- postMessage(content);
312
+ postMessage(content, '*');
267
313
  }
268
- }
269
-
270
- function execute(cmd, errMsg) {
271
- // wrap the sync cmd in a promise
272
- var promise = new Promise(function(resolve) {
273
- var result = cmd();
274
- resolve(result);
275
- });
276
-
277
- // handler error globally
278
- return promise.catch(onError.bind(null, errMsg));
279
- }
280
-
281
- function onError(message, error) {
282
- // log the stack trace
283
- console.error(error.stack);
284
- // rethrow new high level error for api users
285
- throw new Error(message);
286
314
  }
@@ -1,56 +1,39 @@
1
- if(typeof window === 'undefined') {
2
- window = {};
3
- }
4
-
5
- window.crypto = {
6
- getRandomValues: function (buf) {
7
- if(self.ivCounter + buf > self.iv.size)
8
- {
9
- self.send({'cmd': 'randBuff'});
10
- }
11
- for(var i = 0; i<buf.length; i++)
12
- {
13
- buf[i] = self.iv[self.ivCounter++].charCodeAt();
14
- }
1
+ try {
2
+ if (window === undefined) {
3
+ window = globalThis;
15
4
  }
16
- };
5
+ } catch (err) {
6
+ window = {};
7
+ }
17
8
 
18
- self.ivCounter = 0;
19
9
  self.log = "";
20
10
 
21
11
  self.addEventListener('message', function(e) {
22
- var data = e.data;
23
- switch (data.cmd) {
24
- case 'start':
25
- self.ivCounter = 0;
26
- self.csrf = data.csrf;
27
- self.serverSecret = data.serverSecret;
28
- self.packageId = data.packageId;
29
- self.directoryId = data.directoryId;
30
- self.file = data.file;
31
- self.fileId = data.fileId;
32
- self.uploadUrl = data.uploadUrl;
33
- self.keycode = data.keycode;
34
- self.iv = data.iv;
35
- self.name = data.name;
36
- self.browser = data.browser;
37
- self.uploadedBytes = 0;
38
- self.SEGMENT_SIZE = data.SEGMENT_SIZE;
39
- self.filePart = data.filePart;
40
- self.totalFileSize = data.totalFileSize;
41
- self.totalParts = data.parts;
42
- self.id = data.id;
43
- self.boundary = data.boundary;
44
-
45
- // Add file
46
- self.postMessage({'cmd': 'state', 'fileId': self.fileId, 'name': self.name, 'state': 'ENCRYPTION_STARTED', 'part': self.filePart, 'filesize': self.totalFileSize},'*');
47
-
48
- self.start();
49
- break;
50
-
51
- case 'randBuff':
52
- self.iv = data.iv;
53
- self.ivCounter = 0;
12
+ var data = e.data;
13
+ switch (data.cmd) {
14
+ case 'start':
15
+ self.csrf = data.csrf;
16
+ self.serverSecret = data.serverSecret;
17
+ self.packageId = data.packageId;
18
+ self.directoryId = data.directoryId;
19
+ self.file = data.file;
20
+ self.fileId = data.fileId;
21
+ self.uploadUrl = data.uploadUrl;
22
+ self.keycode = data.keycode;
23
+ self.name = data.name;
24
+ self.browser = data.browser;
25
+ self.uploadedBytes = 0;
26
+ self.SEGMENT_SIZE = data.SEGMENT_SIZE;
27
+ self.filePart = data.filePart;
28
+ self.totalFileSize = data.totalFileSize;
29
+ self.totalParts = data.parts;
30
+ self.id = data.id;
31
+ self.boundary = data.boundary;
32
+
33
+ // Add file
34
+ self.postMessage({'cmd': 'state', 'fileId': self.fileId, 'name': self.name, 'state': 'ENCRYPTION_STARTED', 'part': self.filePart, 'filesize': self.totalFileSize}, '*');
35
+
36
+ self.start();
54
37
  break;
55
38
 
56
39
  case 'encrypt_message':
@@ -60,14 +43,14 @@ self.addEventListener('message', function(e) {
60
43
  self.cspUrl = data.cspUrl;
61
44
  self.keycode = data.keycode;
62
45
  self.salt = data.salt;
63
- self.iv = data.iv;
64
46
  self.workerId = data.workerId;
47
+
65
48
  self.debug('Starting to encrypt');
66
49
  self.encryptMessage();
67
50
 
68
51
  break;
69
52
  case 'decrypt_message':
70
-
53
+ self.debug('Starting to decrypt message');
71
54
  self.serverSecret = data.serverSecret;
72
55
  self.message = data.message;
73
56
  self.cspUrl = data.cspUrl;
@@ -75,14 +58,12 @@ self.addEventListener('message', function(e) {
75
58
  self.workerId = data.workerId;
76
59
 
77
60
  self.salt = data.salt;
78
- self.iv = data.iv;
79
61
 
80
62
  self.decryptMessage();
81
63
 
82
64
  break;
83
65
  case 'decrypt_file':
84
- self.ivCounter = 0;
85
- self.iv = data.randomness;
66
+ self.debug('Starting to decrypt file');
86
67
  self.decryptionKey = data.decryptionKey;
87
68
  self.fileId = data.fileId;
88
69
  self.file = data.file;
@@ -97,9 +78,10 @@ self.addEventListener('message', function(e) {
97
78
  }, false);
98
79
 
99
80
  function decryptFile()
100
- {
81
+ {
82
+
101
83
  self.pgpDecryptMessage(self.file, self.decryptionKey, function(decryptedData) {
102
- self.postMessage({'cmd': 'decrypted', 'fileId': self.fileId, 'data': decryptedData, 'part': self.part},'*');
84
+ self.postMessage({'cmd': 'decrypted', 'fileId': self.fileId, 'workerId': self.workerId, 'data': decryptedData, 'part': self.part}, '*');
103
85
  });
104
86
  }
105
87
 
@@ -123,7 +105,7 @@ function decryptMessage() {
123
105
  var decoded = base64Decode(self.message);
124
106
  self.pgpDecryptMessage(decoded, decryptionKey, function (decryptedMsg) {
125
107
  var plaintextString = typedArrayToUnicodeString(decryptedMsg); // Uint8Array([0x01, 0x01, 0x01])
126
- self.postMessage({'cmd': 'done', data: plaintextString},'*');
108
+ self.postMessage({'cmd': 'done', data: plaintextString}, '*');
127
109
  });
128
110
  } catch(e) {
129
111
  throw(e);
@@ -133,23 +115,33 @@ function decryptMessage() {
133
115
 
134
116
  function encryptMessage() {
135
117
  var encryptionKey = self.serverSecret + self.keycode;
118
+
136
119
  self.pgpEncryptMessage(encryptionKey, self.message, 'msg.txt', function (encryptedMsg) {
137
120
  var base64EncodedResponse = base64EncodeArray(encryptedMsg);
138
- self.postMessage({'cmd': 'done', data: base64EncodedResponse},'*');
121
+ self.postMessage({'cmd': 'done', data: base64EncodedResponse}, '*');
139
122
  });
140
123
  }
141
124
 
142
125
  function pgpEncryptMessage(encryptionKey, data, filename, callback)
143
126
  {
144
- var options = {
145
- message: openpgp.message.fromText(data), // input as Uint8Array (or String)
146
- passwords: [encryptionKey], // multiple passwords possible
147
- armor: false // don't ASCII armor (for Uint8Array output)
148
- };
149
- openpgp.encrypt(options).then(function(ciphertext) {
150
- //var encrypted = // get raw encrypted packets as Uint8Array
151
- callback(ciphertext.message.packets.write());
152
- });
127
+ // Create open PGP message
128
+ openpgp.createMessage({ "text": data })
129
+ .then(function (message) {
130
+ var options = {
131
+ message, // input as message obj per openPGPv6
132
+ passwords: [encryptionKey], // multiple passwords possible
133
+ format: 'object',
134
+ config: {
135
+ s2kIterationCountByte: 96
136
+ }
137
+ };
138
+
139
+ // Encrypt open PGP message
140
+ openpgp.encrypt(options)
141
+ .then(function(ciphertext) {
142
+ callback(ciphertext.packets.write());
143
+ });
144
+ });
153
145
  }
154
146
 
155
147
  function typedArrayToUnicodeString(ua) {
@@ -166,19 +158,27 @@ function typedArrayToUnicodeString(ua) {
166
158
  return decodeURIComponent(escstr);
167
159
  }
168
160
 
169
- async function pgpDecryptMessage(encryptedString, passphrase, callback)
161
+ function pgpDecryptMessage(encryptedString, passphrase, callback)
170
162
  {
171
- var options = {
172
- message: await openpgp.message.read(encryptedString), // input as Uint8Array (or String)
173
- passwords: [passphrase], // multiple passwords possible
174
- format: 'binary'
175
- };
176
-
177
-
178
- openpgp.decrypt(options).then(function(plaintext) {
179
- callback(plaintext.data); // String
180
- plaintext = undefined; //Free up for GC
181
- });
163
+ // Read in string as message
164
+ openpgp.readMessage({"binaryMessage": encryptedString})
165
+ .then(function(message) {
166
+ var options = {
167
+ message, // parse encrypted bytes
168
+ passwords: [passphrase], // decrypt with password
169
+ format: 'binary',
170
+ config: {
171
+ s2kIterationCountByte: 96
172
+ }
173
+ };
174
+
175
+ // And decrypt message with openPGP
176
+ openpgp.decrypt(options)
177
+ .then(function(plaintext) {
178
+ callback(plaintext.data); // String
179
+ plaintext = undefined; //Free up for GC
180
+ });
181
+ });
182
182
  }
183
183
 
184
184
  function base64EncodeArray(t,o)
@@ -262,23 +262,28 @@ function base64Decode(t)
262
262
  }
263
263
 
264
264
  function start() {
265
- debug("Using browser: " + self.browser);
266
265
 
267
266
  var encryptionKey = self.serverSecret + self.keycode;
268
- //var reader = new FileReaderSync();
269
267
  var typedArray = new Uint8Array(self.file);
270
268
 
271
- var options = {
272
- message: openpgp.message.fromBinary(typedArray), // input as Uint8Array (or String)
273
- passwords: [encryptionKey], // multiple passwords possible
274
- armor: false // don't ASCII armor (for Uint8Array output)
275
- };
276
-
277
- openpgp.encrypt(options).then(function(ciphertext) {
278
- encrypted = ciphertext.message.packets.write(); // get raw encrypted packets as Uint8Array
279
- self.postMessage({'cmd': 'state', 'name': self.name, 'fileId': self.fileId, 'state': 'FILE_ENCRYPTED', 'part': self.filePart},'*');
280
- self.postMessage({'cmd': 'upload', 'packageId': self.packageId, 'id': self.id, 'boundary': self.boundary, 'file': encrypted, 'name': self.name, 'fileId': self.fileId, 'part': self.filePart, 'parts': self.totalParts, 'filesize': self.totalFileSize},'*');
281
- });
269
+ openpgp.createMessage({ "binary": typedArray })
270
+ .then(function (message) {
271
+ var options = {
272
+ message, // input as messageObj per openPGPv6 update
273
+ passwords: [encryptionKey], // multiple passwords possible
274
+ format: 'binary',
275
+ config: {
276
+ s2kIterationCountByte: 96
277
+ }
278
+ };
279
+
280
+ // Encrypt file with new message obj in options
281
+ openpgp.encrypt(options)
282
+ .then(function(ciphertext) {
283
+ self.postMessage({'cmd': 'state', 'name': self.name, 'fileId': self.fileId, 'state': 'FILE_ENCRYPTED', 'part': self.filePart}, '*');
284
+ self.postMessage({'cmd': 'upload', 'packageId': self.packageId, 'id': self.id, 'boundary': self.boundary, 'file': ciphertext, 'name': self.name, 'fileId': self.fileId, 'part': self.filePart, 'parts': self.totalParts, 'filesize': self.totalFileSize}, '*');
285
+ });
286
+ });
282
287
  }
283
288
 
284
289
  function updateProgress(type, number) {
@@ -292,9 +297,9 @@ function debug(msg) {
292
297
 
293
298
  function send(content) {
294
299
  if(self.postMessage != undefined) {
295
- self.postMessage(content,'*');
300
+ self.postMessage(content, '*');
296
301
  } else {
297
- postMessage(content,'*');
302
+ postMessage(content, '*');
298
303
  }
299
304
  }
300
305
 
@@ -304,8 +309,8 @@ function fatalError(msg, err) {
304
309
  self.debug(err.stack);
305
310
  }
306
311
 
307
- self.postMessage({'cmd': 'fatal', 'msg': msg, 'debug': self.log});
308
- throw new Error('Aborting execution due to error');
312
+ self.postMessage({'cmd': 'fatal', 'msg': msg, 'debug': self.log, 'workerId': self.workerId});
313
+ throw new Error(msg + ': ' + err.stack);
309
314
  }
310
315
 
311
316
  self.updateProgres = updateProgress;
@@ -319,4 +324,4 @@ self.encryptMessage = encryptMessage;
319
324
  self.base64EncodeArray = base64EncodeArray;
320
325
  self.base64Decode = base64Decode;
321
326
  self.pgpEncryptMessage = pgpEncryptMessage;
322
- self.pgpDecryptMessage = pgpDecryptMessage;
327
+ self.pgpDecryptMessage = pgpDecryptMessage;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sendsafely/sendsafely",
3
- "version": "2.0.0",
3
+ "version": "2.0.2",
4
4
  "main": "./lib/SendSafely.js",
5
5
  "engines": {
6
6
  "node": ">=18"
@@ -15,7 +15,7 @@
15
15
  "jquery": "^3.4.1",
16
16
  "jsdom": "^26.0.0",
17
17
  "make-fetch-happen": "^11.1.1",
18
- "openpgp": "4.10.11",
18
+ "openpgp": "6.1.1",
19
19
  "sjcl": "1.0.8",
20
20
  "xmlhttprequest": "^1.8.0"
21
21
  },