diff --git a/app/js/lib/bin_utils.js b/app/js/lib/bin_utils.js index 2d7e0b9a..69344b13 100644 --- a/app/js/lib/bin_utils.js +++ b/app/js/lib/bin_utils.js @@ -156,16 +156,6 @@ function bytesToArrayBuffer (b) { return (new Uint8Array(b)).buffer; } -function bufferConcat(buffer1, buffer2) { - var l1 = buffer1.byteLength || buffer1.length, - l2 = buffer2.byteLength || buffer2.length; - var tmp = new Uint8Array(l1 + l2); - tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0); - tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1); - - return tmp.buffer; -} - function bytesFromArrayBuffer (buffer) { var len = buffer.byteLength, byteView = new Uint8Array(buffer), @@ -178,6 +168,16 @@ function bytesFromArrayBuffer (buffer) { return bytes; } +function bufferConcat(buffer1, buffer2) { + var l1 = buffer1.byteLength || buffer1.length, + l2 = buffer2.byteLength || buffer2.length; + var tmp = new Uint8Array(l1 + l2); + tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0); + tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1); + + return tmp.buffer; +} + function longToInts (sLong) { var divRem = bigStringInt(sLong).divideAndRemainder(bigint(0x100000000)); diff --git a/app/js/lib/ng_utils.js b/app/js/lib/ng_utils.js index 82a98c61..f6fdfd29 100644 --- a/app/js/lib/ng_utils.js +++ b/app/js/lib/ng_utils.js @@ -486,7 +486,9 @@ angular.module('izhukov.utils', []) var worker = window.Worker && new Worker('js/lib/crypto_worker.js') || false, taskID = 0, - awaiting = {}; + awaiting = {}, + webCrypto = window.crypto && (window.crypto.subtle || window.crypto.webkitSubtle) || window.msCrypto && window.msCrypto.subtle, + useSha1Crypto = webCrypto && webCrypto.digest !== undefined; if (worker) { worker.onmessage = function (e) { @@ -521,6 +523,22 @@ angular.module('izhukov.utils', []) return { sha1Hash: function (bytes) { + if (useSha1Crypto) { + var deferred = $q.defer(), + buffer = bytes instanceof ArrayBuffer + ? bytes + : bytesToArrayBuffer(bytes); + + webCrypto.digest({name: 'SHA-1'}, buffer).then(function (digest) { + deferred.resolve(bytesFromArrayBuffer(digest)); + }, function (e) { + console.error('Crypto digest error', e); + useSha1Crypto = false; + deferred.resolve(sha1Hash(bytes)); + }); + + return deferred.promise; + } if (worker && false) { // due overhead for data transfer return performTaskWorker ('sha1-hash', {bytes: bytes}); }