import{j as t}from"./jsbn-6a317af9.js";import{g as e}from"./@turf-e5dd68ad.js";
/* eslint-disable class-methods-use-this */const{BigInteger:n}=t;class r{constructor(){this.tlv=null,this.t="00",this.l="00",this.v=""}
/**
   * 获取 der 编码比特流16进制串
   */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;// 字节数
let e=t.toString(16);// 补齐到整字节
if(e.length%2==1&&(e="0"+e),t<128)
// 短格式，以 0 开头
return e;// 1(1位) + 真正的长度占用字节数(7位) + 真正的长度
return(128+e.length/2).toString(16)+e}getValue(){return""}}class i extends r{constructor(t){super(),this.t="02",// 整型标签说明
t&&(this.v=function(t){let e=t.toString(16);if("-"!==e[0])
// 正数
e.length%2==1?e="0"+e:e.match(/^[0-7]/)||(e="00"+e);// 非0开头，则补一个全0字节
else{
// 负数
e=e.substr(1);let r=e.length;r%2==1?r+=1:e.match(/^[0-7]/)||(r+=2);// 非0开头，则补一个全0字节
let i="";for(let t=0;t<r;t++)i+="f";i=new n(i,16),
// 对绝对值取反，加1
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",// 序列标签说明
this.asn1Array=t}getValue(){return this.v=this.asn1Array.map((t=>t.getEncodedHex())).join(""),this.v}}
/**
 * 获取 l 占用字节数
 */function o(t,e){return+t[e+2]<8?1:128&+t.substr(e+2,2);// l 以0开头，则表示短格式，只占一个字节
}
/**
 * 获取 l
 */function u(t,e){
// 获取 l
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()}
/**
 * 获取 v 的位置
 */function l(t,e){return e+2*(o(t,e)+1)}var c={
/**
   * ASN.1 der 编码，针对 sm2 签名
   */
encodeDer(t,e){const n=new i(t),r=new i(e);return new s([n,r]).getEncodedHex()},
/**
   * 解析 ASN.1 der，针对 sm2 验签
   */
decodeDer(t){
// 结构：
// input = | tSeq | lSeq | vSeq |
// vSeq = | tR | lR | vR | tS | lS | vS |
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)}}};
/* eslint-disable no-case-declarations, max-len */const{BigInteger:h}=t,a=new h("2"),g=new h("3");
/**
 * thanks for Tom Wu : http://www-cs-students.stanford.edu/~tjw/jsbn/
 *
 * Basic Javascript Elliptic Curve implementation
 * Ported loosely from BouncyCastle's Java EC code
 * Only Fp curves implemented for now
 */
/**
 * 椭圆曲线域元素
 */
class f{constructor(t,e){this.x=e,this.q=t}
/**
   * 判断相等
   */equals(t){return t===this||this.q.equals(t.q)&&this.x.equals(t.x)}
/**
   * 返回具体数值
   */toBigInteger(){return this.x}
/**
   * 取反
   */negate(){return new f(this.q,this.x.negate().mod(this.q))}
/**
   * 相加
   */add(t){return new f(this.q,this.x.add(t.toBigInteger()).mod(this.q))}
/**
   * 相减
   */subtract(t){return new f(this.q,this.x.subtract(t.toBigInteger()).mod(this.q))}
/**
   * 相乘
   */multiply(t){return new f(this.q,this.x.multiply(t.toBigInteger()).mod(this.q))}
/**
   * 相除
   */divide(t){return new f(this.q,this.x.multiply(t.toBigInteger().modInverse(this.q)).mod(this.q))}
/**
   * 平方
   */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,
// 标准射影坐标系：zinv == null 或 z * zinv == 1
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))}
/**
   * 判断相等
   */equals(t){if(t===this)return!0;if(this.isInfinity())return t.isInfinity();if(t.isInfinity())return this.isInfinity();
// u = y2 * z1 - y1 * z2
if(!t.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(t.z)).mod(this.curve.q).equals(h.ZERO))return!1;
// v = x2 * z1 - x1 * z2
return t.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(t.z)).mod(this.curve.q).equals(h.ZERO)}
/**
   * 是否是无穷远点
   */isInfinity(){return null===this.x&&null===this.y||this.z.equals(h.ZERO)&&!this.y.toBigInteger().equals(h.ZERO)}
