1 | import { keccak224, keccak384, keccak256 as k256, keccak512 } from 'ethereum-cryptography/keccak'
|
2 | const createHash = require('create-hash')
|
3 | import * as rlp from 'rlp'
|
4 | import { toBuffer, setLengthLeft } from './bytes'
|
5 | import { assertIsString, assertIsBuffer, assertIsArray, assertIsHexString } from './helpers'
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 | export const keccak = function (a: Buffer, bits: number = 256): Buffer {
|
13 | assertIsBuffer(a)
|
14 | switch (bits) {
|
15 | case 224: {
|
16 | return keccak224(a)
|
17 | }
|
18 | case 256: {
|
19 | return k256(a)
|
20 | }
|
21 | case 384: {
|
22 | return keccak384(a)
|
23 | }
|
24 | case 512: {
|
25 | return keccak512(a)
|
26 | }
|
27 | default: {
|
28 | throw new Error(`Invald algorithm: keccak${bits}`)
|
29 | }
|
30 | }
|
31 | }
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 | export const keccak256 = function (a: Buffer): Buffer {
|
38 | return keccak(a)
|
39 | }
|
40 |
|
41 |
|
42 |
|
43 |
|
44 |
|
45 |
|
46 | export const keccakFromString = function (a: string, bits: number = 256) {
|
47 | assertIsString(a)
|
48 | const buf = Buffer.from(a, 'utf8')
|
49 | return keccak(buf, bits)
|
50 | }
|
51 |
|
52 |
|
53 |
|
54 |
|
55 |
|
56 |
|
57 | export const keccakFromHexString = function (a: string, bits: number = 256) {
|
58 | assertIsHexString(a)
|
59 | return keccak(toBuffer(a), bits)
|
60 | }
|
61 |
|
62 |
|
63 |
|
64 |
|
65 |
|
66 |
|
67 | export const keccakFromArray = function (a: number[], bits: number = 256) {
|
68 | assertIsArray(a)
|
69 | return keccak(toBuffer(a), bits)
|
70 | }
|
71 |
|
72 |
|
73 |
|
74 |
|
75 |
|
76 | const _sha256 = function (a: any): Buffer {
|
77 | a = toBuffer(a)
|
78 | return createHash('sha256').update(a).digest()
|
79 | }
|
80 |
|
81 |
|
82 |
|
83 |
|
84 |
|
85 | export const sha256 = function (a: Buffer): Buffer {
|
86 | assertIsBuffer(a)
|
87 | return _sha256(a)
|
88 | }
|
89 |
|
90 |
|
91 |
|
92 |
|
93 |
|
94 | export const sha256FromString = function (a: string): Buffer {
|
95 | assertIsString(a)
|
96 | return _sha256(a)
|
97 | }
|
98 |
|
99 |
|
100 |
|
101 |
|
102 |
|
103 | export const sha256FromArray = function (a: number[]): Buffer {
|
104 | assertIsArray(a)
|
105 | return _sha256(a)
|
106 | }
|
107 |
|
108 |
|
109 |
|
110 |
|
111 |
|
112 |
|
113 | const _ripemd160 = function (a: any, padded: boolean): Buffer {
|
114 | a = toBuffer(a)
|
115 | const hash = createHash('rmd160').update(a).digest()
|
116 | if (padded === true) {
|
117 | return setLengthLeft(hash, 32)
|
118 | } else {
|
119 | return hash
|
120 | }
|
121 | }
|
122 |
|
123 |
|
124 |
|
125 |
|
126 |
|
127 |
|
128 | export const ripemd160 = function (a: Buffer, padded: boolean): Buffer {
|
129 | assertIsBuffer(a)
|
130 | return _ripemd160(a, padded)
|
131 | }
|
132 |
|
133 |
|
134 |
|
135 |
|
136 |
|
137 |
|
138 | export const ripemd160FromString = function (a: string, padded: boolean): Buffer {
|
139 | assertIsString(a)
|
140 | return _ripemd160(a, padded)
|
141 | }
|
142 |
|
143 |
|
144 |
|
145 |
|
146 |
|
147 |
|
148 | export const ripemd160FromArray = function (a: number[], padded: boolean): Buffer {
|
149 | assertIsArray(a)
|
150 | return _ripemd160(a, padded)
|
151 | }
|
152 |
|
153 |
|
154 |
|
155 |
|
156 |
|
157 | export const rlphash = function (a: rlp.Input): Buffer {
|
158 | return keccak(rlp.encode(a))
|
159 | }
|