12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- '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;
|