/**
   * 取反，x 轴对称点
   */negate(){return new d(this.curve,this.x,this.y.negate(),this.z)}
/**
   * 相加
   *
   * 标准射影坐标系：
   *
   * λ1 = x1 * z2
   * λ2 = x2 * z1
   * λ3 = λ1 − λ2
   * λ4 = y1 * z2
   * λ5 = y2 * z1
   * λ6 = λ4 − λ5
   * λ7 = λ1 + λ2
   * λ8 = z1 * z2
   * λ9 = λ3^2
   * λ10 = λ3 * λ9
   * λ11 = λ8 * λ6^2 − λ7 * λ9
   * x3 = λ3 * λ11
   * y3 = λ6 * (λ9 * λ1 − λ11) − λ4 * λ10
   * z3 = λ10 * λ8
   */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)}
/**
   * 自加
   *
   * 标准射影坐标系：
   *
   * λ1 = 3 * x1^2 + a * z1^2
   * λ2 = 2 * y1 * z1
   * λ3 = y1^2
   * λ4 = λ3 * x1 * z1
   * λ5 = λ2^2
   * λ6 = λ1^2 − 8 * λ4
   * x3 = λ2 * λ6
   * y3 = λ1 * (4 * λ4 − λ6) − 2 * λ5 * λ3
   * z3 = λ2 * λ5
   */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)}
/**
   * 倍点计算
   */multiply(t){if(this.isInfinity())return this;if(!t.signum())return this.curve.infinity;
// 使用加减法
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}}
/**
 * 椭圆曲线 y^2 = x^3 + ax + b
 */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)}
/**
   * 判断两个椭圆曲线是否相等
   */equals(t){return t===this||this.q.equals(t.q)&&this.a.equals(t.a)&&this.b.equals(t.b)}
/**
   * 生成椭圆曲线域元素
   */fromBigInteger(t){return new f(this.q,t)}
/**
   * 解析 16 进制串为椭圆曲线点
   */decodePointHex(t){switch(parseInt(t.substr(0,2),16)){
// 第一个字节
case 0:return this.infinity;case 2:case 3:
// 压缩
const e=this.fromBigInteger(new h(t.substr(2),16));
// 对 p ≡ 3 (mod4)，即存在正整数 u，使得 p = 4u + 3
// 计算 y = (√ (x^3 + ax + b) % p)^(u + 1) modp
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));
// 算出结果 2 进制最后 1 位不等于第 1 个字节减 2 则取反
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:
// 不支持
return null}}}};
/* 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();
/**
 * 生成ecparam
 */
function b(){
// 椭圆曲线
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)}}
/**
 * 生成密钥对：publicKey = privateKey * G
 */
/**
 * 补全16进制字符串
 */
function B(t,e){return t.length>=e?t:new Array(e-t.length+1).join("0")+t}
/**
 * 转成16进制串
 */var q={getGlobalCurve:
/**
 * 获取公共椭圆曲线
 */
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)}}
/**
 * 生成压缩公钥
 */,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}
/**
 * utf8串转16进制串
 */,utf8ToHex:function(t){const e=(t=unescape(encodeURIComponent(t))).length,n=[];
// 转换到字数组
for(let i=0;i<e;i++)n[i>>>2]|=(255&t.charCodeAt(i))<<24-i%4*8;
// 转换到16进制
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("")}
/**
 * 转成utf8串
 */,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")}}
/**
 * 转成字节数组
 */,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}
