@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.
- package/README.md +40 -42
- package/dist/cjs/ID-card/index.cjs +21 -13
- package/dist/cjs/array/index.cjs +40 -34
- package/dist/cjs/clipboard/index.cjs +14 -10
- package/dist/cjs/color/index.cjs +73 -59
- package/dist/cjs/cookie/index.cjs +16 -13
- package/dist/cjs/crypto/base64/base64.cjs +398 -206
- package/dist/cjs/crypto/base64/index.cjs +58 -35
- package/dist/cjs/crypto/md5/index.cjs +33 -8
- package/dist/cjs/crypto/md5/md5.cjs +298 -844
- package/dist/cjs/crypto/sha256/index.cjs +95 -0
- package/dist/cjs/crypto/sha256/sha256.cjs +557 -0
- package/dist/cjs/crypto/sm3/index.cjs +27 -0
- package/dist/cjs/crypto/sm3/sm3.cjs +200 -0
- package/dist/cjs/crypto/sm4/index.cjs +101 -0
- package/dist/cjs/crypto/sm4/sm4.cjs +498 -0
- package/dist/cjs/date/index.cjs +379 -335
- package/dist/cjs/desensitized/index.cjs +21 -18
- package/dist/cjs/device/index.cjs +33 -30
- package/dist/cjs/dom/index.cjs +26 -23
- package/dist/cjs/file/index.cjs +51 -41
- package/dist/cjs/function/index.cjs +22 -19
- package/dist/cjs/id/index.cjs +6 -2
- package/dist/cjs/index.cjs +108 -127
- package/dist/cjs/keycode/index.cjs +9 -12
- package/dist/cjs/math/index.cjs +113 -81
- package/dist/cjs/number/index.cjs +10 -7
- package/dist/cjs/object/index.cjs +77 -30
- package/dist/cjs/pagination/index.cjs +25 -10
- package/dist/cjs/random/index.cjs +8 -5
- package/dist/cjs/regexp/index.cjs +23 -20
- package/dist/cjs/storage/index.cjs +4 -1
- package/dist/cjs/storage/localStorage.cjs +5 -5
- package/dist/cjs/storage/sessionStorage.cjs +6 -6
- package/dist/cjs/string/index.cjs +66 -63
- package/dist/cjs/url/index.cjs +83 -80
- package/dist/cjs/validate/index.cjs +122 -106
- package/dist/es/ID-card/index.d.ts +19 -14
- package/dist/es/ID-card/index.mjs +22 -14
- package/dist/es/array/index.d.ts +56 -50
- package/dist/es/array/index.mjs +40 -34
- package/dist/es/clipboard/index.d.ts +10 -7
- package/dist/es/clipboard/index.mjs +14 -10
- package/dist/es/color/index.d.ts +28 -25
- package/dist/es/color/index.mjs +73 -59
- package/dist/es/constants/date.d.ts +4 -174
- package/dist/es/constants/id-card.d.ts +4 -43
- package/dist/es/constants/index.d.ts +11 -7
- package/dist/es/constants/keycode.d.ts +1 -103
- package/dist/es/constants/lang.d.ts +4 -4
- package/dist/es/constants/math.d.ts +4 -4
- package/dist/es/constants/regexp.d.ts +4 -24
- package/dist/es/constants/sort.d.ts +4 -5
- package/dist/es/cookie/index.d.ts +13 -13
- package/dist/es/cookie/index.mjs +16 -13
- package/dist/es/crypto/base64/base64.d.ts +8 -5
- package/dist/es/crypto/base64/base64.mjs +393 -204
- package/dist/es/crypto/base64/index.d.ts +41 -24
- package/dist/es/crypto/base64/index.mjs +53 -32
- package/dist/es/crypto/index.d.ts +8 -8
- package/dist/es/crypto/md5/index.d.ts +20 -7
- package/dist/es/crypto/md5/index.mjs +32 -9
- package/dist/es/crypto/md5/md5.d.ts +9 -142
- package/dist/es/crypto/md5/md5.mjs +299 -844
- package/dist/es/crypto/sha256/index.d.ts +52 -0
- package/dist/es/crypto/sha256/index.mjs +86 -0
- package/dist/es/crypto/sha256/sha256.d.ts +82 -0
- package/dist/es/crypto/sha256/sha256.mjs +548 -0
- package/dist/es/crypto/sm3/index.d.ts +13 -0
- package/dist/es/crypto/sm3/index.mjs +24 -0
- package/dist/es/crypto/sm3/sm3.d.ts +3 -0
- package/dist/es/crypto/sm3/sm3.mjs +197 -0
- package/dist/es/crypto/sm4/index.d.ts +56 -0
- package/dist/es/crypto/sm4/index.mjs +95 -0
- package/dist/es/crypto/sm4/sm4.d.ts +48 -0
- package/dist/es/crypto/sm4/sm4.mjs +490 -0
- package/dist/es/date/index.d.ts +236 -175
- package/dist/es/date/index.mjs +378 -335
- package/dist/es/desensitized/index.d.ts +26 -23
- package/dist/es/desensitized/index.mjs +21 -18
- package/dist/es/device/index.d.ts +31 -25
- package/dist/es/device/index.mjs +33 -30
- package/dist/es/dom/index.d.ts +32 -29
- package/dist/es/dom/index.mjs +26 -23
- package/dist/es/file/index.d.ts +30 -30
- package/dist/es/file/index.mjs +51 -41
- package/dist/es/function/index.d.ts +10 -7
- package/dist/es/function/index.mjs +22 -19
- package/dist/es/id/index.d.ts +3 -0
- package/dist/es/id/index.mjs +6 -2
- package/dist/es/index.d.ts +24 -25
- package/dist/es/index.mjs +6 -23
- package/dist/es/keycode/index.d.ts +6 -6
- package/dist/es/keycode/index.mjs +9 -12
- package/dist/es/math/index.d.ts +37 -37
- package/dist/es/math/index.mjs +113 -81
- package/dist/es/number/index.d.ts +7 -7
- package/dist/es/number/index.mjs +10 -7
- package/dist/es/object/index.d.ts +20 -19
- package/dist/es/object/index.mjs +77 -30
- package/dist/es/pagination/index.d.ts +39 -6
- package/dist/es/pagination/index.mjs +25 -10
- package/dist/es/random/index.d.ts +10 -7
- package/dist/es/random/index.mjs +8 -5
- package/dist/es/regexp/index.d.ts +30 -30
- package/dist/es/regexp/index.mjs +23 -20
- package/dist/es/storage/index.d.ts +10 -4
- package/dist/es/storage/index.mjs +4 -1
- package/dist/es/storage/localStorage.d.ts +9 -9
- package/dist/es/storage/localStorage.mjs +5 -5
- package/dist/es/storage/sessionStorage.d.ts +9 -9
- package/dist/es/storage/sessionStorage.mjs +6 -6
- package/dist/es/string/index.d.ts +62 -59
- package/dist/es/string/index.mjs +66 -63
- package/dist/es/url/index.d.ts +65 -65
- package/dist/es/url/index.mjs +83 -80
- package/dist/es/validate/index.d.ts +83 -80
- package/dist/es/validate/index.mjs +122 -106
- package/dist/index.d.ts +2355 -2803
- package/dist/lib/index.full.umd.js +3297 -9474
- package/dist/lib/index.full.umd.min.js +2 -64
- package/dist/lib/index.full.umd.min.js.map +1 -1
- package/dist/resolver/auto-imports.cjs +38 -31
- package/dist/resolver/auto-imports.mjs +38 -31
- package/dist/resolver/index.cjs +1 -2
- package/dist/resolver/index.d.ts +1 -1
- package/dist/resolver/index.mjs +1 -2
- package/package.json +96 -90
- package/dist/cjs/crypto/aes/aes.cjs +0 -480
- package/dist/cjs/crypto/aes/index.cjs +0 -27
- package/dist/cjs/crypto/base32/base32.cjs +0 -357
- package/dist/cjs/crypto/base32/index.cjs +0 -41
- package/dist/cjs/crypto/des/des.cjs +0 -257
- package/dist/cjs/crypto/des/index.cjs +0 -28
- package/dist/cjs/crypto/sha/sha1/index.cjs +0 -24
- package/dist/cjs/crypto/sha/sha1/sha1.cjs +0 -529
- package/dist/cjs/crypto/sha/sha256/index.cjs +0 -43
- package/dist/cjs/crypto/sha/sha256/sha256.cjs +0 -595
- package/dist/cjs/crypto/sha/sha3/index.cjs +0 -41
- package/dist/cjs/crypto/sha/sha3/sha3.cjs +0 -624
- package/dist/cjs/crypto/sha/sha512/index.cjs +0 -81
- package/dist/cjs/crypto/sha/sha512/sha512.cjs +0 -950
- package/dist/cjs/crypto/sm/lib/asn1.cjs +0 -149
- package/dist/cjs/crypto/sm/lib/ec.cjs +0 -315
- package/dist/cjs/crypto/sm/lib/jsbn.cjs +0 -1608
- package/dist/cjs/crypto/sm/lib/sm3.cjs +0 -158
- package/dist/cjs/crypto/sm/lib/utils.cjs +0 -170
- package/dist/cjs/crypto/sm/sm2/index.cjs +0 -112
- package/dist/cjs/crypto/sm/sm2/sm2.cjs +0 -231
- package/dist/cjs/crypto/sm/sm3/index.cjs +0 -15
- package/dist/cjs/crypto/sm/sm3/sm3.cjs +0 -93
- package/dist/cjs/crypto/sm/sm4/index.cjs +0 -27
- package/dist/cjs/crypto/sm/sm4/sm4.cjs +0 -327
- package/dist/cjs/crypto/tea/index.cjs +0 -25
- package/dist/cjs/crypto/tea/tea.cjs +0 -187
- package/dist/cjs/weapp/index.cjs +0 -142
- package/dist/es/crypto/aes/aes.d.ts +0 -156
- package/dist/es/crypto/aes/aes.mjs +0 -478
- package/dist/es/crypto/aes/index.d.ts +0 -16
- package/dist/es/crypto/aes/index.mjs +0 -24
- package/dist/es/crypto/base32/base32.d.ts +0 -3
- package/dist/es/crypto/base32/base32.mjs +0 -353
- package/dist/es/crypto/base32/index.d.ts +0 -24
- package/dist/es/crypto/base32/index.mjs +0 -36
- package/dist/es/crypto/des/des.d.ts +0 -52
- package/dist/es/crypto/des/des.mjs +0 -255
- package/dist/es/crypto/des/index.d.ts +0 -14
- package/dist/es/crypto/des/index.mjs +0 -25
- package/dist/es/crypto/sha/index.d.ts +0 -4
- package/dist/es/crypto/sha/sha1/index.d.ts +0 -13
- package/dist/es/crypto/sha/sha1/index.mjs +0 -21
- package/dist/es/crypto/sha/sha1/sha1.d.ts +0 -2
- package/dist/es/crypto/sha/sha1/sha1.mjs +0 -526
- package/dist/es/crypto/sha/sha256/index.d.ts +0 -26
- package/dist/es/crypto/sha/sha256/index.mjs +0 -38
- package/dist/es/crypto/sha/sha256/sha256.d.ts +0 -4
- package/dist/es/crypto/sha/sha256/sha256.mjs +0 -590
- package/dist/es/crypto/sha/sha3/index.d.ts +0 -24
- package/dist/es/crypto/sha/sha3/index.mjs +0 -36
- package/dist/es/crypto/sha/sha3/sha3.d.ts +0 -4
- package/dist/es/crypto/sha/sha3/sha3.mjs +0 -619
- package/dist/es/crypto/sha/sha512/index.d.ts +0 -52
- package/dist/es/crypto/sha/sha512/index.mjs +0 -72
- package/dist/es/crypto/sha/sha512/sha512.d.ts +0 -8
- package/dist/es/crypto/sha/sha512/sha512.mjs +0 -941
- package/dist/es/crypto/sm/index.d.ts +0 -3
- package/dist/es/crypto/sm/lib/asn1.d.ts +0 -12
- package/dist/es/crypto/sm/lib/asn1.mjs +0 -146
- package/dist/es/crypto/sm/lib/ec.d.ts +0 -126
- package/dist/es/crypto/sm/lib/ec.mjs +0 -312
- package/dist/es/crypto/sm/lib/jsbn.d.ts +0 -198
- package/dist/es/crypto/sm/lib/jsbn.mjs +0 -1605
- package/dist/es/crypto/sm/lib/sm3.d.ts +0 -5
- package/dist/es/crypto/sm/lib/sm3.mjs +0 -155
- package/dist/es/crypto/sm/lib/utils.d.ts +0 -53
- package/dist/es/crypto/sm/lib/utils.mjs +0 -158
- package/dist/es/crypto/sm/sm2/index.d.ts +0 -71
- package/dist/es/crypto/sm/sm2/index.mjs +0 -101
- package/dist/es/crypto/sm/sm2/sm2.d.ts +0 -34
- package/dist/es/crypto/sm/sm2/sm2.mjs +0 -220
- package/dist/es/crypto/sm/sm3/index.d.ts +0 -7
- package/dist/es/crypto/sm/sm3/index.mjs +0 -13
- package/dist/es/crypto/sm/sm3/sm3.d.ts +0 -1
- package/dist/es/crypto/sm/sm3/sm3.mjs +0 -91
- package/dist/es/crypto/sm/sm4/index.d.ts +0 -16
- package/dist/es/crypto/sm/sm4/index.mjs +0 -24
- package/dist/es/crypto/sm/sm4/sm4.d.ts +0 -2
- package/dist/es/crypto/sm/sm4/sm4.mjs +0 -324
- package/dist/es/crypto/tea/index.d.ts +0 -14
- package/dist/es/crypto/tea/index.mjs +0 -22
- package/dist/es/crypto/tea/tea.d.ts +0 -69
- package/dist/es/crypto/tea/tea.mjs +0 -185
- package/dist/es/weapp/index.d.ts +0 -57
- 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;
|