You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
2.1 KiB
91 lines
2.1 KiB
'use strict'; |
|
|
|
const baseEncodeTables = { |
|
26: 'abcdefghijklmnopqrstuvwxyz', |
|
32: '123456789abcdefghjkmnpqrstuvwxyz', // no 0lio |
|
36: '0123456789abcdefghijklmnopqrstuvwxyz', |
|
49: 'abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ', // no lIO |
|
52: 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', |
|
58: '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ', // no 0lIO |
|
62: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', |
|
64: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_', |
|
}; |
|
|
|
function encodeBufferToBase(buffer, base) { |
|
const encodeTable = baseEncodeTables[base]; |
|
if (!encodeTable) { |
|
throw new Error('Unknown encoding base' + base); |
|
} |
|
|
|
const readLength = buffer.length; |
|
const Big = require('big.js'); |
|
|
|
Big.RM = Big.DP = 0; |
|
let b = new Big(0); |
|
|
|
for (let i = readLength - 1; i >= 0; i--) { |
|
b = b.times(256).plus(buffer[i]); |
|
} |
|
|
|
let output = ''; |
|
while (b.gt(0)) { |
|
output = encodeTable[b.mod(base)] + output; |
|
b = b.div(base); |
|
} |
|
|
|
Big.DP = 20; |
|
Big.RM = 1; |
|
|
|
return output; |
|
} |
|
|
|
let createMd4 = undefined; |
|
let BatchedHash = undefined; |
|
|
|
function getHashDigest(buffer, hashType, digestType, maxLength) { |
|
hashType = hashType || 'md4'; |
|
maxLength = maxLength || 9999; |
|
|
|
let hash; |
|
|
|
try { |
|
hash = require('crypto').createHash(hashType); |
|
} catch (error) { |
|
if (error.code === 'ERR_OSSL_EVP_UNSUPPORTED' && hashType === 'md4') { |
|
if (createMd4 === undefined) { |
|
createMd4 = require('./hash/md4'); |
|
|
|
if (BatchedHash === undefined) { |
|
BatchedHash = require('./hash/BatchedHash'); |
|
} |
|
} |
|
|
|
hash = new BatchedHash(createMd4()); |
|
} |
|
|
|
if (!hash) { |
|
throw error; |
|
} |
|
} |
|
|
|
hash.update(buffer); |
|
|
|
if ( |
|
digestType === 'base26' || |
|
digestType === 'base32' || |
|
digestType === 'base36' || |
|
digestType === 'base49' || |
|
digestType === 'base52' || |
|
digestType === 'base58' || |
|
digestType === 'base62' |
|
) { |
|
return encodeBufferToBase(hash.digest(), digestType.substr(4)).substr( |
|
0, |
|
maxLength |
|
); |
|
} else { |
|
return hash.digest(digestType || 'hex').substr(0, maxLength); |
|
} |
|
} |
|
|
|
module.exports = getHashDigest;
|
|
|