/**
 * 验证公钥是否为椭圆曲线上的点
 */,verifyPublicKey:function(t){const e=v.decodePointHex(t);if(!e)return!1;const n=e.getX();
// 验证 y^2 是否等于 x^3 + ax + b
return e.getY().square().equals(n.multiply(n.square()).add(n.multiply(v.a)).add(v.b))}
/**
 * 验证公钥是否等价，等价返回true
 */,comparePublicKeyHex:function(t,e){const n=v.decodePointHex(t);if(!n)return!1;const r=v.decodePointHex(e);return!!r&&n.equals(r)}};
// 消息扩展
const P=new Uint32Array(68),E=new Uint32Array(64);// W'
/**
 * 循环左移
 */
function A(t,e){const n=31&e;return t<<n|t>>>32-n}
/**
 * 二进制异或运算
 */function H(t,e){const n=[];for(let r=t.length-1;r>=0;r--)n[r]=255&(t[r]^e[r]);return n}
/**
 * 压缩函数中的置换函数 P0(X) = X xor (X <<< 9) xor (X <<< 17)
 */function C(t){return t^A(t,9)^A(t,17)}
/**
 * 消息扩展中的置换函数 P1(X) = X xor (X <<< 15) xor (X <<< 23)
 */
/**
 * sm3 本体
 */
function S(t){let e=8*t.length,n=e%512;
// k 是满足 len + 1 + k = 448mod512 的最小的非负整数
// 如果 448 <= (512 % len) < 512，需要多补充 (len % 448) 比特'0'以满足总比特长度为512的倍数
n=n>=448?512-n%448-1:448-n-1;
// 填充
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);
// 将消息分组B划分为 16 个字 W0， W1，……，W15
const t=16*a;for(let l=0;l<16;l++)P[l]=o.getUint32(4*(t+l),!1);
// 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]
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];
// W′0 ～ W′63：W′[j] = W[j] xor W[j+4]
for(let o=0;o<64;o++)E[o]=P[o]^P[o+4];
// 压缩
const e=2043430169,n=2055708042;
// 字寄存器
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}
// 转回 uint8
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}
/**
 * hmac 实现
 */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(
// 密钥填充
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])}};
/* 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();
/**
 * sm3杂凑算法
 */
function L(t,e,n="1234567812345678"){
// z = hash(entl || userId || a || b || gx || gy || px || py)
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);
// e = hash(z || msg)
return j.arrayToHex(U(a.concat(j.hexToArray(t))))}
/**
 * 计算公钥
 */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)}
/**
 * 获取椭圆曲线点
 */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:
/**
 * 加密
 */
function(t,e,n=1){t="string"==typeof t?j.hexToArray(j.utf8ToHex(t)):Array.prototype.slice.call(t),e=j.getGlobalCurve().decodePointHex(e);// 先将公钥转成点
const r=j.generateKeyPairHex(),i=new z(r.privateKey,16);// 随机数 k
// c1 = k * G
let s=r.publicKey;s.length>128&&(s=s.substr(s.length-128));
// (x2, y2) = k * publicKey
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 位
const f=[].concat(u,l),d=()=>{
// (1) Hai = hash(z || ct)
// (2) ct++
g=U([...f,h>>24&255,h>>16&255,h>>8&255,255&h]),h++,a=0};d();// 先生成 Ha1
for(let y=0,p=t.length;y<p;y++)
// t = Ha1 || Ha2 || Ha3 || Ha4
a===g.length&&d(),
// c2 = msg ^ t
t[y]^=255&g[a++];const F=j.arrayToHex(t);return 0===n?s+F+c:s+c+F}
/**
 * 解密
 */,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 位
const f=[].concat(l,c),d=()=>{
// (1) Hai = hash(z || ct)
// (2) ct++
g=U([...f,h>>24&255,h>>16&255,h>>8&255,255&h]),h++,a=0};d();// 先生成 Ha1
for(let F=0,y=o.length;F<y;F++)
// t = Ha1 || Ha2 || Ha3 || Ha4
a===g.length&&d(),
// c2 = msg ^ t
o[F]^=255&g[a++];
// c3 = hash(x2 || msg || y2)
return j.arrayToHex(U([].concat(l,o,c)))===i.toLowerCase()?"array"===r?o:j.arrayToUtf8(o):"array"===r?[]:""}
/**
 * 签名
 */,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,
