UNPKG

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