@ivujs/i-utils 1.1.16 → 1.1.17

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 (213) hide show
  1. package/README.md +21 -19
  2. package/dist/cjs/index.cjs +5 -400
  3. package/dist/es/index.d.ts +1 -26
  4. package/dist/es/index.mjs +2 -55
  5. package/dist/index.d.ts +11 -2851
  6. package/dist/lib/index.full.umd.js +33 -14240
  7. package/dist/lib/index.full.umd.min.js +2 -64
  8. package/dist/lib/index.full.umd.min.js.map +1 -1
  9. package/dist/resolver/auto-imports.cjs +1 -337
  10. package/dist/resolver/auto-imports.mjs +1 -337
  11. package/dist/resolver/index.cjs +1 -1
  12. package/dist/resolver/index.d.ts +1 -1
  13. package/dist/resolver/index.mjs +1 -1
  14. package/package.json +5 -13
  15. package/dist/cjs/ID-card/index.cjs +0 -87
  16. package/dist/cjs/array/index.cjs +0 -470
  17. package/dist/cjs/clipboard/index.cjs +0 -128
  18. package/dist/cjs/color/index.cjs +0 -193
  19. package/dist/cjs/constants/date.cjs +0 -178
  20. package/dist/cjs/constants/id-card.cjs +0 -52
  21. package/dist/cjs/constants/keycode.cjs +0 -117
  22. package/dist/cjs/constants/lang.cjs +0 -13
  23. package/dist/cjs/constants/math.cjs +0 -13
  24. package/dist/cjs/constants/regexp.cjs +0 -53
  25. package/dist/cjs/constants/sort.cjs +0 -15
  26. package/dist/cjs/cookie/index.cjs +0 -70
  27. package/dist/cjs/crypto/aes/aes.cjs +0 -480
  28. package/dist/cjs/crypto/aes/index.cjs +0 -27
  29. package/dist/cjs/crypto/base32/base32.cjs +0 -357
  30. package/dist/cjs/crypto/base32/index.cjs +0 -41
  31. package/dist/cjs/crypto/base64/base64.cjs +0 -348
  32. package/dist/cjs/crypto/base64/index.cjs +0 -59
  33. package/dist/cjs/crypto/des/des.cjs +0 -257
  34. package/dist/cjs/crypto/des/index.cjs +0 -28
  35. package/dist/cjs/crypto/md5/index.cjs +0 -24
  36. package/dist/cjs/crypto/md5/md5.cjs +0 -897
  37. package/dist/cjs/crypto/sha/sha1/index.cjs +0 -24
  38. package/dist/cjs/crypto/sha/sha1/sha1.cjs +0 -529
  39. package/dist/cjs/crypto/sha/sha256/index.cjs +0 -43
  40. package/dist/cjs/crypto/sha/sha256/sha256.cjs +0 -595
  41. package/dist/cjs/crypto/sha/sha3/index.cjs +0 -41
  42. package/dist/cjs/crypto/sha/sha3/sha3.cjs +0 -624
  43. package/dist/cjs/crypto/sha/sha512/index.cjs +0 -81
  44. package/dist/cjs/crypto/sha/sha512/sha512.cjs +0 -950
  45. package/dist/cjs/crypto/sm/lib/asn1.cjs +0 -149
  46. package/dist/cjs/crypto/sm/lib/ec.cjs +0 -315
  47. package/dist/cjs/crypto/sm/lib/jsbn.cjs +0 -1608
  48. package/dist/cjs/crypto/sm/lib/sm3.cjs +0 -158
  49. package/dist/cjs/crypto/sm/lib/utils.cjs +0 -170
  50. package/dist/cjs/crypto/sm/sm2/index.cjs +0 -112
  51. package/dist/cjs/crypto/sm/sm2/sm2.cjs +0 -231
  52. package/dist/cjs/crypto/sm/sm3/index.cjs +0 -15
  53. package/dist/cjs/crypto/sm/sm3/sm3.cjs +0 -93
  54. package/dist/cjs/crypto/sm/sm4/index.cjs +0 -27
  55. package/dist/cjs/crypto/sm/sm4/sm4.cjs +0 -327
  56. package/dist/cjs/crypto/tea/index.cjs +0 -25
  57. package/dist/cjs/crypto/tea/tea.cjs +0 -187
  58. package/dist/cjs/date/index.cjs +0 -1266
  59. package/dist/cjs/desensitized/index.cjs +0 -75
  60. package/dist/cjs/device/index.cjs +0 -151
  61. package/dist/cjs/dom/index.cjs +0 -129
  62. package/dist/cjs/file/index.cjs +0 -333
  63. package/dist/cjs/function/index.cjs +0 -69
  64. package/dist/cjs/keycode/index.cjs +0 -33
  65. package/dist/cjs/math/index.cjs +0 -278
  66. package/dist/cjs/number/index.cjs +0 -31
  67. package/dist/cjs/object/index.cjs +0 -272
  68. package/dist/cjs/pagination/index.cjs +0 -131
  69. package/dist/cjs/random/index.cjs +0 -24
  70. package/dist/cjs/regexp/index.cjs +0 -100
  71. package/dist/cjs/storage/index.cjs +0 -11
  72. package/dist/cjs/storage/localStorage.cjs +0 -37
  73. package/dist/cjs/storage/sessionStorage.cjs +0 -37
  74. package/dist/cjs/string/index.cjs +0 -358
  75. package/dist/cjs/url/index.cjs +0 -258
  76. package/dist/cjs/validate/index.cjs +0 -468
  77. package/dist/cjs/weapp/index.cjs +0 -142
  78. package/dist/es/ID-card/index.d.ts +0 -31
  79. package/dist/es/ID-card/index.mjs +0 -81
  80. package/dist/es/array/index.d.ts +0 -203
  81. package/dist/es/array/index.mjs +0 -441
  82. package/dist/es/clipboard/index.d.ts +0 -29
  83. package/dist/es/clipboard/index.mjs +0 -122
  84. package/dist/es/color/index.d.ts +0 -52
  85. package/dist/es/color/index.mjs +0 -183
  86. package/dist/es/constants/date.d.ts +0 -174
  87. package/dist/es/constants/date.mjs +0 -176
  88. package/dist/es/constants/id-card.d.ts +0 -43
  89. package/dist/es/constants/id-card.mjs +0 -50
  90. package/dist/es/constants/index.d.ts +0 -7
  91. package/dist/es/constants/keycode.d.ts +0 -103
  92. package/dist/es/constants/keycode.mjs +0 -115
  93. package/dist/es/constants/lang.d.ts +0 -4
  94. package/dist/es/constants/lang.mjs +0 -11
  95. package/dist/es/constants/math.d.ts +0 -4
  96. package/dist/es/constants/math.mjs +0 -11
  97. package/dist/es/constants/regexp.d.ts +0 -24
  98. package/dist/es/constants/regexp.mjs +0 -51
  99. package/dist/es/constants/sort.d.ts +0 -5
  100. package/dist/es/constants/sort.mjs +0 -13
  101. package/dist/es/cookie/index.d.ts +0 -29
  102. package/dist/es/cookie/index.mjs +0 -64
  103. package/dist/es/crypto/aes/aes.d.ts +0 -156
  104. package/dist/es/crypto/aes/aes.mjs +0 -478
  105. package/dist/es/crypto/aes/index.d.ts +0 -16
  106. package/dist/es/crypto/aes/index.mjs +0 -24
  107. package/dist/es/crypto/base32/base32.d.ts +0 -3
  108. package/dist/es/crypto/base32/base32.mjs +0 -353
  109. package/dist/es/crypto/base32/index.d.ts +0 -24
  110. package/dist/es/crypto/base32/index.mjs +0 -36
  111. package/dist/es/crypto/base64/base64.d.ts +0 -5
  112. package/dist/es/crypto/base64/base64.mjs +0 -342
  113. package/dist/es/crypto/base64/index.d.ts +0 -36
  114. package/dist/es/crypto/base64/index.mjs +0 -52
  115. package/dist/es/crypto/des/des.d.ts +0 -52
  116. package/dist/es/crypto/des/des.mjs +0 -255
  117. package/dist/es/crypto/des/index.d.ts +0 -14
  118. package/dist/es/crypto/des/index.mjs +0 -25
  119. package/dist/es/crypto/index.d.ts +0 -8
  120. package/dist/es/crypto/md5/index.d.ts +0 -13
  121. package/dist/es/crypto/md5/index.mjs +0 -21
  122. package/dist/es/crypto/md5/md5.d.ts +0 -144
  123. package/dist/es/crypto/md5/md5.mjs +0 -894
  124. package/dist/es/crypto/sha/index.d.ts +0 -4
  125. package/dist/es/crypto/sha/sha1/index.d.ts +0 -13
  126. package/dist/es/crypto/sha/sha1/index.mjs +0 -21
  127. package/dist/es/crypto/sha/sha1/sha1.d.ts +0 -2
  128. package/dist/es/crypto/sha/sha1/sha1.mjs +0 -526
  129. package/dist/es/crypto/sha/sha256/index.d.ts +0 -26
  130. package/dist/es/crypto/sha/sha256/index.mjs +0 -38
  131. package/dist/es/crypto/sha/sha256/sha256.d.ts +0 -4
  132. package/dist/es/crypto/sha/sha256/sha256.mjs +0 -590
  133. package/dist/es/crypto/sha/sha3/index.d.ts +0 -24
  134. package/dist/es/crypto/sha/sha3/index.mjs +0 -36
  135. package/dist/es/crypto/sha/sha3/sha3.d.ts +0 -4
  136. package/dist/es/crypto/sha/sha3/sha3.mjs +0 -619
  137. package/dist/es/crypto/sha/sha512/index.d.ts +0 -52
  138. package/dist/es/crypto/sha/sha512/index.mjs +0 -72
  139. package/dist/es/crypto/sha/sha512/sha512.d.ts +0 -8
  140. package/dist/es/crypto/sha/sha512/sha512.mjs +0 -941
  141. package/dist/es/crypto/sm/index.d.ts +0 -3
  142. package/dist/es/crypto/sm/lib/asn1.d.ts +0 -12
  143. package/dist/es/crypto/sm/lib/asn1.mjs +0 -146
  144. package/dist/es/crypto/sm/lib/ec.d.ts +0 -126
  145. package/dist/es/crypto/sm/lib/ec.mjs +0 -312
  146. package/dist/es/crypto/sm/lib/jsbn.d.ts +0 -198
  147. package/dist/es/crypto/sm/lib/jsbn.mjs +0 -1605
  148. package/dist/es/crypto/sm/lib/sm3.d.ts +0 -5
  149. package/dist/es/crypto/sm/lib/sm3.mjs +0 -155
  150. package/dist/es/crypto/sm/lib/utils.d.ts +0 -53
  151. package/dist/es/crypto/sm/lib/utils.mjs +0 -158
  152. package/dist/es/crypto/sm/sm2/index.d.ts +0 -71
  153. package/dist/es/crypto/sm/sm2/index.mjs +0 -101
  154. package/dist/es/crypto/sm/sm2/sm2.d.ts +0 -34
  155. package/dist/es/crypto/sm/sm2/sm2.mjs +0 -220
  156. package/dist/es/crypto/sm/sm3/index.d.ts +0 -7
  157. package/dist/es/crypto/sm/sm3/index.mjs +0 -13
  158. package/dist/es/crypto/sm/sm3/sm3.d.ts +0 -1
  159. package/dist/es/crypto/sm/sm3/sm3.mjs +0 -91
  160. package/dist/es/crypto/sm/sm4/index.d.ts +0 -16
  161. package/dist/es/crypto/sm/sm4/index.mjs +0 -24
  162. package/dist/es/crypto/sm/sm4/sm4.d.ts +0 -2
  163. package/dist/es/crypto/sm/sm4/sm4.mjs +0 -324
  164. package/dist/es/crypto/tea/index.d.ts +0 -14
  165. package/dist/es/crypto/tea/index.mjs +0 -22
  166. package/dist/es/crypto/tea/tea.d.ts +0 -69
  167. package/dist/es/crypto/tea/tea.mjs +0 -185
  168. package/dist/es/date/index.d.ts +0 -547
  169. package/dist/es/date/index.mjs +0 -1179
  170. package/dist/es/desensitized/index.d.ts +0 -38
  171. package/dist/es/desensitized/index.mjs +0 -69
  172. package/dist/es/device/index.d.ts +0 -67
  173. package/dist/es/device/index.mjs +0 -137
  174. package/dist/es/dom/index.d.ts +0 -57
  175. package/dist/es/dom/index.mjs +0 -119
  176. package/dist/es/file/index.d.ts +0 -93
  177. package/dist/es/file/index.mjs +0 -317
  178. package/dist/es/function/index.d.ts +0 -23
  179. package/dist/es/function/index.mjs +0 -65
  180. package/dist/es/keycode/index.d.ts +0 -12
  181. package/dist/es/keycode/index.mjs +0 -30
  182. package/dist/es/math/index.d.ts +0 -66
  183. package/dist/es/math/index.mjs +0 -268
  184. package/dist/es/number/index.d.ts +0 -14
  185. package/dist/es/number/index.mjs +0 -28
  186. package/dist/es/object/index.d.ts +0 -83
  187. package/dist/es/object/index.mjs +0 -259
  188. package/dist/es/pagination/index.d.ts +0 -34
  189. package/dist/es/pagination/index.mjs +0 -125
  190. package/dist/es/random/index.d.ts +0 -15
  191. package/dist/es/random/index.mjs +0 -21
  192. package/dist/es/regexp/index.d.ts +0 -63
  193. package/dist/es/regexp/index.mjs +0 -89
  194. package/dist/es/storage/index.d.ts +0 -7
  195. package/dist/es/storage/index.mjs +0 -9
  196. package/dist/es/storage/localStorage.d.ts +0 -21
  197. package/dist/es/storage/localStorage.mjs +0 -32
  198. package/dist/es/storage/sessionStorage.d.ts +0 -21
  199. package/dist/es/storage/sessionStorage.mjs +0 -32
  200. package/dist/es/string/index.d.ts +0 -121
  201. package/dist/es/string/index.mjs +0 -339
  202. package/dist/es/url/index.d.ts +0 -118
  203. package/dist/es/url/index.mjs +0 -240
  204. package/dist/es/validate/index.d.ts +0 -228
  205. package/dist/es/validate/index.mjs +0 -431
  206. package/dist/es/weapp/index.d.ts +0 -57
  207. package/dist/es/weapp/index.mjs +0 -131
  208. package/dist/lib/index.full.cjs.js +0 -14264
  209. package/dist/lib/index.full.cjs.min.js +0 -69
  210. package/dist/lib/index.full.cjs.min.js.map +0 -1
  211. package/dist/lib/index.full.esm.js +0 -13910
  212. package/dist/lib/index.full.esm.min.js +0 -64
  213. package/dist/lib/index.full.esm.min.js.map +0 -1
