129 lines
2.9 KiB
JavaScript
129 lines
2.9 KiB
JavaScript
/*jshint -W054 */
|
|
var tmpglobal
|
|
;
|
|
|
|
try {
|
|
tmpglobal = new Function('return this')();
|
|
} catch(e) {
|
|
tmpglobal = window;
|
|
}
|
|
|
|
;(function (exports) {
|
|
'use strict';
|
|
|
|
// Chrome, Firefox, and even MSIE11+ all support crypto
|
|
var crypto = window.crypto || window.msCrypto
|
|
, algos
|
|
;
|
|
|
|
// convenience mappings for common digest algorithms
|
|
algos = {
|
|
'sha1': 'SHA-1'
|
|
, 'sha256': 'SHA-256'
|
|
, 'sha512': 'SHA-512'
|
|
};
|
|
|
|
// The function to generate a sha1sum is the same as generating any digest
|
|
// but here's a shortcut function anyway
|
|
function sha1sum(str) {
|
|
return hashsum('sha1', str);
|
|
}
|
|
|
|
// a more general convenience function
|
|
function hashsum(hash, str) {
|
|
// you have to convert from string to array buffer
|
|
var ab
|
|
// you have to represent the algorithm as an object
|
|
, algo = { name: algos[hash] }
|
|
;
|
|
|
|
if ('string' === typeof str) {
|
|
ab = str2ab(str);
|
|
} else {
|
|
ab = str;
|
|
}
|
|
|
|
// All crypto digest methods return a promise
|
|
return crypto.subtle.digest(algo, ab).then(function (digest) {
|
|
// you have to convert the ArrayBuffer to a DataView and then to a hex String
|
|
return ab2hex(digest);
|
|
}).catch(function (e) {
|
|
// if you specify an unsupported digest algorithm or non-ArrayBuffer, you'll get an error
|
|
console.error('sha1sum ERROR');
|
|
console.error(e);
|
|
throw e;
|
|
});
|
|
}
|
|
|
|
// convert from arraybuffer to hex
|
|
function ab2hex(ab) {
|
|
var dv = new DataView(ab)
|
|
, i
|
|
, len
|
|
, hex = ''
|
|
, c
|
|
;
|
|
|
|
for (i = 0, len = dv.byteLength; i < len; i += 1) {
|
|
c = dv.getUint8(i).toString(16);
|
|
|
|
if (c.length < 2) {
|
|
c = '0' + c;
|
|
}
|
|
|
|
hex += c;
|
|
}
|
|
|
|
return hex;
|
|
}
|
|
|
|
// convert from string to arraybuffer
|
|
function str2ab(stringToEncode, insertBom) {
|
|
stringToEncode = stringToEncode.replace(/\r\n/g,"\n");
|
|
|
|
var utftext = []
|
|
, n
|
|
, c
|
|
;
|
|
|
|
if (true === insertBom) {
|
|
utftext[0] = 0xef;
|
|
utftext[1] = 0xbb;
|
|
utftext[2] = 0xbf;
|
|
}
|
|
|
|
for (n = 0; n < stringToEncode.length; n += 1) {
|
|
|
|
c = stringToEncode.charCodeAt(n);
|
|
|
|
if (c < 128) {
|
|
utftext[utftext.length]= c;
|
|
}
|
|
else if((c > 127) && (c < 2048)) {
|
|
utftext[utftext.length] = (c >> 6) | 192;
|
|
utftext[utftext.length] = (c & 63) | 128;
|
|
}
|
|
else {
|
|
utftext[utftext.length] = (c >> 12) | 224;
|
|
utftext[utftext.length] = ((c >> 6) & 63) | 128;
|
|
utftext[utftext.length] = (c & 63) | 128;
|
|
}
|
|
|
|
}
|
|
return new Uint8Array(utftext).buffer;
|
|
}
|
|
|
|
exports.hashsum = hashsum;
|
|
exports.sha1sum = sha1sum;
|
|
}('undefined' !== typeof exports && exports || tmpglobal));
|
|
|
|
;(function () {
|
|
'use strict';
|
|
|
|
exports.getStats
|
|
exports.getContents
|
|
exports.getMetaCache
|
|
exports.getContentCache
|
|
//require('./db').create(path.join(_dirname, 'db.json'))
|
|
}());
|