Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | 1x 1x 1x 7x 7x 7x 7x 7x 1x 159x 164x 164x 1x 1x 1x 1x 1x 1x 1x 159x 159x 159x 159x 159x 1x 158x 158x | import Ripemd160Polyfill from 'ripemd160-min'
import { isNodeCryptoAvailable } from './cryptoUtils'
type NodeCryptoCreateHash = typeof import('crypto').createHash
export interface Ripemd160Digest {
digest(data: Buffer): Buffer
}
export class Ripemd160PolyfillDigest implements Ripemd160Digest {
digest(data: Buffer): Buffer {
const instance = new Ripemd160Polyfill()
instance.update(data)
const hash = instance.digest()
Iif (Array.isArray(hash)) {
return Buffer.from(hash)
} else {
return Buffer.from(hash.buffer)
}
}
}
export class NodeCryptoRipemd160Digest implements Ripemd160Digest {
nodeCryptoCreateHash: NodeCryptoCreateHash
constructor(nodeCryptoCreateHash: NodeCryptoCreateHash) {
this.nodeCryptoCreateHash = nodeCryptoCreateHash
}
digest(data: Buffer): Buffer {
try {
return this.nodeCryptoCreateHash('rmd160').update(data).digest()
} catch (error) {
try {
return this.nodeCryptoCreateHash('ripemd160').update(data).digest()
} catch (_err) {
console.log(error)
console.log('Node.js `crypto.createHash` exists but failing to digest for ripemd160, falling back to js implementation')
const polyfill = new Ripemd160PolyfillDigest()
return polyfill.digest(data)
}
}
}
}
export function createHashRipemd160() {
const nodeCryptoCreateHash = isNodeCryptoAvailable(nodeCrypto => {
Eif (typeof nodeCrypto.createHash === 'function') {
return nodeCrypto.createHash
}
return false
})
Eif (nodeCryptoCreateHash) {
return new NodeCryptoRipemd160Digest(nodeCryptoCreateHash)
} else {
return new Ripemd160PolyfillDigest()
}
}
export function hashRipemd160(data: Buffer) {
const hash = createHashRipemd160()
return hash.digest(data)
}
|