@@ -1,3 +0,0 @@
1
- export * as sm2 from "./sm2/index.js";
2
- export * as sm3 from "./sm3/index.js";
3
- export * as sm4 from "./sm4/index.js";
@@ -1,12 +0,0 @@
1
- /**
2
- * ASN.1 der 编码,针对 sm2 签名
3
- */
4
- export function encodeDer(r: any, s: any): string;
5
- /**
6
- * 解析 ASN.1 der,针对 sm2 验签
7
- */
8
- export function decodeDer(input: any): {
9
- r: jsbn.BigInteger;
10
- s: jsbn.BigInteger;
11
- };
12
- import * as jsbn from "./jsbn.js";
@@ -1,146 +0,0 @@
1
- import * as jsbn from './jsbn.mjs';
2
-
3
- const { BigInteger } = jsbn;
4
- function bigintToValue(bigint) {
5
- let h = bigint.toString(16);
6
- if (h[0] !== "-") {
7
- // 正数
8
- if (h.length % 2 === 1)
9
- h = "0" + h; // 补齐到整字节
10
- else if (!h.match(/^[0-7]/))
11
- h = "00" + h; // 非0开头,则补一个全0字节
12
- }
13
- else {
14
- // 负数
15
- h = h.substr(1);
16
- let len = h.length;
17
- if (len % 2 === 1)
18
- len += 1; // 补齐到整字节
19
- else if (!h.match(/^[0-7]/))
20
- len += 2; // 非0开头,则补一个全0字节
21
- let mask = "";
22
- for (let i = 0; i < len; i++)
23
- mask += "f";
24
- mask = new BigInteger(mask, 16);
25
- // 对绝对值取反,加1
26
- h = mask.xor(bigint).add(BigInteger.ONE);
27
- h = h.toString(16).replace(/^-/, "");
28
- }
29
- return h;
30
- }
31
- class ASN1Object {
32
- constructor() {
33
- this.tlv = null;
34
- this.t = "00";
35
- this.l = "00";
36
- this.v = "";
37
- }
38
- /**
39
- * 获取 der 编码比特流16进制串
40
- */
41
- getEncodedHex() {
42
- if (!this.tlv) {
43
- this.v = this.getValue();
44
- this.l = this.getLength();
45
- this.tlv = this.t + this.l + this.v;
46
- }
47
- return this.tlv;
48
- }
49
- getLength() {
50
- const n = this.v.length / 2; // 字节数
51
- let nHex = n.toString(16);
52
- if (nHex.length % 2 === 1)
53
- nHex = "0" + nHex; // 补齐到整字节
54
- if (n < 128) {
55
- // 短格式,以 0 开头
56
- return nHex;
57
- }
58
- else {
59
- // 长格式,以 1 开头
60
- const head = 128 + nHex.length / 2; // 1(1位) + 真正的长度占用字节数(7位) + 真正的长度
61
- return head.toString(16) + nHex;
62
- }
63
- }
64
- getValue() {
65
- return "";
66
- }
67
- }
68
- class DERInteger extends ASN1Object {
69
- constructor(bigint) {
70
- super();
71
- this.t = "02"; // 整型标签说明
72
- if (bigint)
73
- this.v = bigintToValue(bigint);
74
- }
75
- getValue() {
76
- return this.v;
77
- }
78
- }
79
- class DERSequence extends ASN1Object {
80
- constructor(asn1Array) {
81
- super();
82
- this.t = "30"; // 序列标签说明
83
- this.asn1Array = asn1Array;
84
- }
85
- getValue() {
86
- this.v = this.asn1Array.map((asn1Object) => asn1Object.getEncodedHex()).join("");
87
- return this.v;
88
- }
89
- }
90
- /**
91
- * 获取 l 占用字节数
92
- */
93
- function getLenOfL(str, start) {
94
- if (+str[start + 2] < 8)
95
- return 1; // l 以0开头,则表示短格式,只占一个字节
96
- return +str.substr(start + 2, 2) & (0x7f + 1); // 长格式,取第一个字节后7位作为长度真正占用字节数,再加上本身
97
- }
98
- /**
99
- * 获取 l
100
- */
101
- function getL(str, start) {
102
- // 获取 l
103
- const len = getLenOfL(str, start);
104
- const l = str.substr(start + 2, len * 2);
105
- if (!l)
106
- return -1;
107
- const bigint = +l[0] < 8 ? new BigInteger(l, 16) : new BigInteger(l.substr(2), 16);
108
- return bigint.intValue();
109
- }
110
- /**
111
- * 获取 v 的位置
112
- */
113
- function getStartOfV(str, start) {
114
- const len = getLenOfL(str, start);
115
- return start + (len + 1) * 2;
116
- }
117
- /**
118
- * ASN.1 der 编码,针对 sm2 签名
119
- */
120
- function encodeDer(r, s) {
121
- const derR = new DERInteger(r);
122
- const derS = new DERInteger(s);
123
- const derSeq = new DERSequence([derR, derS]);
124
- return derSeq.getEncodedHex();
125
- }
126
- /**
127
- * 解析 ASN.1 der,针对 sm2 验签
128
- */
129
- function decodeDer(input) {
130
- // 结构:
131
- // input = | tSeq | lSeq | vSeq |
132
- // vSeq = | tR | lR | vR | tS | lS | vS |
133
- const start = getStartOfV(input, 0);
134
- const vIndexR = getStartOfV(input, start);
135
- const lR = getL(input, start);
136
- const vR = input.substr(vIndexR, lR * 2);
137
- const nextStart = vIndexR + vR.length;
138
- const vIndexS = getStartOfV(input, nextStart);
139
- const lS = getL(input, nextStart);
140
- const vS = input.substr(vIndexS, lS * 2);
141
- const r = new BigInteger(vR, 16);
142
- const s = new BigInteger(vS, 16);
143
- return { r, s };
144
- }
145
-
146
- export { decodeDer, encodeDer };
@@ -1,126 +0,0 @@
1
- export class ECPointFp {
2
- constructor(curve: any, x: any, y: any, z: any);
3
- curve: any;
4
- x: any;
5
- y: any;
6
- z: any;
7
- zinv: any;
8
- getX(): any;
9
- getY(): any;
10
- /**
11
- * 判断相等
12
- */
13
- equals(other: any): any;
14
- /**
15
- * 是否是无穷远点
16
- */
17
- isInfinity(): any;
18
- /**
19
- * 取反,x 轴对称点
20
- */
21
- negate(): ECPointFp;
22
- /**
23
- * 相加
24
- *
25
- * 标准射影坐标系:
26
- *
27
- * λ1 = x1 * z2
28
- * λ2 = x2 * z1
29
- * λ3 = λ1 − λ2
30
- * λ4 = y1 * z2
31
- * λ5 = y2 * z1
32
- * λ6 = λ4 − λ5
33
- * λ7 = λ1 + λ2
34
- * λ8 = z1 * z2
35
- * λ9 = λ3^2
36
- * λ10 = λ3 * λ9
37
- * λ11 = λ8 * λ6^2 − λ7 * λ9
38
- * x3 = λ3 * λ11
39
- * y3 = λ6 * (λ9 * λ1 − λ11) − λ4 * λ10
40
- * z3 = λ10 * λ8
41
- */
42
- add(b: any): any;
43
- /**
44
- * 自加
45
- *
46
- * 标准射影坐标系:
47
- *
48
- * λ1 = 3 * x1^2 + a * z1^2
49
- * λ2 = 2 * y1 * z1
50
- * λ3 = y1^2
51
- * λ4 = λ3 * x1 * z1
52
- * λ5 = λ2^2
53
- * λ6 = λ1^2 − 8 * λ4
54
- * x3 = λ2 * λ6
55
- * y3 = λ1 * (4 * λ4 − λ6) − 2 * λ5 * λ3
56
- * z3 = λ2 * λ5
57
- */
58
- twice(): any;
59
- /**
60
- * 倍点计算
61
- */
62
- multiply(k: any): any;
63
- }
64
- /**
65
- * 椭圆曲线 y^2 = x^3 + ax + b
66
- */
67
- export class ECCurveFp {
68
- constructor(q: any, a: any, b: any);
69
- q: any;
70
- a: ECFieldElementFp;
71
- b: ECFieldElementFp;
72
- infinity: ECPointFp;
73
- /**
74
- * 判断两个椭圆曲线是否相等
75
- */
76
- equals(other: any): any;
77
- /**
78
- * 生成椭圆曲线域元素
79
- */
80
- fromBigInteger(x: any): ECFieldElementFp;
81
- /**
82
- * 解析 16 进制串为椭圆曲线点
83
- */
84
- decodePointHex(s: any): ECPointFp | null;
85
- }
86
- /**
87
- * 椭圆曲线域元素
88
- */
89
- declare class ECFieldElementFp {
90
- constructor(q: any, x: any);
91
- x: any;
92
- q: any;
93
- /**
94
- * 判断相等
95
- */
96
- equals(other: any): any;
97
- /**
98
- * 返回具体数值
99
- */
100
- toBigInteger(): any;
101
- /**
102
- * 取反
103
- */
104
- negate(): ECFieldElementFp;
105
- /**
106
- * 相加
107
- */
108
- add(b: any): ECFieldElementFp;
109
- /**
110
- * 相减
111
- */
112
- subtract(b: any): ECFieldElementFp;
113
- /**
114
- * 相乘
115
- */
116
- multiply(b: any): ECFieldElementFp;
117
- /**
118
- * 相除
119
- */
120
- divide(b: any): ECFieldElementFp;
121
- /**
122
- * 平方
123
- */
124
- square(): ECFieldElementFp;
125
- }
126
- export {};
@@ -1,312 +0,0 @@
1
- import * as jsbn from './jsbn.mjs';
2
-
3
- const { BigInteger } = jsbn;
4
- /**
5
- * thanks for Tom Wu : http://www-cs-students.stanford.edu/~tjw/jsbn/
6
- *
7
- * Basic Javascript Elliptic Curve implementation
8
- * Ported loosely from BouncyCastle's Java EC code
9
- * Only Fp curves implemented for now
10
- */
11
- const TWO = new BigInteger("2");
12
- const THREE = new BigInteger("3");
13
- /**
14
- * 椭圆曲线域元素
15
- */
16
- class ECFieldElementFp {
17
- constructor(q, x) {
18
- this.x = x;
19
- this.q = q;
20
- // TODO if (x.compareTo(q) >= 0) error
21
- }
22
- /**
23
- * 判断相等
24
- */
25
- equals(other) {
26
- if (other === this)
27
- return true;
28
- return this.q.equals(other.q) && this.x.equals(other.x);
29
- }
30
- /**
31
- * 返回具体数值
32
- */
33
- toBigInteger() {
34
- return this.x;
35
- }
36
- /**
37
- * 取反
38
- */
39
- negate() {
40
- return new ECFieldElementFp(this.q, this.x.negate().mod(this.q));
41
- }
42
- /**
43
- * 相加
44
- */
45
- add(b) {
46
- return new ECFieldElementFp(this.q, this.x.add(b.toBigInteger()).mod(this.q));
47
- }
48
- /**
49
- * 相减
50
- */
51
- subtract(b) {
52
- return new ECFieldElementFp(this.q, this.x.subtract(b.toBigInteger()).mod(this.q));
53
- }
54
- /**
55
- * 相乘
56
- */
57
- multiply(b) {
58
- return new ECFieldElementFp(this.q, this.x.multiply(b.toBigInteger()).mod(this.q));
59
- }
60
- /**
61
- * 相除
62
- */
63
- divide(b) {
64
- return new ECFieldElementFp(this.q, this.x.multiply(b.toBigInteger().modInverse(this.q)).mod(this.q));
65
- }
66
- /**
67
- * 平方
68
- */
69
- square() {
70
- return new ECFieldElementFp(this.q, this.x.square().mod(this.q));
71
- }
72
- }
73
- class ECPointFp {
74
- constructor(curve, x, y, z) {
75
- this.curve = curve;
76
- this.x = x;
77
- this.y = y;
78
- // 标准射影坐标系:zinv == null 或 z * zinv == 1
79
- this.z = z == null ? BigInteger.ONE : z;
80
- this.zinv = null;
81
- // TODO: compression flag
82
- }
83
- getX() {
84
- if (this.zinv === null)
85
- this.zinv = this.z.modInverse(this.curve.q);
86
- return this.curve.fromBigInteger(this.x.toBigInteger().multiply(this.zinv).mod(this.curve.q));
87
- }
88
- getY() {
89
- if (this.zinv === null)
90
- this.zinv = this.z.modInverse(this.curve.q);
91
- return this.curve.fromBigInteger(this.y.toBigInteger().multiply(this.zinv).mod(this.curve.q));
92
- }
93
- /**
94
- * 判断相等
95
- */
96
- equals(other) {
97
- if (other === this)
98
- return true;
99
- if (this.isInfinity())
100
- return other.isInfinity();
101
- if (other.isInfinity())
102
- return this.isInfinity();
103
- // u = y2 * z1 - y1 * z2
104
- const u = other.y
105
- .toBigInteger()
106
- .multiply(this.z)
107
- .subtract(this.y.toBigInteger().multiply(other.z))
108
- .mod(this.curve.q);
109
- if (!u.equals(BigInteger.ZERO))
110
- return false;
111
- // v = x2 * z1 - x1 * z2
112
- const v = other.x
113
- .toBigInteger()
114
- .multiply(this.z)
115
- .subtract(this.x.toBigInteger().multiply(other.z))
116
- .mod(this.curve.q);
117
- return v.equals(BigInteger.ZERO);
118
- }
119
- /**
120
- * 是否是无穷远点
121
- */
122
- isInfinity() {
123
- if (this.x === null && this.y === null)
124
- return true;
125
- return this.z.equals(BigInteger.ZERO) && !this.y.toBigInteger().equals(BigInteger.ZERO);
126
- }
127
- /**
128
- * 取反,x 轴对称点
129
- */
130
- negate() {
131
- return new ECPointFp(this.curve, this.x, this.y.negate(), this.z);
132
- }
133
- /**
134
- * 相加
135
- *
136
- * 标准射影坐标系:
137
- *
138
- * λ1 = x1 * z2
139
- * λ2 = x2 * z1
140
- * λ3 = λ1 − λ2
141
- * λ4 = y1 * z2
142
- * λ5 = y2 * z1
143
- * λ6 = λ4 − λ5
144
- * λ7 = λ1 + λ2
145
- * λ8 = z1 * z2
146
- * λ9 = λ3^2
147
- * λ10 = λ3 * λ9
148
- * λ11 = λ8 * λ6^2 − λ7 * λ9
149
- * x3 = λ3 * λ11
150
- * y3 = λ6 * (λ9 * λ1 − λ11) − λ4 * λ10
151
- * z3 = λ10 * λ8
152
- */
153
- add(b) {
154
- if (this.isInfinity())
155
- return b;
156
- if (b.isInfinity())
157
- return this;
158
- const x1 = this.x.toBigInteger();
159
- const y1 = this.y.toBigInteger();
160
- const z1 = this.z;
161
- const x2 = b.x.toBigInteger();
162
- const y2 = b.y.toBigInteger();
163
- const z2 = b.z;
164
- const q = this.curve.q;
165
- const w1 = x1.multiply(z2).mod(q);
166
- const w2 = x2.multiply(z1).mod(q);
167
- const w3 = w1.subtract(w2);
168
- const w4 = y1.multiply(z2).mod(q);
169
- const w5 = y2.multiply(z1).mod(q);
170
- const w6 = w4.subtract(w5);
171
- if (BigInteger.ZERO.equals(w3)) {
172
- if (BigInteger.ZERO.equals(w6)) {
173
- return this.twice(); // this == b,计算自加
174
- }
175
- return this.curve.infinity; // this == -b,则返回无穷远点
176
- }
177
- const w7 = w1.add(w2);
178
- const w8 = z1.multiply(z2).mod(q);
179
- const w9 = w3.square().mod(q);
180
- const w10 = w3.multiply(w9).mod(q);
181
- const w11 = w8.multiply(w6.square()).subtract(w7.multiply(w9)).mod(q);
182
- const x3 = w3.multiply(w11).mod(q);
183
- const y3 = w6.multiply(w9.multiply(w1).subtract(w11)).subtract(w4.multiply(w10)).mod(q);
184
- const z3 = w10.multiply(w8).mod(q);
185
- return new ECPointFp(this.curve, this.curve.fromBigInteger(x3), this.curve.fromBigInteger(y3), z3);
186
- }
187
- /**
188
- * 自加
189
- *
190
- * 标准射影坐标系:
191
- *
192
- * λ1 = 3 * x1^2 + a * z1^2
193
- * λ2 = 2 * y1 * z1
194
- * λ3 = y1^2
195
- * λ4 = λ3 * x1 * z1
196
- * λ5 = λ2^2
197
- * λ6 = λ1^2 − 8 * λ4
198
- * x3 = λ2 * λ6
199
- * y3 = λ1 * (4 * λ4 − λ6) − 2 * λ5 * λ3
200
- * z3 = λ2 * λ5
201
- */
202
- twice() {
203
- if (this.isInfinity())
204
- return this;
205
- if (!this.y.toBigInteger().signum())
206
- return this.curve.infinity;
207
- const x1 = this.x.toBigInteger();
208
- const y1 = this.y.toBigInteger();
209
- const z1 = this.z;
210
- const q = this.curve.q;
211
- const a = this.curve.a.toBigInteger();
212
- const w1 = x1.square().multiply(THREE).add(a.multiply(z1.square())).mod(q);
213
- const w2 = y1.shiftLeft(1).multiply(z1).mod(q);
214
- const w3 = y1.square().mod(q);
215
- const w4 = w3.multiply(x1).multiply(z1).mod(q);
216
- const w5 = w2.square().mod(q);
217
- const w6 = w1.square().subtract(w4.shiftLeft(3)).mod(q);
218
- const x3 = w2.multiply(w6).mod(q);
219
- const y3 = w1.multiply(w4.shiftLeft(2).subtract(w6)).subtract(w5.shiftLeft(1).multiply(w3)).mod(q);
220
- const z3 = w2.multiply(w5).mod(q);
221
- return new ECPointFp(this.curve, this.curve.fromBigInteger(x3), this.curve.fromBigInteger(y3), z3);
222
- }
223
- /**
224
- * 倍点计算
225
- */
226
- multiply(k) {
227
- if (this.isInfinity())
228
- return this;
229
- if (!k.signum())
230
- return this.curve.infinity;
231
- // 使用加减法
232
- const k3 = k.multiply(THREE);
233
- const neg = this.negate();
234
- let Q = this;
235
- for (let i = k3.bitLength() - 2; i > 0; i--) {
236
- Q = Q.twice();
237
- const k3Bit = k3.testBit(i);
238
- const kBit = k.testBit(i);
239
- if (k3Bit !== kBit) {
240
- Q = Q.add(k3Bit ? this : neg);
241
- }
242
- }
243
- return Q;
244
- }
245
- }
246
- /**
247
- * 椭圆曲线 y^2 = x^3 + ax + b
248
- */
249
- class ECCurveFp {
250
- constructor(q, a, b) {
251
- this.q = q;
252
- this.a = this.fromBigInteger(a);
253
- this.b = this.fromBigInteger(b);
254
- this.infinity = new ECPointFp(this, null, null); // 无穷远点
255
- }
256
- /**
257
- * 判断两个椭圆曲线是否相等
258
- */
259
- equals(other) {
260
- if (other === this)
261
- return true;
262
- return this.q.equals(other.q) && this.a.equals(other.a) && this.b.equals(other.b);
263
- }
264
- /**
265
- * 生成椭圆曲线域元素
266
- */
267
- fromBigInteger(x) {
268
- return new ECFieldElementFp(this.q, x);
269
- }
270
- /**
271
- * 解析 16 进制串为椭圆曲线点
272
- */
273
- decodePointHex(s) {
274
- switch (parseInt(s.substr(0, 2), 16)) {
275
- // 第一个字节
276
- case 0:
277
- return this.infinity;
278
- case 2:
279
- case 3:
280
- // 压缩
281
- const x = this.fromBigInteger(new BigInteger(s.substr(2), 16));
282
- // 对 p ≡ 3 (mod4),即存在正整数 u,使得 p = 4u + 3
283
- // 计算 y = (√ (x^3 + ax + b) % p)^(u + 1) modp
284
- let y = this.fromBigInteger(x
285
- .multiply(x.square())
286
- .add(x.multiply(this.a))
287
- .add(this.b)
288
- .toBigInteger()
289
- .modPow(this.q.divide(new BigInteger("4")).add(BigInteger.ONE), this.q));
290
- // 算出结果 2 进制最后 1 位不等于第 1 个字节减 2 则取反
291
- if (!y
292
- .toBigInteger()
293
- .mod(TWO)
294
- .equals(new BigInteger(s.substr(0, 2), 16).subtract(TWO))) {
295
- y = y.negate();
296
- }
297
- return new ECPointFp(this, x, y);
298
- case 4:
299
- case 6:
300
- case 7:
301
- const len = (s.length - 2) / 2;
302
- const xHex = s.substr(2, len);
303
- const yHex = s.substr(len + 2, len);
304
- return new ECPointFp(this, this.fromBigInteger(new BigInteger(xHex, 16)), this.fromBigInteger(new BigInteger(yHex, 16)));
305
- default:
306
- // 不支持
307
- return null;
308
- }
309
- }
310
- }
311
-
312
- export { ECCurveFp, ECPointFp };