UNPKG

4.7 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.CryptoWorker = undefined;
7
8var _ramda = require('ramda');
9
10var _detectNode = require('detect-node');
11
12var _detectNode2 = _interopRequireDefault(_detectNode);
13
14var _defer = require('./defer');
15
16var _defer2 = _interopRequireDefault(_defer);
17
18var _smartTimeout = require('./smart-timeout');
19
20var _smartTimeout2 = _interopRequireDefault(_smartTimeout);
21
22var _bin = require('./bin');
23
24function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
26const convertIfArray = (0, _ramda.when)((0, _ramda.is)(Array), _bin.convertToUint8Array);
27let webWorker = !_detectNode2.default;
28let taskID = 0;
29const awaiting = {};
30const webCrypto = _detectNode2.default ? false
31//eslint-disable-next-line
32: window.crypto.subtle || window.crypto.webkitSubtle //TODO remove browser depends
33//eslint-disable-next-line
34|| window.msCrypto && window.msCrypto.subtle;
35const useWebCrypto = webCrypto && !!webCrypto.digest;
36let useSha1Crypto = useWebCrypto;
37let useSha256Crypto = useWebCrypto;
38const finalizeTask = (taskID, result) => {
39 const deferred = awaiting[taskID];
40 if (deferred) {
41 // console.log(rework_d_T(), 'CW done')
42 deferred.resolve(result); //TODO Possibly, can be used as
43 delete awaiting[taskID]; //
44 } // deferred = Promise.resolve()
45}; // deferred.resolve( result )
46
47const isCryptoTask = (0, _ramda.both)((0, _ramda.has)('taskID'), (0, _ramda.has)('result'));
48
49//eslint-disable-next-line
50const workerEnable = !_detectNode2.default && window.Worker;
51if (workerEnable) {
52 require('worker-loader!./worker.js');
53 const tmpWorker = new Worker('./bundle/hash.worker.js');
54 // tmpWorker.onmessage = function(event) {
55 // console.info('CW tmpWorker.onmessage', event && event.data)
56 // }
57 tmpWorker.onmessage = e => {
58 if (e.data === 'ready') {
59 console.info('CW ready');
60 } else if (!isCryptoTask(e.data)) {
61 console.info('Not crypto task', e, e.data);
62 return e;
63 } else return webWorker ? finalizeTask(e.data.taskID, e.data.result) : webWorker = tmpWorker;
64 };
65
66 tmpWorker.onerror = function (error) {
67 console.error('CW error', error, error.stack);
68 webWorker = false;
69 };
70 tmpWorker.postMessage('b');
71 webWorker = tmpWorker;
72}
73
74const performTaskWorker = (task, params, embed) => {
75 // console.log(rework_d_T(), 'CW start', task)
76 const deferred = (0, _defer2.default)();
77
78 awaiting[taskID] = deferred;
79
80 params.task = task;
81 params.taskID = taskID;(embed || webWorker).postMessage(params);
82
83 taskID++;
84
85 return deferred.promise;
86};
87
88const sha1Hash = bytes => {
89 if (useSha1Crypto) {
90 // We don't use buffer since typedArray.subarray(...).buffer gives the whole buffer and not sliced one.
91 // webCrypto.digest supports typed array
92 const bytesTyped = convertIfArray(bytes);
93 // console.log(rework_d_T(), 'Native sha1 start')
94 return webCrypto.digest({ name: 'SHA-1' }, bytesTyped).then(digest =>
95 // console.log(rework_d_T(), 'Native sha1 done')
96 digest, e => {
97 console.error('Crypto digest error', e);
98 useSha1Crypto = false;
99 return (0, _bin.sha1HashSync)(bytes);
100 });
101 }
102 return _smartTimeout2.default.immediate(_bin.sha1HashSync, bytes);
103};
104
105const sha256Hash = bytes => {
106 if (useSha256Crypto) {
107 const bytesTyped = convertIfArray(bytes);
108 // console.log(rework_d_T(), 'Native sha1 start')
109 return webCrypto.digest({ name: 'SHA-256' }, bytesTyped).then(_ramda.identity
110 // console.log(rework_d_T(), 'Native sha1 done')
111 , e => {
112 console.error('Crypto digest error', e);
113 useSha256Crypto = false;
114 return (0, _bin.sha256HashSync)(bytes);
115 });
116 }
117 return _smartTimeout2.default.immediate(_bin.sha256HashSync, bytes);
118};
119
120const aesEncrypt = (bytes, keyBytes, ivBytes) => _smartTimeout2.default.immediate(() => (0, _bin.convertToArrayBuffer)((0, _bin.aesEncryptSync)(bytes, keyBytes, ivBytes)));
121
122const aesDecrypt = (encryptedBytes, keyBytes, ivBytes) => _smartTimeout2.default.immediate(() => (0, _bin.convertToArrayBuffer)((0, _bin.aesDecryptSync)(encryptedBytes, keyBytes, ivBytes)));
123
124const factorize = bytes => {
125 bytes = (0, _bin.convertToByteArray)(bytes);
126 return webWorker ? performTaskWorker('factorize', { bytes }) : _smartTimeout2.default.immediate(_bin.pqPrimeFactorization, bytes);
127};
128
129const modPow = (x, y, m) => webWorker ? performTaskWorker('mod-pow', {
130 x,
131 y,
132 m
133}) : _smartTimeout2.default.immediate(_bin.bytesModPow, x, y, m);
134
135const CryptoWorker = exports.CryptoWorker = {
136 sha1Hash,
137 sha256Hash,
138 aesEncrypt,
139 aesDecrypt,
140 factorize,
141 modPow
142};
143
144exports.default = CryptoWorker;
145//# sourceMappingURL=crypto.js.map
\No newline at end of file