// sm3杂凑
s=s||Y(e),o));const l=new z(e,16),c=new z(u,16);
// k
let h=null,a=null,g=null;do{do{let t;t=n&&n.length?n.pop():V(),h=t.k,
// r = (e + x1) mod n
a=c.add(t.x1).mod(Z)}while(a.equals(z.ZERO)||a.add(h).equals(Z));
// s = ((1 + dA)^-1 * (k - r * dA)) mod n
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 编码
}
/**
 * 验签
 */,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&&(
// sm3杂凑
l=L(l,n,s)),r){const t=O(e);// asn.1 der 解码
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;
// x1y1 = s * G + t * PA
const g=k.multiply(u).add(c.multiply(a)),f=h.add(g.getX().toBigInteger()).mod(Z);
// R = (e + x1) mod n
return o.equals(f)},getPublicKeyFromPrivateKey:Y,getPoint:V,verifyPublicKey:j.verifyPublicKey};const{sm3:N,hmac:M}=R;
/**
 * 补全16进制字符串
 */
/**
 * 字节数组转 16 进制串
 */
function _(t){return t.map((t=>1===(t=t.toString(16)).length?"0"+t:t)).join("")}
/**
 * 转成字节数组
 */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}
/**
 * utf8 串转字节数组
 */
/* eslint-disable no-bitwise, no-mixed-operators, complexity */
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];
/**
 * 16 进制串转字节数组
 */
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}
/**
 * 字节数组转 16 进制串
 */
/**
 * 32 比特循环左移
 */
function et(t,e){const n=31&e;return t<<n|t>>>32-n}
/**
 * 非线性变换
 */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]}
/**
 * 线性变换，加密/解密用
 */function rt(t){return t^et(t,2)^et(t,10)^et(t,18)^et(t,24)}
/**
 * 线性变换，生成轮密钥用
 */function it(t){return t^et(t,13)^et(t,23)}
