tinyhmacmd5 0.0.4 → 0.0.6
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 +3 -1
- package/browser.min.js +2 -2
- package/main.js +103 -146
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -2,7 +2,9 @@
|
|
|
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 965 bytes.
|
|
6
|
+
|
|
7
|
+
Preview: https://bddjr.github.io/tinyhmacmd5/
|
|
6
8
|
|
|
7
9
|
## Setup
|
|
8
10
|
|
package/browser.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
/** @license https://github.
|
|
2
|
-
{let r=
|
|
1
|
+
/** @license https://bddjr.github.io/tinyhmacmd5/lic */
|
|
2
|
+
{let r=1732584193,e=271733878,t=~r,n=~e,o=[],f=(f,a,h=0,i,l,u,d,c,g=[r,n,t,e],s=[...g],y=r=>g[3&++c])=>{for(f[a+64>>>9<<4|14]=0|a,f[a>>>5]|=128<<a%32;h<f.length;h+=16){for(c=i=0;i<64;c-=6)g[3&c]=0|((l=0|(l=y(),u=y(),d=y(),((a=i>>4<<2)?a>4?a>8?u^(l|~d):l^u^d:l&d|u&~d:l&u|~l&d)+(0|f[h+(i*(29521>>a)+(1296>>a)&15)])+(u="',16%).4$+07&*/5".charCodeAt(a+i%4)-32,o[63-i++]??=0|2**32*Math.abs(Math.sin(i)))+y()))<<u|l>>>32-u)+y();for(c=4;c;)s[--c]=g[c]=0|s[c]+g[c]}return g},a=(r,e,t=("string"==typeof r?r=(new TextEncoder).encode(r):r).length,n=[],o=8*t)=>{for(;t;)n[e+(--t>>>2)]|=r[t]<<t%4*8;return[n,o]};var md5=(r,e,t)=>{var n=16,o=null!=e,[h,i]=a(r,o*n),l=new Uint8Array(n);if(o){let[r,t]=a(e,0),o=e=>{for(;n;)h[--n]=16843009*e^r[n];n=16};t>512&&(r=f(r,t)),o(54),(h=f(h,512+i)).unshift(...Array(16)),o(92),i=640}for(h=f(h,i);n;)l[--n]=h[n>>2]>>>n%4*8;return t?l:l.reduce((r,e)=>r+(e>>4&&"")+e.toString(16),"")}}
|
package/main.js
CHANGED
|
@@ -1,152 +1,111 @@
|
|
|
1
|
-
/** @license https://github.
|
|
1
|
+
/** @license https://bddjr.github.io/tinyhmacmd5/lic */
|
|
2
2
|
|
|
3
3
|
// Adapted from https://github.com/blueimp/JavaScript-MD5
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
let $16 = 16
|
|
10
|
-
|
|
11
|
-
let $2_32 = 2 ** 32
|
|
12
|
-
|
|
13
|
-
let $Array = Array
|
|
14
|
-
|
|
15
|
-
let $Math = Math
|
|
16
|
-
|
|
17
|
-
let floor = $Math.floor
|
|
18
|
-
|
|
19
|
-
/** @type {((b:number, c:number, d:number) => number)[]} */
|
|
20
|
-
let ff = [
|
|
21
|
-
(b, c, d) => b & c | ~b & d,
|
|
22
|
-
(b, c, d) => b & d | c & ~d,
|
|
23
|
-
(b, c, d) => b ^ c ^ d,
|
|
24
|
-
(b, c, d) => c ^ (b | ~d)
|
|
25
|
-
]
|
|
5
|
+
let A = 1732584193
|
|
6
|
+
, D = 271733878
|
|
7
|
+
, C = ~A
|
|
8
|
+
, B = ~D
|
|
26
9
|
|
|
27
10
|
/** @type {number[]} MD5 constants cached in memory */
|
|
28
|
-
let K =
|
|
11
|
+
let K = []
|
|
29
12
|
|
|
30
13
|
/**
|
|
31
14
|
* Calculate the MD5 of an array of little-endian words, and a bit length.
|
|
32
15
|
*
|
|
33
16
|
* @param {number[]} x Array of little-endian words
|
|
34
|
-
* @param {number}
|
|
35
|
-
*
|
|
17
|
+
* @param {number} l Bit length
|
|
18
|
+
*
|
|
19
|
+
* @param {number} [j]
|
|
20
|
+
* @param {number} [t0]
|
|
21
|
+
* @param {number} [t1]
|
|
22
|
+
* @param {number} [t2]
|
|
23
|
+
* @param {number} [oi]
|
|
24
|
+
*
|
|
25
|
+
* @returns {number[]} MD5 Array
|
|
36
26
|
*/
|
|
37
|
-
let binlMD5 = (
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
/** @type {number} */
|
|
53
|
-
var ff_i
|
|
54
|
-
|
|
55
|
-
/** @type {number} */
|
|
56
|
-
var cmn_t
|
|
57
|
-
|
|
58
|
-
/** @type {number[]} */
|
|
59
|
-
var w = $Array($16)
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* @param {number} q
|
|
63
|
-
* @param {number} a
|
|
64
|
-
* @param {number} b
|
|
65
|
-
* @param {number} s
|
|
66
|
-
* @returns {number}
|
|
67
|
-
*/
|
|
68
|
-
var cmn = (q, a, b, s) => (
|
|
69
|
-
cmn_t = (
|
|
70
|
-
a + q +
|
|
71
|
-
(
|
|
72
|
-
cmn_t = j++ * (7 & 0o7351 >> ff_i * 3) + (7 & 0o0510 >> ff_i * 3) & 15,
|
|
73
|
-
ff_i ? w[cmn_t] : w[cmn_t] = 0 | x[i++]
|
|
74
|
-
) +
|
|
75
|
-
(K[k_i++] ??= 0 | $2_32 * $Math.abs($Math.sin(k_i)))
|
|
76
|
-
),
|
|
77
|
-
0 | (cmn_t << s | cmn_t >>> 32 - s) + b
|
|
78
|
-
)
|
|
79
|
-
|
|
80
|
-
/** @type {typeof ff[0]} */
|
|
81
|
-
var F_f
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* @param {number} s0
|
|
85
|
-
* @param {number} s1
|
|
86
|
-
* @param {number} s2
|
|
87
|
-
* @param {number} s3
|
|
88
|
-
*/
|
|
89
|
-
var F = (s0, s1, s2, s3) => {
|
|
90
|
-
for (F_f = ff[ff_i], j = 0; j < $16;) {
|
|
91
|
-
a = cmn(F_f(b, c, d), a, b, s0)
|
|
92
|
-
d = cmn(F_f(a, b, c), d, a, s1)
|
|
93
|
-
c = cmn(F_f(d, a, b), c, d, s2)
|
|
94
|
-
b = cmn(F_f(c, d, a), b, c, s3)
|
|
95
|
-
}
|
|
96
|
-
ff_i++
|
|
97
|
-
}
|
|
27
|
+
let binlMD5 = (
|
|
28
|
+
x,
|
|
29
|
+
l,
|
|
30
|
+
// var:
|
|
31
|
+
i = 0,
|
|
32
|
+
j,
|
|
33
|
+
t0,
|
|
34
|
+
t1,
|
|
35
|
+
t2,
|
|
36
|
+
oi,
|
|
37
|
+
output = [A, B, C, D],
|
|
38
|
+
oldOutput = [...output],
|
|
39
|
+
o = (/**@type {*}*/ _) => output[++oi & 3],
|
|
40
|
+
) => {
|
|
98
41
|
|
|
99
42
|
// append padding
|
|
100
|
-
x[
|
|
101
|
-
x[
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
43
|
+
x[l + 64 >>> 9 << 4 | 14] = 0 | l;
|
|
44
|
+
x[l >>> 5] |= 0x80 << l % 32;
|
|
45
|
+
|
|
46
|
+
for (; i < x.length; i += 16) {
|
|
47
|
+
for (oi = j = 0; j < 64; oi -= 6) {
|
|
48
|
+
output[oi & 3] = (
|
|
49
|
+
t0 = 0 | (
|
|
50
|
+
(
|
|
51
|
+
t0 = o(),
|
|
52
|
+
t1 = o(),
|
|
53
|
+
t2 = o(),
|
|
54
|
+
(l = j >> 4 << 2)
|
|
55
|
+
? l > 4
|
|
56
|
+
? l > 8
|
|
57
|
+
? t1 ^ (t0 | ~t2) // Round 4: II
|
|
58
|
+
: t0 ^ t1 ^ t2 // Round 3: HH
|
|
59
|
+
: t0 & t2 | t1 & ~t2 // Round 2: GG
|
|
60
|
+
: t0 & t1 | ~t0 & t2 // Round 1: FF
|
|
61
|
+
) +
|
|
62
|
+
(
|
|
63
|
+
0 | x[i + (j * (0x7351 >> l) + (0x0510 >> l) & 15)]
|
|
64
|
+
) +
|
|
65
|
+
(
|
|
66
|
+
t1 = "',16%).4$+07&*/5".charCodeAt(l + j % 4) - 32,
|
|
67
|
+
K[63 - j++] ??= 0 | 2 ** 32 * Math.abs(Math.sin(j))
|
|
68
|
+
) +
|
|
69
|
+
o()
|
|
70
|
+
),
|
|
71
|
+
0 | (t0 << t1 | t0 >>> 32 - t1) + o()
|
|
72
|
+
)
|
|
73
|
+
}
|
|
74
|
+
for (oi = 4; oi;) {
|
|
75
|
+
oldOutput[--oi] = output[oi] = 0 | oldOutput[oi] + output[oi]
|
|
76
|
+
}
|
|
120
77
|
}
|
|
121
|
-
return
|
|
78
|
+
return output
|
|
122
79
|
}
|
|
123
80
|
|
|
124
81
|
/**
|
|
125
82
|
* Convert bytes to an array of little-endian words
|
|
126
83
|
*
|
|
127
|
-
* @param {Uint8Array} input
|
|
128
|
-
* @
|
|
84
|
+
* @param {string | Uint8Array} input
|
|
85
|
+
* @param {number} padLen
|
|
86
|
+
*
|
|
87
|
+
* @param {number[]} [output]
|
|
88
|
+
*
|
|
89
|
+
* @returns {[number[], number]}
|
|
129
90
|
*/
|
|
130
|
-
let
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
var
|
|
91
|
+
let inputToBinl = (
|
|
92
|
+
input,
|
|
93
|
+
padLen,
|
|
94
|
+
// var:
|
|
95
|
+
i = (
|
|
96
|
+
typeof input == 'string'
|
|
97
|
+
? input = new TextEncoder().encode(input)
|
|
98
|
+
: input
|
|
99
|
+
).length,
|
|
100
|
+
output = [],
|
|
101
|
+
bitLen = 8 * i,
|
|
102
|
+
) => {
|
|
134
103
|
for (; i;) {
|
|
135
|
-
output[
|
|
104
|
+
output[padLen + (--i >>> 2)] |= /**@type {Uint8Array}*/(input)[i] << i % 4 * 8
|
|
136
105
|
}
|
|
137
|
-
return output
|
|
106
|
+
return [output, bitLen]
|
|
138
107
|
}
|
|
139
108
|
|
|
140
|
-
/**
|
|
141
|
-
* @param {string | Uint8Array} input
|
|
142
|
-
* @returns {Uint8Array}
|
|
143
|
-
*/
|
|
144
|
-
let inputToBytes = (input) => (
|
|
145
|
-
typeof input == 'string'
|
|
146
|
-
? new TextEncoder().encode(input)
|
|
147
|
-
: input
|
|
148
|
-
)
|
|
149
|
-
|
|
150
109
|
/**
|
|
151
110
|
* @overload
|
|
152
111
|
* @param {string | Uint8Array} data
|
|
@@ -173,30 +132,28 @@ let inputToBytes = (input) => (
|
|
|
173
132
|
* @returns {string | Uint8Array<ArrayBuffer>} The MD5 (or HMAC‑MD5) digest, either as a hex string or a Uint8Array.
|
|
174
133
|
*/
|
|
175
134
|
var md5 = (data, key, raw) => {
|
|
176
|
-
var
|
|
177
|
-
,
|
|
178
|
-
,
|
|
179
|
-
, out = new Uint8Array(
|
|
180
|
-
/** @type {*} */
|
|
181
|
-
var bkey
|
|
182
|
-
, pad = (/**@type {number}*/ x) => {
|
|
183
|
-
bdata.unshift(...$Array($16))
|
|
184
|
-
for (; i;) {
|
|
185
|
-
bdata[--i] = x ^ bkey[i]
|
|
186
|
-
}
|
|
187
|
-
i = $16
|
|
188
|
-
}
|
|
135
|
+
var i = 16
|
|
136
|
+
, hasKey = key != null
|
|
137
|
+
, [bdata, bitLen] = inputToBinl(data, /**@type {*}*/(hasKey) * i)
|
|
138
|
+
, out = new Uint8Array(i)
|
|
189
139
|
|
|
190
|
-
if (
|
|
140
|
+
if (hasKey) {
|
|
191
141
|
// HMAC
|
|
192
|
-
bkey =
|
|
193
|
-
|
|
194
|
-
|
|
142
|
+
let [bkey, keyBitlen] = inputToBinl(key, 0)
|
|
143
|
+
, pad = (/**@type {number}*/ x) => {
|
|
144
|
+
for (; i;) {
|
|
145
|
+
bdata[--i] = 0x01010101 * x ^ bkey[i]
|
|
146
|
+
}
|
|
147
|
+
i = 16
|
|
148
|
+
}
|
|
149
|
+
if (keyBitlen > 512) {
|
|
150
|
+
bkey = binlMD5(bkey, keyBitlen)
|
|
195
151
|
}
|
|
196
|
-
pad(
|
|
152
|
+
pad(0x36)
|
|
197
153
|
bdata = binlMD5(bdata, 512 + bitLen)
|
|
198
|
-
|
|
199
|
-
|
|
154
|
+
bdata.unshift(...Array(16))
|
|
155
|
+
pad(0x5c)
|
|
156
|
+
bitLen = 640
|
|
200
157
|
}
|
|
201
158
|
|
|
202
159
|
bdata = binlMD5(bdata, bitLen)
|
|
@@ -208,7 +165,7 @@ var md5 = (data, key, raw) => {
|
|
|
208
165
|
|
|
209
166
|
return raw
|
|
210
167
|
? out
|
|
211
|
-
: out.reduce((p, v) => p + (v >> 4 && '') + v.toString(
|
|
168
|
+
: out.reduce((p, v) => p + (v >> 4 && '') + v.toString(16), '')
|
|
212
169
|
}
|
|
213
170
|
|
|
214
171
|
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.6",
|
|
4
|
+
"description": "A tiny JavaScript HMAC-MD5 implementation. The minified browser bundle is only 965 bytes.",
|
|
5
5
|
"author": "bddjr",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"type": "module",
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
"main.d.ts",
|
|
14
14
|
"browser.min.js"
|
|
15
15
|
],
|
|
16
|
+
"homepage": "https://bddjr.github.io/tinyhmacmd5/",
|
|
16
17
|
"keywords": [
|
|
17
18
|
"md5",
|
|
18
19
|
"hmac",
|