tinyhmacmd5 0.2.1 → 0.2.3-es2026

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,7 @@ English | [中文](README-zh.md)
2
2
 
3
3
  # Tiny HMAC MD5
4
4
 
5
- A tiny and reliable HMAC-MD5 implementation for JavaScript: [`browser.min.js`](browser.min.js) is only **983 bytes**.
5
+ A tiny and reliable HMAC-MD5 implementation for JavaScript: [`browser.min.js`](browser.min.js) is only **950 bytes**.
6
6
 
7
7
  - **Input type**: `string` (UTF‑8), `Uint8Array` or `Uint8ClampedArray`
8
8
  - **Output type**: hex `string` or bytes `Uint8Array`
@@ -26,7 +26,7 @@ As a result, the final size is not the smallest theoretically achievable.
26
26
 
27
27
 
28
28
  ```
29
- npm i tinyhmacmd5
29
+ npm i tinyhmacmd5@es2026
30
30
  ```
31
31
 
32
32
  ```js
@@ -42,7 +42,7 @@ You can also use other package managers (e.g. `pnpm` or `yarn`) in place of `npm
42
42
  See https://www.jsdelivr.com/package/npm/tinyhmacmd5
43
43
 
44
44
  ```html
45
- <script src="https://cdn.jsdelivr.net/npm/tinyhmacmd5"></script>
45
+ <script src="https://cdn.jsdelivr.net/npm/tinyhmacmd5@es2026"></script>
46
46
  ```
47
47
 
48
48
  It will define the `md5` function using `var`.
@@ -50,7 +50,7 @@ It will define the `md5` function using `var`.
50
50
  ### UNPKG
51
51
 
52
52
  ```html
53
- <script src="https://unpkg.com/tinyhmacmd5"></script>
53
+ <script src="https://unpkg.com/tinyhmacmd5@es2026"></script>
54
54
  ```
55
55
 
56
56
  It will define the `md5` function using `var`.
@@ -141,22 +141,22 @@ md5(data)
141
141
 
142
142
  ## Runtime Environment
143
143
 
