@sendsafely/sendsafely 1.1.0 → 1.1.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.
package/uploadWorker.js CHANGED
@@ -1,322 +1,322 @@
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
- }
15
- }
16
- };
17
-
18
- self.ivCounter = 0;
19
- self.log = "";
20
-
21
- 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;
54
- break;
55
-
56
- case 'encrypt_message':
57
-
58
- self.serverSecret = data.serverSecret;
59
- self.message = data.message;
60
- self.cspUrl = data.cspUrl;
61
- self.keycode = data.keycode;
62
- self.salt = data.salt;
63
- self.iv = data.iv;
64
- self.workerId = data.workerId;
65
- self.debug('Starting to encrypt');
66
- self.encryptMessage();
67
-
68
- break;
69
- case 'decrypt_message':
70
-
71
- self.serverSecret = data.serverSecret;
72
- self.message = data.message;
73
- self.cspUrl = data.cspUrl;
74
- self.keycode = data.keycode;
75
- self.workerId = data.workerId;
76
-
77
- self.salt = data.salt;
78
- self.iv = data.iv;
79
-
80
- self.decryptMessage();
81
-
82
- break;
83
- case 'decrypt_file':
84
- self.ivCounter = 0;
85
- self.iv = data.randomness;
86
- self.decryptionKey = data.decryptionKey;
87
- self.fileId = data.fileId;
88
- self.file = data.file;
89
- self.workerId = data.workerId;
90
- self.part = data.part;
91
- self.dataType = (data.dataType.constructor === Array) ? data.dataType : [data.dataType];
92
- self.decryptFile();
93
- break;
94
- default:
95
- ;
96
- };
97
- }, false);
98
-
99
- function decryptFile()
100
- {
101
- self.pgpDecryptMessage(self.file, self.decryptionKey, function(decryptedData) {
102
- self.postMessage({'cmd': 'decrypted', 'fileId': self.fileId, 'data': decryptedData, 'part': self.part},'*');
103
- });
104
- }
105
-
106
- function handleDataConversion(dataType, data) {
107
- var tmpData = data;
108
- switch(dataType) {
109
- case 'ARRAY_BUFFER':
110
- break;
111
- case 'BASE64':
112
- tmpData = base64Encode(data);
113
- break;
114
- }
115
-
116
- return tmpData;
117
- }
118
-
119
- function decryptMessage() {
120
-
121
- try {
122
- var decryptionKey = self.serverSecret + self.keycode;
123
- var decoded = base64Decode(self.message);
124
- self.pgpDecryptMessage(decoded, decryptionKey, function (decryptedMsg) {
125
- var plaintextString = typedArrayToUnicodeString(decryptedMsg); // Uint8Array([0x01, 0x01, 0x01])
126
- self.postMessage({'cmd': 'done', data: plaintextString},'*');
127
- });
128
- } catch(e) {
129
- throw(e);
130
- }
131
-
132
- }
133
-
134
- function encryptMessage() {
135
- var encryptionKey = self.serverSecret + self.keycode;
136
- self.pgpEncryptMessage(encryptionKey, self.message, 'msg.txt', function (encryptedMsg) {
137
- var base64EncodedResponse = base64EncodeArray(encryptedMsg);
138
- self.postMessage({'cmd': 'done', data: base64EncodedResponse},'*');
139
- });
140
- }
141
-
142
- function pgpEncryptMessage(encryptionKey, data, filename, callback)
143
- {
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
- });
153
- }
154
-
155
- function typedArrayToUnicodeString(ua) {
156
- var binstr = Array.prototype.map.call(ua, function (ch) {
157
- return String.fromCharCode(ch);
158
- }).join('');
159
- var escstr = binstr.replace(/(.)/g, function (m, p) {
160
- var code = p.charCodeAt().toString(16).toUpperCase();
161
- if (code.length < 2) {
162
- code = '0' + code;
163
- }
164
- return '%' + code;
165
- });
166
- return decodeURIComponent(escstr);
167
- }
168
-
169
- async function pgpDecryptMessage(encryptedString, passphrase, callback)
170
- {
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
- });
182
- }
183
-
184
- function base64EncodeArray(t,o)
185
- {
186
- var b64s = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
187
- var a, c, n;
188
- var r = o ? o : [],
189
- l = 0,
190
- s = 0;
191
- var tl = t.length;
192
-
193
- for (n = 0; n < tl; n++) {
194
- c = t[n];
195
- if (s === 0) {
196
- r.push(b64s.charAt((c >> 2) & 63));
197
- a = (c & 3) << 4;
198
- } else if (s === 1) {
199
- r.push(b64s.charAt((a | (c >> 4) & 15)));
200
- a = (c & 15) << 2;
201
- } else if (s === 2) {
202
- r.push(b64s.charAt(a | ((c >> 6) & 3)));
203
- l += 1;
204
- if ((l % 60) === 0) {
205
- //r.push("\n");
206
- }
207
- r.push(b64s.charAt(c & 63));
208
- }
209
- l += 1;
210
- if ((l % 60) === 0) {
211
- //r.push("\n");
212
- }
213
-
214
- s += 1;
215
- if (s === 3) {
216
- s = 0;
217
- }
218
- }
219
- if (s > 0) {
220
- r.push(b64s.charAt(a));
221
- l += 1;
222
- if ((l % 60) === 0) {
223
- //r.push("\n");
224
- }
225
- r.push('=');
226
- l += 1;
227
- }
228
- if (s === 1) {
229
- if ((l % 60) === 0) {
230
- //r.push("\n");
231
- }
232
- r.push('=');
233
- }
234
- if (o)
235
- {
236
- return;
237
- }
238
- return r.join('');
239
- }
240
-
241
- function base64Decode(t)
242
- {
243
- // This is ripped from inside the OpenPGPJS library for compatibility
244
- var b64s = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
245
- var c, n;
246
- var r = [],
247
- s = 0,
248
- a = 0;
249
- var tl = t.length;
250
-
251
- for (n = 0; n < tl; n++) {
252
- c = b64s.indexOf(t.charAt(n));
253
- if (c >= 0) {
254
- if (s) {
255
- r.push(a | (c >> (6 - s)) & 255);
256
- }
257
- s = (s + 2) & 7;
258
- a = (c << s) & 255;
259
- }
260
- }
261
- return new Uint8Array(r);
262
- }
263
-
264
- function start() {
265
- debug("Using browser: " + self.browser);
266
-
267
- var encryptionKey = self.serverSecret + self.keycode;
268
- //var reader = new FileReaderSync();
269
- var typedArray = new Uint8Array(self.file);
270
-
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
- });
282
- }
283
-
284
- function updateProgress(type, number) {
285
- self.postMessage({'cmd': 'progress', 'type': type, 'fileId': fileId, 'percent': number});
286
- }
287
-
288
- function debug(msg) {
289
- self.log += msg + "\n";
290
- self.send({'cmd': 'debug', 'msg': msg});
291
- }
292
-
293
- function send(content) {
294
- if(self.postMessage != undefined) {
295
- self.postMessage(content,'*');
296
- } else {
297
- postMessage(content,'*');
298
- }
299
- }
300
-
301
- function fatalError(msg, err) {
302
- if(err !== undefined) {
303
- self.debug(err);
304
- self.debug(err.stack);
305
- }
306
-
307
- self.postMessage({'cmd': 'fatal', 'msg': msg, 'debug': self.log});
308
- throw new Error('Aborting execution due to error');
309
- }
310
-
311
- self.updateProgres = updateProgress;
312
- self.fatalError = fatalError;
313
- self.debug = debug;
314
- self.start = start;
315
- self.send = send;
316
- self.decryptFile = decryptFile;
317
- self.decryptMessage = decryptMessage;
318
- self.encryptMessage = encryptMessage;
319
- self.base64EncodeArray = base64EncodeArray;
320
- self.base64Decode = base64Decode;
321
- self.pgpEncryptMessage = pgpEncryptMessage;
322
- self.pgpDecryptMessage = pgpDecryptMessage;
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
+ }
15
+ }
16
+ };
17
+
18
+ self.ivCounter = 0;
19
+ self.log = "";
20
+
21
+ 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;
54
+ break;
55
+
56
+ case 'encrypt_message':
57
+
58
+ self.serverSecret = data.serverSecret;
59
+ self.message = data.message;
60
+ self.cspUrl = data.cspUrl;
61
+ self.keycode = data.keycode;
62
+ self.salt = data.salt;
63
+ self.iv = data.iv;
64
+ self.workerId = data.workerId;
65
+ self.debug('Starting to encrypt');
66
+ self.encryptMessage();
67
+
68
+ break;
69
+ case 'decrypt_message':
70
+
71
+ self.serverSecret = data.serverSecret;
72
+ self.message = data.message;
73
+ self.cspUrl = data.cspUrl;
74
+ self.keycode = data.keycode;
75
+ self.workerId = data.workerId;
76
+
77
+ self.salt = data.salt;
78
+ self.iv = data.iv;
79
+
80
+ self.decryptMessage();
81
+
82
+ break;
83
+ case 'decrypt_file':
84
+ self.ivCounter = 0;
85
+ self.iv = data.randomness;
86
+ self.decryptionKey = data.decryptionKey;
87
+ self.fileId = data.fileId;
88
+ self.file = data.file;
89
+ self.workerId = data.workerId;
90
+ self.part = data.part;
91
+ self.dataType = (data.dataType.constructor === Array) ? data.dataType : [data.dataType];
92
+ self.decryptFile();
93
+ break;
94
+ default:
95
+ ;
96
+ };
97
+ }, false);
98
+
99
+ function decryptFile()
100
+ {
101
+ self.pgpDecryptMessage(self.file, self.decryptionKey, function(decryptedData) {
102
+ self.postMessage({'cmd': 'decrypted', 'fileId': self.fileId, 'data': decryptedData, 'part': self.part},'*');
103
+ });
104
+ }
105
+
106
+ function handleDataConversion(dataType, data) {
107
+ var tmpData = data;
108
+ switch(dataType) {
109
+ case 'ARRAY_BUFFER':
110
+ break;
111
+ case 'BASE64':
112
+ tmpData = base64Encode(data);
113
+ break;
114
+ }
115
+
116
+ return tmpData;
117
+ }
118
+
119
+ function decryptMessage() {
120
+
121
+ try {
122
+ var decryptionKey = self.serverSecret + self.keycode;
123
+ var decoded = base64Decode(self.message);
124
+ self.pgpDecryptMessage(decoded, decryptionKey, function (decryptedMsg) {
125
+ var plaintextString = typedArrayToUnicodeString(decryptedMsg); // Uint8Array([0x01, 0x01, 0x01])
126
+ self.postMessage({'cmd': 'done', data: plaintextString},'*');
127
+ });
128
+ } catch(e) {
129
+ throw(e);
130
+ }
131
+
132
+ }
133
+
134
+ function encryptMessage() {
135
+ var encryptionKey = self.serverSecret + self.keycode;
136
+ self.pgpEncryptMessage(encryptionKey, self.message, 'msg.txt', function (encryptedMsg) {
137
+ var base64EncodedResponse = base64EncodeArray(encryptedMsg);
138
+ self.postMessage({'cmd': 'done', data: base64EncodedResponse},'*');
139
+ });
140
+ }
141
+
142
+ function pgpEncryptMessage(encryptionKey, data, filename, callback)
143
+ {
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
+ });
153
+ }
154
+
155
+ function typedArrayToUnicodeString(ua) {
156
+ var binstr = Array.prototype.map.call(ua, function (ch) {
157
+ return String.fromCharCode(ch);
158
+ }).join('');
159
+ var escstr = binstr.replace(/(.)/g, function (m, p) {
160
+ var code = p.charCodeAt().toString(16).toUpperCase();
161
+ if (code.length < 2) {
162
+ code = '0' + code;
163
+ }
164
+ return '%' + code;
165
+ });
166
+ return decodeURIComponent(escstr);
167
+ }
168
+
169
+ async function pgpDecryptMessage(encryptedString, passphrase, callback)
170
+ {
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
+ });
182
+ }
183
+
184
+ function base64EncodeArray(t,o)
185
+ {
186
+ var b64s = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
187
+ var a, c, n;
188
+ var r = o ? o : [],
189
+ l = 0,
190
+ s = 0;
191
+ var tl = t.length;
192
+
193
+ for (n = 0; n < tl; n++) {
194
+ c = t[n];
195
+ if (s === 0) {
196
+ r.push(b64s.charAt((c >> 2) & 63));
197
+ a = (c & 3) << 4;
198
+ } else if (s === 1) {
199
+ r.push(b64s.charAt((a | (c >> 4) & 15)));
200
+ a = (c & 15) << 2;
201
+ } else if (s === 2) {
202
+ r.push(b64s.charAt(a | ((c >> 6) & 3)));
203
+ l += 1;
204
+ if ((l % 60) === 0) {
205
+ //r.push("\n");
206
+ }
207
+ r.push(b64s.charAt(c & 63));
208
+ }
209
+ l += 1;
210
+ if ((l % 60) === 0) {
211
+ //r.push("\n");
212
+ }
213
+
214
+ s += 1;
215
+ if (s === 3) {
216
+ s = 0;
217
+ }
218
+ }
219
+ if (s > 0) {
220
+ r.push(b64s.charAt(a));
221
+ l += 1;
222
+ if ((l % 60) === 0) {
223
+ //r.push("\n");
224
+ }
225
+ r.push('=');
226
+ l += 1;
227
+ }
228
+ if (s === 1) {
229
+ if ((l % 60) === 0) {
230
+ //r.push("\n");
231
+ }
232
+ r.push('=');
233
+ }
234
+ if (o)
235
+ {
236
+ return;
237
+ }
238
+ return r.join('');
239
+ }
240
+
241
+ function base64Decode(t)
242
+ {
243
+ // This is ripped from inside the OpenPGPJS library for compatibility
244
+ var b64s = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
245
+ var c, n;
246
+ var r = [],
247
+ s = 0,
248
+ a = 0;
249
+ var tl = t.length;
250
+
251
+ for (n = 0; n < tl; n++) {
252
+ c = b64s.indexOf(t.charAt(n));
253
+ if (c >= 0) {
254
+ if (s) {
255
+ r.push(a | (c >> (6 - s)) & 255);
256
+ }
257
+ s = (s + 2) & 7;
258
+ a = (c << s) & 255;
259
+ }
260
+ }
261
+ return new Uint8Array(r);
262
+ }
263
+
264
+ function start() {
265
+ debug("Using browser: " + self.browser);
266
+
267
+ var encryptionKey = self.serverSecret + self.keycode;
268
+ //var reader = new FileReaderSync();
269
+ var typedArray = new Uint8Array(self.file);
270
+
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
+ });
282
+ }
283
+
284
+ function updateProgress(type, number) {
285
+ self.postMessage({'cmd': 'progress', 'type': type, 'fileId': fileId, 'percent': number});
286
+ }
287
+
288
+ function debug(msg) {
289
+ self.log += msg + "\n";
290
+ self.send({'cmd': 'debug', 'msg': msg});
291
+ }
292
+
293
+ function send(content) {
294
+ if(self.postMessage != undefined) {
295
+ self.postMessage(content,'*');
296
+ } else {
297
+ postMessage(content,'*');
298
+ }
299
+ }
300
+
301
+ function fatalError(msg, err) {
302
+ if(err !== undefined) {
303
+ self.debug(err);
304
+ self.debug(err.stack);
305
+ }
306
+
307
+ self.postMessage({'cmd': 'fatal', 'msg': msg, 'debug': self.log});
308
+ throw new Error('Aborting execution due to error');
309
+ }
310
+
311
+ self.updateProgres = updateProgress;
312
+ self.fatalError = fatalError;
313
+ self.debug = debug;
314
+ self.start = start;
315
+ self.send = send;
316
+ self.decryptFile = decryptFile;
317
+ self.decryptMessage = decryptMessage;
318
+ self.encryptMessage = encryptMessage;
319
+ self.base64EncodeArray = base64EncodeArray;
320
+ self.base64Decode = base64Decode;
321
+ self.pgpEncryptMessage = pgpEncryptMessage;
322
+ self.pgpDecryptMessage = pgpDecryptMessage;