sm-crypto-2cfdc71b.js 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  1. import{j as t}from"./jsbn-6a317af9.js";import{g as e}from"./@turf-e5dd68ad.js";
  2. /* eslint-disable class-methods-use-this */const{BigInteger:n}=t;class r{constructor(){this.tlv=null,this.t="00",this.l="00",this.v=""}
  3. /**
  4. * 获取 der 编码比特流16进制串
  5. */getEncodedHex(){return this.tlv||(this.v=this.getValue(),this.l=this.getLength(),this.tlv=this.t+this.l+this.v),this.tlv}getLength(){const t=this.v.length/2;// 字节数
  6. let e=t.toString(16);// 补齐到整字节
  7. if(e.length%2==1&&(e="0"+e),t<128)
  8. // 短格式,以 0 开头
  9. return e;// 1(1位) + 真正的长度占用字节数(7位) + 真正的长度
  10. return(128+e.length/2).toString(16)+e}getValue(){return""}}class i extends r{constructor(t){super(),this.t="02",// 整型标签说明
  11. t&&(this.v=function(t){let e=t.toString(16);if("-"!==e[0])
  12. // 正数
  13. e.length%2==1?e="0"+e:e.match(/^[0-7]/)||(e="00"+e);// 非0开头,则补一个全0字节
  14. else{
  15. // 负数
  16. e=e.substr(1);let r=e.length;r%2==1?r+=1:e.match(/^[0-7]/)||(r+=2);// 非0开头,则补一个全0字节
  17. let i="";for(let t=0;t<r;t++)i+="f";i=new n(i,16),
  18. // 对绝对值取反,加1
  19. e=i.xor(t).add(n.ONE),e=e.toString(16).replace(/^-/,"")}return e}(t))}getValue(){return this.v}}class s extends r{constructor(t){super(),this.t="30",// 序列标签说明
  20. this.asn1Array=t}getValue(){return this.v=this.asn1Array.map((t=>t.getEncodedHex())).join(""),this.v}}
  21. /**
  22. * 获取 l 占用字节数
  23. */function o(t,e){return+t[e+2]<8?1:128&+t.substr(e+2,2);// l 以0开头,则表示短格式,只占一个字节
  24. }
  25. /**
  26. * 获取 l
  27. */function u(t,e){
  28. // 获取 l
  29. const r=o(t,e),i=t.substr(e+2,2*r);if(!i)return-1;return(+i[0]<8?new n(i,16):new n(i.substr(2),16)).intValue()}
  30. /**
  31. * 获取 v 的位置
  32. */function l(t,e){return e+2*(o(t,e)+1)}var c={
  33. /**
  34. * ASN.1 der 编码,针对 sm2 签名
  35. */
  36. encodeDer(t,e){const n=new i(t),r=new i(e);return new s([n,r]).getEncodedHex()},
  37. /**
  38. * 解析 ASN.1 der,针对 sm2 验签
  39. */
  40. decodeDer(t){
  41. // 结构:
  42. // input = | tSeq | lSeq | vSeq |
  43. // vSeq = | tR | lR | vR | tS | lS | vS |
  44. const e=l(t,0),r=l(t,e),i=u(t,e),s=t.substr(r,2*i),o=r+s.length,c=l(t,o),h=u(t,o),a=t.substr(c,2*h);return{r:new n(s,16),s:new n(a,16)}}};
  45. /* eslint-disable no-case-declarations, max-len */const{BigInteger:h}=t,a=new h("2"),g=new h("3");
  46. /**
  47. * thanks for Tom Wu : http://www-cs-students.stanford.edu/~tjw/jsbn/
  48. *
  49. * Basic Javascript Elliptic Curve implementation
  50. * Ported loosely from BouncyCastle's Java EC code
  51. * Only Fp curves implemented for now
  52. */
  53. /**
  54. * 椭圆曲线域元素
  55. */
  56. class f{constructor(t,e){this.x=e,this.q=t}
  57. /**
  58. * 判断相等
  59. */equals(t){return t===this||this.q.equals(t.q)&&this.x.equals(t.x)}
  60. /**
  61. * 返回具体数值
  62. */toBigInteger(){return this.x}
  63. /**
  64. * 取反
  65. */negate(){return new f(this.q,this.x.negate().mod(this.q))}
  66. /**
  67. * 相加
  68. */add(t){return new f(this.q,this.x.add(t.toBigInteger()).mod(this.q))}
  69. /**
  70. * 相减
  71. */subtract(t){return new f(this.q,this.x.subtract(t.toBigInteger()).mod(this.q))}
  72. /**
  73. * 相乘
  74. */multiply(t){return new f(this.q,this.x.multiply(t.toBigInteger()).mod(this.q))}
  75. /**
  76. * 相除
  77. */divide(t){return new f(this.q,this.x.multiply(t.toBigInteger().modInverse(this.q)).mod(this.q))}
  78. /**
  79. * 平方
  80. */square(){return new f(this.q,this.x.square().mod(this.q))}}class d{constructor(t,e,n,r){this.curve=t,this.x=e,this.y=n,
  81. // 标准射影坐标系:zinv == null 或 z * zinv == 1
  82. this.z=null==r?h.ONE:r,this.zinv=null}getX(){return null===this.zinv&&(this.zinv=this.z.modInverse(this.curve.q)),this.curve.fromBigInteger(this.x.toBigInteger().multiply(this.zinv).mod(this.curve.q))}getY(){return null===this.zinv&&(this.zinv=this.z.modInverse(this.curve.q)),this.curve.fromBigInteger(this.y.toBigInteger().multiply(this.zinv).mod(this.curve.q))}
  83. /**
  84. * 判断相等
  85. */equals(t){if(t===this)return!0;if(this.isInfinity())return t.isInfinity();if(t.isInfinity())return this.isInfinity();
  86. // u = y2 * z1 - y1 * z2
  87. if(!t.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(t.z)).mod(this.curve.q).equals(h.ZERO))return!1;
  88. // v = x2 * z1 - x1 * z2
  89. return t.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(t.z)).mod(this.curve.q).equals(h.ZERO)}
  90. /**
  91. * 是否是无穷远点
  92. */isInfinity(){return null===this.x&&null===this.y||this.z.equals(h.ZERO)&&!this.y.toBigInteger().equals(h.ZERO)}
  93. /**
  94. * 取反,x 轴对称点
  95. */negate(){return new d(this.curve,this.x,this.y.negate(),this.z)}
  96. /**
  97. * 相加
  98. *
  99. * 标准射影坐标系:
  100. *
  101. * λ1 = x1 * z2
  102. * λ2 = x2 * z1
  103. * λ3 = λ1 − λ2
  104. * λ4 = y1 * z2
  105. * λ5 = y2 * z1
  106. * λ6 = λ4 − λ5
  107. * λ7 = λ1 + λ2
  108. * λ8 = z1 * z2
  109. * λ9 = λ3^2
  110. * λ10 = λ3 * λ9
  111. * λ11 = λ8 * λ6^2 − λ7 * λ9
  112. * x3 = λ3 * λ11
  113. * y3 = λ6 * (λ9 * λ1 − λ11) − λ4 * λ10
  114. * z3 = λ10 * λ8
  115. */add(t){if(this.isInfinity())return t;if(t.isInfinity())return this;const e=this.x.toBigInteger(),n=this.y.toBigInteger(),r=this.z,i=t.x.toBigInteger(),s=t.y.toBigInteger(),o=t.z,u=this.curve.q,l=e.multiply(o).mod(u),c=i.multiply(r).mod(u),a=l.subtract(c),g=n.multiply(o).mod(u),f=s.multiply(r).mod(u),F=g.subtract(f);if(h.ZERO.equals(a))return h.ZERO.equals(F)?this.twice():this.curve.infinity;const y=l.add(c),p=r.multiply(o).mod(u),m=a.square().mod(u),w=a.multiply(m).mod(u),v=p.multiply(F.square()).subtract(y.multiply(m)).mod(u),x=a.multiply(v).mod(u),I=F.multiply(m.multiply(l).subtract(v)).subtract(g.multiply(w)).mod(u),b=w.multiply(p).mod(u);return new d(this.curve,this.curve.fromBigInteger(x),this.curve.fromBigInteger(I),b)}
  116. /**
  117. * 自加
  118. *
  119. * 标准射影坐标系:
  120. *
  121. * λ1 = 3 * x1^2 + a * z1^2
  122. * λ2 = 2 * y1 * z1
  123. * λ3 = y1^2
  124. * λ4 = λ3 * x1 * z1
  125. * λ5 = λ2^2
  126. * λ6 = λ1^2 − 8 * λ4
  127. * x3 = λ2 * λ6
  128. * y3 = λ1 * (4 * λ4 − λ6) − 2 * λ5 * λ3
  129. * z3 = λ2 * λ5
  130. */twice(){if(this.isInfinity())return this;if(!this.y.toBigInteger().signum())return this.curve.infinity;const t=this.x.toBigInteger(),e=this.y.toBigInteger(),n=this.z,r=this.curve.q,i=this.curve.a.toBigInteger(),s=t.square().multiply(g).add(i.multiply(n.square())).mod(r),o=e.shiftLeft(1).multiply(n).mod(r),u=e.square().mod(r),l=u.multiply(t).multiply(n).mod(r),c=o.square().mod(r),h=s.square().subtract(l.shiftLeft(3)).mod(r),a=o.multiply(h).mod(r),f=s.multiply(l.shiftLeft(2).subtract(h)).subtract(c.shiftLeft(1).multiply(u)).mod(r),F=o.multiply(c).mod(r);return new d(this.curve,this.curve.fromBigInteger(a),this.curve.fromBigInteger(f),F)}
  131. /**
  132. * 倍点计算
  133. */multiply(t){if(this.isInfinity())return this;if(!t.signum())return this.curve.infinity;
  134. // 使用加减法
  135. const e=t.multiply(g),n=this.negate();let r=this;for(let i=e.bitLength()-2;i>0;i--){r=r.twice();const s=e.testBit(i);s!==t.testBit(i)&&(r=r.add(s?this:n))}return r}}
  136. /**
  137. * 椭圆曲线 y^2 = x^3 + ax + b
  138. */var F={ECPointFp:d,ECCurveFp:class{constructor(t,e,n){this.q=t,this.a=this.fromBigInteger(e),this.b=this.fromBigInteger(n),this.infinity=new d(this,null,null)}
  139. /**
  140. * 判断两个椭圆曲线是否相等
  141. */equals(t){return t===this||this.q.equals(t.q)&&this.a.equals(t.a)&&this.b.equals(t.b)}
  142. /**
  143. * 生成椭圆曲线域元素
  144. */fromBigInteger(t){return new f(this.q,t)}
  145. /**
  146. * 解析 16 进制串为椭圆曲线点
  147. */decodePointHex(t){switch(parseInt(t.substr(0,2),16)){
  148. // 第一个字节
  149. case 0:return this.infinity;case 2:case 3:
  150. // 压缩
  151. const e=this.fromBigInteger(new h(t.substr(2),16));
  152. // 对 p ≡ 3 (mod4),即存在正整数 u,使得 p = 4u + 3
  153. // 计算 y = (√ (x^3 + ax + b) % p)^(u + 1) modp
  154. let n=this.fromBigInteger(e.multiply(e.square()).add(e.multiply(this.a)).add(this.b).toBigInteger().modPow(this.q.divide(new h("4")).add(h.ONE),this.q));
  155. // 算出结果 2 进制最后 1 位不等于第 1 个字节减 2 则取反
  156. return n.toBigInteger().mod(a).equals(new h(t.substr(0,2),16).subtract(a))||(n=n.negate()),new d(this,e,n);case 4:case 6:case 7:const r=(t.length-2)/2,i=t.substr(2,r),s=t.substr(r+2,r);return new d(this,this.fromBigInteger(new h(i,16)),this.fromBigInteger(new h(s,16)));default:
  157. // 不支持
  158. return null}}}};
  159. /* eslint-disable no-bitwise, no-mixed-operators, no-use-before-define, max-len */const{BigInteger:y,SecureRandom:p}=t,{ECCurveFp:m}=F,w=new p,{curve:v,G:x,n:I}=b();
  160. /**
  161. * 生成ecparam
  162. */
  163. function b(){
  164. // 椭圆曲线
  165. const t=new y("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF",16),e=new y("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC",16),n=new y("28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93",16),r=new m(t,e,n),i=r.decodePointHex("0432C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0");return{curve:r,G:i,n:new y("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123",16)}}
  166. /**
  167. * 生成密钥对:publicKey = privateKey * G
  168. */
  169. /**
  170. * 补全16进制字符串
  171. */
  172. function B(t,e){return t.length>=e?t:new Array(e-t.length+1).join("0")+t}
  173. /**
  174. * 转成16进制串
  175. */var q={getGlobalCurve:
  176. /**
  177. * 获取公共椭圆曲线
  178. */
  179. function(){return v},generateEcparam:b,generateKeyPairHex:function(t,e,n){const r=(t?new y(t,e,n):new y(I.bitLength(),w)).mod(I.subtract(y.ONE)).add(y.ONE),i=B(r.toString(16),64),s=x.multiply(r);return{privateKey:i,publicKey:"04"+B(s.getX().toBigInteger().toString(16),64)+B(s.getY().toBigInteger().toString(16),64)}}
  180. /**
  181. * 生成压缩公钥
  182. */,compressPublicKeyHex:function(t){if(130!==t.length)throw new Error("Invalid public key to compress");const e=(t.length-2)/2,n=t.substr(2,e);let r="03";return new y(t.substr(e+2,e),16).mod(new y("2")).equals(y.ZERO)&&(r="02"),r+n}
  183. /**
  184. * utf8串转16进制串
  185. */,utf8ToHex:function(t){const e=(t=unescape(encodeURIComponent(t))).length,n=[];
  186. // 转换到字数组
  187. for(let i=0;i<e;i++)n[i>>>2]|=(255&t.charCodeAt(i))<<24-i%4*8;
  188. // 转换到16进制
  189. const r=[];for(let i=0;i<e;i++){const t=n[i>>>2]>>>24-i%4*8&255;r.push((t>>>4).toString(16)),r.push((15&t).toString(16))}return r.join("")},leftPad:B,arrayToHex:function(t){return t.map((t=>1===(t=t.toString(16)).length?"0"+t:t)).join("")}
  190. /**
  191. * 转成utf8串
  192. */,arrayToUtf8:function(t){const e=[];let n=0;for(let i=0;i<2*t.length;i+=2)e[i>>>3]|=parseInt(t[n],10)<<24-i%8*4,n++;try{const n=[];for(let r=0;r<t.length;r++){const t=e[r>>>2]>>>24-r%4*8&255;n.push(String.fromCharCode(t))}return decodeURIComponent(escape(n.join("")))}catch(r){throw new Error("Malformed UTF-8 data")}}
  193. /**
  194. * 转成字节数组
  195. */,hexToArray:function(t){const e=[];let n=t.length;n%2!=0&&(t=B(t,n+1)),n=t.length;for(let r=0;r<n;r+=2)e.push(parseInt(t.substr(r,2),16));return e}
  196. /**
  197. * 验证公钥是否为椭圆曲线上的点
  198. */,verifyPublicKey:function(t){const e=v.decodePointHex(t);if(!e)return!1;const n=e.getX();
  199. // 验证 y^2 是否等于 x^3 + ax + b
  200. return e.getY().square().equals(n.multiply(n.square()).add(n.multiply(v.a)).add(v.b))}
  201. /**
  202. * 验证公钥是否等价,等价返回true
  203. */,comparePublicKeyHex:function(t,e){const n=v.decodePointHex(t);if(!n)return!1;const r=v.decodePointHex(e);return!!r&&n.equals(r)}};
  204. // 消息扩展
  205. const P=new Uint32Array(68),E=new Uint32Array(64);// W'
  206. /**
  207. * 循环左移
  208. */
  209. function A(t,e){const n=31&e;return t<<n|t>>>32-n}
  210. /**
  211. * 二进制异或运算
  212. */function H(t,e){const n=[];for(let r=t.length-1;r>=0;r--)n[r]=255&(t[r]^e[r]);return n}
  213. /**
  214. * 压缩函数中的置换函数 P0(X) = X xor (X <<< 9) xor (X <<< 17)
  215. */function C(t){return t^A(t,9)^A(t,17)}
  216. /**
  217. * 消息扩展中的置换函数 P1(X) = X xor (X <<< 15) xor (X <<< 23)
  218. */
  219. /**
  220. * sm3 本体
  221. */
  222. function S(t){let e=8*t.length,n=e%512;
  223. // k 是满足 len + 1 + k = 448mod512 的最小的非负整数
  224. // 如果 448 <= (512 % len) < 512,需要多补充 (len % 448) 比特'0'以满足总比特长度为512的倍数
  225. n=n>=448?512-n%448-1:448-n-1;
  226. // 填充
  227. const r=new Array((n-7)/8),i=new Array(8);for(let a=0,g=r.length;a<g;a++)r[a]=0;for(let a=0,g=i.length;a<g;a++)i[a]=0;e=e.toString(2);for(let a=7;a>=0;a--)if(e.length>8){const t=e.length-8;i[a]=parseInt(e.substr(t),2),e=e.substr(0,t)}else e.length>0&&(i[a]=parseInt(e,2),e="");const s=new Uint8Array([...t,128,...r,...i]),o=new DataView(s.buffer,0),u=s.length/64,l=new Uint32Array([1937774191,1226093241,388252375,3666478592,2842636476,372324522,3817729613,2969243214]);for(let a=0;a<u;a++){P.fill(0),E.fill(0);
  228. // 将消息分组B划分为 16 个字 W0, W1,……,W15
  229. const t=16*a;for(let l=0;l<16;l++)P[l]=o.getUint32(4*(t+l),!1);
  230. // 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]
  231. for(let o=16;o<68;o++)P[o]=(c=P[o-16]^P[o-9]^A(P[o-3],15))^A(c,15)^A(c,23)^A(P[o-13],7)^P[o-6];
  232. // W′0 ~ W′63:W′[j] = W[j] xor W[j+4]
  233. for(let o=0;o<64;o++)E[o]=P[o]^P[o+4];
  234. // 压缩
  235. const e=2043430169,n=2055708042;
  236. // 字寄存器
  237. let r,i,s,u,h,g=l[0],f=l[1],d=l[2],F=l[3],y=l[4],p=l[5],m=l[6],w=l[7];for(let o=0;o<64;o++)h=o>=0&&o<=15?e:n,r=A(A(g,12)+y+A(h,o),7),i=r^A(g,12),s=(o>=0&&o<=15?g^f^d:g&f|g&d|f&d)+F+i+E[o],u=(o>=0&&o<=15?y^p^m:y&p|~y&m)+w+r+P[o],F=d,d=A(f,9),f=g,g=s,w=m,m=A(p,19),p=y,y=C(u);l[0]^=g,l[1]^=f,l[2]^=d,l[3]^=F,l[4]^=y,l[5]^=p,l[6]^=m,l[7]^=w}
  238. // 转回 uint8
  239. var c;const h=[];for(let a=0,g=l.length;a<g;a++){const t=l[a];h.push((4278190080&t)>>>24,(16711680&t)>>>16,(65280&t)>>>8,255&t)}return h}
  240. /**
  241. * hmac 实现
  242. */const T=new Uint8Array(64),K=new Uint8Array(64);for(let lt=0;lt<64;lt++)T[lt]=54,K[lt]=92;var R={sm3:S,hmac:function(t,e){for(
  243. // 密钥填充
  244. e.length>64&&(e=S(e));e.length<64;)e.push(0);const n=H(e,T),r=H(e,K),i=S([...n,...t]);return S([...r,...i])}};
  245. /* eslint-disable no-use-before-define */const{BigInteger:z}=t,{encodeDer:D,decodeDer:O}=c,j=q,U=R.sm3,{G:k,curve:X,n:Z}=j.generateEcparam();
  246. /**
  247. * sm3杂凑算法
  248. */
  249. function L(t,e,n="1234567812345678"){
  250. // z = hash(entl || userId || a || b || gx || gy || px || py)
  251. n=j.utf8ToHex(n);const r=j.leftPad(k.curve.a.toBigInteger().toRadix(16),64),i=j.leftPad(k.curve.b.toBigInteger().toRadix(16),64),s=j.leftPad(k.getX().toBigInteger().toRadix(16),64),o=j.leftPad(k.getY().toBigInteger().toRadix(16),64);let u,l;if(128===e.length)u=e.substr(0,64),l=e.substr(64,64);else{const t=k.curve.decodePointHex(e);u=j.leftPad(t.getX().toBigInteger().toRadix(16),64),l=j.leftPad(t.getY().toBigInteger().toRadix(16),64)}const c=j.hexToArray(n+r+i+s+o+u+l),h=4*n.length;c.unshift(255&h),c.unshift(h>>8&255);const a=U(c);
  252. // e = hash(z || msg)
  253. return j.arrayToHex(U(a.concat(j.hexToArray(t))))}
  254. /**
  255. * 计算公钥
  256. */function Y(t){const e=k.multiply(new z(t,16));return"04"+j.leftPad(e.getX().toBigInteger().toString(16),64)+j.leftPad(e.getY().toBigInteger().toString(16),64)}
  257. /**
  258. * 获取椭圆曲线点
  259. */function V(){const t=j.generateKeyPairHex(),e=X.decodePointHex(t.publicKey);return t.k=new z(t.privateKey,16),t.x1=e.getX().toBigInteger(),t}var G={generateKeyPairHex:j.generateKeyPairHex,compressPublicKeyHex:j.compressPublicKeyHex,comparePublicKeyHex:j.comparePublicKeyHex,doEncrypt:
  260. /**
  261. * 加密
  262. */
  263. function(t,e,n=1){t="string"==typeof t?j.hexToArray(j.utf8ToHex(t)):Array.prototype.slice.call(t),e=j.getGlobalCurve().decodePointHex(e);// 先将公钥转成点
  264. const r=j.generateKeyPairHex(),i=new z(r.privateKey,16);// 随机数 k
  265. // c1 = k * G
  266. let s=r.publicKey;s.length>128&&(s=s.substr(s.length-128));
  267. // (x2, y2) = k * publicKey
  268. const o=e.multiply(i),u=j.hexToArray(j.leftPad(o.getX().toBigInteger().toRadix(16),64)),l=j.hexToArray(j.leftPad(o.getY().toBigInteger().toRadix(16),64)),c=j.arrayToHex(U([].concat(u,t,l)));let h=1,a=0,g=[];// 256 位
  269. const f=[].concat(u,l),d=()=>{
  270. // (1) Hai = hash(z || ct)
  271. // (2) ct++
  272. g=U([...f,h>>24&255,h>>16&255,h>>8&255,255&h]),h++,a=0};d();// 先生成 Ha1
  273. for(let y=0,p=t.length;y<p;y++)
  274. // t = Ha1 || Ha2 || Ha3 || Ha4
  275. a===g.length&&d(),
  276. // c2 = msg ^ t
  277. t[y]^=255&g[a++];const F=j.arrayToHex(t);return 0===n?s+F+c:s+c+F}
  278. /**
  279. * 解密
  280. */,doDecrypt:function(t,e,n=1,{output:r="string"}={}){e=new z(e,16);let i=t.substr(128,64),s=t.substr(192);0===n&&(i=t.substr(t.length-64),s=t.substr(128,t.length-128-64));const o=j.hexToArray(s),u=j.getGlobalCurve().decodePointHex("04"+t.substr(0,128)).multiply(e),l=j.hexToArray(j.leftPad(u.getX().toBigInteger().toRadix(16),64)),c=j.hexToArray(j.leftPad(u.getY().toBigInteger().toRadix(16),64));let h=1,a=0,g=[];// 256 位
  281. const f=[].concat(l,c),d=()=>{
  282. // (1) Hai = hash(z || ct)
  283. // (2) ct++
  284. g=U([...f,h>>24&255,h>>16&255,h>>8&255,255&h]),h++,a=0};d();// 先生成 Ha1
  285. for(let F=0,y=o.length;F<y;F++)
  286. // t = Ha1 || Ha2 || Ha3 || Ha4
  287. a===g.length&&d(),
  288. // c2 = msg ^ t
  289. o[F]^=255&g[a++];
  290. // c3 = hash(x2 || msg || y2)
  291. return j.arrayToHex(U([].concat(l,o,c)))===i.toLowerCase()?"array"===r?o:j.arrayToUtf8(o):"array"===r?[]:""}
  292. /**
  293. * 签名
  294. */,doSignature:function(t,e,{pointPool:n,der:r,hash:i,publicKey:s,userId:o}={}){let u="string"==typeof t?j.utf8ToHex(t):j.arrayToHex(t);i&&(u=L(u,
  295. // sm3杂凑
  296. s=s||Y(e),o));const l=new z(e,16),c=new z(u,16);
  297. // k
  298. let h=null,a=null,g=null;do{do{let t;t=n&&n.length?n.pop():V(),h=t.k,
  299. // r = (e + x1) mod n
  300. a=c.add(t.x1).mod(Z)}while(a.equals(z.ZERO)||a.add(h).equals(Z));
  301. // s = ((1 + dA)^-1 * (k - r * dA)) mod n
  302. g=l.add(z.ONE).modInverse(Z).multiply(h.subtract(a.multiply(l))).mod(Z)}while(g.equals(z.ZERO));return r?D(a,g):j.leftPad(a.toString(16),64)+j.leftPad(g.toString(16),64);// asn.1 der 编码
  303. }
  304. /**
  305. * 验签
  306. */,doVerifySignature:function(t,e,n,{der:r,hash:i,userId:s}={}){let o,u,l="string"==typeof t?j.utf8ToHex(t):j.arrayToHex(t);if(i&&(
  307. // sm3杂凑
  308. l=L(l,n,s)),r){const t=O(e);// asn.1 der 解码
  309. o=t.r,u=t.s}else o=new z(e.substring(0,64),16),u=new z(e.substring(64),16);const c=X.decodePointHex(n),h=new z(l,16),a=o.add(u).mod(Z);if(a.equals(z.ZERO))return!1;
  310. // x1y1 = s * G + t * PA
  311. const g=k.multiply(u).add(c.multiply(a)),f=h.add(g.getX().toBigInteger()).mod(Z);
  312. // R = (e + x1) mod n
  313. return o.equals(f)},getPublicKeyFromPrivateKey:Y,getPoint:V,verifyPublicKey:j.verifyPublicKey};const{sm3:N,hmac:M}=R;
  314. /**
  315. * 补全16进制字符串
  316. */
  317. /**
  318. * 字节数组转 16 进制串
  319. */
  320. function _(t){return t.map((t=>1===(t=t.toString(16)).length?"0"+t:t)).join("")}
  321. /**
  322. * 转成字节数组
  323. */function J(t){const e=[];let n=t.length;var r,i;n%2!=0&&(i=n+1,t=(r=t).length>=i?r:new Array(i-r.length+1).join("0")+r),n=t.length;for(let s=0;s<n;s+=2)e.push(parseInt(t.substr(s,2),16));return e}
  324. /**
  325. * utf8 串转字节数组
  326. */
  327. /* eslint-disable no-bitwise, no-mixed-operators, complexity */
  328. const Q=16,W=[214,144,233,254,204,225,61,183,22,182,20,194,40,251,44,5,43,103,154,118,42,190,4,195,170,68,19,38,73,134,6,153,156,66,80,244,145,239,152,122,51,84,11,67,237,207,172,98,228,179,28,169,201,8,232,149,128,223,148,250,117,143,63,166,71,7,167,252,243,115,23,186,131,89,60,25,230,133,79,168,104,107,129,178,113,100,218,139,248,235,15,75,112,86,157,53,30,36,14,94,99,88,209,162,37,34,124,59,1,33,120,135,212,0,70,87,159,211,39,82,76,54,2,231,160,196,200,158,234,191,138,210,64,199,56,181,163,247,242,206,249,97,21,161,224,174,93,164,155,52,26,85,173,147,50,48,245,140,177,227,29,246,226,46,130,102,202,96,192,41,35,171,13,83,78,111,213,219,55,69,222,253,142,47,3,255,106,114,109,108,91,81,141,27,175,146,187,221,188,127,17,217,92,65,31,16,90,216,10,193,49,136,165,205,123,189,45,116,208,18,184,229,180,176,137,105,151,74,12,150,119,126,101,185,241,9,197,110,198,132,24,240,125,236,58,220,77,32,121,238,95,62,215,203,57,72],$=[462357,472066609,943670861,1415275113,1886879365,2358483617,2830087869,3301692121,3773296373,4228057617,404694573,876298825,1347903077,1819507329,2291111581,2762715833,3234320085,3705924337,4177462797,337322537,808926789,1280531041,1752135293,2223739545,2695343797,3166948049,3638552301,4110090761,269950501,741554753,1213159005,1684763257];
  329. /**
  330. * 16 进制串转字节数组
  331. */
  332. function tt(t){const e=[];for(let n=0,r=t.length;n<r;n+=2)e.push(parseInt(t.substr(n,2),16));return e}
  333. /**
  334. * 字节数组转 16 进制串
  335. */
  336. /**
  337. * 32 比特循环左移
  338. */
  339. function et(t,e){const n=31&e;return t<<n|t>>>32-n}
  340. /**
  341. * 非线性变换
  342. */function nt(t){return(255&W[t>>>24&255])<<24|(255&W[t>>>16&255])<<16|(255&W[t>>>8&255])<<8|255&W[255&t]}
  343. /**
  344. * 线性变换,加密/解密用
  345. */function rt(t){return t^et(t,2)^et(t,10)^et(t,18)^et(t,24)}
  346. /**
  347. * 线性变换,生成轮密钥用
  348. */function it(t){return t^et(t,13)^et(t,23)}
  349. /**
  350. * 以一组 128 比特进行加密/解密操作
  351. */function st(t,e,n){const r=new Array(4),i=new Array(4);
  352. // 字节数组转成字数组(此处 1 字 = 32 比特)
  353. for(let s=0;s<4;s++)i[0]=255&t[4*s],i[1]=255&t[4*s+1],i[2]=255&t[4*s+2],i[3]=255&t[4*s+3],r[s]=i[0]<<24|i[1]<<16|i[2]<<8|i[3];
  354. // x[i + 4] = x[i] ^ l1(byteSub(x[i + 1] ^ x[i + 2] ^ x[i + 3] ^ roundKey[i]))
  355. for(let s,o=0;o<32;o+=4)s=r[1]^r[2]^r[3]^n[o+0],r[0]^=rt(nt(s)),// x[4]
  356. s=r[2]^r[3]^r[0]^n[o+1],r[1]^=rt(nt(s)),// x[5]
  357. s=r[3]^r[0]^r[1]^n[o+2],r[2]^=rt(nt(s)),// x[6]
  358. s=r[0]^r[1]^r[2]^n[o+3],r[3]^=rt(nt(s));
  359. // 反序变换
  360. for(let s=0;s<16;s+=4)e[s]=r[3-s/4]>>>24&255,e[s+1]=r[3-s/4]>>>16&255,e[s+2]=r[3-s/4]>>>8&255,e[s+3]=255&r[3-s/4]}
  361. /**
  362. * 密钥扩展算法
  363. */function ot(t,e,n,{padding:r="pkcs#7",mode:i,iv:s=[],output:o="string"}={}){if("cbc"===i&&(
  364. // CBC 模式,默认走 ECB 模式
  365. "string"==typeof s&&(s=tt(s)),16!==s.length))
  366. // iv 不是 128 比特
  367. throw new Error("iv is invalid");
  368. // 检查 key
  369. if("string"==typeof e&&(e=tt(e)),16!==e.length)
  370. // key 不是 128 比特
  371. throw new Error("key is invalid");
  372. // 检查输入
  373. // 新增填充,sm4 是 16 个字节一个分组,所以统一走到 pkcs#7
  374. if(
  375. // 加密,输入为 utf8 串
  376. t="string"==typeof t?0!==n?
  377. /**
  378. * utf8 串转字节数组
  379. */
  380. function(t){const e=[];for(let n=0,r=t.length;n<r;n++){const r=t.codePointAt(n);if(r<=127)
  381. // 单字节,标量值:00000000 00000000 0zzzzzzz
  382. e.push(r);else if(r<=2047)
  383. // 双字节,标量值:00000000 00000yyy yyzzzzzz
  384. e.push(192|r>>>6),// 110yyyyy(0xc0-0xdf)
  385. e.push(128|63&r);else if(r<=55295||r>=57344&&r<=65535)
  386. // 三字节:标量值:00000000 xxxxyyyy yyzzzzzz
  387. e.push(224|r>>>12),// 1110xxxx(0xe0-0xef)
  388. e.push(128|r>>>6&63),// 10yyyyyy(0x80-0xbf)
  389. e.push(128|63&r);else{if(!(r>=65536&&r<=1114111))
  390. // 五、六字节,暂时不支持
  391. throw e.push(r),new Error("input is not supported");
  392. // 四字节:标量值:000wwwxx xxxxyyyy yyzzzzzz
  393. n++,e.push(240|r>>>18&28),// 11110www(0xf0-0xf7)
  394. e.push(128|r>>>12&63),// 10xxxxxx(0x80-0xbf)
  395. e.push(128|r>>>6&63),// 10yyyyyy(0x80-0xbf)
  396. e.push(128|63&r)}}return e}
  397. /**
  398. * 字节数组转 utf8 串
  399. */(t):tt(t):[...t],("pkcs#5"===r||"pkcs#7"===r)&&0!==n){const e=Q-t.length%Q;for(let n=0;n<e;n++)t.push(e)}
  400. // 生成轮密钥
  401. const u=new Array(32);!function(t,e,n){const r=new Array(4),i=new Array(4);
  402. // 字节数组转成字数组(此处 1 字 = 32 比特)
  403. for(let s=0;s<4;s++)i[0]=255&t[0+4*s],i[1]=255&t[1+4*s],i[2]=255&t[2+4*s],i[3]=255&t[3+4*s],r[s]=i[0]<<24|i[1]<<16|i[2]<<8|i[3];
  404. // 与系统参数做异或
  405. r[0]^=2746333894,r[1]^=1453994832,r[2]^=1736282519,r[3]^=2993693404;
  406. // roundKey[i] = x[i + 4] = x[i] ^ l2(byteSub(x[i + 1] ^ x[i + 2] ^ x[i + 3] ^ CK[i]))
  407. for(let s,o=0;o<32;o+=4)s=r[1]^r[2]^r[3]^$[o+0],e[o+0]=r[0]^=it(nt(s)),// x[4]
  408. s=r[2]^r[3]^r[0]^$[o+1],e[o+1]=r[1]^=it(nt(s)),// x[5]
  409. s=r[3]^r[0]^r[1]^$[o+2],e[o+2]=r[2]^=it(nt(s)),// x[6]
  410. s=r[0]^r[1]^r[2]^$[o+3],e[o+3]=r[3]^=it(nt(s));
  411. // 解密时使用反序的轮密钥
  412. if(0===n)for(let s,o=0;o<16;o++)s=e[o],e[o]=e[31-o],e[31-o]=s}(e,u,n);const l=[];let c=s,h=t.length,a=0;for(;h>=Q;){const e=t.slice(a,a+16),r=new Array(16);if("cbc"===i)for(let t=0;t<Q;t++)0!==n&&(
  413. // 加密过程在组加密前进行异或
  414. e[t]^=c[t]);st(e,r,u);for(let t=0;t<Q;t++)"cbc"===i&&0===n&&(
  415. // 解密过程在组解密后进行异或
  416. r[t]^=c[t]),l[a+t]=r[t];"cbc"===i&&(
  417. // 使用上一次输出作为加密向量
  418. c=0!==n?r:e),h-=Q,a+=Q}
  419. // 去除填充,sm4 是 16 个字节一个分组,所以统一走到 pkcs#7
  420. if(("pkcs#5"===r||"pkcs#7"===r)&&0===n){const t=l.length,e=l[t-1];for(let n=1;n<=e;n++)if(l[t-n]!==e)throw new Error("padding is invalid");l.splice(t-e,e)}
  421. // 调整输出
  422. return"array"!==o?0!==n?l.map((t=>1===(t=t.toString(16)).length?"0"+t:t)).join(""):function(t){const e=[];for(let n=0,r=t.length;n<r;n++)t[n]>=240&&t[n]<=247?(
  423. // 四字节
  424. e.push(String.fromCodePoint(((7&t[n])<<18)+((63&t[n+1])<<12)+((63&t[n+2])<<6)+(63&t[n+3]))),n+=3):t[n]>=224&&t[n]<=239?(
  425. // 三字节
  426. e.push(String.fromCodePoint(((15&t[n])<<12)+((63&t[n+1])<<6)+(63&t[n+2]))),n+=2):t[n]>=192&&t[n]<=223?(
  427. // 双字节
  428. e.push(String.fromCodePoint(((31&t[n])<<6)+(63&t[n+1]))),n++):
  429. // 单字节
  430. e.push(String.fromCodePoint(t[n]));return e.join("")}(l):l}const ut=e({sm2:G,sm3:function(t,e){if(t="string"==typeof t?function(t){const e=[];for(let n=0,r=t.length;n<r;n++){const r=t.codePointAt(n);if(r<=127)
  431. // 单字节,标量值:00000000 00000000 0zzzzzzz
  432. e.push(r);else if(r<=2047)
  433. // 双字节,标量值:00000000 00000yyy yyzzzzzz
  434. e.push(192|r>>>6),// 110yyyyy(0xc0-0xdf)
  435. e.push(128|63&r);else if(r<=55295||r>=57344&&r<=65535)
  436. // 三字节:标量值:00000000 xxxxyyyy yyzzzzzz
  437. e.push(224|r>>>12),// 1110xxxx(0xe0-0xef)
  438. e.push(128|r>>>6&63),// 10yyyyyy(0x80-0xbf)
  439. e.push(128|63&r);else{if(!(r>=65536&&r<=1114111))
  440. // 五、六字节,暂时不支持
  441. throw e.push(r),new Error("input is not supported");
  442. // 四字节:标量值:000wwwxx xxxxyyyy yyzzzzzz
  443. n++,e.push(240|r>>>18&28),// 11110www(0xf0-0xf7)
  444. e.push(128|r>>>12&63),// 10xxxxxx(0x80-0xbf)
  445. e.push(128|r>>>6&63),// 10yyyyyy(0x80-0xbf)
  446. e.push(128|63&r)}}return e}(t):Array.prototype.slice.call(t),e){if("hmac"!==(e.mode||"hmac"))throw new Error("invalid mode");let n=e.key;if(!n)throw new Error("invalid key");return n="string"==typeof n?J(n):Array.prototype.slice.call(n),_(M(t,n))}return _(N(t))},sm4:{encrypt:(t,e,n)=>ot(t,e,1,n),decrypt:(t,e,n)=>ot(t,e,0,n)}});export{ut as _};
  447. //# sourceMappingURL=sm-crypto-2cfdc71b.js.map