@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,200 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * SM3 纯函数式实现(无类、无实例,闭包隔离状态)
5
+ */
6
+ // 全局常量(只读,无状态)
7
+ const BLOCK_LENGTH = 64;
8
+ const IPAD = new Uint8Array(BLOCK_LENGTH).fill(0x36);
9
+ const OPAD = new Uint8Array(BLOCK_LENGTH).fill(0x5c);
10
+ const IV = new Uint32Array([
11
+ 0x7380166f, 0x4914b2b9, 0x172442d7, 0xda8a0600, 0xa96f30bc, 0x163138aa, 0xe38dee4d, 0xb0fb0e4e,
12
+ ]);
13
+ // 纯函数:循环左移
14
+ function rotl(x, n) {
15
+ const s = n & 31;
16
+ return (x << s) | (x >>> (32 - s));
17
+ }
18
+ // 纯函数:字节数组异或
19
+ function xor(x, y) {
20
+ const result = [];
21
+ for (let i = x.length - 1; i >= 0; i--) {
22
+ result[i] = (x[i] ^ y[i]) & 0xff;
23
+ }
24
+ return result;
25
+ }
26
+ // 纯函数:置换函数 P0
27
+ function P0(X) {
28
+ return X ^ rotl(X, 9) ^ rotl(X, 17);
29
+ }
30
+ // 纯函数:置换函数 P1
31
+ function P1(X) {
32
+ return X ^ rotl(X, 15) ^ rotl(X, 23);
33
+ }
34
+ // 纯函数:补全16进制字符串
35
+ function leftPad(input, num) {
36
+ if (input.length >= num)
37
+ return input;
38
+ return new Array(num - input.length + 1).join("0") + input;
39
+ }
40
+ // 纯函数:字节数组转16进制
41
+ function arrayToHex(arr) {
42
+ return arr
43
+ .map((item) => {
44
+ item = item.toString(16);
45
+ return item.length === 1 ? "0" + item : item;
46
+ })
47
+ .join("");
48
+ }
49
+ // 纯函数:16进制转字节数组
50
+ function hexToArray(hexStr) {
51
+ const words = [];
52
+ let hexStrLength = hexStr.length;
53
+ if (hexStrLength % 2 !== 0) {
54
+ hexStr = leftPad(hexStr, hexStrLength + 1);
55
+ }
56
+ hexStrLength = hexStr.length;
57
+ for (let i = 0; i < hexStrLength; i += 2) {
58
+ words.push(parseInt(hexStr.substr(i, 2), 16));
59
+ }
60
+ return words;
61
+ }
62
+ // 纯函数:UTF8转字节数组
63
+ function utf8ToArray(str) {
64
+ const arr = [];
65
+ for (let i = 0, len = str.length; i < len; i++) {
66
+ const point = str.codePointAt(i);
67
+ if (point <= 0x007f) {
68
+ arr.push(point);
69
+ }
70
+ else if (point <= 0x07ff) {
71
+ arr.push(0xc0 | (point >>> 6));
72
+ arr.push(0x80 | (point & 0x3f));
73
+ }
74
+ else if (point <= 0xd7ff || (point >= 0xe000 && point <= 0xffff)) {
75
+ arr.push(0xe0 | (point >>> 12));
76
+ arr.push(0x80 | ((point >>> 6) & 0x3f));
77
+ arr.push(0x80 | (point & 0x3f));
78
+ }
79
+ else if (point >= 0x010000 && point <= 0x10ffff) {
80
+ i++;
81
+ arr.push(0xf0 | ((point >>> 18) & 0x1c));
82
+ arr.push(0x80 | ((point >>> 12) & 0x3f));
83
+ arr.push(0x80 | ((point >>> 6) & 0x3f));
84
+ arr.push(0x80 | (point & 0x3f));
85
+ }
86
+ else {
87
+ arr.push(point);
88
+ throw new Error("input is not supported");
89
+ }
90
+ }
91
+ return arr;
92
+ }
93
+ // 核心纯函数:SM3哈希计算(闭包隔离状态)
94
+ function sm3Core(array) {
95
+ // 每次调用都创建全新的局部状态(隔离关键)
96
+ let len = array.length * 8;
97
+ let k = len % 512;
98
+ k = k >= 448 ? 512 - (k % 448) - 1 : 448 - k - 1;
99
+ const kArr = new Array((k - 7) / 8).fill(0);
100
+ const lenArr = new Array(8).fill(0);
101
+ let lenBin = len.toString(2);
102
+ for (let i = 7; i >= 0; i--) {
103
+ if (lenBin.length > 8) {
104
+ const start = lenBin.length - 8;
105
+ lenArr[i] = parseInt(lenBin.substr(start), 2);
106
+ lenBin = lenBin.substr(0, start);
107
+ }
108
+ else if (lenBin.length > 0) {
109
+ lenArr[i] = parseInt(lenBin, 2);
110
+ lenBin = "";
111
+ }
112
+ }
113
+ const m = new Uint8Array([...array, 0x80, ...kArr, ...lenArr]);
114
+ const dataView = new DataView(m.buffer, 0);
115
+ const n = m.length / 64;
116
+ const V = new Uint32Array(IV); // 全新初始向量(每次调用重新创建)
117
+ const W = new Uint32Array(68); // 全新消息扩展数组
118
+ const M = new Uint32Array(64); // 全新W'数组
119
+ // 以下计算逻辑和原代码一致,仅操作局部变量
120
+ for (let i = 0; i < n; i++) {
121
+ W.fill(0);
122
+ M.fill(0);
123
+ const start = 16 * i;
124
+ for (let j = 0; j < 16; j++) {
125
+ W[j] = dataView.getUint32((start + j) * 4, false);
126
+ }
127
+ for (let j = 16; j < 68; j++) {
128
+ W[j] = P1(W[j - 16] ^ W[j - 9] ^ rotl(W[j - 3], 15)) ^ rotl(W[j - 13], 7) ^ W[j - 6];
129
+ }
130
+ for (let j = 0; j < 64; j++) {
131
+ M[j] = W[j] ^ W[j + 4];
132
+ }
133
+ const T1 = 0x79cc4519;
134
+ const T2 = 0x7a879d8a;
135
+ let A = V[0], B = V[1], C = V[2], D = V[3];
136
+ let E = V[4], F = V[5], G = V[6], H = V[7];
137
+ let SS1, SS2, TT1, TT2, T;
138
+ for (let j = 0; j < 64; j++) {
139
+ T = j <= 15 ? T1 : T2;
140
+ SS1 = rotl((rotl(A, 12) + E + rotl(T, j)) & 0xffffffff, 7);
141
+ SS2 = SS1 ^ rotl(A, 12);
142
+ const FFj = j <= 15 ? A ^ B ^ C : (A & B) | (A & C) | (B & C);
143
+ const GGj = j <= 15 ? E ^ F ^ G : (E & F) | (~E & G);
144
+ TT1 = (FFj + D + SS2 + M[j]) & 0xffffffff;
145
+ TT2 = (GGj + H + SS1 + W[j]) & 0xffffffff;
146
+ D = C;
147
+ C = rotl(B, 9);
148
+ B = A;
149
+ A = TT1;
150
+ H = G;
151
+ G = rotl(F, 19);
152
+ F = E;
153
+ E = P0(TT2);
154
+ }
155
+ V[0] ^= A;
156
+ V[1] ^= B;
157
+ V[2] ^= C;
158
+ V[3] ^= D;
159
+ V[4] ^= E;
160
+ V[5] ^= F;
161
+ V[6] ^= G;
162
+ V[7] ^= H;
163
+ }
164
+ const result = [];
165
+ for (let i = 0; i < V.length; i++) {
166
+ result.push((V[i] & 0xff000000) >>> 24, (V[i] & 0xff0000) >>> 16, (V[i] & 0xff00) >>> 8, V[i] & 0xff);
167
+ }
168
+ return result;
169
+ }
170
+ // 纯函数:HMAC-SM3计算
171
+ function encryptHmac(input, key) {
172
+ let processedKey = key.length > BLOCK_LENGTH ? sm3Core(key) : [...key];
173
+ while (processedKey.length < BLOCK_LENGTH) {
174
+ processedKey.push(0);
175
+ }
176
+ const iPadKey = xor(processedKey, IPAD);
177
+ const oPadKey = xor(processedKey, OPAD);
178
+ const innerHash = sm3Core([...iPadKey, ...input]);
179
+ return sm3Core([...oPadKey, ...innerHash]);
180
+ }
181
+ // 对外暴露的核心函数(兼容原调用方式)
182
+ function encrypt(input, key) {
183
+ const inputArr = typeof input === "string" ? utf8ToArray(input) : Array.prototype.slice.call(input);
184
+ if (!key) {
185
+ const hashArr = sm3Core(inputArr);
186
+ return arrayToHex(hashArr);
187
+ }
188
+ else {
189
+ const keyArr = typeof key === "string"
190
+ ? /^[0-9a-fA-F]+$/.test(key)
191
+ ? hexToArray(key)
192
+ : utf8ToArray(key)
193
+ : Array.prototype.slice.call(key);
194
+ const hmacArr = encryptHmac(inputArr, keyArr);
195
+ return arrayToHex(hmacArr);
196
+ }
197
+ }
198
+
199
+ exports.encrypt = encrypt;
200
+ exports.encrypt_hmac = encryptHmac;
@@ -0,0 +1,101 @@
1
+ 'use strict';
2
+
3
+ var sm4 = require('./sm4.cjs');
4
+
5
+ /**
6
+ * sm4 加密
7
+ * @param {string} str 字符串
8
+ * @param {string} key 秘钥
9
+ * @param {Object} options 配置
10
+ * @returns {string} 加密后的字符串
11
+ */
12
+ function sm4Encrypt(str, key, options) {
13
+ _validateSM4Options(options, "encrypt");
14
+ return sm4.encrypt(str, key, options);
15
+ }
16
+ /**
17
+ * sm4 解密
18
+ * @param {string} str 字符串
19
+ * @param {string} key 秘钥
20
+ * @param {Object} options 配置
21
+ * @returns {string} 解密后的数据
22
+ */
23
+ function sm4Decrypt(str, key, options) {
24
+ _validateSM4Options(options, "decrypt");
25
+ return sm4.decrypt(str, key, options);
26
+ }
27
+ /**
28
+ * 生成sm4的key
29
+ * @param {string} inputFormat 输入类型 可以任意字符串,其中固定的uint8array、array、hex这3个字符串,会对应生成类型数据
30
+ * @returns {SM4DataType} 生成的key
31
+ */
32
+ const generateSM4Key = sm4.generateKey;
33
+ /**
34
+ * 生成sm4的iv
35
+ * @param {string} inputFormat 输入类型 可以任意字符串,其中固定的uint8array、array、hex这3个字符串,会对应生成类型数据
36
+ * @returns {SM4DataType} 生成的iv
37
+ */
38
+ const generateSM4Iv = sm4.generateIv;
39
+ /**
40
+ * 校验SM4配置参数的合法性
41
+ * @param options 配置项
42
+ * @param operation 操作类型(encrypt/decrypt)
43
+ */
44
+ function _validateSM4Options(options = {}, operation) {
45
+ const { mode = sm4.MODE.ECB, iv } = options;
46
+ // 1. 校验模式是否合法
47
+ const validModes = Object.values(sm4.MODE);
48
+ if (!validModes.includes(mode)) {
49
+ throw new Error(`sm4${operation} 方法错误:不支持的加密模式 "${mode}",仅支持 ${validModes.join("/")}`);
50
+ }
51
+ // 2. CBC模式必须传IV
52
+ if (mode === sm4.MODE.CBC && !iv) {
53
+ throw new Error(`sm4${operation} 方法错误:CBC 模式必须传入 IV 初始向量`);
54
+ }
55
+ // 3. ECB模式禁止传IV(避免误用)
56
+ if (mode === sm4.MODE.ECB && iv !== undefined) {
57
+ throw new Error(`sm4${operation} 方法错误:ECB 模式不需要传入 IV,请勿传递iv参数`);
58
+ }
59
+ // 4. 校验IV长度(如果传了IV)
60
+ if (iv) {
61
+ let ivLength;
62
+ if (typeof iv === "string") {
63
+ // hex字符串:16字节对应32位hex
64
+ ivLength = iv.length === 32 ? 16 : iv.length;
65
+ }
66
+ else if (iv instanceof ArrayBuffer) {
67
+ ivLength = iv.byteLength;
68
+ }
69
+ else if (iv instanceof Uint8Array) {
70
+ ivLength = iv.length;
71
+ }
72
+ else if (Array.isArray(iv)) {
73
+ ivLength = iv.length;
74
+ }
75
+ else {
76
+ ivLength = 0;
77
+ }
78
+ if (ivLength !== 16) {
79
+ throw new Error(`SM4${operation}错误:IV 长度必须为 16 字节,当前长度为 ${ivLength}`);
80
+ }
81
+ }
82
+ // 5. 校验填充模式(仅允许pkcs#7)
83
+ if (options.padding && options.padding !== String(sm4.PADDING)) {
84
+ throw new Error(`SM4${operation}错误:仅支持 pkcs#7 填充模式,当前传入 ${String(options.padding)}`);
85
+ }
86
+ }
87
+ // sm4的配置
88
+ const SM4 = {
89
+ // sm4的模式
90
+ MODE: sm4.MODE,
91
+ // sm4的填充
92
+ PADDING: sm4.PADDING,
93
+ // sm4的输出
94
+ OUTPUT: sm4.OUTPUT,
95
+ };
96
+
97
+ exports.SM4 = SM4;
98
+ exports.generateSM4Iv = generateSM4Iv;
99
+ exports.generateSM4Key = generateSM4Key;
100
+ exports.sm4Decrypt = sm4Decrypt;
101
+ exports.sm4Encrypt = sm4Encrypt;