/**
 * 以一组 128 比特进行加密/解密操作
 */function st(t,e,n){const r=new Array(4),i=new Array(4);
// 字节数组转成字数组（此处 1 字 = 32 比特）
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];
// x[i + 4] = x[i] ^ l1(byteSub(x[i + 1] ^ x[i + 2] ^ x[i + 3] ^ roundKey[i]))
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]
s=r[2]^r[3]^r[0]^n[o+1],r[1]^=rt(nt(s)),// x[5]
s=r[3]^r[0]^r[1]^n[o+2],r[2]^=rt(nt(s)),// x[6]
s=r[0]^r[1]^r[2]^n[o+3],r[3]^=rt(nt(s));
// 反序变换
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]}
/**
 * 密钥扩展算法
 */function ot(t,e,n,{padding:r="pkcs#7",mode:i,iv:s=[],output:o="string"}={}){if("cbc"===i&&(
// CBC 模式，默认走 ECB 模式
"string"==typeof s&&(s=tt(s)),16!==s.length))
// iv 不是 128 比特
throw new Error("iv is invalid");
// 检查 key
if("string"==typeof e&&(e=tt(e)),16!==e.length)
// key 不是 128 比特
throw new Error("key is invalid");
// 检查输入
// 新增填充，sm4 是 16 个字节一个分组，所以统一走到 pkcs#7
if(
// 加密，输入为 utf8 串
t="string"==typeof t?0!==n?
/**
 * utf8 串转字节数组
 */
function(t){const e=[];for(let n=0,r=t.length;n<r;n++){const r=t.codePointAt(n);if(r<=127)
// 单字节，标量值：00000000 00000000 0zzzzzzz
e.push(r);else if(r<=2047)
// 双字节，标量值：00000000 00000yyy yyzzzzzz
e.push(192|r>>>6),// 110yyyyy（0xc0-0xdf）
e.push(128|63&r);else if(r<=55295||r>=57344&&r<=65535)
// 三字节：标量值：00000000 xxxxyyyy yyzzzzzz
e.push(224|r>>>12),// 1110xxxx（0xe0-0xef）
e.push(128|r>>>6&63),// 10yyyyyy（0x80-0xbf）
e.push(128|63&r);else{if(!(r>=65536&&r<=1114111))
// 五、六字节，暂时不支持
throw e.push(r),new Error("input is not supported");
// 四字节：标量值：000wwwxx xxxxyyyy yyzzzzzz
n++,e.push(240|r>>>18&28),// 11110www（0xf0-0xf7）
e.push(128|r>>>12&63),// 10xxxxxx（0x80-0xbf）
e.push(128|r>>>6&63),// 10yyyyyy（0x80-0xbf）
e.push(128|63&r)}}return e}
/**
 * 字节数组转 utf8 串
 */(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)}
// 生成轮密钥
const u=new Array(32);!function(t,e,n){const r=new Array(4),i=new Array(4);
// 字节数组转成字数组（此处 1 字 = 32 比特）
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];
// 与系统参数做异或
r[0]^=2746333894,r[1]^=1453994832,r[2]^=1736282519,r[3]^=2993693404;
// roundKey[i] = x[i + 4] = x[i] ^ l2(byteSub(x[i + 1] ^ x[i + 2] ^ x[i + 3] ^ CK[i]))
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]
s=r[2]^r[3]^r[0]^$[o+1],e[o+1]=r[1]^=it(nt(s)),// x[5]
s=r[3]^r[0]^r[1]^$[o+2],e[o+2]=r[2]^=it(nt(s)),// x[6]
s=r[0]^r[1]^r[2]^$[o+3],e[o+3]=r[3]^=it(nt(s));
// 解密时使用反序的轮密钥
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&&(
// 加密过程在组加密前进行异或
e[t]^=c[t]);st(e,r,u);for(let t=0;t<Q;t++)"cbc"===i&&0===n&&(
// 解密过程在组解密后进行异或
r[t]^=c[t]),l[a+t]=r[t];"cbc"===i&&(
// 使用上一次输出作为加密向量
c=0!==n?r:e),h-=Q,a+=Q}
// 去除填充，sm4 是 16 个字节一个分组，所以统一走到 pkcs#7
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)}
// 调整输出
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?(
// 四字节
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?(
// 三字节
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?(
// 双字节
e.push(String.fromCodePoint(((31&t[n])<<6)+(63&t[n+1]))),n++):
// 单字节
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)
// 单字节，标量值：00000000 00000000 0zzzzzzz
e.push(r);else if(r<=2047)
// 双字节，标量值：00000000 00000yyy yyzzzzzz
e.push(192|r>>>6),// 110yyyyy（0xc0-0xdf）
e.push(128|63&r);else if(r<=55295||r>=57344&&r<=65535)
// 三字节：标量值：00000000 xxxxyyyy yyzzzzzz
e.push(224|r>>>12),// 1110xxxx（0xe0-0xef）
e.push(128|r>>>6&63),// 10yyyyyy（0x80-0xbf）
e.push(128|63&r);else{if(!(r>=65536&&r<=1114111))
// 五、六字节，暂时不支持
throw e.push(r),new Error("input is not supported");
// 四字节：标量值：000wwwxx xxxxyyyy yyzzzzzz
n++,e.push(240|r>>>18&28),// 11110www（0xf0-0xf7）
e.push(128|r>>>12&63),// 10xxxxxx（0x80-0xbf）
e.push(128|r>>>6&63),// 10yyyyyy（0x80-0xbf）
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 _};
//# sourceMappingURL=sm-crypto-2cfdc71b.js.map