144
- Environments that support [Exponentiation (`**`)](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/Exponentiation) and [`TextEncoder`](https://developer.mozilla.org/docs/Web/API/TextEncoder) :
144
+ Environments that support [`Uint8Array.prototype.toHex()`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array/toHex) :
145
145
 
146
146
  - Desktop
147
- - Chrome ≥ 52 (2016-07-20)
148
- - Edge ≥ 79 (2020-01-15)
149
- - Firefox ≥ 52 (2017-03-07)
150
- - Opera ≥ 39 (2016-08-02)
151
- - Safari ≥ 10.1 (2017-03-27)
147
+ - Chrome ≥ 140 (2025-09-02)
148
+ - Edge ≥ 140 (2025-09-05)
149
+ - Firefox ≥ 133 (2024-11-26)
150
+ - Opera ≥ 124 (2025-11-13)
151
+ - Safari ≥ 18.2 (2024-12-11)
152
152
  - Mobile
153
- - Chrome Android ≥ 52 (2016-07-27)
154
- - Firefox for Android ≥ 52 (2017-03-07)
155
- - Opera Android ≥ 41 (2016-10-25)
156
- - Safari on iOS ≥ 10.3 (2017-03-27)
157
- - Samsung Browser ≥ 6 (2017-08-23)
158
- - WebView Android ≥ 51 (2016-06-08)
159
- - WebView on iOS ≥ 10.3 (2017-03-27)
153
+ - Chrome Android ≥ 140 (2025-09-02)
154
+ - Firefox for Android ≥ 133 (2024-11-26)
155
+ - Opera Android ≥ 92 (2025-10-08)
156
+ - Safari on iOS ≥ 18.2 (2024-12-11)
157
+ - Samsung Browser ×
158
+ - WebView Android ≥ 140 (2025-09-02)
159
+ - WebView on iOS ≥ 18.2 (2024-12-11)
160
160
 
161
161
  Not recommended for use in environments that support `node:crypto`, as `node:crypto` already provides HMAC-MD5.
162
162
 
@@ -178,7 +178,7 @@ During the adaptation, I discovered that `blueimp-md5` did not correctly handle
178
178
 
179
179
  I also found that using `Array` to process inputs over 512 MiB could throw a `RangeError`, so I replaced it with `Int32Array`.
180
180
 
181
- I demonstrated in practice that HMAC-MD5 can be implemented in an extremely small footprint (983 bytes) while also improving reliability.
181
+ I demonstrated in practice that HMAC-MD5 can be implemented in an extremely small footprint (950 bytes) while also improving reliability.
182
182
 
183
183
  Maybe not many people care about saving just a few KB, but `tinyhmacmd5` exists precisely to "explore the unknown".
184
184
 
package/browser.min.js CHANGED
@@ -1 +1 @@
1
- /*! npmjs.com/tinyhmacmd5 */{let r=[],n=0,t=Math,e=t.floor,o=r=>16*e((r+72)/64),f=(n,t,f=0,a=o(t),l=1732584193,c=271733878,i,d,g=[l,~c,~l,c],h=[...g])=>{for(n[a-1]=0|t/2**29,n[e(t/4)]|=128<<(n[a-2]=t<<3);f<n.length;){for(a=0;a<64;)g[d&=3]=0|((c=0|g[d]+r[a]+(l=g[3&++d],c=g[3&++d],i=g[3&++d],(t=a>>4<<2)?t>4?t>8?c^(l|~i):l^c^i:l&i|c&~i:l&c|~l&i)+(0|n[f+(a*(29521>>t)+(1296>>t)&15)]))<<(i="',16%).4$+07&*/5".charCodeAt(3&a++|t))|c>>>64-i)+l;for(;d;f+=4)h[--d]=g[d]=0|h[d]+g[d]}return g},a=(r,n,t=("string"==typeof r?r=(new TextEncoder).encode(r):r).length,e=new Int32Array(o(4*n+t)),f=0)=>{for(;f<t;)e[n++]=r[f++]|r[f++]<<8|r[f++]<<16|r[f++]<<24;return[e,t]};for(var md5=(r,n,t)=>{var e=16,o=null!=n,[l,c]=a(r,o*e),i=[],d=t?new Uint8Array(e):"";if(o){let[r,t]=a(n,0);for(t>64&&(r=f(r,t));e;)i[--e]=1785358954^(l[e]=909522486^r[e]);e=16,l=i.concat(f(l,64+c)),c=80}for(l=f(l,c);e;t?d[e]=i:d=(i>>4&&"")+i.toString(16)+d)i=l[--e>>2]>>8*e&255;return d};n<64;)r[n]=0|2**32*t.abs(t.sin(++n))}
1
+ /*! npmjs.com/tinyhmacmd5 */{let r=[],e=0,n=Math,t=n.floor,o=r=>16*t((r+72)/64),f=(e,n,f=0,a=o(n),l=1732584193,c=271733878,d,h,i=[l,~c,~l,c],u=[...i])=>{for(e[a-1]=0|n/2**29,e[t(n/4)]|=128<<(e[a-2]=n<<3);f<e.length;f+=16){for(a=0;a<64;i[h&=3]=0|((c=0|i[h]+r[a]+(l=i[3&++h],c=i[3&++h],d=i[3&++h],n?n>4?n>8?c^(l|~d):l^c^d:l&d|c&~d:l&c|~l&d)+(0|e[f+(a*(29521>>n)+(1296>>n)&15)]))<<(d="',16%).4$+07&*/5".charCodeAt(3&a++|n))|c>>>64-d)+l)n=a>>4<<2;for(;h;)u[--h]=i[h]=0|u[h]+i[h]}return i},a=(r,e,n=("string"==typeof r?r=(new TextEncoder).encode(r):r).length,t=new Int32Array(o(4*e+n)),f=0)=>{for(;f<n;)t[e++]=r[f++]|r[f++]<<8|r[f++]<<16|r[f++]<<24;return[t,n]};for(var md5=(r,e,n)=>{var t=16,o=null!=e,[l,c]=a(r,o*t),d=new Uint8Array(t);if(o){let[r,n]=a(e,0),o=[];for(n>64&&(r=f(r,n)),n=t;n;)o[--n]=1785358954^(l[n]=909522486^r[n]);l=o.concat(f(l,64+c)),c=80}for(l=f(l,c);t;)d[--t]=l[t>>2]>>8*t;return n?d:d.toHex()};e<64;)r[e]=0|2**32*n.abs(n.sin(++e))}
package/main.js CHANGED
@@ -44,8 +44,8 @@ let wordsMD5 = (
44
44
  x[j - 1] = 0 | l / 2 ** 29;
45
45
  x[floor(l / 4)] |= 0x80 << (x[j - 2] = l << 3);
46
46
 
47
- for (; i < x.length;) {
48
- for (j = 0; j < 64;) {
47
+ for (; i < x.length; i += 16) {
48
+ for (j = 0; j < 64;
49
49
  output[oi &= 3] = 0 | (
50
50
  (
51
51
  t1 = 0 | (
@@ -55,7 +55,7 @@ let wordsMD5 = (
55
55
  t0 = output[++oi & 3],
56
56
  t1 = output[++oi & 3],
57
57
  t2 = output[++oi & 3],
58
- (l = j >> 4 << 2)
58
+ l
59
59
  ? l > 4
60
60
  ? l > 8
61
61
  ? t1 ^ (t0 | ~t2) // Round 4: I
@@ -71,8 +71,10 @@ let wordsMD5 = (
71
71
  t2 = "',16%).4$+07&*/5".charCodeAt(j++ & 3 | l)
72
72
  ) | t1 >>> 64 - t2
73
73
  ) + t0
74
+ ) {
75
+ l = j >> 4 << 2
74
76
  }
75
- for (; oi; i += 4) {
77
+ for (; oi;) {
76
78
  oldOutput[--oi] = output[oi] = 0 | oldOutput[oi] + output[oi]
77
79
  }
78
80
  }
@@ -126,41 +128,32 @@ let inputToWords = (
126
128
  var md5 = (data, key, raw) => {
127
129
  var i = 16
128
130
  , hasKey = key != null
129
- , [bdata, dataByteLen] = inputToWords(data, /**@type {*}*/(hasKey) * i)
130
-
131
- /** @type {*} */
132
- var temp = []
133
-
134
- /** @type {*} */
135
- var out = raw ? new Uint8Array(i) : ''
131
+ , [bdata, temp] = inputToWords(data, /**@type {*}*/(hasKey) * i)
132
+ , out = new Uint8Array(i)
136
133
 
137
134
  if (hasKey) {
138
135
  // HMAC
139
- let [bkey, keyByteLen] = inputToWords(key, 0)
140
- if (keyByteLen > 64) {
141
- bkey = wordsMD5(bkey, keyByteLen)
136
+ let [bkey, j] = inputToWords(key, 0)
137
+ , opad = []
138
+ if (j > 64) {
139
+ bkey = wordsMD5(bkey, j)
142
140
  }
143
- for (; i;) {
141
+ for (j = i; j;) {
144
142
  // (0x36363636 ^ 0x5c5c5c5c) == 0x6a6a6a6a
145
- temp[--i] = 0x6a6a6a6a ^ (bdata[i] = 0x36363636 ^ bkey[i])
143
+ opad[--j] = 0x6a6a6a6a ^ (bdata[j] = 0x36363636 ^ bkey[j])
146
144
  }
147
- i = 16
148
- bdata = temp.concat(wordsMD5(bdata, 64 + dataByteLen))
149
- dataByteLen = 80
145
+ bdata = opad.concat(wordsMD5(bdata, 64 + temp))
146
+ temp = 80
150
147
  }
151
148
 
152
- bdata = wordsMD5(bdata, dataByteLen)
149
+ bdata = wordsMD5(bdata, temp)
153
150
 
154
151
  // words to bytes or hex
155
- for (; i;
156
- raw
157
- ? out[i] = temp
158
- : out = (temp >> 4 && '') + temp.toString(16) + out
159
- ) {
160
- temp = bdata[--i >> 2] >> i * 8 & 0xff
152
+ for (; i;) {
153
+ out[--i] = bdata[i >> 2] >> i * 8
161
154
  }
162
155
 
163
- return out
156
+ return raw ? out : out.toHex()
164
157
  }
165
158
 
166
159
  for (; i < 64;) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "tinyhmacmd5",
3
- "version": "0.2.1",
4
- "description": "A tiny and reliable HMAC-MD5 implementation for JavaScript: browser.min.js is only 983 bytes.",
3
+ "version": "0.2.3-es2026",
4
+ "description": "A tiny and reliable HMAC-MD5 implementation for JavaScript: browser.min.js is only 950 bytes.",
5
5
  "author": "bddjr",
6
6
  "license": "MIT",
7
7
  "type": "module",
@@ -60,7 +60,7 @@
60
60
  "typescript": "^7.0.2"
61
61
  },
62
62
  "scripts": {
63
- "build": "tsc && node scripts/build.mjs && es-check es2016 --module --checkFeatures main.js browser.min.js",
63
+ "build": "tsc && node scripts/build.mjs && es-check es2026 --module --checkFeatures main.js browser.min.js",
64
64
  "build:unchanged": "node scripts/build-unchanged.mjs",
65
65
  "test": "pnpm build && pnpm test:only",
66
66
  "test:only": "node scripts/test.mjs",