tinyhmacmd5 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/browser.min.js +1 -1
- package/main.js +128 -103
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
A tiny JavaScript HMAC-MD5 implementation.
|
|
4
4
|
|
|
5
|
-
The minified browser bundle ([`browser.min.js`](browser.min.js)) is only
|
|
5
|
+
The minified browser bundle ([`browser.min.js`](browser.min.js)) is only 2471 bytes.
|
|
6
6
|
|
|
7
7
|
## Setup
|
|
8
8
|
|
|
@@ -32,12 +32,12 @@ HMAC-MD5:
|
|
|
32
32
|
|
|
33
33
|
```js
|
|
34
34
|
// string to hex
|
|
35
|
-
// returns "
|
|
36
|
-
md5("Hello world!👋", "
|
|
35
|
+
// returns "c87fdc912df24da05a6e3fed927e9d89"
|
|
36
|
+
md5("Hello world!👋", "HMAC key 🔑")
|
|
37
37
|
|
|
38
38
|
// string to bytes
|
|
39
39
|
// returns Uint8Array<ArrayBuffer>
|
|
40
|
-
md5("Hello world!👋", "
|
|
40
|
+
md5("Hello world!👋", "HMAC key 🔑", true)
|
|
41
41
|
|
|
42
42
|
// bytes to hex
|
|
43
43
|
// returns "f881235eccf71ab49b937753a72ac673"
|
package/browser.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/** @license https://github.com/bddjr/tinyhmacmd5/blob/HEAD/LICENSE */
|
|
2
|
-
{let r="length",e=
|
|
2
|
+
{let r="length",e=16,n=2**32,t=Math,o=t.floor,a=(r,e)=>0|(0|r)+(0|e),f=(r,e)=>r<<e|r>>>32-e,l=(r,e,n,t,o,l)=>a(f(a(e,r)+a(t,l),o),n),i=(r,e,n,t,o,a,f)=>l(e&n|~e&t,r,e,o,a,f),u=(r,e,n,t,o,a,f)=>l(e&t|n&~t,r,e,o,a,f),s=(r,e,n,t,o,a,f)=>l(e^n^t,r,e,o,a,f),c=(r,e,n,t,o,a,f)=>l(n^(e|~t),r,e,o,a,f),d=[],v=(f,l)=>{var v,g,h,w,y,b=0,m=1732584193,p=271733878,x=~m,A=~p,E=o((l+64)/512)*e+14,M=r=>d[y++]??=0|n*t.abs(t.sin(y));for(f[o(l/32)]|=128<<l%32,f[E]=0|l,f[E+1]=0|l/n;b<f[r];p=a(p,w)){let[r,n,t,o,l,d,E,S,T,U,j,k,q,z,B,C]=f.slice(b,b+=e);v=m,g=A,h=x,w=p,y=0,m=i(m,A,x,p,r,7,M()),p=i(p,m,A,x,n,12,M()),x=i(x,p,m,A,t,17,M()),A=i(A,x,p,m,o,22,M()),m=i(m,A,x,p,l,7,M()),p=i(p,m,A,x,d,12,M()),x=i(x,p,m,A,E,17,M()),A=i(A,x,p,m,S,22,M()),m=i(m,A,x,p,T,7,M()),p=i(p,m,A,x,U,12,M()),x=i(x,p,m,A,j,17,M()),A=i(A,x,p,m,k,22,M()),m=i(m,A,x,p,q,7,M()),p=i(p,m,A,x,z,12,M()),x=i(x,p,m,A,B,17,M()),A=i(A,x,p,m,C,22,M()),m=u(m,A,x,p,n,5,M()),p=u(p,m,A,x,E,9,M()),x=u(x,p,m,A,k,14,M()),A=u(A,x,p,m,r,20,M()),m=u(m,A,x,p,d,5,M()),p=u(p,m,A,x,j,9,M()),x=u(x,p,m,A,C,14,M()),A=u(A,x,p,m,l,20,M()),m=u(m,A,x,p,U,5,M()),p=u(p,m,A,x,B,9,M()),x=u(x,p,m,A,o,14,M()),A=u(A,x,p,m,T,20,M()),m=u(m,A,x,p,z,5,M()),p=u(p,m,A,x,t,9,M()),x=u(x,p,m,A,S,14,M()),A=u(A,x,p,m,q,20,M()),m=s(m,A,x,p,d,4,M()),p=s(p,m,A,x,T,11,M()),x=s(x,p,m,A,k,e,M()),A=s(A,x,p,m,B,23,M()),m=s(m,A,x,p,n,4,M()),p=s(p,m,A,x,l,11,M()),x=s(x,p,m,A,S,e,M()),A=s(A,x,p,m,j,23,M()),m=s(m,A,x,p,z,4,M()),p=s(p,m,A,x,r,11,M()),x=s(x,p,m,A,o,e,M()),A=s(A,x,p,m,E,23,M()),m=s(m,A,x,p,U,4,M()),p=s(p,m,A,x,q,11,M()),x=s(x,p,m,A,C,e,M()),A=s(A,x,p,m,t,23,M()),m=c(m,A,x,p,r,6,M()),p=c(p,m,A,x,S,10,M()),x=c(x,p,m,A,B,15,M()),A=c(A,x,p,m,d,21,M()),m=c(m,A,x,p,q,6,M()),p=c(p,m,A,x,o,10,M()),x=c(x,p,m,A,j,15,M()),A=c(A,x,p,m,n,21,M()),m=c(m,A,x,p,T,6,M()),p=c(p,m,A,x,C,10,M()),x=c(x,p,m,A,E,15,M()),A=c(A,x,p,m,z,21,M()),m=c(m,A,x,p,l,6,M()),p=c(p,m,A,x,k,10,M()),x=c(x,p,m,A,t,15,M()),A=c(A,x,p,m,U,21,M()),m=a(m,v),A=a(A,g),x=a(x,h)}return[m,A,x,p]},g=e=>{for(var n=e[r],t=[];n;)t[o(--n/4)]|=e[n]<<n%4*8;return t},h=r=>"string"==typeof r?(new TextEncoder).encode(r):r;var md5=(n,t,o)=>{var a,f=g(n=h(n)),l=8*n[r],i=e,u=new Uint8Array(e),s=r=>{for(;i;)f.unshift(r^a[--i]);i=e};for(null!=t&&((a=g(t=h(t)))[r]>e&&(a=v(a,8*t[r])),s(909522486),f=v(f,512+l),s(1549556828),l=640),f=v(f,l);i;)u[--i]=f[i>>2]>>>i%4*8;return o?u:u.reduce((r,n)=>r+(n>>4&&"")+n.toString(e),"")}}
|
package/main.js
CHANGED
|
@@ -5,11 +5,15 @@
|
|
|
5
5
|
/** @type {"length"} */
|
|
6
6
|
let $length = "length"
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
/** @type {16} */
|
|
9
|
+
let $16 = 16
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
/** @type {number} */
|
|
12
|
+
let $2_32 = 2 ** 32
|
|
11
13
|
|
|
12
|
-
let
|
|
14
|
+
let $Math = Math
|
|
15
|
+
|
|
16
|
+
let floor = $Math.floor
|
|
13
17
|
|
|
14
18
|
/**
|
|
15
19
|
* Add integers, wrapping at 2^32.
|
|
@@ -18,7 +22,7 @@ let textEncoder = new TextEncoder;
|
|
|
18
22
|
* @param {number} y Second integer
|
|
19
23
|
* @returns {number} Sum
|
|
20
24
|
*/
|
|
21
|
-
let safeAdd = (x, y) => (
|
|
25
|
+
let safeAdd = (x, y) => 0 | (0 | x) + (0 | y)
|
|
22
26
|
|
|
23
27
|
/**
|
|
24
28
|
* Bitwise rotate a 32-bit number to the left.
|
|
@@ -40,7 +44,7 @@ let bitRotateLeft = (num, cnt) => (num << cnt) | (num >>> (32 - cnt))
|
|
|
40
44
|
* @param {number} t t
|
|
41
45
|
* @returns {number} Result
|
|
42
46
|
*/
|
|
43
|
-
let md5cmn = (q, a, b, x, s, t) => safeAdd(bitRotateLeft(safeAdd(
|
|
47
|
+
let md5cmn = (q, a, b, x, s, t) => safeAdd(bitRotateLeft(safeAdd(a, q) + safeAdd(x, t), s), b)
|
|
44
48
|
|
|
45
49
|
/**
|
|
46
50
|
* Basic operation the algorithm uses.
|
|
@@ -98,6 +102,9 @@ let md5hh = (a, b, c, d, x, s, t) => md5cmn(b ^ c ^ d, a, b, x, s, t)
|
|
|
98
102
|
*/
|
|
99
103
|
let md5ii = (a, b, c, d, x, s, t) => md5cmn(c ^ (b | ~d), a, b, x, s, t)
|
|
100
104
|
|
|
105
|
+
/** @type {number[]} MD5 constants cached in memory */
|
|
106
|
+
let K = []
|
|
107
|
+
|
|
101
108
|
/**
|
|
102
109
|
* Calculate the MD5 of an array of little-endian words, and a bit length.
|
|
103
110
|
*
|
|
@@ -112,94 +119,103 @@ let binlMD5 = (x, bitLen) => {
|
|
|
112
119
|
, oldc
|
|
113
120
|
, oldd
|
|
114
121
|
, a = 1732584193
|
|
115
|
-
, b = -271733879
|
|
116
|
-
, c = -1732584194
|
|
117
122
|
, d = 271733878
|
|
118
|
-
,
|
|
123
|
+
, c = ~a
|
|
124
|
+
, b = ~d
|
|
125
|
+
, padLenIndex = floor((bitLen + 64) / 512) * $16 + 14
|
|
126
|
+
/** @type {number} */
|
|
127
|
+
var k_i
|
|
128
|
+
, k = (/**@type {*}*/ _) => K[k_i++] ??= 0 | $2_32 * $Math.abs($Math.sin(k_i))
|
|
119
129
|
|
|
120
130
|
// append padding
|
|
121
|
-
x[floor(bitLen / 32)] |=
|
|
122
|
-
x[padLenIndex] =
|
|
123
|
-
x[padLenIndex + 1] =
|
|
131
|
+
x[floor(bitLen / 32)] |= 0x80 << bitLen % 32;
|
|
132
|
+
x[padLenIndex] = 0 | bitLen;
|
|
133
|
+
x[padLenIndex + 1] = 0 | bitLen / $2_32;
|
|
134
|
+
|
|
135
|
+
for (; i < x[$length]; d = safeAdd(d, oldd)) {
|
|
136
|
+
let [
|
|
137
|
+
x0, x1, x2, x3, x4, x5, x6, x7,
|
|
138
|
+
x8, x9, x10, x11, x12, x13, x14, x15
|
|
139
|
+
] = x.slice(i, i += $16)
|
|
124
140
|
|
|
125
|
-
for (; i < x[$length]; i += 16) {
|
|
126
141
|
olda = a
|
|
127
142
|
oldb = b
|
|
128
143
|
oldc = c
|
|
129
144
|
oldd = d
|
|
130
145
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
146
|
+
k_i = 0
|
|
147
|
+
|
|
148
|
+
a = md5ff(a, b, c, d, x0, 7, k())
|
|
149
|
+
d = md5ff(d, a, b, c, x1, 12, k())
|
|
150
|
+
c = md5ff(c, d, a, b, x2, 17, k())
|
|
151
|
+
b = md5ff(b, c, d, a, x3, 22, k())
|
|
152
|
+
a = md5ff(a, b, c, d, x4, 7, k())
|
|
153
|
+
d = md5ff(d, a, b, c, x5, 12, k())
|
|
154
|
+
c = md5ff(c, d, a, b, x6, 17, k())
|
|
155
|
+
b = md5ff(b, c, d, a, x7, 22, k())
|
|
156
|
+
a = md5ff(a, b, c, d, x8, 7, k())
|
|
157
|
+
d = md5ff(d, a, b, c, x9, 12, k())
|
|
158
|
+
c = md5ff(c, d, a, b, x10, 17, k())
|
|
159
|
+
b = md5ff(b, c, d, a, x11, 22, k())
|
|
160
|
+
a = md5ff(a, b, c, d, x12, 7, k())
|
|
161
|
+
d = md5ff(d, a, b, c, x13, 12, k())
|
|
162
|
+
c = md5ff(c, d, a, b, x14, 17, k())
|
|
163
|
+
b = md5ff(b, c, d, a, x15, 22, k())
|
|
164
|
+
|
|
165
|
+
a = md5gg(a, b, c, d, x1, 5, k())
|
|
166
|
+
d = md5gg(d, a, b, c, x6, 9, k())
|
|
167
|
+
c = md5gg(c, d, a, b, x11, 14, k())
|
|
168
|
+
b = md5gg(b, c, d, a, x0, 20, k())
|
|
169
|
+
a = md5gg(a, b, c, d, x5, 5, k())
|
|
170
|
+
d = md5gg(d, a, b, c, x10, 9, k())
|
|
171
|
+
c = md5gg(c, d, a, b, x15, 14, k())
|
|
172
|
+
b = md5gg(b, c, d, a, x4, 20, k())
|
|
173
|
+
a = md5gg(a, b, c, d, x9, 5, k())
|
|
174
|
+
d = md5gg(d, a, b, c, x14, 9, k())
|
|
175
|
+
c = md5gg(c, d, a, b, x3, 14, k())
|
|
176
|
+
b = md5gg(b, c, d, a, x8, 20, k())
|
|
177
|
+
a = md5gg(a, b, c, d, x13, 5, k())
|
|
178
|
+
d = md5gg(d, a, b, c, x2, 9, k())
|
|
179
|
+
c = md5gg(c, d, a, b, x7, 14, k())
|
|
180
|
+
b = md5gg(b, c, d, a, x12, 20, k())
|
|
181
|
+
|
|
182
|
+
a = md5hh(a, b, c, d, x5, 4, k())
|
|
183
|
+
d = md5hh(d, a, b, c, x8, 11, k())
|
|
184
|
+
c = md5hh(c, d, a, b, x11, $16, k())
|
|
185
|
+
b = md5hh(b, c, d, a, x14, 23, k())
|
|
186
|
+
a = md5hh(a, b, c, d, x1, 4, k())
|
|
187
|
+
d = md5hh(d, a, b, c, x4, 11, k())
|
|
188
|
+
c = md5hh(c, d, a, b, x7, $16, k())
|
|
189
|
+
b = md5hh(b, c, d, a, x10, 23, k())
|
|
190
|
+
a = md5hh(a, b, c, d, x13, 4, k())
|
|
191
|
+
d = md5hh(d, a, b, c, x0, 11, k())
|
|
192
|
+
c = md5hh(c, d, a, b, x3, $16, k())
|
|
193
|
+
b = md5hh(b, c, d, a, x6, 23, k())
|
|
194
|
+
a = md5hh(a, b, c, d, x9, 4, k())
|
|
195
|
+
d = md5hh(d, a, b, c, x12, 11, k())
|
|
196
|
+
c = md5hh(c, d, a, b, x15, $16, k())
|
|
197
|
+
b = md5hh(b, c, d, a, x2, 23, k())
|
|
198
|
+
|
|
199
|
+
a = md5ii(a, b, c, d, x0, 6, k())
|
|
200
|
+
d = md5ii(d, a, b, c, x7, 10, k())
|
|
201
|
+
c = md5ii(c, d, a, b, x14, 15, k())
|
|
202
|
+
b = md5ii(b, c, d, a, x5, 21, k())
|
|
203
|
+
a = md5ii(a, b, c, d, x12, 6, k())
|
|
204
|
+
d = md5ii(d, a, b, c, x3, 10, k())
|
|
205
|
+
c = md5ii(c, d, a, b, x10, 15, k())
|
|
206
|
+
b = md5ii(b, c, d, a, x1, 21, k())
|
|
207
|
+
a = md5ii(a, b, c, d, x8, 6, k())
|
|
208
|
+
d = md5ii(d, a, b, c, x15, 10, k())
|
|
209
|
+
c = md5ii(c, d, a, b, x6, 15, k())
|
|
210
|
+
b = md5ii(b, c, d, a, x13, 21, k())
|
|
211
|
+
a = md5ii(a, b, c, d, x4, 6, k())
|
|
212
|
+
d = md5ii(d, a, b, c, x11, 10, k())
|
|
213
|
+
c = md5ii(c, d, a, b, x2, 15, k())
|
|
214
|
+
b = md5ii(b, c, d, a, x9, 21, k())
|
|
198
215
|
|
|
199
216
|
a = safeAdd(a, olda)
|
|
200
217
|
b = safeAdd(b, oldb)
|
|
201
218
|
c = safeAdd(c, oldc)
|
|
202
|
-
d = safeAdd(d, oldd)
|
|
203
219
|
}
|
|
204
220
|
return [a, b, c, d]
|
|
205
221
|
}
|
|
@@ -212,13 +228,24 @@ let binlMD5 = (x, bitLen) => {
|
|
|
212
228
|
*/
|
|
213
229
|
let bytesToBinl = (input) => {
|
|
214
230
|
var i = input[$length]
|
|
215
|
-
|
|
231
|
+
/** @type {number[]} */
|
|
232
|
+
var output = []
|
|
216
233
|
for (; i;) {
|
|
217
|
-
output[floor(--i / 4)] |= input[i] <<
|
|
234
|
+
output[floor(--i / 4)] |= input[i] << i % 4 * 8
|
|
218
235
|
}
|
|
219
236
|
return output
|
|
220
237
|
}
|
|
221
238
|
|
|
239
|
+
/**
|
|
240
|
+
* @param {string | Uint8Array} input
|
|
241
|
+
* @returns {Uint8Array}
|
|
242
|
+
*/
|
|
243
|
+
let inputToBytes = (input) => (
|
|
244
|
+
typeof input == 'string'
|
|
245
|
+
? new TextEncoder().encode(input)
|
|
246
|
+
: input
|
|
247
|
+
)
|
|
248
|
+
|
|
222
249
|
/**
|
|
223
250
|
* @overload
|
|
224
251
|
* @param {string | Uint8Array} data
|
|
@@ -245,29 +272,28 @@ let bytesToBinl = (input) => {
|
|
|
245
272
|
* @returns {string | Uint8Array<ArrayBuffer>} The MD5 (or HMAC‑MD5) digest, either as a hex string or a Uint8Array.
|
|
246
273
|
*/
|
|
247
274
|
var md5 = (data, key, raw) => {
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
,
|
|
252
|
-
|
|
253
|
-
|
|
275
|
+
var bdata = bytesToBinl(data = inputToBytes(data))
|
|
276
|
+
, bitLen = data[$length] * 8
|
|
277
|
+
, i = $16
|
|
278
|
+
, out = new Uint8Array($16)
|
|
279
|
+
/** @type {*} */
|
|
280
|
+
var bkey
|
|
281
|
+
, pad = (/**@type {number}*/ x) => {
|
|
282
|
+
for (; i;) {
|
|
283
|
+
bdata.unshift(x ^ bkey[--i])
|
|
284
|
+
}
|
|
285
|
+
i = $16
|
|
286
|
+
}
|
|
254
287
|
|
|
255
288
|
if (key != null) {
|
|
256
289
|
// HMAC
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
, bkey = bytesToBinl(key)
|
|
260
|
-
, ipad = _Array(16)
|
|
261
|
-
, opad = _Array(16)
|
|
262
|
-
if (bkey[$length] > 16) {
|
|
290
|
+
bkey = bytesToBinl(key = inputToBytes(key))
|
|
291
|
+
if (bkey[$length] > $16) {
|
|
263
292
|
bkey = binlMD5(bkey, key[$length] * 8)
|
|
264
293
|
}
|
|
265
|
-
|
|
266
|
-
ipad[--i] = bkey[i] ^ 0x36363636
|
|
267
|
-
}
|
|
268
|
-
bdata.unshift(...ipad)
|
|
294
|
+
pad(0x36363636)
|
|
269
295
|
bdata = binlMD5(bdata, 512 + bitLen)
|
|
270
|
-
|
|
296
|
+
pad(0x5c5c5c5c)
|
|
271
297
|
bitLen = 512 + 128
|
|
272
298
|
}
|
|
273
299
|
|
|
@@ -275,14 +301,13 @@ var md5 = (data, key, raw) => {
|
|
|
275
301
|
|
|
276
302
|
// binl to bytes
|
|
277
303
|
for (; i;) {
|
|
278
|
-
out[--i] = bdata[
|
|
304
|
+
out[--i] = bdata[i >> 2] >>> i % 4 * 8
|
|
279
305
|
}
|
|
280
306
|
|
|
281
307
|
return raw
|
|
282
308
|
? out
|
|
283
|
-
: out.
|
|
284
|
-
|
|
285
|
-
: _Array.from(out, byte => (0 + byte.toString(16)).slice(-2)).join('')
|
|
309
|
+
: out.reduce((p, v) => p + (v >> 4 && '') + v.toString($16), '')
|
|
310
|
+
// : out.toHex()
|
|
286
311
|
}
|
|
287
312
|
|
|
288
313
|
export default md5
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tinyhmacmd5",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "A tiny JavaScript HMAC-MD5 implementation. The minified browser bundle is only
|
|
3
|
+
"version": "0.0.3",
|
|
4
|
+
"description": "A tiny JavaScript HMAC-MD5 implementation. The minified browser bundle is only 2471 bytes.",
|
|
5
5
|
"author": "bddjr",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"type": "module",
|