multihashing-async
Version:
multiple hash functions
57 lines (52 loc) • 1.53 kB
JavaScript
/* eslint-disable require-await */
const crypto = require('crypto')
const multihash = require('multihashes')
/**
* @typedef {import('multihashes').HashName} HashName
* @typedef {import('./types').Digest} Digest
*/
// Note that although this function doesn't do any asynchronous work, we mark
// the function as async because it must return a Promise to match the API
// for other functions that do perform asynchronous work (see sha.browser.js)
// eslint-disable-next-line
/**
* @param {Uint8Array} data
* @param {HashName} alg
* @returns {Promise<Uint8Array>}
*/
const digest = async (data, alg) => {
switch (alg) {
case 'sha1':
return crypto.createHash('sha1').update(data).digest()
case 'sha2-256':
return crypto.createHash('sha256').update(data).digest()
case 'sha2-512':
return crypto.createHash('sha512').update(data).digest()
case 'dbl-sha2-256': {
const first = crypto.createHash('sha256').update(data).digest()
return crypto.createHash('sha256').update(first).digest()
}
default:
throw new Error(`${alg} is not a supported algorithm`)
}
}
module.exports = {
/**
* @param {HashName} alg
* @returns {Digest}
*/
factory: (alg) => async (data) => {
return digest(data, alg)
},
digest,
/**
* @param {Uint8Array} buf
* @param {HashName} alg
* @param {number} [length]
*/
multihashing: async (buf, alg, length) => {
const h = await digest(buf, alg)
return multihash.encode(h, alg, length)
}
}