@ivujs/i-utils 2.0.0 → 2.1.0

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.
Files changed (214) hide show
  1. package/README.md +40 -42
  2. package/dist/cjs/ID-card/index.cjs +21 -13
  3. package/dist/cjs/array/index.cjs +40 -34
  4. package/dist/cjs/clipboard/index.cjs +14 -10
  5. package/dist/cjs/color/index.cjs +73 -59
  6. package/dist/cjs/cookie/index.cjs +16 -13
  7. package/dist/cjs/crypto/base64/base64.cjs +398 -206
  8. package/dist/cjs/crypto/base64/index.cjs +58 -35
  9. package/dist/cjs/crypto/md5/index.cjs +33 -8
  10. package/dist/cjs/crypto/md5/md5.cjs +298 -844
  11. package/dist/cjs/crypto/sha256/index.cjs +95 -0
  12. package/dist/cjs/crypto/sha256/sha256.cjs +557 -0
  13. package/dist/cjs/crypto/sm3/index.cjs +27 -0
  14. package/dist/cjs/crypto/sm3/sm3.cjs +200 -0
  15. package/dist/cjs/crypto/sm4/index.cjs +101 -0
  16. package/dist/cjs/crypto/sm4/sm4.cjs +498 -0
  17. package/dist/cjs/date/index.cjs +379 -335
  18. package/dist/cjs/desensitized/index.cjs +21 -18
  19. package/dist/cjs/device/index.cjs +33 -30
  20. package/dist/cjs/dom/index.cjs +26 -23
  21. package/dist/cjs/file/index.cjs +51 -41
  22. package/dist/cjs/function/index.cjs +22 -19
  23. package/dist/cjs/id/index.cjs +6 -2
  24. package/dist/cjs/index.cjs +108 -127
  25. package/dist/cjs/keycode/index.cjs +9 -12
  26. package/dist/cjs/math/index.cjs +113 -81
  27. package/dist/cjs/number/index.cjs +10 -7
  28. package/dist/cjs/object/index.cjs +77 -30
  29. package/dist/cjs/pagination/index.cjs +25 -10
  30. package/dist/cjs/random/index.cjs +8 -5
  31. package/dist/cjs/regexp/index.cjs +23 -20
  32. package/dist/cjs/storage/index.cjs +4 -1
  33. package/dist/cjs/storage/localStorage.cjs +5 -5
  34. package/dist/cjs/storage/sessionStorage.cjs +6 -6
  35. package/dist/cjs/string/index.cjs +66 -63
  36. package/dist/cjs/url/index.cjs +83 -80
  37. package/dist/cjs/validate/index.cjs +122 -106
  38. package/dist/es/ID-card/index.d.ts +19 -14
  39. package/dist/es/ID-card/index.mjs +22 -14
  40. package/dist/es/array/index.d.ts +56 -50
  41. package/dist/es/array/index.mjs +40 -34
  42. package/dist/es/clipboard/index.d.ts +10 -7
  43. package/dist/es/clipboard/index.mjs +14 -10
  44. package/dist/es/color/index.d.ts +28 -25
  45. package/dist/es/color/index.mjs +73 -59
  46. package/dist/es/constants/date.d.ts +4 -174
  47. package/dist/es/constants/id-card.d.ts +4 -43
  48. package/dist/es/constants/index.d.ts +11 -7
  49. package/dist/es/constants/keycode.d.ts +1 -103
  50. package/dist/es/constants/lang.d.ts +4 -4
  51. package/dist/es/constants/math.d.ts +4 -4
  52. package/dist/es/constants/regexp.d.ts +4 -24
  53. package/dist/es/constants/sort.d.ts +4 -5
  54. package/dist/es/cookie/index.d.ts +13 -13
  55. package/dist/es/cookie/index.mjs +16 -13
  56. package/dist/es/crypto/base64/base64.d.ts +8 -5
  57. package/dist/es/crypto/base64/base64.mjs +393 -204
  58. package/dist/es/crypto/base64/index.d.ts +41 -24
  59. package/dist/es/crypto/base64/index.mjs +53 -32
  60. package/dist/es/crypto/index.d.ts +8 -8
  61. package/dist/es/crypto/md5/index.d.ts +20 -7
  62. package/dist/es/crypto/md5/index.mjs +32 -9
  63. package/dist/es/crypto/md5/md5.d.ts +9 -142
  64. package/dist/es/crypto/md5/md5.mjs +299 -844
  65. package/dist/es/crypto/sha256/index.d.ts +52 -0
  66. package/dist/es/crypto/sha256/index.mjs +86 -0
  67. package/dist/es/crypto/sha256/sha256.d.ts +82 -0
  68. package/dist/es/crypto/sha256/sha256.mjs +548 -0
  69. package/dist/es/crypto/sm3/index.d.ts +13 -0
  70. package/dist/es/crypto/sm3/index.mjs +24 -0
  71. package/dist/es/crypto/sm3/sm3.d.ts +3 -0
  72. package/dist/es/crypto/sm3/sm3.mjs +197 -0
  73. package/dist/es/crypto/sm4/index.d.ts +56 -0
  74. package/dist/es/crypto/sm4/index.mjs +95 -0
  75. package/dist/es/crypto/sm4/sm4.d.ts +48 -0
  76. package/dist/es/crypto/sm4/sm4.mjs +490 -0
  77. package/dist/es/date/index.d.ts +236 -175
  78. package/dist/es/date/index.mjs +378 -335
  79. package/dist/es/desensitized/index.d.ts +26 -23
  80. package/dist/es/desensitized/index.mjs +21 -18
  81. package/dist/es/device/index.d.ts +31 -25
  82. package/dist/es/device/index.mjs +33 -30
  83. package/dist/es/dom/index.d.ts +32 -29
  84. package/dist/es/dom/index.mjs +26 -23
  85. package/dist/es/file/index.d.ts +30 -30
  86. package/dist/es/file/index.mjs +51 -41
  87. package/dist/es/function/index.d.ts +10 -7
  88. package/dist/es/function/index.mjs +22 -19
  89. package/dist/es/id/index.d.ts +3 -0
  90. package/dist/es/id/index.mjs +6 -2
  91. package/dist/es/index.d.ts +24 -25
  92. package/dist/es/index.mjs +6 -23
  93. package/dist/es/keycode/index.d.ts +6 -6
  94. package/dist/es/keycode/index.mjs +9 -12
  95. package/dist/es/math/index.d.ts +37 -37
  96. package/dist/es/math/index.mjs +113 -81
  97. package/dist/es/number/index.d.ts +7 -7
  98. package/dist/es/number/index.mjs +10 -7
  99. package/dist/es/object/index.d.ts +20 -19
  100. package/dist/es/object/index.mjs +77 -30
  101. package/dist/es/pagination/index.d.ts +39 -6
  102. package/dist/es/pagination/index.mjs +25 -10
  103. package/dist/es/random/index.d.ts +10 -7
  104. package/dist/es/random/index.mjs +8 -5
  105. package/dist/es/regexp/index.d.ts +30 -30
  106. package/dist/es/regexp/index.mjs +23 -20
  107. package/dist/es/storage/index.d.ts +10 -4
  108. package/dist/es/storage/index.mjs +4 -1
  109. package/dist/es/storage/localStorage.d.ts +9 -9
  110. package/dist/es/storage/localStorage.mjs +5 -5
  111. package/dist/es/storage/sessionStorage.d.ts +9 -9
  112. package/dist/es/storage/sessionStorage.mjs +6 -6
  113. package/dist/es/string/index.d.ts +62 -59
  114. package/dist/es/string/index.mjs +66 -63
  115. package/dist/es/url/index.d.ts +65 -65
  116. package/dist/es/url/index.mjs +83 -80
  117. package/dist/es/validate/index.d.ts +83 -80
  118. package/dist/es/validate/index.mjs +122 -106
  119. package/dist/index.d.ts +2355 -2803
  120. package/dist/lib/index.full.umd.js +3297 -9474
  121. package/dist/lib/index.full.umd.min.js +2 -64
  122. package/dist/lib/index.full.umd.min.js.map +1 -1
  123. package/dist/resolver/auto-imports.cjs +38 -31
  124. package/dist/resolver/auto-imports.mjs +38 -31
  125. package/dist/resolver/index.cjs +1 -2
  126. package/dist/resolver/index.d.ts +1 -1
  127. package/dist/resolver/index.mjs +1 -2
  128. package/package.json +96 -90
  129. package/dist/cjs/crypto/aes/aes.cjs +0 -480
  130. package/dist/cjs/crypto/aes/index.cjs +0 -27
  131. package/dist/cjs/crypto/base32/base32.cjs +0 -357
  132. package/dist/cjs/crypto/base32/index.cjs +0 -41
  133. package/dist/cjs/crypto/des/des.cjs +0 -257
  134. package/dist/cjs/crypto/des/index.cjs +0 -28
  135. package/dist/cjs/crypto/sha/sha1/index.cjs +0 -24
  136. package/dist/cjs/crypto/sha/sha1/sha1.cjs +0 -529
  137. package/dist/cjs/crypto/sha/sha256/index.cjs +0 -43
  138. package/dist/cjs/crypto/sha/sha256/sha256.cjs +0 -595
  139. package/dist/cjs/crypto/sha/sha3/index.cjs +0 -41
  140. package/dist/cjs/crypto/sha/sha3/sha3.cjs +0 -624
  141. package/dist/cjs/crypto/sha/sha512/index.cjs +0 -81
  142. package/dist/cjs/crypto/sha/sha512/sha512.cjs +0 -950
  143. package/dist/cjs/crypto/sm/lib/asn1.cjs +0 -149
  144. package/dist/cjs/crypto/sm/lib/ec.cjs +0 -315
  145. package/dist/cjs/crypto/sm/lib/jsbn.cjs +0 -1608
  146. package/dist/cjs/crypto/sm/lib/sm3.cjs +0 -158
  147. package/dist/cjs/crypto/sm/lib/utils.cjs +0 -170
  148. package/dist/cjs/crypto/sm/sm2/index.cjs +0 -112
  149. package/dist/cjs/crypto/sm/sm2/sm2.cjs +0 -231
  150. package/dist/cjs/crypto/sm/sm3/index.cjs +0 -15
  151. package/dist/cjs/crypto/sm/sm3/sm3.cjs +0 -93
  152. package/dist/cjs/crypto/sm/sm4/index.cjs +0 -27
  153. package/dist/cjs/crypto/sm/sm4/sm4.cjs +0 -327
  154. package/dist/cjs/crypto/tea/index.cjs +0 -25
  155. package/dist/cjs/crypto/tea/tea.cjs +0 -187
  156. package/dist/cjs/weapp/index.cjs +0 -142
  157. package/dist/es/crypto/aes/aes.d.ts +0 -156
  158. package/dist/es/crypto/aes/aes.mjs +0 -478
  159. package/dist/es/crypto/aes/index.d.ts +0 -16
  160. package/dist/es/crypto/aes/index.mjs +0 -24
  161. package/dist/es/crypto/base32/base32.d.ts +0 -3
  162. package/dist/es/crypto/base32/base32.mjs +0 -353
  163. package/dist/es/crypto/base32/index.d.ts +0 -24
  164. package/dist/es/crypto/base32/index.mjs +0 -36
  165. package/dist/es/crypto/des/des.d.ts +0 -52
  166. package/dist/es/crypto/des/des.mjs +0 -255
  167. package/dist/es/crypto/des/index.d.ts +0 -14
  168. package/dist/es/crypto/des/index.mjs +0 -25
  169. package/dist/es/crypto/sha/index.d.ts +0 -4
  170. package/dist/es/crypto/sha/sha1/index.d.ts +0 -13
  171. package/dist/es/crypto/sha/sha1/index.mjs +0 -21
  172. package/dist/es/crypto/sha/sha1/sha1.d.ts +0 -2
  173. package/dist/es/crypto/sha/sha1/sha1.mjs +0 -526
  174. package/dist/es/crypto/sha/sha256/index.d.ts +0 -26
  175. package/dist/es/crypto/sha/sha256/index.mjs +0 -38
  176. package/dist/es/crypto/sha/sha256/sha256.d.ts +0 -4
  177. package/dist/es/crypto/sha/sha256/sha256.mjs +0 -590
  178. package/dist/es/crypto/sha/sha3/index.d.ts +0 -24
  179. package/dist/es/crypto/sha/sha3/index.mjs +0 -36
  180. package/dist/es/crypto/sha/sha3/sha3.d.ts +0 -4
  181. package/dist/es/crypto/sha/sha3/sha3.mjs +0 -619
  182. package/dist/es/crypto/sha/sha512/index.d.ts +0 -52
  183. package/dist/es/crypto/sha/sha512/index.mjs +0 -72
  184. package/dist/es/crypto/sha/sha512/sha512.d.ts +0 -8
  185. package/dist/es/crypto/sha/sha512/sha512.mjs +0 -941
  186. package/dist/es/crypto/sm/index.d.ts +0 -3
  187. package/dist/es/crypto/sm/lib/asn1.d.ts +0 -12
  188. package/dist/es/crypto/sm/lib/asn1.mjs +0 -146
  189. package/dist/es/crypto/sm/lib/ec.d.ts +0 -126
  190. package/dist/es/crypto/sm/lib/ec.mjs +0 -312
  191. package/dist/es/crypto/sm/lib/jsbn.d.ts +0 -198
  192. package/dist/es/crypto/sm/lib/jsbn.mjs +0 -1605
  193. package/dist/es/crypto/sm/lib/sm3.d.ts +0 -5
  194. package/dist/es/crypto/sm/lib/sm3.mjs +0 -155
  195. package/dist/es/crypto/sm/lib/utils.d.ts +0 -53
  196. package/dist/es/crypto/sm/lib/utils.mjs +0 -158
  197. package/dist/es/crypto/sm/sm2/index.d.ts +0 -71
  198. package/dist/es/crypto/sm/sm2/index.mjs +0 -101
  199. package/dist/es/crypto/sm/sm2/sm2.d.ts +0 -34
  200. package/dist/es/crypto/sm/sm2/sm2.mjs +0 -220
  201. package/dist/es/crypto/sm/sm3/index.d.ts +0 -7
  202. package/dist/es/crypto/sm/sm3/index.mjs +0 -13
  203. package/dist/es/crypto/sm/sm3/sm3.d.ts +0 -1
  204. package/dist/es/crypto/sm/sm3/sm3.mjs +0 -91
  205. package/dist/es/crypto/sm/sm4/index.d.ts +0 -16
  206. package/dist/es/crypto/sm/sm4/index.mjs +0 -24
  207. package/dist/es/crypto/sm/sm4/sm4.d.ts +0 -2
  208. package/dist/es/crypto/sm/sm4/sm4.mjs +0 -324
  209. package/dist/es/crypto/tea/index.d.ts +0 -14
  210. package/dist/es/crypto/tea/index.mjs +0 -22
  211. package/dist/es/crypto/tea/tea.d.ts +0 -69
  212. package/dist/es/crypto/tea/tea.mjs +0 -185
  213. package/dist/es/weapp/index.d.ts +0 -57
  214. package/dist/es/weapp/index.mjs +0 -131
