@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
@@ -1,158 +0,0 @@
1
- 'use strict';
2
-
3
- // 消息扩展
4
- const W = new Uint32Array(68);
5
- const M = new Uint32Array(64); // W'
6
- /**
7
- * 循环左移
8
- */
9
- function rotl(x, n) {
10
- const s = n & 31;
11
- return (x << s) | (x >>> (32 - s));
12
- }
13
- /**
14
- * 二进制异或运算
15
- */
16
- function xor(x, y) {
17
- const result = [];
18
- for (let i = x.length - 1; i >= 0; i--)
19
- result[i] = (x[i] ^ y[i]) & 0xff;
20
- return result;
21
- }
22
- /**
23
- * 压缩函数中的置换函数 P0(X) = X xor (X <<< 9) xor (X <<< 17)
24
- */
25
- function P0(X) {
26
- return X ^ rotl(X, 9) ^ rotl(X, 17);
27
- }
28
- /**
29
- * 消息扩展中的置换函数 P1(X) = X xor (X <<< 15) xor (X <<< 23)
30
- */
31
- function P1(X) {
32
- return X ^ rotl(X, 15) ^ rotl(X, 23);
33
- }
34
- /**
35
- * sm3 本体
36
- */
37
- function sm3(array) {
38
- let len = array.length * 8;
39
- // k 是满足 len + 1 + k = 448mod512 的最小的非负整数
40
- let k = len % 512;
41
- // 如果 448 <= (512 % len) < 512,需要多补充 (len % 448) 比特'0'以满足总比特长度为512的倍数
42
- k = k >= 448 ? 512 - (k % 448) - 1 : 448 - k - 1;
43
- // 填充
44
- const kArr = new Array((k - 7) / 8);
45
- const lenArr = new Array(8);
46
- for (let i = 0, len = kArr.length; i < len; i++)
47
- kArr[i] = 0;
48
- for (let i = 0, len = lenArr.length; i < len; i++)
49
- lenArr[i] = 0;
50
- len = len.toString(2);
51
- for (let i = 7; i >= 0; i--) {
52
- if (len.length > 8) {
53
- const start = len.length - 8;
54
- lenArr[i] = parseInt(len.substr(start), 2);
55
- len = len.substr(0, start);
56
- }
57
- else if (len.length > 0) {
58
- lenArr[i] = parseInt(len, 2);
59
- len = "";
60
- }
61
- }
62
- const m = new Uint8Array([...array, 0x80, ...kArr, ...lenArr]);
63
- const dataView = new DataView(m.buffer, 0);
64
- // 迭代压缩
65
- const n = m.length / 64;
66
- const V = new Uint32Array([
67
- 0x7380166f, 0x4914b2b9, 0x172442d7, 0xda8a0600, 0xa96f30bc, 0x163138aa, 0xe38dee4d, 0xb0fb0e4e,
68
- ]);
69
- for (let i = 0; i < n; i++) {
70
- W.fill(0);
71
- M.fill(0);
72
- // 将消息分组B划分为 16 个字 W0, W1,……,W15
73
- const start = 16 * i;
74
- for (let j = 0; j < 16; j++) {
75
- W[j] = dataView.getUint32((start + j) * 4, false);
76
- }
77
- // W16 ~ W67:W[j] <- P1(W[j−16] xor W[j−9] xor (W[j−3] <<< 15)) xor (W[j−13] <<< 7) xor W[j−6]
78
- for (let j = 16; j < 68; j++) {
79
- W[j] = P1(W[j - 16] ^ W[j - 9] ^ rotl(W[j - 3], 15)) ^ rotl(W[j - 13], 7) ^ W[j - 6];
80
- }
81
- // W′0 ~ W′63:W′[j] = W[j] xor W[j+4]
82
- for (let j = 0; j < 64; j++) {
83
- M[j] = W[j] ^ W[j + 4];
84
- }
85
- // 压缩
86
- const T1 = 0x79cc4519;
87
- const T2 = 0x7a879d8a;
88
- // 字寄存器
89
- let A = V[0];
90
- let B = V[1];
91
- let C = V[2];
92
- let D = V[3];
93
- let E = V[4];
94
- let F = V[5];
95
- let G = V[6];
96
- let H = V[7];
97
- // 中间变量
98
- let SS1;
99
- let SS2;
100
- let TT1;
101
- let TT2;
102
- let T;
103
- for (let j = 0; j < 64; j++) {
104
- T = j >= 0 && j <= 15 ? T1 : T2;
105
- SS1 = rotl(rotl(A, 12) + E + rotl(T, j), 7);
106
- SS2 = SS1 ^ rotl(A, 12);
107
- TT1 = (j >= 0 && j <= 15 ? A ^ B ^ C : (A & B) | (A & C) | (B & C)) + D + SS2 + M[j];
108
- TT2 = (j >= 0 && j <= 15 ? E ^ F ^ G : (E & F) | (~E & G)) + H + SS1 + W[j];
109
- D = C;
110
- C = rotl(B, 9);
111
- B = A;
112
- A = TT1;
113
- H = G;
114
- G = rotl(F, 19);
115
- F = E;
116
- E = P0(TT2);
117
- }
118
- V[0] ^= A;
119
- V[1] ^= B;
120
- V[2] ^= C;
121
- V[3] ^= D;
122
- V[4] ^= E;
123
- V[5] ^= F;
124
- V[6] ^= G;
125
- V[7] ^= H;
126
- }
127
- // 转回 uint8
128
- const result = [];
129
- for (let i = 0, len = V.length; i < len; i++) {
130
- const word = V[i];
131
- result.push((word & 0xff000000) >>> 24, (word & 0xff0000) >>> 16, (word & 0xff00) >>> 8, word & 0xff);
132
- }
133
- return result;
134
- }
135
- /**
136
- * hmac 实现
137
- */
138
- const blockLen = 64;
139
- const iPad = new Uint8Array(blockLen);
140
- const oPad = new Uint8Array(blockLen);
141
- for (let i = 0; i < blockLen; i++) {
142
- iPad[i] = 0x36;
143
- oPad[i] = 0x5c;
144
- }
145
- function hmac(input, key) {
146
- // 密钥填充
147
- if (key.length > blockLen)
148
- key = sm3(key);
149
- while (key.length < blockLen)
150
- key.push(0);
151
- const iPadKey = xor(key, iPad);
152
- const oPadKey = xor(key, oPad);
153
- const hash = sm3([...iPadKey, ...input]);
154
- return sm3([...oPadKey, ...hash]);
155
- }
156
-
157
- exports.hmac = hmac;
158
- exports.sm3 = sm3;
@@ -1,170 +0,0 @@
1
- 'use strict';
2
-
3
- var jsbn = require('./jsbn.cjs');
4
- var ec = require('./ec.cjs');
5
-
6
- const { BigInteger, SecureRandom } = jsbn;
7
- const { ECCurveFp } = ec;
8
- const rng = new SecureRandom();
9
- const { curve, G, n } = generateEcparam();
10
- /**
11
- * 获取公共椭圆曲线
12
- */
13
- function getGlobalCurve() {
14
- return curve;
15
- }
16
- /**
17
- * 生成ecparam
18
- */
19
- function generateEcparam() {
20
- // 椭圆曲线
21
- const p = new BigInteger("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF", 16);
22
- const a = new BigInteger("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC", 16);
23
- const b = new BigInteger("28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93", 16);
24
- const curve = new ECCurveFp(p, a, b);
25
- // 基点
26
- const gxHex = "32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7";
27
- const gyHex = "BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0";
28
- const G = curve.decodePointHex("04" + gxHex + gyHex);
29
- const n = new BigInteger("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123", 16);
30
- return { curve, G, n };
31
- }
32
- /**
33
- * 生成密钥对:publicKey = privateKey * G
34
- */
35
- function generateKeyPairHex(a, b, c) {
36
- const random = a ? new BigInteger(a, b, c) : new BigInteger(n.bitLength(), rng);
37
- const d = random.mod(n.subtract(BigInteger.ONE)).add(BigInteger.ONE); // 随机数
38
- const privateKey = leftPad(d.toString(16), 64);
39
- const P = G.multiply(d); // P = dG,p 为公钥,d 为私钥
40
- const Px = leftPad(P.getX().toBigInteger().toString(16), 64);
41
- const Py = leftPad(P.getY().toBigInteger().toString(16), 64);
42
- const publicKey = "04" + Px + Py;
43
- return { privateKey, publicKey };
44
- }
45
- /**
46
- * 生成压缩公钥
47
- */
48
- function compressPublicKeyHex(s) {
49
- if (s.length !== 130)
50
- throw new Error("Invalid public key to compress");
51
- const len = (s.length - 2) / 2;
52
- const xHex = s.substr(2, len);
53
- const y = new BigInteger(s.substr(len + 2, len), 16);
54
- let prefix = "03";
55
- if (y.mod(new BigInteger("2")).equals(BigInteger.ZERO))
56
- prefix = "02";
57
- return prefix + xHex;
58
- }
59
- /**
60
- * utf8串转16进制串
61
- */
62
- function utf8ToHex(input) {
63
- input = unescape(encodeURIComponent(input));
64
- const length = input.length;
65
- // 转换到字数组
66
- const words = [];
67
- for (let i = 0; i < length; i++) {
68
- words[i >>> 2] |= (input.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);
69
- }
70
- // 转换到16进制
71
- const hexChars = [];
72
- for (let i = 0; i < length; i++) {
73
- const bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
74
- hexChars.push((bite >>> 4).toString(16));
75
- hexChars.push((bite & 0x0f).toString(16));
76
- }
77
- return hexChars.join("");
78
- }
79
- /**
80
- * 补全16进制字符串
81
- */
82
- function leftPad(input, num) {
83
- if (input.length >= num)
84
- return input;
85
- return new Array(num - input.length + 1).join("0") + input;
86
- }
87
- /**
88
- * 转成16进制串
89
- */
90
- function arrayToHex(arr) {
91
- return arr
92
- .map((item) => {
93
- item = item.toString(16);
94
- return item.length === 1 ? "0" + item : item;
95
- })
96
- .join("");
97
- }
98
- /**
99
- * 转成utf8串
100
- */
101
- function arrayToUtf8(arr) {
102
- const words = [];
103
- let j = 0;
104
- for (let i = 0; i < arr.length * 2; i += 2) {
105
- words[i >>> 3] |= parseInt(arr[j], 10) << (24 - (i % 8) * 4);
106
- j++;
107
- }
108
- try {
109
- const latin1Chars = [];
110
- for (let i = 0; i < arr.length; i++) {
111
- const bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
112
- latin1Chars.push(String.fromCharCode(bite));
113
- }
114
- return decodeURIComponent(escape(latin1Chars.join("")));
115
- }
116
- catch (e) {
117
- throw new Error("Malformed UTF-8 data");
118
- }
119
- }
120
- /**
121
- * 转成字节数组
122
- */
123
- function hexToArray(hexStr) {
124
- const words = [];
125
- let hexStrLength = hexStr.length;
126
- if (hexStrLength % 2 !== 0) {
127
- hexStr = leftPad(hexStr, hexStrLength + 1);
128
- }
129
- hexStrLength = hexStr.length;
130
- for (let i = 0; i < hexStrLength; i += 2) {
131
- words.push(parseInt(hexStr.substr(i, 2), 16));
132
- }
133
- return words;
134
- }
135
- /**
136
- * 验证公钥是否为椭圆曲线上的点
137
- */
138
- function verifyPublicKey(publicKey) {
139
- const point = curve.decodePointHex(publicKey);
140
- if (!point)
141
- return false;
142
- const x = point.getX();
143
- const y = point.getY();
144
- // 验证 y^2 是否等于 x^3 + ax + b
145
- return y.square().equals(x.multiply(x.square()).add(x.multiply(curve.a)).add(curve.b));
146
- }
147
- /**
148
- * 验证公钥是否等价,等价返回true
149
- */
150
- function comparePublicKeyHex(publicKey1, publicKey2) {
151
- const point1 = curve.decodePointHex(publicKey1);
152
- if (!point1)
153
- return false;
154
- const point2 = curve.decodePointHex(publicKey2);
155
- if (!point2)
156
- return false;
157
- return point1.equals(point2);
158
- }
159
-
160
- exports.arrayToHex = arrayToHex;
161
- exports.arrayToUtf8 = arrayToUtf8;
162
- exports.comparePublicKeyHex = comparePublicKeyHex;
163
- exports.compressPublicKeyHex = compressPublicKeyHex;
164
- exports.generateEcparam = generateEcparam;
165
- exports.generateKeyPairHex = generateKeyPairHex;
166
- exports.getGlobalCurve = getGlobalCurve;
167
- exports.hexToArray = hexToArray;
168
- exports.leftPad = leftPad;
169
- exports.utf8ToHex = utf8ToHex;
170
- exports.verifyPublicKey = verifyPublicKey;
@@ -1,112 +0,0 @@
1
- 'use strict';
2
-
3
- var sm2 = require('./sm2.cjs');
4
-
5
- // 获取密钥对
6
- /**
7
- * sm2 生成公钥和私钥
8
- * @param {String} str 字符串
9
- * @param {Number} rnd 随机数
10
- * @returns {Object} 返回公钥和私钥
11
- */
12
- function generateKeyPairHex(str, rnd) {
13
- return sm2.generateKeyPairHex(str, rnd);
14
- }
15
- /**
16
- * sm2 压缩公钥
17
- * @param {String} publicKey 公钥
18
- * @returns {String} 返回公钥字符串
19
- */
20
- function compressPublicKeyHex(publicKey) {
21
- return sm2.compressPublicKeyHex(publicKey);
22
- }
23
- /**
24
- * sm2 对比公钥是否等价
25
- * @param {String} publicKey 公钥
26
- * @param {String} compressedPublicKey 压缩后的公钥
27
- * @returns {Boolean} 返回结果
28
- */
29
- function comparePublicKeyHex(publicKey, compressedPublicKey) {
30
- return sm2.comparePublicKeyHex(publicKey, compressedPublicKey);
31
- }
32
- // 验证密钥对
33
- /**
34
- * sm2 验证公钥
35
- * @param {String} publicKey 公钥,也可以传压缩后的公钥
36
- * @returns {Boolean} 返回结果
37
- */
38
- function verifyPublicKey(publicKey) {
39
- return sm2.verifyPublicKey(publicKey);
40
- }
41
- // 加密解密
42
- /**
43
- * sm2 加密
44
- * @param {String} str 字符串
45
- * @param {String} publicKey 公钥
46
- * @param {Number} cipherMode 加密模式,1(C1C3C2)和0(C1C2C3),默认1
47
- * @returns {String} 返回加密后的字符串
48
- */
49
- function encrypt(str, publicKey, cipherMode = 1) {
50
- return sm2.doEncrypt(str, publicKey, cipherMode);
51
- }
52
- /**
53
- * sm2 解密
54
- * @param {String} str 字符串
55
- * @param {String} privateKey 私钥
56
- * @param {Number} cipherMode 解密模式,1(C1C3C2)和0(C1C2C3),默认1
57
- * @param {Object} outputConfig 输出结果配置,{output:'string/array'}
58
- * @returns {String,Array} 返回解密后的数据
59
- */
60
- function decrypt(str, privateKey, cipherMode = 1, outputConfig = { output: "string" }) {
61
- return sm2.doDecrypt(str, privateKey, cipherMode, outputConfig);
62
- }
63
- // 签名验签
64
- /**
65
- * sm2 生成签名
66
- * @param {String} str 字符串
67
- * @param {String} privateKey 私钥
68
- * @param {Object} signatureConfig 签名配置
69
- * @returns {String} 返回签名信息
70
- */
71
- function doSignature(str, privateKey, signatureConfig) {
72
- return sm2.doSignature(str, privateKey, signatureConfig);
73
- }
74
- /**
75
- * sm2 验证签名
76
- * @param {String} str 字符串
77
- * @param {String} signHex 生成签名的信息
78
- * @param {String} publicKey 公钥
79
- * @param {Object} verifyConfig 验证配置
80
- * @returns {String} 返回结果
81
- */
82
- function doVerifySignature(str, signHex, publicKey, verifyConfig) {
83
- return sm2.doVerifySignature(str, signHex, publicKey, verifyConfig);
84
- }
85
- // 获取椭圆曲线点
86
- /**
87
- * sm2 获取椭圆曲线点
88
- * @returns {Object} 返回椭圆曲线点,可在sm2签名时传入
89
- */
90
- function getPoint() {
91
- return sm2.getPoint();
92
- }
93
- // 根据私钥获取公钥
94
- /**
95
- * sm2 根据私钥获取公钥
96
- * @param {String} privateKey 私钥
97
- * @returns {String} 返回公钥
98
- */
99
- function getPublicKeyFromPrivateKey(privateKey) {
100
- return sm2.getPublicKeyFromPrivateKey(privateKey);
101
- }
102
-
103
- exports.comparePublicKeyHex = comparePublicKeyHex;
104
- exports.compressPublicKeyHex = compressPublicKeyHex;
105
- exports.decrypt = decrypt;
106
- exports.doSignature = doSignature;
107
- exports.doVerifySignature = doVerifySignature;
108
- exports.encrypt = encrypt;
109
- exports.generateKeyPairHex = generateKeyPairHex;
110
- exports.getPoint = getPoint;
111
- exports.getPublicKeyFromPrivateKey = getPublicKeyFromPrivateKey;
112
- exports.verifyPublicKey = verifyPublicKey;
@@ -1,231 +0,0 @@
1
- 'use strict';
2
-
3
- var jsbn = require('../lib/jsbn.cjs');
4
- var asn1 = require('../lib/asn1.cjs');
5
- var utils = require('../lib/utils.cjs');
6
- var sm3 = require('../lib/sm3.cjs');
7
-
8
- const { BigInteger } = jsbn;
9
- const { decodeDer, encodeDer } = asn1;
10
- const { G, curve, n } = utils.generateEcparam();
11
- const C1C2C3 = 0;
12
- /**
13
- * 加密
14
- */
15
- function doEncrypt(msg, publicKey, cipherMode = 1) {
16
- msg = typeof msg === "string" ? utils.hexToArray(utils.utf8ToHex(msg)) : Array.prototype.slice.call(msg);
17
- publicKey = utils.getGlobalCurve().decodePointHex(publicKey); // 先将公钥转成点
18
- const keypair = utils.generateKeyPairHex();
19
- const k = new BigInteger(keypair.privateKey, 16); // 随机数 k
20
- // c1 = k * G
21
- let c1 = keypair.publicKey;
22
- if (c1.length > 128)
23
- c1 = c1.substr(c1.length - 128);
24
- // (x2, y2) = k * publicKey
25
- const p = publicKey.multiply(k);
26
- const x2 = utils.hexToArray(utils.leftPad(p.getX().toBigInteger().toRadix(16), 64));
27
- const y2 = utils.hexToArray(utils.leftPad(p.getY().toBigInteger().toRadix(16), 64));
28
- // c3 = hash(x2 || msg || y2)
29
- const c3 = utils.arrayToHex(sm3.sm3([].concat(x2, msg, y2)));
30
- let ct = 1;
31
- let offset = 0;
32
- let t = []; // 256 位
33
- const z = [].concat(x2, y2);
34
- const nextT = () => {
35
- // (1) Hai = hash(z || ct)
36
- // (2) ct++
37
- t = sm3.sm3([...z, (ct >> 24) & 0x00ff, (ct >> 16) & 0x00ff, (ct >> 8) & 0x00ff, ct & 0x00ff]);
38
- ct++;
39
- offset = 0;
40
- };
41
- nextT(); // 先生成 Ha1
42
- for (let i = 0, len = msg.length; i < len; i++) {
43
- // t = Ha1 || Ha2 || Ha3 || Ha4
44
- if (offset === t.length)
45
- nextT();
46
- // c2 = msg ^ t
47
- msg[i] ^= t[offset++] & 0xff;
48
- }
49
- const c2 = utils.arrayToHex(msg);
50
- return cipherMode === C1C2C3 ? c1 + c2 + c3 : c1 + c3 + c2;
51
- }
52
- /**
53
- * 解密
54
- */
55
- function doDecrypt(encryptData, privateKey, cipherMode = 1, { output = "string" } = {}) {
56
- privateKey = new BigInteger(privateKey, 16);
57
- let c3 = encryptData.substr(128, 64);
58
- let c2 = encryptData.substr(128 + 64);
59
- if (cipherMode === C1C2C3) {
60
- c3 = encryptData.substr(encryptData.length - 64);
61
- c2 = encryptData.substr(128, encryptData.length - 128 - 64);
62
- }
63
- const msg = utils.hexToArray(c2);
64
- const c1 = utils.getGlobalCurve().decodePointHex("04" + encryptData.substr(0, 128));
65
- const p = c1.multiply(privateKey);
66
- const x2 = utils.hexToArray(utils.leftPad(p.getX().toBigInteger().toRadix(16), 64));
67
- const y2 = utils.hexToArray(utils.leftPad(p.getY().toBigInteger().toRadix(16), 64));
68
- let ct = 1;
69
- let offset = 0;
70
- let t = []; // 256 位
71
- const z = [].concat(x2, y2);
72
- const nextT = () => {
73
- // (1) Hai = hash(z || ct)
74
- // (2) ct++
75
- t = sm3.sm3([...z, (ct >> 24) & 0x00ff, (ct >> 16) & 0x00ff, (ct >> 8) & 0x00ff, ct & 0x00ff]);
76
- ct++;
77
- offset = 0;
78
- };
79
- nextT(); // 先生成 Ha1
80
- for (let i = 0, len = msg.length; i < len; i++) {
81
- // t = Ha1 || Ha2 || Ha3 || Ha4
82
- if (offset === t.length)
83
- nextT();
84
- // c2 = msg ^ t
85
- msg[i] ^= t[offset++] & 0xff;
86
- }
87
- // c3 = hash(x2 || msg || y2)
88
- const checkC3 = utils.arrayToHex(sm3.sm3([].concat(x2, msg, y2)));
89
- if (checkC3 === c3.toLowerCase()) {
90
- return output === "array" ? msg : utils.arrayToUtf8(msg);
91
- }
92
- else {
93
- return output === "array" ? [] : "";
94
- }
95
- }
96
- /**
97
- * 签名
98
- */
99
- function doSignature(msg, privateKey, { pointPool, der, hash, publicKey, userId } = {}) {
100
- let hashHex = typeof msg === "string" ? utils.utf8ToHex(msg) : utils.arrayToHex(msg);
101
- if (hash) {
102
- // sm3杂凑
103
- publicKey = publicKey || getPublicKeyFromPrivateKey(privateKey);
104
- hashHex = getHash(hashHex, publicKey, userId);
105
- }
106
- const dA = new BigInteger(privateKey, 16);
107
- const e = new BigInteger(hashHex, 16);
108
- // k
109
- let k = null;
110
- let r = null;
111
- let s = null;
112
- do {
113
- do {
114
- let point;
115
- if (pointPool && pointPool.length) {
116
- point = pointPool.pop();
117
- }
118
- else {
119
- point = getPoint();
120
- }
121
- k = point.k;
122
- // r = (e + x1) mod n
123
- r = e.add(point.x1).mod(n);
124
- } while (r.equals(BigInteger.ZERO) || r.add(k).equals(n));
125
- // s = ((1 + dA)^-1 * (k - r * dA)) mod n
126
- s = dA
127
- .add(BigInteger.ONE)
128
- .modInverse(n)
129
- .multiply(k.subtract(r.multiply(dA)))
130
- .mod(n);
131
- } while (s.equals(BigInteger.ZERO));
132
- if (der)
133
- return encodeDer(r, s); // asn.1 der 编码
134
- return utils.leftPad(r.toString(16), 64) + utils.leftPad(s.toString(16), 64);
135
- }
136
- /**
137
- * 验签
138
- */
139
- function doVerifySignature(msg, signHex, publicKey, { der, hash, userId } = {}) {
140
- let hashHex = typeof msg === "string" ? utils.utf8ToHex(msg) : utils.arrayToHex(msg);
141
- if (hash) {
142
- // sm3杂凑
143
- hashHex = getHash(hashHex, publicKey, userId);
144
- }
145
- let r;
146
- let s;
147
- if (der) {
148
- const decodeDerObj = decodeDer(signHex); // asn.1 der 解码
149
- r = decodeDerObj.r;
150
- s = decodeDerObj.s;
151
- }
152
- else {
153
- r = new BigInteger(signHex.substring(0, 64), 16);
154
- s = new BigInteger(signHex.substring(64), 16);
155
- }
156
- const PA = curve.decodePointHex(publicKey);
157
- const e = new BigInteger(hashHex, 16);
158
- // t = (r + s) mod n
159
- const t = r.add(s).mod(n);
160
- if (t.equals(BigInteger.ZERO))
161
- return false;
162
- // x1y1 = s * G + t * PA
163
- const x1y1 = G.multiply(s).add(PA.multiply(t));
164
- // R = (e + x1) mod n
165
- const R = e.add(x1y1.getX().toBigInteger()).mod(n);
166
- return r.equals(R);
167
- }
168
- /**
169
- * sm3杂凑算法
170
- */
171
- function getHash(hashHex, publicKey, userId = "1234567812345678") {
172
- // z = hash(entl || userId || a || b || gx || gy || px || py)
173
- userId = utils.utf8ToHex(userId);
174
- const a = utils.leftPad(G.curve.a.toBigInteger().toRadix(16), 64);
175
- const b = utils.leftPad(G.curve.b.toBigInteger().toRadix(16), 64);
176
- const gx = utils.leftPad(G.getX().toBigInteger().toRadix(16), 64);
177
- const gy = utils.leftPad(G.getY().toBigInteger().toRadix(16), 64);
178
- let px;
179
- let py;
180
- if (publicKey.length === 128) {
181
- px = publicKey.substr(0, 64);
182
- py = publicKey.substr(64, 64);
183
- }
184
- else {
185
- const point = G.curve.decodePointHex(publicKey);
186
- px = utils.leftPad(point.getX().toBigInteger().toRadix(16), 64);
187
- py = utils.leftPad(point.getY().toBigInteger().toRadix(16), 64);
188
- }
189
- const data = utils.hexToArray(userId + a + b + gx + gy + px + py);
190
- const entl = userId.length * 4;
191
- data.unshift(entl & 0x00ff);
192
- data.unshift((entl >> 8) & 0x00ff);
193
- const z = sm3.sm3(data);
194
- // e = hash(z || msg)
195
- return utils.arrayToHex(sm3.sm3(z.concat(utils.hexToArray(hashHex))));
196
- }
197
- /**
198
- * 计算公钥
199
- */
200
- function getPublicKeyFromPrivateKey(privateKey) {
201
- const PA = G.multiply(new BigInteger(privateKey, 16));
202
- const x = utils.leftPad(PA.getX().toBigInteger().toString(16), 64);
203
- const y = utils.leftPad(PA.getY().toBigInteger().toString(16), 64);
204
- return "04" + x + y;
205
- }
206
- /**
207
- * 获取椭圆曲线点
208
- */
209
- function getPoint() {
210
- const keypair = utils.generateKeyPairHex();
211
- const PA = curve.decodePointHex(keypair.publicKey);
212
- keypair.k = new BigInteger(keypair.privateKey, 16);
213
- keypair.x1 = PA.getX().toBigInteger();
214
- return keypair;
215
- }
216
- // es6 export
217
- const generateKeyPairHex = utils.generateKeyPairHex;
218
- const compressPublicKeyHex = utils.compressPublicKeyHex;
219
- const comparePublicKeyHex = utils.comparePublicKeyHex;
220
- const verifyPublicKey = utils.verifyPublicKey;
221
-
222
- exports.comparePublicKeyHex = comparePublicKeyHex;
223
- exports.compressPublicKeyHex = compressPublicKeyHex;
224
- exports.doDecrypt = doDecrypt;
225
- exports.doEncrypt = doEncrypt;
226
- exports.doSignature = doSignature;
227
- exports.doVerifySignature = doVerifySignature;
228
- exports.generateKeyPairHex = generateKeyPairHex;
229
- exports.getPoint = getPoint;
230
- exports.getPublicKeyFromPrivateKey = getPublicKeyFromPrivateKey;
231
- exports.verifyPublicKey = verifyPublicKey;
@@ -1,15 +0,0 @@
1
- 'use strict';
2
-
3
- var sm3 = require('./sm3.cjs');
4
-
5
- /**
6
- * sm3 加密
7
- * @param {String} str 字符串
8
- * @param {Object} options 配置
9
- * @returns {String} 返回加密后的字符串
10
- */
11
- function encrypt(str, options) {
12
- return sm3(str, options);
13
- }
14
-
15
- exports.encrypt = encrypt;