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 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 1160 bytes.
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.com/bddjr/tinyhmacmd5/blob/HEAD/LICENSE */
2
- {let r="length",e=16,n=2**32,t=Array,o=Math,a=o.floor,f=[(r,e,n)=>r&e|~r&n,(r,e,n)=>r&n|e&~n,(r,e,n)=>r^e^n,(r,e,n)=>e^(r|~n)],u=t(64),i=(i,l)=>{var d,s,v,c,g,h,y,w,A=0,b=1732584193,m=271733878,p=~b,x=~m,E=a((l+64)/512)*e+14,M=t(e),S=(r,e,t,a)=>0|((y=e+r+(y=E++*(7&3817>>3*h)+(7&328>>3*h)&15,h?M[y]:M[y]=0|i[A++])+(u[g++]??=0|n*o.abs(o.sin(g))))<<a|y>>>32-a)+t,T=(r,n,t,o)=>{for(w=f[h],E=0;E<e;)b=S(w(x,p,m),b,x,r),m=S(w(b,x,p),m,b,n),p=S(w(m,b,x),p,m,t),x=S(w(p,m,b),x,p,o);h++};for(i[a(l/32)]|=128<<l%32,i[E]=0|l,i[E+1]=0|l/n;A<i[r];m=0|m+c)d=b,s=x,v=p,c=m,g=h=0,T(7,12,17,22),T(5,9,14,20),T(4,11,e,23),T(6,10,15,21),b=0|b+d,x=0|x+s,p=0|p+v;return[b,x,p,m]},l=e=>{for(var n=e[r],t=[];n;)t[a(--n/4)]|=e[n]<<n%4*8;return t},d=r=>"string"==typeof r?(new TextEncoder).encode(r):r;var md5=(n,o,a)=>{var f,u=l(n=d(n)),s=8*n[r],v=e,c=new Uint8Array(e),g=r=>{for(u.unshift(...t(e));v;)u[--v]=r^f[v];v=e};for(null!=o&&((f=l(o=d(o)))[r]>e&&(f=i(f,8*o[r])),g(909522486),u=i(u,512+s),g(1549556828),s=640),u=i(u,s);v;)c[--v]=u[v>>2]>>>v%4*8;return a?c:c.reduce((r,n)=>r+(n>>4&&"")+n.toString(e),"")}}
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.com/bddjr/tinyhmacmd5/blob/HEAD/LICENSE */
1
+ /** @license https://bddjr.github.io/tinyhmacmd5/lic */
2
2
 
3
3
  // Adapted from https://github.com/blueimp/JavaScript-MD5
4
4
 
5
- /** @type {"length"} */
6
- let $length = "length"
7
-
8
- /** @type {16} */
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 = $Array(64)
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} bitLen Bit length
35
- * @returns {[number, number, number, number]} MD5 Array
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 = (x, bitLen) => {
38
- var i = 0
39
- , olda
40
- , oldb
41
- , oldc
42
- , oldd
43
- , a = 1732584193
44
- , d = 271733878
45
- , c = ~a
46
- , b = ~d
47
- , j = floor((bitLen + 64) / 512) * $16 + 14
48
-
49
- /** @type {number} */
50
- var k_i
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[floor(bitLen / 32)] |= 0x80 << bitLen % 32;
101
- x[j] = 0 | bitLen;
102
- x[j + 1] = 0 | bitLen / $2_32;
103
-
104
- for (; i < x[$length]; d = 0 | d + oldd) {
105
- olda = a
106
- oldb = b
107
- oldc = c
108
- oldd = d
109
-
110
- k_i = ff_i = 0
111
-
112
- F(7, 12, 17, 22)
113
- F(5, 9, 14, 20)
114
- F(4, 11, $16, 23)
115
- F(6, 10, 15, 21)
116
-
117
- a = 0 | a + olda
118
- b = 0 | b + oldb
119
- c = 0 | c + oldc
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 [a, b, c, d]
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 Raw bytes
128
- * @returns {number[]} Array of little-endian words
84
+ * @param {string | Uint8Array} input
85
+ * @param {number} padLen
86
+ *
87
+ * @param {number[]} [output]
88
+ *
89
+ * @returns {[number[], number]}
129
90
  */
130
- let bytesToBinl = (input) => {
131
- var i = input[$length]
132
- /** @type {number[]} */
133
- var output = []
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[floor(--i / 4)] |= input[i] << i % 4 * 8
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 bdata = bytesToBinl(data = inputToBytes(data))
177
- , bitLen = data[$length] * 8
178
- , i = $16
179
- , out = new Uint8Array($16)
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 (key != null) {
140
+ if (hasKey) {
191
141
  // HMAC
192
- bkey = bytesToBinl(key = inputToBytes(key))
193
- if (bkey[$length] > $16) {
194
- bkey = binlMD5(bkey, key[$length] * 8)
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(0x36363636)
152
+ pad(0x36)
197
153
  bdata = binlMD5(bdata, 512 + bitLen)
198
- pad(0x5c5c5c5c)
199
- bitLen = 512 + 128
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($16), '')
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",
4
- "description": "A tiny JavaScript HMAC-MD5 implementation. The minified browser bundle is only 1160 bytes.",
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",