@@ -0,0 +1,95 @@
1
+ 'use strict';
2
+
3
+ var sha256$1 = require('./sha256.cjs');
4
+
5
+ // sha256
6
+ /**
7
+ * sha256 加密
8
+ * @param {string} str 字符串
9
+ * @returns {string} 返回加密后的字符串
10
+ */
11
+ function sha256(str) {
12
+ return sha256$1.sha256(str);
13
+ }
14
+ /**
15
+ * sha256_raw 加密
16
+ * @param {string} str 字符串
17
+ * @returns {string} 返回加密后的原始值
18
+ */
19
+ function sha256Raw(str) {
20
+ return sha256$1.sha256_raw(str);
21
+ }
22
+ /**
23
+ * sha256_hmac 加密
24
+ * @param {string} str 字符串
25
+ * @param {string} key 秘钥
26
+ * @returns {string} 返回加密后的字符串
27
+ */
28
+ function sha256Hmac(str, key) {
29
+ if (!str || !key) {
30
+ throw new Error("Missing str or key");
31
+ }
32
+ return sha256$1.sha256_hmac(key, str);
33
+ }
34
+ /**
35
+ * sha256_hmac_raw 加密
36
+ * @param {string} str 字符串
37
+ * @param {string} key 秘钥
38
+ * @returns {string} 返回加密后的原始值
39
+ */
40
+ function sha256HmacRaw(str, key) {
41
+ if (!str || !key) {
42
+ throw new Error("Missing str or key");
43
+ }
44
+ return sha256$1.sha256_hmac_raw(key, str);
45
+ }
46
+ // sha224
47
+ /**
48
+ * sha224 加密
49
+ * @param {string} str 字符串
50
+ * @returns {string} 返回加密后的字符串
51
+ */
52
+ function sha224(str) {
53
+ return sha256$1.sha224(str);
54
+ }
55
+ /**
56
+ * sha224_raw 加密
57
+ * @param {string} str 字符串
58
+ * @returns {string} 返回加密后的原始值
59
+ */
60
+ function sha224Raw(str) {
61
+ return sha256$1.sha224_raw(str);
62
+ }
63
+ /**
64
+ * sha224_hmac 加密
65
+ * @param {string} str 字符串
66
+ * @param {string} key 秘钥
67
+ * @returns {string} 返回加密后的字符串
68
+ */
69
+ function sha224Hmac(str, key) {
70
+ if (!str || !key) {
71
+ throw new Error("Missing str or key");
72
+ }
73
+ return sha256$1.sha224_hmac(key, str);
74
+ }
75
+ /**
76
+ * sha224_hmac_raw 加密
77
+ * @param {string} str 字符串
78
+ * @param {string} key 秘钥
79
+ * @returns {string} 返回加密后的原始值
80
+ */
81
+ function sha224HmacRaw(str, key) {
82
+ if (!str || !key) {
83
+ throw new Error("Missing str or key");
84
+ }
85
+ return sha256$1.sha224_hmac_raw(key, str);
86
+ }
87
+
88
+ exports.sha224 = sha224;
89
+ exports.sha224Hmac = sha224Hmac;
90
+ exports.sha224HmacRaw = sha224HmacRaw;
91
+ exports.sha224Raw = sha224Raw;
92
+ exports.sha256 = sha256;
93
+ exports.sha256Hmac = sha256Hmac;
94
+ exports.sha256HmacRaw = sha256HmacRaw;
95
+ exports.sha256Raw = sha256Raw;
@@ -0,0 +1,557 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * 纯前端 SHA256/SHA224 实现(无 Node.js 依赖,兼容所有浏览器)
5
+ * 核心逻辑借鉴 js-sha256,移除所有服务端相关代码,仅保留浏览器环境实现
6
+ */
7
+ // ========== 核心常量 ==========
8
+ const ERROR = "input is invalid type";
9
+ const HEX_CHARS = "0123456789abcdef".split("");
10
+ const EXTRA = [-2147483648, 8388608, 32768, 128];
11
+ const SHIFT = [24, 16, 8, 0];
12
+ // SHA256 常量 K
13
+ const K = [
14
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98,
15
+ 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,
16
+ 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8,
17
+ 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
18
+ 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819,
19
+ 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,
20
+ 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7,
21
+ 0xc67178f2,
22
+ ];
23
+ // ========== SHA256 核心类 ==========
24
+ class Sha256 {
25
+ constructor(is224 = false) {
26
+ // 初始化区块数组(仅浏览器环境,无需共享内存)
27
+ this.blocks = new Array(17).fill(0);
28
+ // 初始化哈希值(SHA224/SHA256 不同初始值)
29
+ if (is224) {
30
+ this.h0 = 0xc1059ed8;
31
+ this.h1 = 0x367cd507;
32
+ this.h2 = 0x3070dd17;
33
+ this.h3 = 0xf70e5939;
34
+ this.h4 = 0xffc00b31;
35
+ this.h5 = 0x68581511;
36
+ this.h6 = 0x64f98fa7;
37
+ this.h7 = 0xbefa4fa4;
38
+ }
39
+ else {
40
+ this.h0 = 0x6a09e667;
41
+ this.h1 = 0xbb67ae85;
42
+ this.h2 = 0x3c6ef372;
43
+ this.h3 = 0xa54ff53a;
44
+ this.h4 = 0x510e527f;
45
+ this.h5 = 0x9b05688c;
46
+ this.h6 = 0x1f83d9ab;
47
+ this.h7 = 0x5be0cd19;
48
+ }
49
+ // 状态变量初始化
50
+ this.block = this.start = this.bytes = this.hBytes = 0;
51
+ this.finalized = this.hashed = false;
52
+ this.first = true;
53
+ this.is224 = is224;
54
+ }
55
+ // 更新哈希(处理输入数据)
56
+ update(message) {
57
+ if (this.finalized)
58
+ return this;
59
+ // 校验输入类型
60
+ let notString = false;
61
+ const type = typeof message;
62
+ if (type !== "string") {
63
+ if (type === "object") {
64
+ if (message === null)
65
+ throw new Error(ERROR);
66
+ // 支持 ArrayBuffer/Uint8Array
67
+ if (message.constructor === ArrayBuffer) {
68
+ message = new Uint8Array(message);
69
+ }
70
+ else if (!Array.isArray(message) && !ArrayBuffer.isView(message)) {
71
+ throw new Error(ERROR);
72
+ }
73
+ }
74
+ else {
75
+ throw new Error(ERROR);
76
+ }
77
+ notString = true;
78
+ }
79
+ let code, index = 0, i, length = message.length;
80
+ const blocks = this.blocks;
81
+ while (index < length) {
82
+ if (this.hashed) {
83
+ this.hashed = false;
84
+ blocks.fill(0);
85
+ blocks[0] = this.block;
86
+ }
87
+ // 处理字符串/字节数组
88
+ if (notString) {
89
+ for (i = this.start; index < length && i < 64; ++index) {
90
+ blocks[i >>> 2] |= message[index] << SHIFT[i++ & 3];
91
+ }
92
+ }
93
+ else {
94
+ for (i = this.start; index < length && i < 64; ++index) {
95
+ code = message.charCodeAt(index);
96
+ // UTF-8 编码处理
97
+ if (code < 0x80) {
98
+ blocks[i >>> 2] |= code << SHIFT[i++ & 3];
99
+ }
100
+ else if (code < 0x800) {
101
+ blocks[i >>> 2] |= (0xc0 | (code >>> 6)) << SHIFT[i++ & 3];
102
+ blocks[i >>> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
103
+ }
104
+ else if (code < 0xd800 || code >= 0xe000) {
105
+ blocks[i >>> 2] |= (0xe0 | (code >>> 12)) << SHIFT[i++ & 3];
106
+ blocks[i >>> 2] |= (0x80 | ((code >>> 6) & 0x3f)) << SHIFT[i++ & 3];
107
+ blocks[i >>> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
108
+ }
109
+ else {
110
+ // 处理代理对
111
+ code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
112
+ blocks[i >>> 2] |= (0xf0 | (code >>> 18)) << SHIFT[i++ & 3];
113
+ blocks[i >>> 2] |= (0x80 | ((code >>> 12) & 0x3f)) << SHIFT[i++ & 3];
114
+ blocks[i >>> 2] |= (0x80 | ((code >>> 6) & 0x3f)) << SHIFT[i++ & 3];
115
+ blocks[i >>> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
116
+ }
117
+ }
118
+ }
119
+ this.lastByteIndex = i;
120
+ this.bytes += i - this.start;
121
+ // 区块满 64 字节,进行哈希计算
122
+ if (i >= 64) {
123
+ this.block = blocks[16];
124
+ this.start = i - 64;
125
+ this.hash();
126
+ this.hashed = true;
127
+ }
128
+ else {
129
+ this.start = i;
130
+ }
131
+ }
132
+ // 处理字节长度溢出
133
+ if (this.bytes > 4294967295) {
134
+ this.hBytes += (this.bytes / 4294967296) << 0;
135
+ this.bytes = this.bytes % 4294967296;
136
+ }
137
+ return this;
138
+ }
139
+ // 核心哈希计算
140
+ hash() {
141
+ let a = this.h0, b = this.h1, c = this.h2, d = this.h3;
142
+ let e = this.h4, f = this.h5, g = this.h6, h = this.h7;
143
+ const blocks = this.blocks;
144
+ let j, s0, s1, maj, t1, t2, ch, ab, da, cd, bc;
145
+ // 扩展区块
146
+ for (j = 16; j < 64; ++j) {
147
+ t1 = blocks[j - 15];
148
+ s0 = ((t1 >>> 7) | (t1 << 25)) ^ ((t1 >>> 18) | (t1 << 14)) ^ (t1 >>> 3);
149
+ t1 = blocks[j - 2];
150
+ s1 = ((t1 >>> 17) | (t1 << 15)) ^ ((t1 >>> 19) | (t1 << 13)) ^ (t1 >>> 10);
151
+ blocks[j] = (blocks[j - 16] + s0 + blocks[j - 7] + s1) << 0;
152
+ }
153
+ bc = b & c;
154
+ // 64 轮哈希计算
155
+ for (j = 0; j < 64; j += 4) {
156
+ if (this.first) {
157
+ if (this.is224) {
158
+ ab = 300032;
159
+ t1 = blocks[0] - 1413257819;
160
+ h = (t1 - 150054599) << 0;
161
+ d = (t1 + 24177077) << 0;
162
+ }
163
+ else {
164
+ ab = 704751109;
165
+ t1 = blocks[0] - 210244248;
166
+ h = (t1 - 1521486534) << 0;
167
+ d = (t1 + 143694565) << 0;
168
+ }
169
+ this.first = false;
170
+ }
171
+ else {
172
+ s0 = ((a >>> 2) | (a << 30)) ^ ((a >>> 13) | (a << 19)) ^ ((a >>> 22) | (a << 10));
173
+ s1 = ((e >>> 6) | (e << 26)) ^ ((e >>> 11) | (e << 21)) ^ ((e >>> 25) | (e << 7));
174
+ ab = a & b;
175
+ maj = ab ^ (a & c) ^ bc;
176
+ ch = (e & f) ^ (~e & g);
177
+ t1 = h + s1 + ch + K[j] + blocks[j];
178
+ t2 = s0 + maj;
179
+ h = (d + t1) << 0;
180
+ d = (t1 + t2) << 0;
181
+ }
182
+ s0 = ((d >>> 2) | (d << 30)) ^ ((d >>> 13) | (d << 19)) ^ ((d >>> 22) | (d << 10));
183
+ s1 = ((h >>> 6) | (h << 26)) ^ ((h >>> 11) | (h << 21)) ^ ((h >>> 25) | (h << 7));
184
+ da = d & a;
185
+ maj = da ^ (d & b) ^ ab;
186
+ ch = (h & e) ^ (~h & f);
187
+ t1 = g + s1 + ch + K[j + 1] + blocks[j + 1];
188
+ t2 = s0 + maj;
189
+ g = (c + t1) << 0;
190
+ c = (t1 + t2) << 0;
191
+ s0 = ((c >>> 2) | (c << 30)) ^ ((c >>> 13) | (c << 19)) ^ ((c >>> 22) | (c << 10));
192
+ s1 = ((g >>> 6) | (g << 26)) ^ ((g >>> 11) | (g << 21)) ^ ((g >>> 25) | (g << 7));
193
+ cd = c & d;
194
+ maj = cd ^ (c & a) ^ da;
195
+ ch = (g & h) ^ (~g & e);
196
+ t1 = f + s1 + ch + K[j + 2] + blocks[j + 2];
197
+ t2 = s0 + maj;
198
+ f = (b + t1) << 0;
199
+ b = (t1 + t2) << 0;
200
+ s0 = ((b >>> 2) | (b << 30)) ^ ((b >>> 13) | (b << 19)) ^ ((b >>> 22) | (b << 10));
201
+ s1 = ((f >>> 6) | (f << 26)) ^ ((f >>> 11) | (f << 21)) ^ ((f >>> 25) | (f << 7));
202
+ bc = b & c;
203
+ maj = bc ^ (b & d) ^ cd;
204
+ ch = (f & g) ^ (~f & h);
205
+ t1 = e + s1 + ch + K[j + 3] + blocks[j + 3];
206
+ t2 = s0 + maj;
207
+ e = (a + t1) << 0;
208
+ a = (t1 + t2) << 0;
209
+ }
210
+ // 更新哈希值
211
+ this.h0 = (this.h0 + a) << 0;
212
+ this.h1 = (this.h1 + b) << 0;
213
+ this.h2 = (this.h2 + c) << 0;
214
+ this.h3 = (this.h3 + d) << 0;
215
+ this.h4 = (this.h4 + e) << 0;
216
+ this.h5 = (this.h5 + f) << 0;
217
+ this.h6 = (this.h6 + g) << 0;
218
+ this.h7 = (this.h7 + h) << 0;
219
+ }
220
+ // 完成哈希计算(补位)
221
+ finalize() {
222
+ if (this.finalized)
223
+ return this;
224
+ this.finalized = true;
225
+ const blocks = this.blocks;
226
+ let i = this.lastByteIndex;
227
+ blocks[16] = this.block;
228
+ blocks[i >>> 2] |= EXTRA[i & 3];
229
+ this.block = blocks[16];
230
+ // 补位处理
231
+ if (i >= 56) {
232
+ if (!this.hashed)
233
+ this.hash();
234
+ blocks.fill(0);
235
+ blocks[0] = this.block;
236
+ }
237
+ // 写入长度信息
238
+ blocks[14] = (this.hBytes << 3) | (this.bytes >>> 29);
239
+ blocks[15] = this.bytes << 3;
240
+ this.hash();
241
+ return this;
242
+ }
243
+ // 输出十六进制字符串
244
+ hex() {
245
+ this.finalize();
246
+ const h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
247
+ const h4 = this.h4, h5 = this.h5, h6 = this.h6, h7 = this.h7;
248
+ let hex = "";
249
+ // 拼接哈希值为十六进制
250
+ hex +=
251
+ HEX_CHARS[(h0 >>> 28) & 0x0f] +
252
+ HEX_CHARS[(h0 >>> 24) & 0x0f] +
253
+ HEX_CHARS[(h0 >>> 20) & 0x0f] +
254
+ HEX_CHARS[(h0 >>> 16) & 0x0f] +
255
+ HEX_CHARS[(h0 >>> 12) & 0x0f] +
256
+ HEX_CHARS[(h0 >>> 8) & 0x0f] +
257
+ HEX_CHARS[(h0 >>> 4) & 0x0f] +
258
+ HEX_CHARS[h0 & 0x0f];
259
+ hex +=
260
+ HEX_CHARS[(h1 >>> 28) & 0x0f] +
261
+ HEX_CHARS[(h1 >>> 24) & 0x0f] +
262
+ HEX_CHARS[(h1 >>> 20) & 0x0f] +
263
+ HEX_CHARS[(h1 >>> 16) & 0x0f] +
264
+ HEX_CHARS[(h1 >>> 12) & 0x0f] +
265
+ HEX_CHARS[(h1 >>> 8) & 0x0f] +
266
+ HEX_CHARS[(h1 >>> 4) & 0x0f] +
267
+ HEX_CHARS[h1 & 0x0f];
268
+ hex +=
269
+ HEX_CHARS[(h2 >>> 28) & 0x0f] +
270
+ HEX_CHARS[(h2 >>> 24) & 0x0f] +
271
+ HEX_CHARS[(h2 >>> 20) & 0x0f] +
272
+ HEX_CHARS[(h2 >>> 16) & 0x0f] +
273
+ HEX_CHARS[(h2 >>> 12) & 0x0f] +
274
+ HEX_CHARS[(h2 >>> 8) & 0x0f] +
275
+ HEX_CHARS[(h2 >>> 4) & 0x0f] +
276
+ HEX_CHARS[h2 & 0x0f];
277
+ hex +=
278
+ HEX_CHARS[(h3 >>> 28) & 0x0f] +
279
+ HEX_CHARS[(h3 >>> 24) & 0x0f] +
280
+ HEX_CHARS[(h3 >>> 20) & 0x0f] +
281
+ HEX_CHARS[(h3 >>> 16) & 0x0f] +
282
+ HEX_CHARS[(h3 >>> 12) & 0x0f] +
283
+ HEX_CHARS[(h3 >>> 8) & 0x0f] +
284
+ HEX_CHARS[(h3 >>> 4) & 0x0f] +
285
+ HEX_CHARS[h3 & 0x0f];
286
+ hex +=
287
+ HEX_CHARS[(h4 >>> 28) & 0x0f] +
288
+ HEX_CHARS[(h4 >>> 24) & 0x0f] +
289
+ HEX_CHARS[(h4 >>> 20) & 0x0f] +
290
+ HEX_CHARS[(h4 >>> 16) & 0x0f] +
291
+ HEX_CHARS[(h4 >>> 12) & 0x0f] +
292
+ HEX_CHARS[(h4 >>> 8) & 0x0f] +
293
+ HEX_CHARS[(h4 >>> 4) & 0x0f] +
294
+ HEX_CHARS[h4 & 0x0f];
295
+ hex +=
296
+ HEX_CHARS[(h5 >>> 28) & 0x0f] +
297
+ HEX_CHARS[(h5 >>> 24) & 0x0f] +
298
+ HEX_CHARS[(h5 >>> 20) & 0x0f] +
299
+ HEX_CHARS[(h5 >>> 16) & 0x0f] +
300
+ HEX_CHARS[(h5 >>> 12) & 0x0f] +
301
+ HEX_CHARS[(h5 >>> 8) & 0x0f] +
302
+ HEX_CHARS[(h5 >>> 4) & 0x0f] +
303
+ HEX_CHARS[h5 & 0x0f];
304
+ hex +=
305
+ HEX_CHARS[(h6 >>> 28) & 0x0f] +
306
+ HEX_CHARS[(h6 >>> 24) & 0x0f] +
307
+ HEX_CHARS[(h6 >>> 20) & 0x0f] +
308
+ HEX_CHARS[(h6 >>> 16) & 0x0f] +
309
+ HEX_CHARS[(h6 >>> 12) & 0x0f] +
310
+ HEX_CHARS[(h6 >>> 8) & 0x0f] +
311
+ HEX_CHARS[(h6 >>> 4) & 0x0f] +
312
+ HEX_CHARS[h6 & 0x0f];
313
+ // SHA224 不需要 h7
314
+ if (!this.is224) {
315
+ hex +=
316
+ HEX_CHARS[(h7 >>> 28) & 0x0f] +
317
+ HEX_CHARS[(h7 >>> 24) & 0x0f] +
318
+ HEX_CHARS[(h7 >>> 20) & 0x0f] +
319
+ HEX_CHARS[(h7 >>> 16) & 0x0f] +
320
+ HEX_CHARS[(h7 >>> 12) & 0x0f] +
321
+ HEX_CHARS[(h7 >>> 8) & 0x0f] +
322
+ HEX_CHARS[(h7 >>> 4) & 0x0f] +
323
+ HEX_CHARS[h7 & 0x0f];
324
+ }
325
+ return hex;
326
+ }
327
+ // 输出字节数组
328
+ digest() {
329
+ this.finalize();
330
+ const h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
331
+ const h4 = this.h4, h5 = this.h5, h6 = this.h6, h7 = this.h7;
332
+ const arr = [
333
+ (h0 >>> 24) & 0xff,
334
+ (h0 >>> 16) & 0xff,
335
+ (h0 >>> 8) & 0xff,
336
+ h0 & 0xff,
337
+ (h1 >>> 24) & 0xff,
338
+ (h1 >>> 16) & 0xff,
339
+ (h1 >>> 8) & 0xff,
340
+ h1 & 0xff,
341
+ (h2 >>> 24) & 0xff,
342
+ (h2 >>> 16) & 0xff,
343
+ (h2 >>> 8) & 0xff,
344
+ h2 & 0xff,
345
+ (h3 >>> 24) & 0xff,
346
+ (h3 >>> 16) & 0xff,
347
+ (h3 >>> 8) & 0xff,
348
+ h3 & 0xff,
349
+ (h4 >>> 24) & 0xff,
350
+ (h4 >>> 16) & 0xff,
351
+ (h4 >>> 8) & 0xff,
352
+ h4 & 0xff,
353
+ (h5 >>> 24) & 0xff,
354
+ (h5 >>> 16) & 0xff,
355
+ (h5 >>> 8) & 0xff,
356
+ h5 & 0xff,
357
+ (h6 >>> 24) & 0xff,
358
+ (h6 >>> 16) & 0xff,
359
+ (h6 >>> 8) & 0xff,
360
+ h6 & 0xff,
361
+ ];
362
+ if (!this.is224) {
363
+ arr.push((h7 >>> 24) & 0xff, (h7 >>> 16) & 0xff, (h7 >>> 8) & 0xff, h7 & 0xff);
364
+ }
365
+ return arr;
366
+ }
367
+ // 输出二进制原始字符串(raw)
368
+ raw() {
369
+ this.finalize();
370
+ const bytes = this.digest();
371
+ let rawStr = "";
372
+ for (let i = 0; i < bytes.length; i++) {
373
+ rawStr += String.fromCharCode(bytes[i]);
374
+ }
375
+ return rawStr;
376
+ }
377
+ // 输出 ArrayBuffer
378
+ arrayBuffer() {
379
+ this.finalize();
380
+ const buffer = new ArrayBuffer(this.is224 ? 28 : 32);
381
+ const dataView = new DataView(buffer);
382
+ dataView.setUint32(0, this.h0);
383
+ dataView.setUint32(4, this.h1);
384
+ dataView.setUint32(8, this.h2);
385
+ dataView.setUint32(12, this.h3);
386
+ dataView.setUint32(16, this.h4);
387
+ dataView.setUint32(20, this.h5);
388
+ dataView.setUint32(24, this.h6);
389
+ if (!this.is224) {
390
+ dataView.setUint32(28, this.h7);
391
+ }
392
+ return buffer;
393
+ }
394
+ }
395
+ // ========== HMAC-SHA256 实现 ==========
396
+ class HmacSha256 {
397
+ constructor(key, is224 = false) {
398
+ // 处理密钥
399
+ let keyBytes = [];
400
+ const type = typeof key;
401
+ if (type === "string") {
402
+ // 字符串密钥转字节数组
403
+ let code, index = 0, length = key.length;
404
+ for (let i = 0; i < length; ++i) {
405
+ code = key.charCodeAt(i);
406
+ if (code < 0x80) {
407
+ keyBytes[index++] = code;
408
+ }
409
+ else if (code < 0x800) {
410
+ keyBytes[index++] = 0xc0 | (code >>> 6);
411
+ keyBytes[index++] = 0x80 | (code & 0x3f);
412
+ }
413
+ else if (code < 0xd800 || code >= 0xe000) {
414
+ keyBytes[index++] = 0xe0 | (code >>> 12);
415
+ keyBytes[index++] = 0x80 | ((code >>> 6) & 0x3f);
416
+ keyBytes[index++] = 0x80 | (code & 0x3f);
417
+ }
418
+ else {
419
+ code = 0x10000 + (((code & 0x3ff) << 10) | (key.charCodeAt(++i) & 0x3ff));
420
+ keyBytes[index++] = 0xf0 | (code >>> 18);
421
+ keyBytes[index++] = 0x80 | ((code >>> 12) & 0x3f);
422
+ keyBytes[index++] = 0x80 | ((code >>> 6) & 0x3f);
423
+ keyBytes[index++] = 0x80 | (code & 0x3f);
424
+ }
425
+ }
426
+ }
427
+ else if (type === "object") {
428
+ if (key === null)
429
+ throw new Error(ERROR);
430
+ if (key.constructor === ArrayBuffer) {
431
+ keyBytes = Array.from(new Uint8Array(key));
432
+ }
433
+ else if (Array.isArray(key) || ArrayBuffer.isView(key)) {
434
+ keyBytes = Array.from(key);
435
+ }
436
+ else {
437
+ throw new Error(ERROR);
438
+ }
439
+ }
440
+ else {
441
+ throw new Error(ERROR);
442
+ }
443
+ // 密钥长度超过 64 字节,先哈希
444
+ if (keyBytes.length > 64) {
445
+ keyBytes = new Sha256(is224).update(keyBytes).digest();
446
+ }
447
+ // 生成内外填充
448
+ const oKeyPad = [];
449
+ const iKeyPad = [];
450
+ for (let i = 0; i < 64; ++i) {
451
+ const b = keyBytes[i] || 0;
452
+ oKeyPad[i] = 0x5c ^ b;
453
+ iKeyPad[i] = 0x36 ^ b;
454
+ }
455
+ // 初始化 SHA256
456
+ this.sha256 = new Sha256(is224);
457
+ this.sha256.update(iKeyPad);
458
+ this.oKeyPad = oKeyPad;
459
+ this.is224 = is224;
460
+ this.inner = true;
461
+ }
462
+ update(message) {
463
+ this.sha256.update(message);
464
+ return this;
465
+ }
466
+ finalize() {
467
+ if (this.inner) {
468
+ // 计算内部哈希
469
+ const innerHash = this.sha256.digest();
470
+ // 初始化外部哈希
471
+ this.sha256 = new Sha256(this.is224);
472
+ this.sha256.update(this.oKeyPad).update(innerHash);
473
+ this.inner = false;
474
+ }
475
+ this.sha256.finalize();
476
+ return this;
477
+ }
478
+ hex() {
479
+ this.finalize();
480
+ return this.sha256.hex();
481
+ }
482
+ digest() {
483
+ this.finalize();
484
+ return this.sha256.digest();
485
+ }
486
+ raw() {
487
+ this.finalize();
488
+ return this.sha256.raw();
489
+ }
490
+ arrayBuffer() {
491
+ this.finalize();
492
+ return this.sha256.arrayBuffer();
493
+ }
494
+ }
495
+ // ========== 便捷方法封装 ==========
496
+ const createMethod = (is224 = false) => {
497
+ const method = (message) => new Sha256(is224).update(message).hex();
498
+ method.raw = (message) => new Sha256(is224).update(message).raw();
499
+ method.digest = (message) => new Sha256(is224).update(message).digest();
500
+ method.arrayBuffer = (message) => new Sha256(is224).update(message).arrayBuffer();
501
+ method.create = () => new Sha256(is224);
502
+ method.update = (message) => method.create().update(message);
503
+ return method;
504
+ };
505
+ const createRawMethod = (is224 = false) => {
506
+ const method = (message) => new Sha256(is224).update(message).raw();
507
+ method.hex = (message) => new Sha256(is224).update(message).hex();
508
+ method.digest = (message) => new Sha256(is224).update(message).digest();
509
+ method.arrayBuffer = (message) => new Sha256(is224).update(message).arrayBuffer();
510
+ method.create = () => new Sha256(is224);
511
+ method.update = (message) => method.create().update(message);
512
+ return method;
513
+ };
514
+ const createHmacMethod = (is224 = false) => {
515
+ const method = (key, message) => new HmacSha256(key, is224).update(message).hex();
516
+ method.raw = (key, message) => new HmacSha256(key, is224).update(message).raw();
517
+ method.digest = (key, message) => new HmacSha256(key, is224).update(message).digest();
518
+ method.arrayBuffer = (key, message) => new HmacSha256(key, is224).update(message).arrayBuffer();
519
+ method.create = (key) => new HmacSha256(key, is224);
520
+ method.update = (key, message) => method.create(key).update(message);
521
+ return method;
522
+ };
523
+ const createHmacRawMethod = (is224 = false) => {
524
+ const method = (key, message) => new HmacSha256(key, is224).update(message).raw();
525
+ method.hex = (key, message) => new HmacSha256(key, is224).update(message).hex();
526
+ method.digest = (key, message) => new HmacSha256(key, is224).update(message).digest();
527
+ method.arrayBuffer = (key, message) => new HmacSha256(key, is224).update(message).arrayBuffer();
528
+ method.create = (key) => new HmacSha256(key, is224);
529
+ method.update = (key, message) => method.create(key).update(message);
530
+ return method;
531
+ };
532
+ /* 以下是内部实现需要的es模块化导出方法 */
533
+ // SHA256 基础方法
534
+ const sha256 = createMethod();
535
+ // SHA256 基础方法原始值
536
+ const sha256_raw = createRawMethod();
537
+ // HMAC-SHA256
538
+ const sha256_hmac = createHmacMethod();
539
+ // HMAC-SHA256原始值
540
+ const sha256_hmac_raw = createHmacRawMethod();
541
+ // SHA224 基础方法
542
+ const sha224 = createMethod(true);
543
+ // SHA224 基础方法原始值
544
+ const sha224_raw = createRawMethod(true);
545
+ // HMAC-SHA224
546
+ const sha224_hmac = createHmacMethod(true);
547
+ // HMAC-SHA224原始值
548
+ const sha224_hmac_raw = createHmacRawMethod(true);
549
+
550
+ exports.sha224 = sha224;
551
+ exports.sha224_hmac = sha224_hmac;
552
+ exports.sha224_hmac_raw = sha224_hmac_raw;
553
+ exports.sha224_raw = sha224_raw;
554
+ exports.sha256 = sha256;
555
+ exports.sha256_hmac = sha256_hmac;
556
+ exports.sha256_hmac_raw = sha256_hmac_raw;
557
+ exports.sha256_raw = sha256_raw;
@@ -0,0 +1,27 @@
1
+ 'use strict';
2
+
3
+ var sm3 = require('./sm3.cjs');
4
+
5
+ /**
6
+ * sm3 加密
7
+ * @param {string} str 字符串
8
+ * @returns {string} 返回加密后的字符串
9
+ */
10
+ function sm3Encrypt(str) {
11
+ return sm3.encrypt(str);
12
+ }
13
+ /**
14
+ * sm3_hmac 加密
15
+ * @param {string} str 字符串
16
+ * @param {string} key 配置
17
+ * @returns {string} 返回加密后的字符串
18
+ */
19
+ function sm3EncryptHmac(str, key) {
20
+ if (!str || !key) {
21
+ throw new Error("Missing str or key");
22
+ }
23
+ return sm3.encrypt(str, key);
24
+ }
25
+
26
+ exports.sm3Encrypt = sm3Encrypt;
27
+ exports.sm3EncryptHmac = sm3EncryptHmac;