@wowok/wowok 2.3.13 → 2.3.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/{arb-DJFsMaw8.mjs → arb-Cs1RQFrB.mjs} +1 -1
- package/dist/esm/{base-C6G3xkf-.mjs → base-DNb4ZGE-.mjs} +1 -1
- package/dist/esm/bcs/index.d.mts +1 -1
- package/dist/esm/{call-DPC7BB9z.mjs → call-7-ua3nJj.mjs} +1 -1
- package/dist/esm/client/index.d.mts +1 -1
- package/dist/esm/client/index.mjs +1 -1
- package/dist/esm/{client-Qky9ahYr.mjs → client-BQ4xeDS9.mjs} +1 -1
- package/dist/esm/cryptography/index.d.mts +1 -1
- package/dist/esm/{evm-account-BEq5OtWc.d.mts → evm-account-DMl7wn2f.d.mts} +6 -3
- package/dist/esm/graphql/index.d.mts +1 -1
- package/dist/esm/graphql/index.mjs +1 -1
- package/dist/esm/{graphql-ChU-TqO3.mjs → graphql-DO9FSljL.mjs} +1 -1
- package/dist/esm/grpc/index.d.mts +1 -1
- package/dist/esm/grpc/index.mjs +1 -1
- package/dist/esm/{grpc-Blljyw_0.mjs → grpc-CtkzBzxW.mjs} +1 -1
- package/dist/esm/{index-CT5v_n9y.d.mts → index-C7hBsiex.d.mts} +26 -16
- package/dist/esm/{index-B8BZSNzI.d.mts → index-Cj4KHtbw.d.mts} +6 -6
- package/dist/esm/index.d.mts +3 -3
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/jsonRpc/index.d.mts +1 -1
- package/dist/esm/jsonRpc/index.mjs +1 -1
- package/dist/esm/keypairs/ed25519/index.d.mts +1 -1
- package/dist/esm/keypairs/falcon512/index.d.mts +1 -1
- package/dist/esm/keypairs/passkey/index.d.mts +1 -1
- package/dist/esm/keypairs/secp256k1/index.d.mts +1 -1
- package/dist/esm/keypairs/secp256r1/index.d.mts +1 -1
- package/dist/esm/messenger-api-BljlMqMC.mjs +1 -0
- package/dist/esm/messenger-uSvD3cWJ.mjs +1 -0
- package/dist/esm/multisig/index.d.mts +1 -1
- package/dist/esm/object-HkVaWf0g.mjs +1 -0
- package/dist/esm/{pqxdh-66KxOyAF.d.mts → pqxdh-BqO4C7fY.d.mts} +1 -1
- package/dist/esm/{proof-BC83Au5Z.mjs → proof-fUaUX3Lq.mjs} +1 -1
- package/dist/esm/{query-kEOQO88T.mjs → query-D8GdqXf4.mjs} +1 -1
- package/dist/esm/received-BoWuifKq.mjs +1 -0
- package/dist/esm/service-BHYLhpzY.mjs +1 -0
- package/dist/esm/transactions/index.d.mts +1 -1
- package/dist/esm/{util-B-taRQwn.mjs → util-CMtnxhJ-.mjs} +1 -1
- package/dist/esm/verify/index.d.mts +1 -1
- package/dist/esm/w/call/allocation.d.mts +1 -1
- package/dist/esm/w/call/allocation.mjs +1 -1
- package/dist/esm/w/call/arbitration.d.mts +1 -1
- package/dist/esm/w/call/arbitration.mjs +1 -1
- package/dist/esm/w/call/base.d.mts +1 -1
- package/dist/esm/w/call/base.mjs +1 -1
- package/dist/esm/w/call/demand.d.mts +1 -1
- package/dist/esm/w/call/demand.mjs +1 -1
- package/dist/esm/w/call/guard.d.mts +1 -1
- package/dist/esm/w/call/guard.mjs +1 -1
- package/dist/esm/w/call/index.d.mts +1 -1
- package/dist/esm/w/call/index.mjs +1 -1
- package/dist/esm/w/call/machine.d.mts +1 -1
- package/dist/esm/w/call/machine.mjs +1 -1
- package/dist/esm/w/call/passport.d.mts +1 -1
- package/dist/esm/w/call/passport.mjs +1 -1
- package/dist/esm/w/call/payment.d.mts +1 -1
- package/dist/esm/w/call/payment.mjs +1 -1
- package/dist/esm/w/call/permission.d.mts +1 -1
- package/dist/esm/w/call/permission.mjs +1 -1
- package/dist/esm/w/call/progress.d.mts +1 -1
- package/dist/esm/w/call/progress.mjs +1 -1
- package/dist/esm/w/call/repository.d.mts +1 -1
- package/dist/esm/w/call/repository.mjs +1 -1
- package/dist/esm/w/call/reward.d.mts +1 -1
- package/dist/esm/w/call/reward.mjs +1 -1
- package/dist/esm/w/call/service.d.mts +1 -1
- package/dist/esm/w/call/service.mjs +1 -1
- package/dist/esm/w/call/treasury.d.mts +1 -1
- package/dist/esm/w/call/treasury.mjs +1 -1
- package/dist/esm/w/common.d.mts +1 -1
- package/dist/esm/w/index.d.mts +2 -2
- package/dist/esm/w/index.mjs +1 -1
- package/dist/esm/w/local/account.d.mts +1 -1
- package/dist/esm/w/local/account.mjs +1 -1
- package/dist/esm/w/local/evm-account.d.mts +1 -1
- package/dist/esm/w/local/evm-account.mjs +1 -1
- package/dist/esm/w/local/index.d.mts +2 -2
- package/dist/esm/w/local/token.d.mts +1 -1
- package/dist/esm/w/local/token.mjs +1 -1
- package/dist/esm/w/local/wip.mjs +1 -1
- package/dist/esm/w/messenger/crypto.d.mts +2 -2
- package/dist/esm/w/messenger/crypto.mjs +1 -1
- package/dist/esm/w/messenger/index.d.mts +1 -1
- package/dist/esm/w/messenger/index.mjs +1 -1
- package/dist/esm/w/messenger/messenger-api.d.mts +1 -1
- package/dist/esm/w/messenger/messenger-api.mjs +1 -1
- package/dist/esm/w/messenger/messenger.d.mts +1 -1
- package/dist/esm/w/messenger/messenger.mjs +1 -1
- package/dist/esm/w/messenger/pq/crypto.d.mts +2 -1
- package/dist/esm/w/messenger/pq/crypto.mjs +1 -1
- package/dist/esm/w/messenger/pq/index.d.mts +4 -4
- package/dist/esm/w/messenger/pq/index.mjs +1 -1
- package/dist/esm/w/messenger/pq/pqxdh.d.mts +1 -1
- package/dist/esm/w/messenger/pq/pqxdh.mjs +1 -1
- package/dist/esm/w/messenger/pq/ratchet.d.mts +2 -2
- package/dist/esm/w/messenger/pq/ratchet.mjs +1 -1
- package/dist/esm/w/messenger/pq/session.d.mts +1 -1
- package/dist/esm/w/messenger/pq/session.mjs +1 -1
- package/dist/esm/w/messenger/pq/spqr.d.mts +2 -5
- package/dist/esm/w/messenger/pq/spqr.mjs +1 -1
- package/dist/esm/w/messenger/pq/types.d.mts +2 -0
- package/dist/esm/w/messenger/storage.d.mts +1 -1
- package/dist/esm/w/messenger/types.d.mts +1 -1
- package/dist/esm/w/messenger/types.mjs +1 -1
- package/dist/esm/w/query/index.d.mts +1 -1
- package/dist/esm/w/query/index.mjs +1 -1
- package/dist/esm/w/query/object.d.mts +1 -1
- package/dist/esm/w/query/object.mjs +1 -1
- package/dist/esm/{w-BFHLwfOM.mjs → w-C77c6iBV.mjs} +1 -1
- package/package.json +1 -1
- package/dist/esm/messenger-CsKfzhTO.mjs +0 -1
- package/dist/esm/messenger-api-5Rsz17OK.mjs +0 -1
- package/dist/esm/object-CnzImhYw.mjs +0 -1
- package/dist/esm/received-CR3BScdG.mjs +0 -1
- package/dist/esm/service-Cm5BQ2jN.mjs +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as a79a}from'../../exception--UEPnygY.mjs';import{SQLiteAccountStorage}from'./storage.mjs';import{SecureAccountStorage}from'./secure-storage.mjs';import{bytesToBigInt,bytesToHex,hexToBytes,isValidEvmAddress,privateKeyToAddress,signEIP1559,signLegacy,toChecksumAddress}from'./evm/rlp.mjs';import{EvmNetworkRegistry}from'./evm/networks.mjs';import{secp256k1}from'@noble/curves/secp256k1.js';import{keccak_256}from'@noble/hashes/sha3.js';var AsyncLock=class{constructor(){this['_locked']=![],this['_queue']=[];}async['acquire'](){if(!this['_locked']){this['_locked']=!![];return;}return new Promise(a=>{this['_queue']['push'](a);});}['release'](){if(this['_queue']['length']>0x0)this['_queue']['shift']()();else this['_locked']=![];}async['run'](a){await this['acquire']();try{return await a();}finally{this['release']();}}};let rpcRequestId=0x0;async function ethRpcWithAbort(a,b,c,d){const e={'jsonrpc':'2.0','id':++rpcRequestId,'method':b,'params':c},f=await fetch(a,{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify'](e),'signal':d});if(!f['ok'])throw new Error('EVM\x20RPC\x20HTTP\x20'+f['status']+':\x20'+await f['text']());const g=await f['json']();if(g['error'])throw new Error('EVM\x20RPC\x20error:\x20'+g['error']['message']+'\x20(code\x20'+g['error']['code']+')');return g['result'];}var EvmAccount=class EvmAccount{static{this['_lock']=new AsyncLock();}['setStorage'](a){EvmAccount['storage']=a;}['setEncryptedStorage'](a){EvmAccount['storage']=new SecureAccountStorage(a);}async['_getStorage'](){if(!EvmAccount['storage'])EvmAccount['storage']=new SecureAccountStorage(new SQLiteAccountStorage(void 0x0,'evm_accounts'));return EvmAccount['storage'];}async['unlock'](a){const b=await this['_getStorage']();if(!(b instanceof SecureAccountStorage))throw new Error('Current\x20storage\x20does\x20not\x20support\x20encryption.');b['setSessionPassword'](a),await b['get']();}async['lock'](){const a=await this['_getStorage']();if(a instanceof SecureAccountStorage)a['setSessionPassword'](void 0x0);}async['setEncryptionPassword'](a){const b=await this['_getStorage']();if(!(b instanceof SecureAccountStorage))throw new Error('Current\x20storage\x20does\x20not\x20support\x20encryption.');await b['setPassword'](a);}async['changeEncryptionPassword'](a,b){const c=await this['_getStorage']();if(!(c instanceof SecureAccountStorage))throw new Error('Current\x20storage\x20does\x20not\x20support\x20encryption.');await c['changePassword'](a,b);}async['removeEncryptionPassword'](a){const b=await this['_getStorage']();if(!(b instanceof SecureAccountStorage))throw new Error('Current\x20storage\x20does\x20not\x20support\x20encryption.');await b['removePassword'](a);}static['Instance'](){if(!EvmAccount['_instance'])EvmAccount['_instance']=new EvmAccount();return EvmAccount['_instance'];}async['_get'](){const a=await this['_getStorage'](),b=await a['get']();if(!b)return void 0x0;const c=JSON['parse'](b);if(Array['isArray'](c)){const f=c,g=f['find'](h=>!h['suspended'])||f[0x0];if(g){const h={'address':g['address'],'pubkey':g['pubkey'],'secret':g['secret'],'createdAt':g['createdAt'],'updatedAt':g['updatedAt']};await a['put'](JSON['stringify'](h));const {secret:i,...j}=h;return j;}return;}const {secret:d,...e}=c;return e;}async['_getWithSecret'](){const a=await this['_getStorage'](),b=await a['get']();if(!b)a79a('account\x20not\x20found','No\x20active\x20EVM\x20account.\x20Call\x20active()\x20first\x20to\x20auto-generate\x20one.');const c=JSON['parse'](b);if(Array['isArray'](c)){const e=c,f=e['find'](h=>!h['suspended'])||e[0x0];if(!f||!f['secret'])a79a('account\x20not\x20found','No\x20active\x20EVM\x20account\x20with\x20secret\x20found\x20in\x20storage.');const g={'address':f['address'],'pubkey':f['pubkey'],'secret':f['secret'],'createdAt':f['createdAt'],'updatedAt':f['updatedAt']};return await a['put'](JSON['stringify'](g)),g;}const d=c;if(!d['secret'])a79a('account\x20not\x20found','EVM\x20account\x20found\x20but\x20has\x20no\x20secret.');return d;}async['_save'](a){await(await this['_getStorage']())['put'](JSON['stringify'](a));}async['resolveNetwork'](a,b){const c=EvmNetworkRegistry['Instance']();if(b){const e=await c['resolve'](b);return{'cfg':e,'url':c['pickHealthyRpc'](e)||b};}const d=await c['resolve'](a);return{'cfg':d,'url':c['pickHealthyRpc'](d)};}async['rpcWithFailover'](a,b,c){const d=EvmNetworkRegistry['Instance']();let f;const g=a['rpcTimeoutMs']??0x2710;for(const h of a['rpcUrls'])try{const i=new AbortController(),j=setTimeout(()=>i['abort'](),g);try{const k=await ethRpcWithAbort(h,b,c,i['signal']);return d['markHealthy'](h),k;}finally{clearTimeout(j);}}catch(l){f=l,d['markUnhealthy'](h);}throw f instanceof Error?f:new Error('All\x20RPCs\x20failed\x20for\x20'+b);}async['gen'](){return EvmAccount['_lock']['run'](async()=>{const a=secp256k1['utils']['randomSecretKey'](),b='0x'+bytesToHex(a),c=privateKeyToAddress(a),d=Date['now'](),e={'address':c,'secret':b,'createdAt':d,'updatedAt':d};await this['_save'](e);const {secret:f,...g}=e;return g;});}async['importPrivateKey'](a){return EvmAccount['_lock']['run'](async()=>{const b=a['startsWith']('0x')?a['slice'](0x2):a;if(b['length']!==0x40)a79a('invalid\x20parameter','Private\x20key\x20must\x20be\x2032\x20bytes\x20(64\x20hex\x20chars),\x20got\x20'+b['length']+'\x20chars');const c='0x'+b,d=privateKeyToAddress(hexToBytes(c)),e=Date['now'](),f={'address':d,'secret':c,'createdAt':e,'updatedAt':e};await this['_save'](f);const {secret:g,...h}=f;return h;});}async['active'](){const a=await this['_get']();if(a)return a;return this['gen']();}async['balance'](b,c){const d=await this['_get']();if(!d)return void 0x0;const {cfg:e}=await this['resolveNetwork'](b,c),f=await this['rpcWithFailover'](e,'eth_getBalance',[d['address'],'latest']);return BigInt(f);}async['balanceOf'](b,c,d){const e=await this['_get']();if(!e)return void 0x0;const {cfg:f}=await this['resolveNetwork'](c,d),g='0x70a08231'+e['address']['slice'](0x2)['toLowerCase']()['padStart'](0x40,'0'),h=await this['rpcWithFailover'](f,'eth_call',[{'to':b,'data':g},'latest']);return BigInt(h);}async['getNonce'](b,c){const d=await this['_get']();if(!d)return void 0x0;const {cfg:e}=await this['resolveNetwork'](b,c),f=await this['rpcWithFailover'](e,'eth_getTransactionCount',[d['address'],'pending']);return parseInt(f,0x10);}async['getChainId'](a,b){const {cfg:c}=await this['resolveNetwork'](a,b),d=await this['rpcWithFailover'](c,'eth_chainId',[]);return parseInt(d,0x10);}async['getBlockNumber'](a,b){const {cfg:c}=await this['resolveNetwork'](a,b),d=await this['rpcWithFailover'](c,'eth_blockNumber',[]);return BigInt(d);}async['ethCall'](b,c,d){const e=await this['_get']();if(!e)a79a('account\x20not\x20found','No\x20active\x20EVM\x20account');const f=b['network']??c,{cfg:g}=await this['resolveNetwork'](f,d??b['rpcUrl']);return await this['rpcWithFailover'](g,'eth_call',[{'from':e['address'],'to':b['to'],'data':b['data']??'0x','value':'0x'+(b['value']??0x0n)['toString'](0x10)},'latest']);}['guessGasLimit'](a){const b=a['data']??'';if(b['startsWith']('0x9c3ecefb'))return 0x927c0n;if(b['startsWith']('0x095ea7b3'))return 0x186a0n;if(b['startsWith']('0xb4b7068c'))return 0x3d090n;if(b['startsWith']('0x0bdba58b'))return 0x493e0n;return 0x61a80n;}async['estimateGas'](b,c,d){const e=await this['_get']();if(!e)a79a('account\x20not\x20found','No\x20active\x20EVM\x20account');const f=b['network']??c,{cfg:g}=await this['resolveNetwork'](f,d??b['rpcUrl']),h=await this['rpcWithFailover'](g,'eth_estimateGas',[{'from':e['address'],'to':b['to'],'data':b['data']??'0x','value':'0x'+(b['value']??0x0n)['toString'](0x10)}]);return BigInt(h);}async['safeEstimateGas'](a){if(!await this['_get']())a79a('account\x20not\x20found','No\x20active\x20EVM\x20account');const {cfg:b}=await this['resolveNetwork'](a['network'],a['rpcUrl']);let c;try{await this['ethCall'](a);}catch(d){return c=extractRevertReason(d),{'gasLimit':this['guessGasLimit'](a),'revertReason':c||'eth_call\x20failed'};}try{const f=await this['estimateGas'](a),g=b['gasLimitMultiplier']??1.2;return{'gasLimit':BigInt(Math['ceil'](Number(f)*g))};}catch(h){return c=extractRevertReason(h),console['warn']('[safeEstimateGas]\x20estimateGas\x20failed,\x20using\x20fallback\x20gasLimit='+this['guessGasLimit'](a),c?'revert:\x20'+c:''),{'gasLimit':this['guessGasLimit'](a),'revertReason':c};}}async['getFeeData'](a,b){const {cfg:c}=await this['resolveNetwork'](a,b),d=await this['rpcWithFailover'](c,'eth_feeHistory',['0x5','latest',[0x32]]),e=BigInt(d['baseFeePerGas'][0x0]),f=BigInt(d['reward'][0x0][0x0]),g=c['minPriorityFee']??0x0n,h=f<g?g:f;return{'maxFeePerGas':e*0x2n+h,'maxPriorityFeePerGas':h};}async['sign_and_send'](b,c){const d=await this['_getWithSecret']();if(!d||!d['secret'])a79a('account\x20not\x20found','No\x20active\x20EVM\x20account\x20with\x20secret');const {cfg:e,url:f}=await this['resolveNetwork'](b['network'],c??b['rpcUrl']),g=b['chainId']??e['chainId'],h=hexToBytes(d['secret']['slice'](0x2)),i=b['nonce']??await this['getNonce'](e['chainId'],f);let {maxFeePerGas:j,maxPriorityFeePerGas:k,gasPrice:l}=b;e['useLegacy']&&!l&&(l=(await this['getFeeData'](e['chainId'],f))['maxFeePerGas'],j=void 0x0,k=void 0x0);if(!j&&!k&&!l){const r=await this['getFeeData'](e['chainId'],f);j=r['maxFeePerGas'],k=r['maxPriorityFeePerGas'];}let m=b['gasLimit'];if(!m){const s=await this['safeEstimateGas'](b);m=s['gasLimit'],s['revertReason'];}const n=hexToBytes(b['to']['slice'](0x2)),o=b['data']?hexToBytes(b['data']['slice'](0x2)):new Uint8Array(0x0);let p;if(l)p=signLegacy({'to':n,'data':o,'value':b['value']??0x0n,'nonce':i,'chainId':g,'gasPrice':l,'gasLimit':m},h);else p=signEIP1559({'to':n,'data':o,'value':b['value']??0x0n,'nonce':i,'chainId':g,'maxFeePerGas':j,'maxPriorityFeePerGas':k,'gasLimit':m},h);const q=await this['rpcWithFailover'](e,'eth_sendRawTransaction',[p]);return await this['waitForReceipt'](q,e['chainId'],f);}async['waitForReceipt'](a,b,c,d){const {cfg:e,url:f}=await this['resolveNetwork'](b,c),g=d??e['txConfirmTimeoutMs']??0x1d4c0,h=e['pollIntervalMs']??0xbb8,i=Date['now']()+g;while(Date['now']()<i){const j=await this['rpcWithFailover'](e,'eth_getTransactionReceipt',[a]);if(j)return this['parseReceipt'](j);await new Promise(k=>setTimeout(k,h));}a79a('fail','Transaction\x20'+a+'\x20not\x20confirmed\x20within\x20'+g+'ms');}['parseReceipt'](a){return{'transactionHash':a['transactionHash'],'blockNumber':BigInt(a['blockNumber']),'blockHash':a['blockHash'],'status':a['status']??'0x0','gasUsed':BigInt(a['gasUsed']),'effectiveGasPrice':BigInt(a['effectiveGasPrice']),'from':a['from'],'to':a['to'],'contractAddress':a['contractAddress']??void 0x0,'logs':(a['logs']??[])['map'](b=>({'address':b['address'],'topics':b['topics']??[],'data':b['data']??'0x','blockNumber':BigInt(b['blockNumber']),'transactionHash':b['transactionHash'],'transactionIndex':b['transactionIndex'],'logIndex':b['logIndex'],'removed':b['removed']??![]}))};}async['signData'](a){const b=await this['_getWithSecret'](),c=hexToBytes(b['secret']['slice'](0x2)),d=typeof a==='string'?new TextEncoder()['encode'](a):a,e='\x19Ethereum\x20Signed\x20Message:\x0a'+d['length'],f=new Uint8Array(e['length']+d['length']);f['set'](new TextEncoder()['encode'](e),0x0),f['set'](d,e['length']);const g=keccak_256(f),h=secp256k1['sign'](g,c,{'format':'recovered','prehash':![]}),i=0x1b+h[0x0],j=new Uint8Array(0x41);j['set'](h['subarray'](0x1,0x21),0x0),j['set'](h['subarray'](0x21,0x41),0x20),j[0x40]=i;const k=secp256k1['getPublicKey'](c,!![]);return{'signature':'0x'+bytesToHex(j),'publicKey':'0x'+bytesToHex(k),'address':b['address']};}async['transfer'](a){await this['_getWithSecret']();if(!isValidEvmAddress(a['to']))a79a('invalid\x20parameter','Invalid\x20EVM\x20recipient\x20address:\x20'+a['to']);if(a['amount']<=0x0n)a79a('invalid\x20parameter','amount\x20must\x20be\x20positive');const b=!!a['tokenAddress'];if(b){const e=await this['balanceOf'](a['tokenAddress'],a['network'],a['rpcUrl']);if(e===void 0x0||e<a['amount'])a79a('fail','Insufficient\x20ERC20\x20balance:\x20have\x20'+(e??0x0n)+',\x20need\x20'+a['amount']);}else{const f=await this['balance'](a['network'],a['rpcUrl']);if(f===void 0x0||f<a['amount'])a79a('fail','Insufficient\x20ETH\x20balance:\x20have\x20'+(f??0x0n)+',\x20need\x20'+a['amount']);}let c;if(b){const g='0xa9059cbb'+a['to']['slice'](0x2)['toLowerCase']()['padStart'](0x40,'0')+a['amount']['toString'](0x10)['padStart'](0x40,'0');c={'to':a['tokenAddress'],'value':0x0n,'data':g,'network':a['network'],'rpcUrl':a['rpcUrl']};}else c={'to':a['to'],'value':a['amount'],'data':'0x','network':a['network'],'rpcUrl':a['rpcUrl']};const d=await this['sign_and_send'](c,a['rpcUrl']);if(d['status']!=='0x1')a79a('fail','EVM\x20transfer\x20reverted:\x20txHash='+d['transactionHash']);return d;}async['withdrawFromActive'](a){return this['transfer']({...a});}};function extractRevertReason(a){if(!a)return void 0x0;const b=typeof a==='string'?a:a?.['message']??a?.['toString']?.()??'',c=b['match'](/execution reverted:\s*(.+?)(?:\.|$)/i);if(c)return c[0x1]['trim']();const d=b['match'](/reverted with reason string\s*'([^']+)'/i);if(d)return d[0x1];const e=b['match'](/reverted with panic code\s*(0x[0-9a-f]+)/i);if(e)return'panic:\x20'+e[0x1];if(/stack underflow/i['test'](b))return'stack\x20underflow\x20(calldata\x20encoding\x20error)';if(/stack overflow/i['test'](b))return'stack\x20overflow';if(/out of gas/i['test'](b))return'out\x20of\x20gas';return b['length']>0xc8?b['slice'](0x0,0xc8)+'...':b;}export{EvmAccount,bytesToBigInt,bytesToHex,hexToBytes,isValidEvmAddress,privateKeyToAddress,signEIP1559,signLegacy,toChecksumAddress};
|
|
1
|
+
import{o as a79a}from'../../exception--UEPnygY.mjs';import{SQLiteAccountStorage}from'./storage.mjs';import{SecureAccountStorage}from'./secure-storage.mjs';import{bytesToBigInt,bytesToHex,hexToBytes,isValidEvmAddress,privateKeyToAddress,signEIP1559,signLegacy,toChecksumAddress}from'./evm/rlp.mjs';import{EvmNetworkRegistry}from'./evm/networks.mjs';import{secp256k1}from'@noble/curves/secp256k1.js';import{keccak_256}from'@noble/hashes/sha3.js';var AsyncLock=class{constructor(){this['_locked']=![],this['_queue']=[];}async['acquire'](){if(!this['_locked']){this['_locked']=!![];return;}return new Promise(a=>{this['_queue']['push'](a);});}['release'](){if(this['_queue']['length']>0x0)this['_queue']['shift']()();else this['_locked']=![];}async['run'](a){await this['acquire']();try{return await a();}finally{this['release']();}}};let rpcRequestId=0x0;async function ethRpcWithAbort(a,b,c,d){const e={'jsonrpc':'2.0','id':++rpcRequestId,'method':b,'params':c},f=await fetch(a,{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify'](e),'signal':d});if(!f['ok'])throw new Error('EVM\x20RPC\x20HTTP\x20'+f['status']+':\x20'+await f['text']());const g=await f['json']();if(g['error'])throw new Error('EVM\x20RPC\x20error:\x20'+g['error']['message']+'\x20(code\x20'+g['error']['code']+')');return g['result'];}var EvmAccount=class EvmAccount{static{this['_lock']=new AsyncLock();}['setStorage'](a){EvmAccount['storage']=a;}['setEncryptedStorage'](a){EvmAccount['storage']=new SecureAccountStorage(a);}async['_getStorage'](){if(!EvmAccount['storage'])EvmAccount['storage']=new SecureAccountStorage(new SQLiteAccountStorage(void 0x0,'evm_accounts'));return EvmAccount['storage'];}async['unlock'](a){const b=await this['_getStorage']();if(!(b instanceof SecureAccountStorage))throw new Error('Current\x20storage\x20does\x20not\x20support\x20encryption.');b['setSessionPassword'](a),await b['get']();}async['lock'](){const a=await this['_getStorage']();if(a instanceof SecureAccountStorage)a['setSessionPassword'](void 0x0);}async['setEncryptionPassword'](a){const b=await this['_getStorage']();if(!(b instanceof SecureAccountStorage))throw new Error('Current\x20storage\x20does\x20not\x20support\x20encryption.');await b['setPassword'](a);}async['changeEncryptionPassword'](a,b){const c=await this['_getStorage']();if(!(c instanceof SecureAccountStorage))throw new Error('Current\x20storage\x20does\x20not\x20support\x20encryption.');await c['changePassword'](a,b);}async['removeEncryptionPassword'](a){const b=await this['_getStorage']();if(!(b instanceof SecureAccountStorage))throw new Error('Current\x20storage\x20does\x20not\x20support\x20encryption.');await b['removePassword'](a);}static['Instance'](){if(!EvmAccount['_instance'])EvmAccount['_instance']=new EvmAccount();return EvmAccount['_instance'];}async['_get'](a=![]){const b=await this['_getStorage'](),c=await b['get']();if(!c)return void 0x0;const d=JSON['parse'](c);if(Array['isArray'](d)){const g=d,h=g['find'](i=>!i['suspended'])||g[0x0];if(h){const i={'address':h['address'],'pubkey':h['pubkey'],'secret':h['secret'],'createdAt':h['createdAt'],'updatedAt':h['updatedAt']};await b['put'](JSON['stringify'](i));const {secret:j,...k}=i;if(!a){const {pubkey:l,...m}=k;return m;}return k;}return;}const {secret:e,...f}=d;if(!a){const {pubkey:n,...o}=f;return o;}return f;}async['_getWithSecret'](){const a=await this['_getStorage'](),b=await a['get']();if(!b)a79a('account\x20not\x20found','No\x20active\x20EVM\x20account.\x20Call\x20active()\x20first\x20to\x20auto-generate\x20one.');const c=JSON['parse'](b);if(Array['isArray'](c)){const e=c,f=e['find'](h=>!h['suspended'])||e[0x0];if(!f||!f['secret'])a79a('account\x20not\x20found','No\x20active\x20EVM\x20account\x20with\x20secret\x20found\x20in\x20storage.');const g={'address':f['address'],'pubkey':f['pubkey'],'secret':f['secret'],'createdAt':f['createdAt'],'updatedAt':f['updatedAt']};return await a['put'](JSON['stringify'](g)),g;}const d=c;if(!d['secret'])a79a('account\x20not\x20found','EVM\x20account\x20found\x20but\x20has\x20no\x20secret.');return d;}async['_save'](a){await(await this['_getStorage']())['put'](JSON['stringify'](a));}async['resolveNetwork'](a,b){const c=EvmNetworkRegistry['Instance']();if(b){const e=await c['resolve'](b);return{'cfg':e,'url':c['pickHealthyRpc'](e)||b};}const d=await c['resolve'](a);return{'cfg':d,'url':c['pickHealthyRpc'](d)};}async['rpcWithFailover'](a,b,c){const d=EvmNetworkRegistry['Instance']();let f;const g=a['rpcTimeoutMs']??0x2710;for(const h of a['rpcUrls'])try{const i=new AbortController(),j=setTimeout(()=>i['abort'](),g);try{const k=await ethRpcWithAbort(h,b,c,i['signal']);return d['markHealthy'](h),k;}finally{clearTimeout(j);}}catch(l){f=l,d['markUnhealthy'](h);}throw f instanceof Error?f:new Error('All\x20RPCs\x20failed\x20for\x20'+b);}async['gen'](a=![]){return EvmAccount['_lock']['run'](async()=>{const b=secp256k1['utils']['randomSecretKey'](),c='0x'+bytesToHex(b),d=privateKeyToAddress(b),e=Date['now'](),f={'address':d,'secret':c,'createdAt':e,'updatedAt':e};if(a)f['pubkey']='0x'+bytesToHex(secp256k1['getPublicKey'](b,!![]));await this['_save'](f);const {secret:g,...h}=f;return h;});}async['importPrivateKey'](a,b=![]){return EvmAccount['_lock']['run'](async()=>{const c=a['startsWith']('0x')?a['slice'](0x2):a;if(c['length']!==0x40)a79a('invalid\x20parameter','Private\x20key\x20must\x20be\x2032\x20bytes\x20(64\x20hex\x20chars),\x20got\x20'+c['length']+'\x20chars');const d='0x'+c,e=hexToBytes(d),f=privateKeyToAddress(e),g=Date['now'](),h={'address':f,'secret':d,'createdAt':g,'updatedAt':g};if(b)h['pubkey']='0x'+bytesToHex(secp256k1['getPublicKey'](e,!![]));await this['_save'](h);const {secret:i,...j}=h;return j;});}async['active'](a=![]){const b=await this['_get'](a);if(b)return b;return this['gen'](a);}async['balance'](b,c){const d=await this['_get']();if(!d)return void 0x0;const {cfg:e}=await this['resolveNetwork'](b,c),f=await this['rpcWithFailover'](e,'eth_getBalance',[d['address'],'latest']);return BigInt(f);}async['balanceOf'](b,c,d){const e=await this['_get']();if(!e)return void 0x0;const {cfg:f}=await this['resolveNetwork'](c,d),g='0x70a08231'+e['address']['slice'](0x2)['toLowerCase']()['padStart'](0x40,'0'),h=await this['rpcWithFailover'](f,'eth_call',[{'to':b,'data':g},'latest']);return BigInt(h);}async['getNonce'](b,c){const d=await this['_get']();if(!d)return void 0x0;const {cfg:e}=await this['resolveNetwork'](b,c),f=await this['rpcWithFailover'](e,'eth_getTransactionCount',[d['address'],'pending']);return parseInt(f,0x10);}async['getChainId'](a,b){const {cfg:c}=await this['resolveNetwork'](a,b),d=await this['rpcWithFailover'](c,'eth_chainId',[]);return parseInt(d,0x10);}async['getBlockNumber'](a,b){const {cfg:c}=await this['resolveNetwork'](a,b),d=await this['rpcWithFailover'](c,'eth_blockNumber',[]);return BigInt(d);}async['ethCall'](b,c,d){const e=await this['_get']();if(!e)a79a('account\x20not\x20found','No\x20active\x20EVM\x20account');const f=b['network']??c,{cfg:g}=await this['resolveNetwork'](f,d??b['rpcUrl']);return await this['rpcWithFailover'](g,'eth_call',[{'from':e['address'],'to':b['to'],'data':b['data']??'0x','value':'0x'+(b['value']??0x0n)['toString'](0x10)},'latest']);}['guessGasLimit'](a){const b=a['data']??'';if(b['startsWith']('0x9c3ecefb'))return 0x927c0n;if(b['startsWith']('0x095ea7b3'))return 0x186a0n;if(b['startsWith']('0xb4b7068c'))return 0x3d090n;if(b['startsWith']('0x0bdba58b'))return 0x493e0n;return 0x61a80n;}async['estimateGas'](b,c,d){const e=await this['_get']();if(!e)a79a('account\x20not\x20found','No\x20active\x20EVM\x20account');const f=b['network']??c,{cfg:g}=await this['resolveNetwork'](f,d??b['rpcUrl']),h=await this['rpcWithFailover'](g,'eth_estimateGas',[{'from':e['address'],'to':b['to'],'data':b['data']??'0x','value':'0x'+(b['value']??0x0n)['toString'](0x10)}]);return BigInt(h);}async['safeEstimateGas'](a){if(!await this['_get']())a79a('account\x20not\x20found','No\x20active\x20EVM\x20account');const {cfg:b}=await this['resolveNetwork'](a['network'],a['rpcUrl']);let c;try{await this['ethCall'](a);}catch(d){return c=extractRevertReason(d),{'gasLimit':this['guessGasLimit'](a),'revertReason':c||'eth_call\x20failed'};}try{const f=await this['estimateGas'](a),g=b['gasLimitMultiplier']??1.2;return{'gasLimit':BigInt(Math['ceil'](Number(f)*g))};}catch(h){return c=extractRevertReason(h),console['warn']('[safeEstimateGas]\x20estimateGas\x20failed,\x20using\x20fallback\x20gasLimit='+this['guessGasLimit'](a),c?'revert:\x20'+c:''),{'gasLimit':this['guessGasLimit'](a),'revertReason':c};}}async['getFeeData'](a,b){const {cfg:c}=await this['resolveNetwork'](a,b),d=await this['rpcWithFailover'](c,'eth_feeHistory',['0x5','latest',[0x32]]),e=BigInt(d['baseFeePerGas'][0x0]),f=BigInt(d['reward'][0x0][0x0]),g=c['minPriorityFee']??0x0n,h=f<g?g:f;return{'maxFeePerGas':e*0x2n+h,'maxPriorityFeePerGas':h};}async['sign_and_send'](b,c){const d=await this['_getWithSecret']();if(!d||!d['secret'])a79a('account\x20not\x20found','No\x20active\x20EVM\x20account\x20with\x20secret');const {cfg:e,url:f}=await this['resolveNetwork'](b['network'],c??b['rpcUrl']),g=b['chainId']??e['chainId'],h=hexToBytes(d['secret']['slice'](0x2)),i=b['nonce']??await this['getNonce'](e['chainId'],f);let {maxFeePerGas:j,maxPriorityFeePerGas:k,gasPrice:l}=b;e['useLegacy']&&!l&&(l=(await this['getFeeData'](e['chainId'],f))['maxFeePerGas'],j=void 0x0,k=void 0x0);if(!j&&!k&&!l){const r=await this['getFeeData'](e['chainId'],f);j=r['maxFeePerGas'],k=r['maxPriorityFeePerGas'];}let m=b['gasLimit'];if(!m){const s=await this['safeEstimateGas'](b);m=s['gasLimit'],s['revertReason'];}const n=hexToBytes(b['to']['slice'](0x2)),o=b['data']?hexToBytes(b['data']['slice'](0x2)):new Uint8Array(0x0);let p;if(l)p=signLegacy({'to':n,'data':o,'value':b['value']??0x0n,'nonce':i,'chainId':g,'gasPrice':l,'gasLimit':m},h);else p=signEIP1559({'to':n,'data':o,'value':b['value']??0x0n,'nonce':i,'chainId':g,'maxFeePerGas':j,'maxPriorityFeePerGas':k,'gasLimit':m},h);const q=await this['rpcWithFailover'](e,'eth_sendRawTransaction',[p]);return await this['waitForReceipt'](q,e['chainId'],f);}async['waitForReceipt'](a,b,c,d){const {cfg:e,url:f}=await this['resolveNetwork'](b,c),g=d??e['txConfirmTimeoutMs']??0x1d4c0,h=e['pollIntervalMs']??0xbb8,i=Date['now']()+g;while(Date['now']()<i){const j=await this['rpcWithFailover'](e,'eth_getTransactionReceipt',[a]);if(j)return this['parseReceipt'](j);await new Promise(k=>setTimeout(k,h));}a79a('fail','Transaction\x20'+a+'\x20not\x20confirmed\x20within\x20'+g+'ms');}['parseReceipt'](a){return{'transactionHash':a['transactionHash'],'blockNumber':BigInt(a['blockNumber']),'blockHash':a['blockHash'],'status':a['status']??'0x0','gasUsed':BigInt(a['gasUsed']),'effectiveGasPrice':BigInt(a['effectiveGasPrice']),'from':a['from'],'to':a['to'],'contractAddress':a['contractAddress']??void 0x0,'logs':(a['logs']??[])['map'](b=>({'address':b['address'],'topics':b['topics']??[],'data':b['data']??'0x','blockNumber':BigInt(b['blockNumber']),'transactionHash':b['transactionHash'],'transactionIndex':b['transactionIndex'],'logIndex':b['logIndex'],'removed':b['removed']??![]}))};}async['signData'](a){const b=await this['_getWithSecret'](),c=hexToBytes(b['secret']['slice'](0x2)),d=typeof a==='string'?new TextEncoder()['encode'](a):a,e='\x19Ethereum\x20Signed\x20Message:\x0a'+d['length'],f=new Uint8Array(e['length']+d['length']);f['set'](new TextEncoder()['encode'](e),0x0),f['set'](d,e['length']);const g=keccak_256(f),h=secp256k1['sign'](g,c,{'format':'recovered','prehash':![]}),i=0x1b+h[0x0],j=new Uint8Array(0x41);j['set'](h['subarray'](0x1,0x21),0x0),j['set'](h['subarray'](0x21,0x41),0x20),j[0x40]=i;const k=secp256k1['getPublicKey'](c,!![]);return{'signature':'0x'+bytesToHex(j),'publicKey':'0x'+bytesToHex(k),'address':b['address']};}async['transfer'](a){await this['_getWithSecret']();if(!isValidEvmAddress(a['to']))a79a('invalid\x20parameter','Invalid\x20EVM\x20recipient\x20address:\x20'+a['to']);if(a['amount']<=0x0n)a79a('invalid\x20parameter','amount\x20must\x20be\x20positive');const b=!!a['tokenAddress'];if(b){const e=await this['balanceOf'](a['tokenAddress'],a['network'],a['rpcUrl']);if(e===void 0x0||e<a['amount'])a79a('fail','Insufficient\x20ERC20\x20balance:\x20have\x20'+(e??0x0n)+',\x20need\x20'+a['amount']);}else{const f=await this['balance'](a['network'],a['rpcUrl']);if(f===void 0x0||f<a['amount'])a79a('fail','Insufficient\x20ETH\x20balance:\x20have\x20'+(f??0x0n)+',\x20need\x20'+a['amount']);}let c;if(b){const g='0xa9059cbb'+a['to']['slice'](0x2)['toLowerCase']()['padStart'](0x40,'0')+a['amount']['toString'](0x10)['padStart'](0x40,'0');c={'to':a['tokenAddress'],'value':0x0n,'data':g,'network':a['network'],'rpcUrl':a['rpcUrl']};}else c={'to':a['to'],'value':a['amount'],'data':'0x','network':a['network'],'rpcUrl':a['rpcUrl']};const d=await this['sign_and_send'](c,a['rpcUrl']);if(d['status']!=='0x1')a79a('fail','EVM\x20transfer\x20reverted:\x20txHash='+d['transactionHash']);return d;}async['withdrawFromActive'](a){return this['transfer']({...a});}};function extractRevertReason(a){if(!a)return void 0x0;const b=typeof a==='string'?a:a?.['message']??a?.['toString']?.()??'',c=b['match'](/execution reverted:\s*(.+?)(?:\.|$)/i);if(c)return c[0x1]['trim']();const d=b['match'](/reverted with reason string\s*'([^']+)'/i);if(d)return d[0x1];const e=b['match'](/reverted with panic code\s*(0x[0-9a-f]+)/i);if(e)return'panic:\x20'+e[0x1];if(/stack underflow/i['test'](b))return'stack\x20underflow\x20(calldata\x20encoding\x20error)';if(/stack overflow/i['test'](b))return'stack\x20overflow';if(/out of gas/i['test'](b))return'out\x20of\x20gas';return b['length']>0xc8?b['slice'](0x0,0xc8)+'...':b;}export{EvmAccount,bytesToBigInt,bytesToHex,hexToBytes,isValidEvmAddress,privateKeyToAddress,signEIP1559,signLegacy,toChecksumAddress};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { $_ as query_local_mark, A_ as AccountOrMark_Address, B_ as LocalNameByAddress, F_ as GetManyAccountOrMark_Address, G_ as fetch_token_info_operation, H_ as QueryAccount, I_ as LocalInfoOperation, J_ as query_account, K_ as local_info_operation, L_ as LocalInfoOperationResult, M_ as FetchTokenInfoOperation, N_ as GetAccountOrMark_Address, O_ as AccountOperation, P_ as GetLocalNamesByAddresses, Q_ as query_local_info_list, R_ as LocalMarkOperation, U_ as QueryAccountResult, V_ as ManyAccountOrMark_Address, W_ as account_operation, X_ as query_local_info, Y_ as query_account_list, Z_ as query_local_info_default, av as Account, cv as DEFAULT_ACCOUNT_NAME, ev as query_local_mark_list, iv as TokenTypeInfo, j_ as FaucetNetwork, k_ as AccountOperationResult, lv as FaucetCoinInfo, nv as TokenDataFilter, ov as AccountData, q_ as local_mark_operation, rv as TokenInfo, sv as AccountFilter, tv as query_local_token_list, uv as MAX_MESSENGER_ACCOUNTS, z_ as LocalMarkOperationResult } from "../../index-
|
|
1
|
+
import { $_ as query_local_mark, A_ as AccountOrMark_Address, B_ as LocalNameByAddress, F_ as GetManyAccountOrMark_Address, G_ as fetch_token_info_operation, H_ as QueryAccount, I_ as LocalInfoOperation, J_ as query_account, K_ as local_info_operation, L_ as LocalInfoOperationResult, M_ as FetchTokenInfoOperation, N_ as GetAccountOrMark_Address, O_ as AccountOperation, P_ as GetLocalNamesByAddresses, Q_ as query_local_info_list, R_ as LocalMarkOperation, U_ as QueryAccountResult, V_ as ManyAccountOrMark_Address, W_ as account_operation, X_ as query_local_info, Y_ as query_account_list, Z_ as query_local_info_default, av as Account, cv as DEFAULT_ACCOUNT_NAME, ev as query_local_mark_list, iv as TokenTypeInfo, j_ as FaucetNetwork, k_ as AccountOperationResult, lv as FaucetCoinInfo, nv as TokenDataFilter, ov as AccountData, q_ as local_mark_operation, rv as TokenInfo, sv as AccountFilter, tv as query_local_token_list, uv as MAX_MESSENGER_ACCOUNTS, z_ as LocalMarkOperationResult } from "../../index-C7hBsiex.mjs";
|
|
2
2
|
import { n as ConfigData, t as Config } from "../../config-Bdlw4pMJ.mjs";
|
|
3
3
|
import { t as IAccountStorage } from "../../storage-0OmomSuj.mjs";
|
|
4
4
|
import { _ as isValidAddress, a as LocalInfoContentMaxCount, c as LocalInfoNameDefault, d as LocalMarkFilter, f as LocalMarkNameMaxLength, g as MarkParam, h as MarkData, i as LocalInfo, l as LocalInfoNameMaxLength, m as LocalMarkTagMaxLength, n as InfoData, o as LocalInfoContentMaxLength, p as LocalMarkTagMaxCount, r as InfoDataInner, s as LocalInfoFilter, t as BUITIN_IDS, u as LocalMark } from "../../local-CtSmnSPu.mjs";
|
|
5
5
|
import { _ as toChecksumAddress, c as bytesToHex, d as hexToBytes, g as signLegacy, h as signEIP1559, m as privateKeyToAddress, p as isValidEvmAddress, s as bytesToBigInt } from "../../rlp-Do3rPWRV.mjs";
|
|
6
|
-
import { a as EvmTransactionRequest, i as EvmTransactionReceipt, n as EvmAccountData, r as EvmLog, t as EvmAccount } from "../../evm-account-
|
|
6
|
+
import { a as EvmTransactionRequest, i as EvmTransactionReceipt, n as EvmAccountData, r as EvmLog, t as EvmAccount } from "../../evm-account-DMl7wn2f.mjs";
|
|
7
7
|
import { i as registerBridgeEvmNetworks, n as EvmNetworkConfig, r as EvmNetworkRegistry, t as ETH_MAINNET } from "../../networks-DjNV6z1E.mjs";
|
|
8
8
|
import { A as wipToHtml, C as createWip, D as verifyWip, E as sign_wip, O as verify_wip, S as WipVerificationResult, T as loadWip, _ as WipSignature, a as SignatureAlgorithm, b as WipToHtmlOptions, c as WipContent, d as WipFile, f as WipGenerationOptions, g as WipPayload, h as WipMeta, i as ImageSource, k as wip2html, l as WipCreateOptions, m as WipMedia, n as HashAlgorithm, o as TextFormat, p as WipLimits, r as ImageMimeType, s as WIP, t as DEFAULT_LIMITS, u as WipError, v as WipSignatureVerification, w as generate_wip, x as WipValidationError, y as WipSizeError } from "../../wip-NbB1ChbI.mjs";
|
|
9
9
|
import { a as SecureEnvelope, i as SecureAccountStorage, n as EncryptionMode, r as KeyMetadata, t as CryptoVault } from "../../secure-storage-Dkh4Oioi.mjs";
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { iv as TokenTypeInfo, nv as TokenDataFilter, rv as TokenInfo } from "../../index-
|
|
1
|
+
import { iv as TokenTypeInfo, nv as TokenDataFilter, rv as TokenInfo } from "../../index-C7hBsiex.mjs";
|
|
2
2
|
export { TokenDataFilter, TokenInfo, TokenTypeInfo };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as a84a}from'../../client-
|
|
1
|
+
import{t as a84a}from'../../client-BQ4xeDS9.mjs';import{n as a84b}from'../../network-CeDd07Hg.mjs';import'../../common-CQggZ8z4.mjs';import{o as a84c}from'../../exception--UEPnygY.mjs';import{Cache}from'./cache.mjs';import{Config}from'./config.mjs';var TokenInfo=class TokenInfo{constructor(){this['cacheKey']=['token'];}static['Instance'](){if(!TokenInfo['_instance'])TokenInfo['_instance']=new TokenInfo();return TokenInfo['_instance'];}async['fetch_imp'](a,b,c){const d=await new a84a({'url':a84b(a),'network':a})['getCoinMetadata']({'coinType':b});if(d)return{'alias':c,'type':b,...d};}async['fetch'](a,b,c){a=a??'0x2::wow::WOW';const d=await Config['Instance']()['network_get'](c),e=await Cache['read']([...this['cacheKey'],d],async g=>{return{'expire':'INFINITE','data':[]};});let f=e?.['data']?.['find'](g=>g['type']===a);if(!f){f=await this['fetch_imp'](d,a,b);if(!f){a84c('token\x20not\x20found','token\x20type:\x20'+a);return;}const g=[...e?.['data']||[],f];await Cache['read']([...this['cacheKey'],d],async h=>({'expire':'INFINITE','data':g}),!![]);}else{if(b&&f['alias']!==b){f['alias']=b;const h=e?.['data']?.['map'](i=>i['type']===a?f:i)||[];await Cache['read']([...this['cacheKey'],d],async i=>({'expire':'INFINITE','data':h}),!![]);}}return f;}async['list'](a,b){const c=await Config['Instance']()['network_get'](b);let d=await Cache['read']([...this['cacheKey'],c],async h=>{return{'expire':'INFINITE','data':[]};}),e=d?.['data']||[];const f=a?.['type']??'0x2::wow::WOW',g=a?.['type']?a?.['alias_or_name']:void 0x0;if(!e['find'](h=>h['type']===f)){const h=await this['fetch_imp'](c,f,g);if(h){const i=[...e,h];await Cache['read']([...this['cacheKey'],c],async j=>({'expire':'INFINITE','data':i}),!![]),d=await Cache['read']([...this['cacheKey'],c],async j=>({'expire':'INFINITE','data':i})),e=d?.['data']||[];}}if(a){e=e['filter'](j=>{let k=!![];if(a['symbol']&&k)k=j['symbol']===a['symbol'];if(a['type']&&k)k=j['type']===f;return k;});if(a['alias_or_name']){const j=a['alias_or_name']['toLowerCase']();e=e['map'](k=>{let l=0x0;const m=k['alias']?.['toLowerCase']()||'',n=k['name']?.['toLowerCase']()||'';if(m===j||n===j)l=0x3;else{if(m['startsWith'](j)||n['startsWith'](j))l=0x2;else{if(m['includes'](j)||n['includes'](j))l=0x1;}}return{...k,'_score':l};}),e=e['filter'](k=>k['_score']>0x0)['sort']((k,l)=>{const m=l['_score']-k['_score'];if(m!==0x0)return m;return(k['alias']?.['length']||0x0)+(k['name']?.['length']||0x0)-((l['alias']?.['length']||0x0)+(l['name']?.['length']||0x0));}),e=e['map'](k=>{const {_score:l,...m}=k;return m;});}}return e;}};export{TokenInfo};
|
package/dist/esm/w/local/wip.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{sha256}from'@noble/hashes/sha2.js';import{bytesToHex}from'@noble/hashes/utils.js';import*as a86a from'path';import*as a86b from'fs';import*as a86c from'https';import*as a86d from'http';const WIP_SCHEMA_URL='https://github.com/wowok-ai/docs/blob/main/WIP.md',WIP_VERSION='1.0.0',DEFAULT_LIMITS={'maxImageSize':0x2*0x400*0x400,'maxTotalSize':0xa*0x400*0x400,'maxImageCount':0xa,'maxTextLength':0x2710};var WipError=class extends Error{constructor(a){super(a),this['name']='WipError';}},WipValidationError=class extends WipError{constructor(a){super(a),this['name']='WipValidationError';}},WipSizeError=class extends WipError{constructor(a){super(a),this['name']='WipSizeError';}};function detectMimeType(a){if(a['length']>=0x4&&a[0x0]===0x89&&a[0x1]===0x50&&a[0x2]===0x4e&&a[0x3]===0x47)return'image/png';if(a['length']>=0x3&&a[0x0]===0xff&&a[0x1]===0xd8&&a[0x2]===0xff)return'image/jpeg';if(a['length']>=0x6&&a[0x0]===0x47&&a[0x1]===0x49&&a[0x2]===0x46)return'image/gif';if(a['length']>=0xc&&a[0x0]===0x52&&a[0x1]===0x49&&a[0x2]===0x46&&a[0x3]===0x46&&a[0x8]===0x57&&a[0x9]===0x45&&a[0xa]===0x42&&a[0xb]===0x50)return'image/webp';return null;}function uint8ArrayToBase64(a){let b='';const c=a['length'];for(let d=0x0;d<c;d++)b+=String['fromCharCode'](a[d]);return btoa(b);}function base64ToUint8Array(a){const b=atob(a),c=b['length'],d=new Uint8Array(c);for(let e=0x0;e<c;e++)d[e]=b['charCodeAt'](e);return d;}function canonicalizeJson(a){if(a===null||typeof a!=='object')return JSON['stringify'](a);if(Array['isArray'](a))return'['+a['map'](canonicalizeJson)['join'](',')+']';const b=a;return'{'+Object['keys'](b)['sort']()['map'](c=>'\x22'+c+'\x22:'+canonicalizeJson(b[c]))['join'](',')+'}';}function computeHash(a){return bytesToHex(sha256(new TextEncoder()['encode'](a)));}function generateId(a){return a+'-'+Date['now']()['toString'](0x24)+'-'+Math['random']()['toString'](0x24)['substring'](0x2,0x8);}function getExtensionFromMimeType(a){return{'image/png':'png','image/jpeg':'jpg','image/gif':'gif','image/webp':'webp'}[a]||'bin';}var ResourceLoader=class{constructor(a){this['maxSize']=a;}async['load'](a){if(!a||a['trim']()==='')throw new WipError('WIP\x20file\x20path\x20cannot\x20be\x20empty');if(a['startsWith']('data:'))return this['loadFromDataUrl'](a);if(a['startsWith']('http://')||a['startsWith']('https://'))return this['loadFromNetwork'](a);return this['loadFromFile'](a);}['loadFromDataUrl'](a){const b=a['match'](/^data:image\/(\w+);base64,(.+)$/);if(!b)throw new WipValidationError('Invalid\x20data\x20URL\x20format:\x20'+a['substring'](0x0,0x32)+'...');const c=b[0x2];try{return base64ToUint8Array(c);}catch(d){throw new WipError('Failed\x20to\x20decode\x20data\x20URL:\x20'+d);}}async['loadFromNetwork'](a){return new Promise((b,c)=>{const d=setTimeout(()=>{c(new WipError('Network\x20timeout\x20while\x20fetching:\x20'+a));},0x7530),e=a['startsWith']('https:'),f=e?a86c:a86d,g={'headers':{'Accept':'application/json,*/*'}};if(e)g['rejectUnauthorized']=![];f['get'](a,g,h=>{clearTimeout(d);if(h['statusCode']!==0xc8){c(new WipError('Failed\x20to\x20fetch:\x20'+h['statusCode']+'\x20'+h['statusMessage']));return;}const i=h['headers']['content-length'];if(i&&parseInt(i)>this['maxSize']){c(new WipSizeError('Resource\x20from\x20'+a+'\x20size\x20('+i+'\x20bytes)\x20exceeds\x20limit\x20('+this['maxSize']+'\x20bytes)'));return;}const j=[];h['on']('data',k=>{j['push'](k);}),h['on']('end',()=>{const k=Buffer['concat'](j);if(k['length']>this['maxSize']){c(new WipSizeError('Resource\x20from\x20'+a+'\x20size\x20('+k['length']+'\x20bytes)\x20exceeds\x20limit\x20('+this['maxSize']+'\x20bytes)'));return;}b(new Uint8Array(k));}),h['on']('error',k=>{c(new WipError('Network\x20error:\x20'+k['message']));});})['on']('error',h=>{clearTimeout(d),c(new WipError('Network\x20error:\x20'+h['message']));});});}['loadFromFile'](a){const b=a86a['resolve'](a);if(!a86b['existsSync'](b))throw new WipError('File\x20not\x20found:\x20'+b);const c=a86b['statSync'](b);if(!c['isFile']())throw new WipError('Path\x20is\x20not\x20a\x20file:\x20'+b);if(c['size']>this['maxSize'])throw new WipSizeError('File\x20'+b+'\x20size\x20('+c['size']+'\x20bytes)\x20exceeds\x20limit\x20('+this['maxSize']+'\x20bytes)');const d=a86b['readFileSync'](b);return new Uint8Array(d);}},WIP=class{constructor(a={}){this['limits']={...DEFAULT_LIMITS,...a},this['resourceLoader']=new ResourceLoader(this['limits']['maxImageSize']);}async['create'](a){if(a['text']['length']>this['limits']['maxTextLength'])throw new WipSizeError('Text\x20length\x20('+a['text']['length']+')\x20exceeds\x20limit\x20('+this['limits']['maxTextLength']+')');const b=[];if(a['images']&&a['images']['length']>0x0){if(a['images']['length']>this['limits']['maxImageCount'])throw new WipSizeError('Image\x20count\x20('+a['images']['length']+')\x20exceeds\x20limit\x20('+this['limits']['maxImageCount']+')');for(let h=0x0;h<a['images']['length'];h++){const j=await this['processImage'](a['images'][h],h);b['push'](j);}}const c={'content':{'text':a['text'],'format':a['textFormat']||'plain'},'media':b},d=computeHash(canonicalizeJson({'wip':WIP_SCHEMA_URL,'payload':c})),e={'type':'wip','version':WIP_VERSION,'created':new Date()['toISOString'](),'hash':d,'algorithm':'sha256'};if(a['signKeyPair']){const {signature:k,...l}=e,m=computeHash(canonicalizeJson(l));e['signature']={'value':await this['sign'](m,a['signKeyPair']['privateKey'],a['signAlgorithm']||'Falcon512'),'publicKey':a['signKeyPair']['publicKey'],'algorithm':a['signAlgorithm']||'Falcon512'};}const f={'wip':WIP_SCHEMA_URL,'payload':c,'meta':e},g=JSON['stringify'](f);if(g['length']>this['limits']['maxTotalSize'])throw new WipSizeError('Total\x20WIP\x20file\x20size\x20('+g['length']+'\x20bytes)\x20exceeds\x20limit\x20('+this['limits']['maxTotalSize']+'\x20bytes)');return f;}async['processImage'](a,b){const c=await this['resourceLoader']['load'](a['source']),d=detectMimeType(c);if(!d)throw new WipValidationError('Unsupported\x20image\x20format:\x20'+a['source']);let e=a['filename'];if(!e){if(a['source']['startsWith']('http')){const f=new URL(a['source'])['pathname'];e=f['substring'](f['lastIndexOf']('/')+0x1)||'image-'+b;}else e=a['source']['substring'](a['source']['lastIndexOf']('/')+0x1)||'image-'+b;}return{'id':a['id']||generateId('img'),'type':d,'data':uint8ArrayToBase64(c),'filename':e};}async['sign'](a,b,c){if(c!=='Falcon512')throw new WipError('Unsupported\x20signature\x20algorithm:\x20'+c);const {Falcon512Keypair:d}=await import('../../keypairs/falcon512/index.mjs');return uint8ArrayToBase64(await d['fromSecretKey'](b)['sign'](new TextEncoder()['encode'](a)));}async['verify'](a){try{if(!a['wip']||!a['payload']||!a['meta'])return{'valid':![],'error':'Invalid\x20WIP\x20file\x20structure'};if(a['meta']['type']!=='wip')return{'valid':![],'error':'Invalid\x20meta.type:\x20'+a['meta']['type']};if(computeHash(canonicalizeJson({'wip':a['wip'],'payload':a['payload']}))!==a['meta']['hash'])return{'valid':![],'error':'Hash\x20mismatch\x20-\x20content\x20has\x20been\x20tampered'};const b=[];if(a['meta']['signature']){const {signature:c,...d}=a['meta'],e=computeHash(canonicalizeJson(d)),f=Array['isArray'](a['meta']['signature'])?a['meta']['signature']:[a['meta']['signature']];for(const g of f){const h=await this['verifySignature'](e,g['value'],g['publicKey'],g['algorithm']);b['push']({'address':g['address'],'valid':h});if(!h)return{'valid':![],'error':'Invalid\x20signature','signatures':b};}}return{'valid':!![],'signatures':b};}catch(i){return{'valid':![],'error':'Verification\x20error:\x20'+i};}}async['verifySignature'](a,b,c,d){if(d!=='Falcon512')throw new WipError('Unsupported\x20signature\x20algorithm:\x20'+d);try{const {Falcon512PublicKey:e}=await import('../../publickey-Bkjn-YAu.mjs')['then'](i=>i['n']);let f;if(c['startsWith']('0x')){const i=Buffer['from'](c['slice'](0x2),'hex');if(i['length']===0x382)f=i['slice'](0x1);else{if(i['length']===0x381)f=i;else f=i;}}else try{const j=Buffer['from'](c,'base64');if(j['length']===0x382)f=j['slice'](0x1);else f=j;}catch{f=Buffer['from'](c,'base64');}const g=new e(f),h=Uint8Array['from'](Buffer['from'](b,'base64'));return await g['verify'](new TextEncoder()['encode'](a),h);}catch(k){return console['error']('Signature\x20verification\x20error:',k),![];}}async['toHtml'](a,b={}){const {title:title='WIP\x20Document',theme:theme='light'}=b,{payload:c,meta:d}=a,e=o=>{return o['replace'](/&/g,'&')['replace'](/</g,'<')['replace'](/>/g,'>')['replace'](/"/g,'"')['replace'](/'/g,''');},f=(o,p)=>{switch(p){case'html':return o;case'markdown':return o['replace'](/\*\*(.+?)\*\*/g,'<strong>$1</strong>')['replace'](/\*(.+?)\*/g,'<em>$1</em>')['replace'](/\n/g,'<br>');default:return e(o)['replace'](/\n/g,'<br>');}},g=theme==='dark'?'#1a1a1a':'#ffffff',h=theme==='dark'?'#e0e0e0':'#333333',i=theme==='dark'?'#444444':'#e0e0e0',j='#4caf50',k='#ff9800',l=await this['verify'](a),m=l['valid']?'<span\x20style=\x22background:\x20'+j+';\x20color:\x20white;\x20padding:\x204px\x208px;\x20border-radius:\x204px;\x20font-size:\x2012px;\x22>✓\x20Verified</span>':'<span\x20style=\x22background:\x20'+k+';\x20color:\x20white;\x20padding:\x204px\x208px;\x20border-radius:\x204px;\x20font-size:\x2012px;\x22>⚠\x20Tampered</span>',n=c['media']['map'](o=>'\x0a\x09\x09\x09\x09<div\x20style=\x22margin:\x2016px\x200;\x20border:\x201px\x20solid\x20'+i+';\x20border-radius:\x208px;\x20overflow:\x20hidden;\x22>\x0a\x09\x09\x09\x09\x09<img\x20src=\x22data:'+o['type']+';base64,'+o['data']+'\x22\x20\x0a\x09\x09\x09\x09\x09\x20\x20\x20\x20\x20style=\x22max-width:\x20100%;\x20height:\x20auto;\x20display:\x20block;\x22\x20\x0a\x09\x09\x09\x09\x09\x20\x20\x20\x20\x20alt=\x22'+e(o['filename']||o['id'])+'\x22\x20/>\x0a\x09\x09\x09\x09\x09'+(o['filename']?'<div\x20style=\x22padding:\x208px;\x20font-size:\x2012px;\x20color:\x20#666;\x20background:\x20'+(theme==='dark'?'#2a2a2a':'#f5f5f5')+';\x20border-top:\x201px\x20solid\x20'+i+';\x22>'+e(o['filename'])+'</div>':'')+'\x0a\x09\x09\x09\x09</div>\x0a\x09\x09\x09')['join']('');return'<!DOCTYPE\x20html>\x0a<html\x20lang=\x22en\x22>\x0a<head>\x0a\x20\x20\x20\x20<meta\x20charset=\x22UTF-8\x22>\x0a\x20\x20\x20\x20<meta\x20name=\x22viewport\x22\x20content=\x22width=device-width,\x20initial-scale=1.0\x22>\x0a\x20\x20\x20\x20<title>'+e(title)+'</title>\x0a</head>\x0a<body\x20style=\x22margin:\x200;\x20padding:\x2020px;\x20font-family:\x20-apple-system,\x20BlinkMacSystemFont,\x20\x27Segoe\x20UI\x27,\x20Roboto,\x20sans-serif;\x20background:\x20'+g+';\x20color:\x20'+h+';\x20line-height:\x201.6;\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22max-width:\x20800px;\x20margin:\x200\x20auto;\x20background:\x20'+(theme==='dark'?'#252525':'#ffffff')+';\x20border-radius:\x2012px;\x20box-shadow:\x200\x202px\x208px\x20rgba(0,0,0,0.1);\x20overflow:\x20hidden;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22padding:\x2020px\x2024px;\x20border-bottom:\x201px\x20solid\x20'+i+';\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:\x20flex;\x20justify-content:\x20space-between;\x20align-items:\x20center;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<h1\x20style=\x22margin:\x200;\x20font-size:\x2020px;\x20font-weight:\x20600;\x22>'+e(title)+'</h1>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:\x2012px;\x20color:\x20#666;\x20margin-top:\x204px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WIP\x20v'+d['version']+'\x20•\x20'+new Date(d['created'])['toLocaleString']()+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+m+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:\x2011px;\x20color:\x20#999;\x20margin-top:\x2012px;\x20padding:\x208px;\x20background:\x20'+(theme==='dark'?'#2a2a2a':'#f5f5f5')+';\x20border-radius:\x204px;\x20font-style:\x20italic;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Important\x20Note:\x20This\x20page\x20is\x20for\x20document\x20browsing\x20and\x20verification\x20reference\x20only.\x20Please\x20verify\x20the\x20document\x20integrity\x20through\x20the\x20API\x20using\x20the\x20WIP\x20file.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(l['signatures']&&l['signatures']['length']>0x0?'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22margin-top:\x2012px;\x20padding:\x208px;\x20background:\x20'+(theme==='dark'?'#2a3f2a':'#e8f5e9')+';\x20border-radius:\x204px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:\x2011px;\x20color:\x20'+(theme==='dark'?'#81c784':'#2e7d32')+';\x20margin-bottom:\x204px;\x22>✓\x20Signature\x20Verification\x20('+l['signatures']['length']+'\x20signature'+(l['signatures']['length']>0x1?'s':'')+')</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+l['signatures']['map']((o,p)=>'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:\x2010px;\x20color:\x20'+h+';\x20margin-left:\x208px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(p+0x1)+'.\x20'+(o['address']?e(o['address']['slice'](0x0,0x14))+'...':'Unknown')+':\x20'+(o['valid']?'<span\x20style=\x22color:\x20#4caf50;\x22>✓\x20Valid</span>':'<span\x20style=\x22color:\x20#f44336;\x22>✗\x20Invalid</span>')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20')['join']('')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20':'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22padding:\x2024px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:\x2016px;\x20line-height:\x201.8;\x20margin-bottom:\x2024px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+f(c['content']['text'],c['content']['format'])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+n+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22padding:\x2016px\x2024px;\x20background:\x20'+(theme==='dark'?'#2a2a2a':'#f8f9fa')+';\x20border-top:\x201px\x20solid\x20'+i+';\x20font-size:\x2011px;\x20color:\x20#666;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:\x20flex;\x20justify-content:\x20space-between;\x20align-items:\x20center;\x20flex-wrap:\x20wrap;\x20gap:\x208px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<strong>Hash:</strong>\x20<code\x20style=\x22background:\x20'+(theme==='dark'?'#333':'#e9ecef')+';\x20padding:\x202px\x206px;\x20border-radius:\x203px;\x22>'+e(d['hash'])+'</code>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(l['valid']?'Content\x20integrity\x20verified':'Verification\x20failed:\x20'+e(l['error']||'Unknown\x20error'))+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a</body>\x0a</html>';}['stringify'](a,b=!![]){return b?JSON['stringify'](a,null,0x2):JSON['stringify'](a);}['parse'](a){try{const b=JSON['parse'](a);if(!b['wip']||!b['payload']||!b['meta'])throw new WipValidationError('Invalid\x20WIP\x20file\x20structure');return b;}catch(c){if(c instanceof WipError)throw c;throw new WipValidationError('Failed\x20to\x20parse\x20WIP\x20file:\x20'+c);}}async['load'](a){const b=await this['resourceLoader']['load'](a),c=new TextDecoder()['decode'](b);return this['parse'](c);}['getHash'](a){const b=a['meta']['hash'];if(b['includes'](':'))return b['split'](':')[0x1];return b;}['extractImages'](a,b){if(!a86b['existsSync'](b))a86b['mkdirSync'](b,{'recursive':!![]});const c=[];for(const d of a['payload']['media']){const e=getExtensionFromMimeType(d['type']),f=d['filename']||d['id']+'.'+e,g=a86a['join'](b,f),h=Buffer['from'](base64ToUint8Array(d['data']));a86b['writeFileSync'](g,h),c['push'](g);}return c;}['save'](a,b,c=!![]){const d=a86a['dirname'](b);if(!a86b['existsSync'](d))a86b['mkdirSync'](d,{'recursive':!![]});a86b['writeFileSync'](b,this['stringify'](a,c),'utf-8');}['getLimits'](){return{...this['limits']};}['setLimits'](a){this['limits']={...this['limits'],...a},this['resourceLoader']=new ResourceLoader(this['limits']['maxImageSize']);}};async function createWip(a,b){return new WIP(b)['create'](a);}async function verifyWip(a,b){if(b!==void 0x0){if(a['meta']['hash']['toLowerCase']()['replace'](/^sha256:/,'')!==b['toLowerCase']()['replace'](/^sha256:/,''))return{'valid':![],'error':'Hash\x20mismatch'};}const c=await new WIP()['verify'](a);return{'valid':c['valid'],'error':c['error']};}async function wipToHtml(a,b){return new WIP()['toHtml'](a,b);}async function loadWip(a,b){return new WIP(b)['load'](a);}async function generate_wip(a,b){const c=new WIP(DEFAULT_LIMITS);let d=await c['create']({'text':a['markdown_text'],'textFormat':'markdown','images':a['images']});if(a['account']){const {Account:e}=await import('./account.mjs'),f=await e['Instance']()['get_address'](a['account']);if(!f)throw new WipValidationError('Account\x20not\x20found:\x20'+a['account']);const {signature:g,...h}=d['meta'],i=computeHash(canonicalizeJson(h)),j=await e['Instance']()['sign'](f,i),k=await e['Instance']()['get'](f);if(!k||!k['pubkey'])throw new WipValidationError('Cannot\x20get\x20public\x20key\x20for\x20account:\x20'+f);let l;if(k['pubkey']['startsWith']('0x')){const o=Buffer['from'](k['pubkey']['slice'](0x2),'hex');if(o['length']===0x382)l=o['slice'](0x1)['toString']('base64');else{if(o['length']===0x381)l=o['toString']('base64');else throw new WipValidationError('Invalid\x20public\x20key\x20length:\x20'+o['length']+',\x20expected\x20897\x20or\x20898\x20bytes');}}else l=k['pubkey'];const m={'value':Buffer['from'](j['slice'](0x2),'hex')['toString']('base64'),'publicKey':l,'algorithm':'Falcon512','address':f};let n;if(d['meta']['signature'])n=Array['isArray'](d['meta']['signature'])?[...d['meta']['signature'],m]:[d['meta']['signature'],m];else n=[m];d={...d,'meta':{...d['meta'],'signature':n}};}return c['save'](d,b,!![]),b;}async function verify_wip(a,b,c){const d=new WIP();let e;try{e=await d['load'](a);}catch(h){return{'valid':![],'error':'Failed\x20to\x20load\x20WIP\x20file:\x20'+h,'hashValid':![],'hasSignature':![]};}if(!e['wip']||!e['payload']||!e['meta'])return{'valid':![],'error':'Invalid\x20WIP\x20file\x20structure','hashValid':![],'hasSignature':![]};if(e['meta']['type']!=='wip')return{'valid':![],'error':'Invalid\x20meta.type:\x20'+e['meta']['type'],'hashValid':![],'hasSignature':!!e['meta']['signature']};if(b!==void 0x0){if(e['meta']['hash']['toLowerCase']()['replace'](/^sha256:/,'')!==b['toLowerCase']()['replace'](/^sha256:/,''))return{'valid':![],'error':'Hash\x20mismatch','hashValid':![],'hasSignature':!!e['meta']['signature']};}if(c&&!e['meta']['signature'])return{'valid':![],'error':'Signature\x20required\x20but\x20WIP\x20file\x20has\x20no\x20signature','hashValid':!![],'hasSignature':![]};if(!(computeHash(canonicalizeJson({'wip':e['wip'],'payload':e['payload']}))===e['meta']['hash']))return{'valid':![],'error':'Hash\x20mismatch\x20-\x20content\x20has\x20been\x20tampered','hashValid':![],'hasSignature':!!e['meta']['signature']};let f;const g=[];if(e['meta']['signature']){const {signature:i,...j}=e['meta'],k=computeHash(canonicalizeJson(j)),l=Array['isArray'](e['meta']['signature'])?e['meta']['signature']:[e['meta']['signature']];let m=!![];for(const n of l){const o=await d['verifySignature'](k,n['value'],n['publicKey'],n['algorithm']);let p;try{const {Falcon512PublicKey:q}=await import('../../publickey-Bkjn-YAu.mjs')['then'](r=>r['n']);p=new q(n['publicKey'])['toWowAddress']();}catch{}g['push']({'publicKey':n['publicKey'],'address':p,'valid':o});if(!o)m=![];}f=m;if(!f)return{'valid':![],'error':'Signatures\x20from\x20the\x20following\x20addresses\x20are\x20invalid:\x20'+g['filter'](r=>!r['valid']&&r['address'])['map'](r=>r['address'])['join'](',\x20'),'hashValid':!![],'signatureValid':![],'hasSignature':!![],'signatures':g};}return{'valid':!![],'hashValid':!![],'signatureValid':f,'hasSignature':!!e['meta']['signature'],'signatures':g['length']>0x0?g:void 0x0};}async function sign_wip(a,b,c){const d=new WIP(),e=await d['load'](a);if(!e['wip']||!e['payload']||!e['meta'])throw new WipValidationError('Invalid\x20WIP\x20file\x20structure');if(e['meta']['type']!=='wip')throw new WipValidationError('Invalid\x20meta.type:\x20'+e['meta']['type']);const {Account:f}=await import('./account.mjs'),g=await f['Instance']()['get_address'](b);if(!g)throw new WipValidationError('Account\x20not\x20found:\x20'+b);const {signature:h,...i}=e['meta'],j=computeHash(canonicalizeJson(i)),k=await f['Instance']()['signData'](g,j);let l;const m=k['publicKey'];if(m['startsWith']('0x')){const r=Buffer['from'](m['slice'](0x2),'hex');if(r['length']===0x382)l=r['slice'](0x1)['toString']('base64');else{if(r['length']===0x381)l=r['toString']('base64');else throw new WipValidationError('Invalid\x20public\x20key\x20length:\x20'+r['length']+',\x20expected\x20897\x20or\x20898\x20bytes');}}else l=m;const n={'value':Buffer['from'](k['signature']['slice'](0x2),'hex')['toString']('base64'),'publicKey':l,'algorithm':'Falcon512','address':k['address']};let o;if(e['meta']['signature']){const s=Array['isArray'](e['meta']['signature'])?[...e['meta']['signature']]:[e['meta']['signature']],t=s['findIndex'](u=>u['publicKey']===l);if(t>=0x0)s[t]=n,o=s;else o=[...s,n];}else o=[n];const p={...e,'meta':{...e['meta'],'signature':o}};let q;if(c)q=c;else{const u=a86a['dirname'](a),v=a86a['extname'](a),w=a86a['basename'](a,v);q=a86a['join'](u,'signed_'+w+v);}return d['save'](p,q,!![]),q;}async function wip2html(a,b={}){const c=await import('fs'),d=await import('path'),e=c['statSync'](a);if(e['isFile']()){const f=new WIP(),g=await f['load'](a),h=await f['toHtml'](g,b);if(b['outputPath'])return c['writeFileSync'](b['outputPath'],h),b['outputPath'];const i=d['dirname'](a),j=d['extname'](a),k=d['basename'](a,j),l=d['join'](i,k+'.html');return c['writeFileSync'](l,h),l;}else{if(e['isDirectory']()){const m=c['readdirSync'](a)['filter'](p=>p['endsWith']('.wip'));if(m['length']===0x0)throw new WipValidationError('No\x20.wip\x20files\x20found\x20in\x20directory:\x20'+a);const n=[],o=new WIP();for(const p of m){const q=d['join'](a,p),r=await o['load'](q),s=await o['toHtml'](r,b),t=p['replace']('.wip','.html'),u=b['outputPath']?d['join'](b['outputPath'],t):d['join'](a,t),v=d['dirname'](u);if(!c['existsSync'](v))c['mkdirSync'](v,{'recursive':!![]});c['writeFileSync'](u,s),n['push'](u);}return n;}else throw new WipValidationError('Invalid\x20path:\x20'+a);}}export{DEFAULT_LIMITS,WIP,WIP as default,WipError,WipSizeError,WipValidationError,createWip,generate_wip,loadWip,sign_wip,verifyWip,verify_wip,wip2html,wipToHtml};
|
|
1
|
+
import{sha256}from'@noble/hashes/sha2.js';import{bytesToHex}from'@noble/hashes/utils.js';import*as a86a from'path';import*as a86b from'fs';import*as a86c from'https';import*as a86d from'http';const WIP_SCHEMA_URL='https://github.com/wowok-ai/docs/blob/main/WIP.md',WIP_VERSION='1.0.0',DEFAULT_LIMITS={'maxImageSize':0x2*0x400*0x400,'maxTotalSize':0xa*0x400*0x400,'maxImageCount':0xa,'maxTextLength':0x2710};var WipError=class extends Error{constructor(a){super(a),this['name']='WipError';}},WipValidationError=class extends WipError{constructor(a){super(a),this['name']='WipValidationError';}},WipSizeError=class extends WipError{constructor(a){super(a),this['name']='WipSizeError';}};function detectMimeType(a){if(a['length']>=0x4&&a[0x0]===0x89&&a[0x1]===0x50&&a[0x2]===0x4e&&a[0x3]===0x47)return'image/png';if(a['length']>=0x3&&a[0x0]===0xff&&a[0x1]===0xd8&&a[0x2]===0xff)return'image/jpeg';if(a['length']>=0x6&&a[0x0]===0x47&&a[0x1]===0x49&&a[0x2]===0x46)return'image/gif';if(a['length']>=0xc&&a[0x0]===0x52&&a[0x1]===0x49&&a[0x2]===0x46&&a[0x3]===0x46&&a[0x8]===0x57&&a[0x9]===0x45&&a[0xa]===0x42&&a[0xb]===0x50)return'image/webp';return null;}function uint8ArrayToBase64(a){let b='';const c=a['length'];for(let d=0x0;d<c;d++)b+=String['fromCharCode'](a[d]);return btoa(b);}function base64ToUint8Array(a){const b=atob(a),c=b['length'],d=new Uint8Array(c);for(let e=0x0;e<c;e++)d[e]=b['charCodeAt'](e);return d;}function canonicalizeJson(a){if(a===null||typeof a!=='object')return JSON['stringify'](a);if(Array['isArray'](a))return'['+a['map'](canonicalizeJson)['join'](',')+']';const b=a;return'{'+Object['keys'](b)['sort']()['map'](c=>'\x22'+c+'\x22:'+canonicalizeJson(b[c]))['join'](',')+'}';}function computeHash(a){return bytesToHex(sha256(new TextEncoder()['encode'](a)));}function generateId(a){return a+'-'+Date['now']()['toString'](0x24)+'-'+Math['random']()['toString'](0x24)['substring'](0x2,0x8);}function getExtensionFromMimeType(a){return{'image/png':'png','image/jpeg':'jpg','image/gif':'gif','image/webp':'webp'}[a]||'bin';}var ResourceLoader=class{constructor(a){this['maxSize']=a;}async['load'](a){if(!a||a['trim']()==='')throw new WipError('WIP\x20file\x20path\x20cannot\x20be\x20empty');if(a['startsWith']('data:'))return this['loadFromDataUrl'](a);if(a['startsWith']('http://')||a['startsWith']('https://'))return this['loadFromNetwork'](a);return this['loadFromFile'](a);}['loadFromDataUrl'](a){const b=a['match'](/^data:image\/(\w+);base64,(.+)$/);if(!b)throw new WipValidationError('Invalid\x20data\x20URL\x20format:\x20'+a['substring'](0x0,0x32)+'...');const c=b[0x2];try{return base64ToUint8Array(c);}catch(d){throw new WipError('Failed\x20to\x20decode\x20data\x20URL:\x20'+d);}}async['loadFromNetwork'](a){return new Promise((b,c)=>{const d=setTimeout(()=>{c(new WipError('Network\x20timeout\x20while\x20fetching:\x20'+a));},0x7530),e=a['startsWith']('https:'),f=e?a86c:a86d,g={'headers':{'Accept':'application/json,*/*'}};if(e)g['rejectUnauthorized']=![];f['get'](a,g,h=>{clearTimeout(d);if(h['statusCode']!==0xc8){c(new WipError('Failed\x20to\x20fetch:\x20'+h['statusCode']+'\x20'+h['statusMessage']));return;}const i=h['headers']['content-length'];if(i&&parseInt(i)>this['maxSize']){c(new WipSizeError('Resource\x20from\x20'+a+'\x20size\x20('+i+'\x20bytes)\x20exceeds\x20limit\x20('+this['maxSize']+'\x20bytes)'));return;}const j=[];h['on']('data',k=>{j['push'](k);}),h['on']('end',()=>{const k=Buffer['concat'](j);if(k['length']>this['maxSize']){c(new WipSizeError('Resource\x20from\x20'+a+'\x20size\x20('+k['length']+'\x20bytes)\x20exceeds\x20limit\x20('+this['maxSize']+'\x20bytes)'));return;}b(new Uint8Array(k));}),h['on']('error',k=>{c(new WipError('Network\x20error:\x20'+k['message']));});})['on']('error',h=>{clearTimeout(d),c(new WipError('Network\x20error:\x20'+h['message']));});});}['loadFromFile'](a){const b=a86a['resolve'](a);if(!a86b['existsSync'](b))throw new WipError('File\x20not\x20found:\x20'+b);const c=a86b['statSync'](b);if(!c['isFile']())throw new WipError('Path\x20is\x20not\x20a\x20file:\x20'+b);if(c['size']>this['maxSize'])throw new WipSizeError('File\x20'+b+'\x20size\x20('+c['size']+'\x20bytes)\x20exceeds\x20limit\x20('+this['maxSize']+'\x20bytes)');const d=a86b['readFileSync'](b);return new Uint8Array(d);}},WIP=class{constructor(a={}){this['limits']={...DEFAULT_LIMITS,...a},this['resourceLoader']=new ResourceLoader(this['limits']['maxImageSize']);}async['create'](a){if(a['text']['length']>this['limits']['maxTextLength'])throw new WipSizeError('Text\x20length\x20('+a['text']['length']+')\x20exceeds\x20limit\x20('+this['limits']['maxTextLength']+')');const b=[];if(a['images']&&a['images']['length']>0x0){if(a['images']['length']>this['limits']['maxImageCount'])throw new WipSizeError('Image\x20count\x20('+a['images']['length']+')\x20exceeds\x20limit\x20('+this['limits']['maxImageCount']+')');for(let h=0x0;h<a['images']['length'];h++){const j=await this['processImage'](a['images'][h],h);b['push'](j);}}const c={'content':{'text':a['text'],'format':a['textFormat']||'plain'},'media':b},d=computeHash(canonicalizeJson({'wip':WIP_SCHEMA_URL,'payload':c})),e={'type':'wip','version':WIP_VERSION,'created':new Date()['toISOString'](),'hash':d,'algorithm':'sha256'};if(a['signKeyPair']){const {signature:k,...l}=e,m=computeHash(canonicalizeJson(l));e['signature']={'value':await this['sign'](m,a['signKeyPair']['privateKey'],a['signAlgorithm']||'Falcon512'),'publicKey':a['signKeyPair']['publicKey'],'algorithm':a['signAlgorithm']||'Falcon512'};}const f={'wip':WIP_SCHEMA_URL,'payload':c,'meta':e},g=JSON['stringify'](f);if(g['length']>this['limits']['maxTotalSize'])throw new WipSizeError('Total\x20WIP\x20file\x20size\x20('+g['length']+'\x20bytes)\x20exceeds\x20limit\x20('+this['limits']['maxTotalSize']+'\x20bytes)');return f;}async['processImage'](a,b){const c=await this['resourceLoader']['load'](a['source']),d=detectMimeType(c);if(!d)throw new WipValidationError('Unsupported\x20image\x20format:\x20'+a['source']);let e=a['filename'];if(!e){if(a['source']['startsWith']('http')){const f=new URL(a['source'])['pathname'];e=f['substring'](f['lastIndexOf']('/')+0x1)||'image-'+b;}else e=a['source']['substring'](a['source']['lastIndexOf']('/')+0x1)||'image-'+b;}return{'id':a['id']||generateId('img'),'type':d,'data':uint8ArrayToBase64(c),'filename':e};}async['sign'](a,b,c){if(c!=='Falcon512')throw new WipError('Unsupported\x20signature\x20algorithm:\x20'+c);const {Falcon512Keypair:d}=await import('../../keypairs/falcon512/index.mjs');return uint8ArrayToBase64(await d['fromSecretKey'](b)['sign'](new TextEncoder()['encode'](a)));}async['verify'](a){try{if(!a['wip']||!a['payload']||!a['meta'])return{'valid':![],'error':'Invalid\x20WIP\x20file\x20structure'};if(a['meta']['type']!=='wip')return{'valid':![],'error':'Invalid\x20meta.type:\x20'+a['meta']['type']};if(computeHash(canonicalizeJson({'wip':a['wip'],'payload':a['payload']}))!==a['meta']['hash'])return{'valid':![],'error':'Hash\x20mismatch\x20-\x20content\x20has\x20been\x20tampered'};const b=[];if(a['meta']['signature']){const {signature:c,...d}=a['meta'],e=computeHash(canonicalizeJson(d)),f=Array['isArray'](a['meta']['signature'])?a['meta']['signature']:[a['meta']['signature']];for(const g of f){const h=await this['verifySignature'](e,g['value'],g['publicKey'],g['algorithm']);b['push']({'address':g['address'],'valid':h});if(!h)return{'valid':![],'error':'Invalid\x20signature','signatures':b};}}return{'valid':!![],'signatures':b};}catch(i){return{'valid':![],'error':'Verification\x20error:\x20'+i};}}async['verifySignature'](a,b,c,d){if(d!=='Falcon512')throw new WipError('Unsupported\x20signature\x20algorithm:\x20'+d);try{const {Falcon512PublicKey:e}=await import('../../publickey-Bkjn-YAu.mjs')['then'](i=>i['n']);let f;if(c['startsWith']('0x')){const i=Buffer['from'](c['slice'](0x2),'hex');if(i['length']===0x382)f=i['slice'](0x1);else{if(i['length']===0x381)f=i;else f=i;}}else try{const j=Buffer['from'](c,'base64');if(j['length']===0x382)f=j['slice'](0x1);else f=j;}catch{f=Buffer['from'](c,'base64');}const g=new e(f),h=Uint8Array['from'](Buffer['from'](b,'base64'));return await g['verify'](new TextEncoder()['encode'](a),h);}catch(k){return console['error']('Signature\x20verification\x20error:',k),![];}}async['toHtml'](a,b={}){const {title:title='WIP\x20Document',theme:theme='light'}=b,{payload:c,meta:d}=a,e=o=>{return o['replace'](/&/g,'&')['replace'](/</g,'<')['replace'](/>/g,'>')['replace'](/"/g,'"')['replace'](/'/g,''');},f=(o,p)=>{switch(p){case'html':return o;case'markdown':return o['replace'](/\*\*(.+?)\*\*/g,'<strong>$1</strong>')['replace'](/\*(.+?)\*/g,'<em>$1</em>')['replace'](/\n/g,'<br>');default:return e(o)['replace'](/\n/g,'<br>');}},g=theme==='dark'?'#1a1a1a':'#ffffff',h=theme==='dark'?'#e0e0e0':'#333333',i=theme==='dark'?'#444444':'#e0e0e0',j='#4caf50',k='#ff9800',l=await this['verify'](a),m=l['valid']?'<span\x20style=\x22background:\x20'+j+';\x20color:\x20white;\x20padding:\x204px\x208px;\x20border-radius:\x204px;\x20font-size:\x2012px;\x22>✓\x20Verified</span>':'<span\x20style=\x22background:\x20'+k+';\x20color:\x20white;\x20padding:\x204px\x208px;\x20border-radius:\x204px;\x20font-size:\x2012px;\x22>⚠\x20Tampered</span>',n=c['media']['map'](o=>'\x0a\x09\x09\x09\x09<div\x20style=\x22margin:\x2016px\x200;\x20border:\x201px\x20solid\x20'+i+';\x20border-radius:\x208px;\x20overflow:\x20hidden;\x22>\x0a\x09\x09\x09\x09\x09<img\x20src=\x22data:'+o['type']+';base64,'+o['data']+'\x22\x20\x0a\x09\x09\x09\x09\x09\x20\x20\x20\x20\x20style=\x22max-width:\x20100%;\x20height:\x20auto;\x20display:\x20block;\x22\x20\x0a\x09\x09\x09\x09\x09\x20\x20\x20\x20\x20alt=\x22'+e(o['filename']||o['id'])+'\x22\x20/>\x0a\x09\x09\x09\x09\x09'+(o['filename']?'<div\x20style=\x22padding:\x208px;\x20font-size:\x2012px;\x20color:\x20#666;\x20background:\x20'+(theme==='dark'?'#2a2a2a':'#f5f5f5')+';\x20border-top:\x201px\x20solid\x20'+i+';\x22>'+e(o['filename'])+'</div>':'')+'\x0a\x09\x09\x09\x09</div>\x0a\x09\x09\x09')['join']('');return'<!DOCTYPE\x20html>\x0a<html\x20lang=\x22en\x22>\x0a<head>\x0a\x20\x20\x20\x20<meta\x20charset=\x22UTF-8\x22>\x0a\x20\x20\x20\x20<meta\x20name=\x22viewport\x22\x20content=\x22width=device-width,\x20initial-scale=1.0\x22>\x0a\x20\x20\x20\x20<title>'+e(title)+'</title>\x0a</head>\x0a<body\x20style=\x22margin:\x200;\x20padding:\x2020px;\x20font-family:\x20-apple-system,\x20BlinkMacSystemFont,\x20\x27Segoe\x20UI\x27,\x20Roboto,\x20sans-serif;\x20background:\x20'+g+';\x20color:\x20'+h+';\x20line-height:\x201.6;\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22max-width:\x20800px;\x20margin:\x200\x20auto;\x20background:\x20'+(theme==='dark'?'#252525':'#ffffff')+';\x20border-radius:\x2012px;\x20box-shadow:\x200\x202px\x208px\x20rgba(0,0,0,0.1);\x20overflow:\x20hidden;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22padding:\x2020px\x2024px;\x20border-bottom:\x201px\x20solid\x20'+i+';\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:\x20flex;\x20justify-content:\x20space-between;\x20align-items:\x20center;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<h1\x20style=\x22margin:\x200;\x20font-size:\x2020px;\x20font-weight:\x20600;\x22>'+e(title)+'</h1>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:\x2012px;\x20color:\x20#666;\x20margin-top:\x204px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WIP\x20v'+d['version']+'\x20•\x20'+new Date(d['created'])['toLocaleString']()+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+m+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:\x2011px;\x20color:\x20#999;\x20margin-top:\x2012px;\x20padding:\x208px;\x20background:\x20'+(theme==='dark'?'#2a2a2a':'#f5f5f5')+';\x20border-radius:\x204px;\x20font-style:\x20italic;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Important\x20Note:\x20This\x20page\x20is\x20for\x20document\x20browsing\x20and\x20verification\x20reference\x20only.\x20Please\x20verify\x20the\x20document\x20integrity\x20through\x20the\x20API\x20using\x20the\x20WIP\x20file.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(l['signatures']&&l['signatures']['length']>0x0?'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22margin-top:\x2012px;\x20padding:\x208px;\x20background:\x20'+(theme==='dark'?'#2a3f2a':'#e8f5e9')+';\x20border-radius:\x204px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:\x2011px;\x20color:\x20'+(theme==='dark'?'#81c784':'#2e7d32')+';\x20margin-bottom:\x204px;\x22>✓\x20Signature\x20Verification\x20('+l['signatures']['length']+'\x20signature'+(l['signatures']['length']>0x1?'s':'')+')</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+l['signatures']['map']((o,p)=>'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:\x2010px;\x20color:\x20'+h+';\x20margin-left:\x208px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(p+0x1)+'.\x20'+(o['address']?e(o['address']['slice'](0x0,0x14))+'...':'Unknown')+':\x20'+(o['valid']?'<span\x20style=\x22color:\x20#4caf50;\x22>✓\x20Valid</span>':'<span\x20style=\x22color:\x20#f44336;\x22>✗\x20Invalid</span>')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20')['join']('')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20':'')+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22padding:\x2024px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:\x2016px;\x20line-height:\x201.8;\x20margin-bottom:\x2024px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+f(c['content']['text'],c['content']['format'])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+n+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22padding:\x2016px\x2024px;\x20background:\x20'+(theme==='dark'?'#2a2a2a':'#f8f9fa')+';\x20border-top:\x201px\x20solid\x20'+i+';\x20font-size:\x2011px;\x20color:\x20#666;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:\x20flex;\x20justify-content:\x20space-between;\x20align-items:\x20center;\x20flex-wrap:\x20wrap;\x20gap:\x208px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<strong>Hash:</strong>\x20<code\x20style=\x22background:\x20'+(theme==='dark'?'#333':'#e9ecef')+';\x20padding:\x202px\x206px;\x20border-radius:\x203px;\x22>'+e(d['hash'])+'</code>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+(l['valid']?'Content\x20integrity\x20verified':'Verification\x20failed:\x20'+e(l['error']||'Unknown\x20error'))+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a</body>\x0a</html>';}['stringify'](a,b=!![]){return b?JSON['stringify'](a,null,0x2):JSON['stringify'](a);}['parse'](a){try{const b=JSON['parse'](a);if(!b['wip']||!b['payload']||!b['meta'])throw new WipValidationError('Invalid\x20WIP\x20file\x20structure');return b;}catch(c){if(c instanceof WipError)throw c;throw new WipValidationError('Failed\x20to\x20parse\x20WIP\x20file:\x20'+c);}}async['load'](a){const b=await this['resourceLoader']['load'](a),c=new TextDecoder()['decode'](b);return this['parse'](c);}['getHash'](a){const b=a['meta']['hash'];if(b['includes'](':'))return b['split'](':')[0x1];return b;}['extractImages'](a,b){if(!a86b['existsSync'](b))a86b['mkdirSync'](b,{'recursive':!![]});const c=[];for(const d of a['payload']['media']){const e=getExtensionFromMimeType(d['type']),f=d['filename']||d['id']+'.'+e,g=a86a['join'](b,f),h=Buffer['from'](base64ToUint8Array(d['data']));a86b['writeFileSync'](g,h),c['push'](g);}return c;}['save'](a,b,c=!![]){const d=a86a['dirname'](b);if(!a86b['existsSync'](d))a86b['mkdirSync'](d,{'recursive':!![]});a86b['writeFileSync'](b,this['stringify'](a,c),'utf-8');}['getLimits'](){return{...this['limits']};}['setLimits'](a){this['limits']={...this['limits'],...a},this['resourceLoader']=new ResourceLoader(this['limits']['maxImageSize']);}};async function createWip(a,b){return new WIP(b)['create'](a);}async function verifyWip(a,b){if(b!==void 0x0){if(a['meta']['hash']['toLowerCase']()['replace'](/^sha256:/,'')!==b['toLowerCase']()['replace'](/^sha256:/,''))return{'valid':![],'error':'Hash\x20mismatch'};}const c=await new WIP()['verify'](a);return{'valid':c['valid'],'error':c['error']};}async function wipToHtml(a,b){return new WIP()['toHtml'](a,b);}async function loadWip(a,b){return new WIP(b)['load'](a);}async function generate_wip(a,b){const c=new WIP(DEFAULT_LIMITS);let d=await c['create']({'text':a['markdown_text'],'textFormat':'markdown','images':a['images']});if(a['account']){const {Account:e}=await import('./account.mjs'),f=await e['Instance']()['get_address'](a['account']);if(!f)throw new WipValidationError('Account\x20not\x20found:\x20'+a['account']);const {signature:g,...h}=d['meta'],i=computeHash(canonicalizeJson(h)),j=await e['Instance']()['sign'](f,i),k=await e['Instance']()['get'](f,![],!![]);if(!k||!k['pubkey'])throw new WipValidationError('Cannot\x20get\x20public\x20key\x20for\x20account:\x20'+f);let l;if(k['pubkey']['startsWith']('0x')){const o=Buffer['from'](k['pubkey']['slice'](0x2),'hex');if(o['length']===0x382)l=o['slice'](0x1)['toString']('base64');else{if(o['length']===0x381)l=o['toString']('base64');else throw new WipValidationError('Invalid\x20public\x20key\x20length:\x20'+o['length']+',\x20expected\x20897\x20or\x20898\x20bytes');}}else l=k['pubkey'];const m={'value':Buffer['from'](j['slice'](0x2),'hex')['toString']('base64'),'publicKey':l,'algorithm':'Falcon512','address':f};let n;if(d['meta']['signature'])n=Array['isArray'](d['meta']['signature'])?[...d['meta']['signature'],m]:[d['meta']['signature'],m];else n=[m];d={...d,'meta':{...d['meta'],'signature':n}};}return c['save'](d,b,!![]),b;}async function verify_wip(a,b,c){const d=new WIP();let e;try{e=await d['load'](a);}catch(h){return{'valid':![],'error':'Failed\x20to\x20load\x20WIP\x20file:\x20'+h,'hashValid':![],'hasSignature':![]};}if(!e['wip']||!e['payload']||!e['meta'])return{'valid':![],'error':'Invalid\x20WIP\x20file\x20structure','hashValid':![],'hasSignature':![]};if(e['meta']['type']!=='wip')return{'valid':![],'error':'Invalid\x20meta.type:\x20'+e['meta']['type'],'hashValid':![],'hasSignature':!!e['meta']['signature']};if(b!==void 0x0){if(e['meta']['hash']['toLowerCase']()['replace'](/^sha256:/,'')!==b['toLowerCase']()['replace'](/^sha256:/,''))return{'valid':![],'error':'Hash\x20mismatch','hashValid':![],'hasSignature':!!e['meta']['signature']};}if(c&&!e['meta']['signature'])return{'valid':![],'error':'Signature\x20required\x20but\x20WIP\x20file\x20has\x20no\x20signature','hashValid':!![],'hasSignature':![]};if(!(computeHash(canonicalizeJson({'wip':e['wip'],'payload':e['payload']}))===e['meta']['hash']))return{'valid':![],'error':'Hash\x20mismatch\x20-\x20content\x20has\x20been\x20tampered','hashValid':![],'hasSignature':!!e['meta']['signature']};let f;const g=[];if(e['meta']['signature']){const {signature:i,...j}=e['meta'],k=computeHash(canonicalizeJson(j)),l=Array['isArray'](e['meta']['signature'])?e['meta']['signature']:[e['meta']['signature']];let m=!![];for(const n of l){const o=await d['verifySignature'](k,n['value'],n['publicKey'],n['algorithm']);let p;try{const {Falcon512PublicKey:q}=await import('../../publickey-Bkjn-YAu.mjs')['then'](r=>r['n']);p=new q(n['publicKey'])['toWowAddress']();}catch{}g['push']({'publicKey':n['publicKey'],'address':p,'valid':o});if(!o)m=![];}f=m;if(!f)return{'valid':![],'error':'Signatures\x20from\x20the\x20following\x20addresses\x20are\x20invalid:\x20'+g['filter'](r=>!r['valid']&&r['address'])['map'](r=>r['address'])['join'](',\x20'),'hashValid':!![],'signatureValid':![],'hasSignature':!![],'signatures':g};}return{'valid':!![],'hashValid':!![],'signatureValid':f,'hasSignature':!!e['meta']['signature'],'signatures':g['length']>0x0?g:void 0x0};}async function sign_wip(a,b,c){const d=new WIP(),e=await d['load'](a);if(!e['wip']||!e['payload']||!e['meta'])throw new WipValidationError('Invalid\x20WIP\x20file\x20structure');if(e['meta']['type']!=='wip')throw new WipValidationError('Invalid\x20meta.type:\x20'+e['meta']['type']);const {Account:f}=await import('./account.mjs'),g=await f['Instance']()['get_address'](b);if(!g)throw new WipValidationError('Account\x20not\x20found:\x20'+b);const {signature:h,...i}=e['meta'],j=computeHash(canonicalizeJson(i)),k=await f['Instance']()['signData'](g,j);let l;const m=k['publicKey'];if(m['startsWith']('0x')){const r=Buffer['from'](m['slice'](0x2),'hex');if(r['length']===0x382)l=r['slice'](0x1)['toString']('base64');else{if(r['length']===0x381)l=r['toString']('base64');else throw new WipValidationError('Invalid\x20public\x20key\x20length:\x20'+r['length']+',\x20expected\x20897\x20or\x20898\x20bytes');}}else l=m;const n={'value':Buffer['from'](k['signature']['slice'](0x2),'hex')['toString']('base64'),'publicKey':l,'algorithm':'Falcon512','address':k['address']};let o;if(e['meta']['signature']){const s=Array['isArray'](e['meta']['signature'])?[...e['meta']['signature']]:[e['meta']['signature']],t=s['findIndex'](u=>u['publicKey']===l);if(t>=0x0)s[t]=n,o=s;else o=[...s,n];}else o=[n];const p={...e,'meta':{...e['meta'],'signature':o}};let q;if(c)q=c;else{const u=a86a['dirname'](a),v=a86a['extname'](a),w=a86a['basename'](a,v);q=a86a['join'](u,'signed_'+w+v);}return d['save'](p,q,!![]),q;}async function wip2html(a,b={}){const c=await import('fs'),d=await import('path'),e=c['statSync'](a);if(e['isFile']()){const f=new WIP(),g=await f['load'](a),h=await f['toHtml'](g,b);if(b['outputPath'])return c['writeFileSync'](b['outputPath'],h),b['outputPath'];const i=d['dirname'](a),j=d['extname'](a),k=d['basename'](a,j),l=d['join'](i,k+'.html');return c['writeFileSync'](l,h),l;}else{if(e['isDirectory']()){const m=c['readdirSync'](a)['filter'](p=>p['endsWith']('.wip'));if(m['length']===0x0)throw new WipValidationError('No\x20.wip\x20files\x20found\x20in\x20directory:\x20'+a);const n=[],o=new WIP();for(const p of m){const q=d['join'](a,p),r=await o['load'](q),s=await o['toHtml'](r,b),t=p['replace']('.wip','.html'),u=b['outputPath']?d['join'](b['outputPath'],t):d['join'](a,t),v=d['dirname'](u);if(!c['existsSync'](v))c['mkdirSync'](v,{'recursive':!![]});c['writeFileSync'](u,s),n['push'](u);}return n;}else throw new WipValidationError('Invalid\x20path:\x20'+a);}}export{DEFAULT_LIMITS,WIP,WIP as default,WipError,WipSizeError,WipValidationError,createWip,generate_wip,loadWip,sign_wip,verifyWip,verify_wip,wip2html,wipToHtml};
|
|
@@ -46,7 +46,7 @@ declare function arrayBufferToUint8Array(buf: ArrayBuffer): Uint8Array;
|
|
|
46
46
|
*/
|
|
47
47
|
declare function uint8ArrayToArrayBuffer(arr: Uint8Array): ArrayBuffer;
|
|
48
48
|
/**
|
|
49
|
-
* 比较两个 ArrayBuffer
|
|
49
|
+
* 比较两个 ArrayBuffer 是否相等(常量时间,防止时序侧信道)
|
|
50
50
|
*/
|
|
51
51
|
declare function bufferEqual(a: ArrayBufferLike, b: ArrayBufferLike): boolean;
|
|
52
52
|
/**
|
|
@@ -61,7 +61,7 @@ declare function normalizeRoot(root: string): string;
|
|
|
61
61
|
*/
|
|
62
62
|
declare function calculateMerkleLeafHash(plaintextHash: string, serverTimestamp: number): string;
|
|
63
63
|
/**
|
|
64
|
-
*
|
|
64
|
+
* 计算两个哈希的父节点哈希(与服务端一致:UTF-8 编码字符串后拼接)
|
|
65
65
|
*/
|
|
66
66
|
declare function merkleHash(left: string, right: string): string;
|
|
67
67
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{sha256}from'@noble/hashes/sha2.js';import{randomBytes}from'@noble/hashes/utils.js';import{falcon512padded}from'@noble/post-quantum/falcon.js';function verifyFalcon512(a,b,c){try{return falcon512padded['verify'](c,b,a);}catch{return![];}}function hashSha256(a){return sha256(a);}function hashMessage(a){return bytesToHex(sha256(new TextEncoder()['encode'](a)));}function hashPlaintext(a,b,c,d,e){
|
|
1
|
+
import{sha256}from'@noble/hashes/sha2.js';import{randomBytes}from'@noble/hashes/utils.js';import{falcon512padded}from'@noble/post-quantum/falcon.js';function verifyFalcon512(a,b,c){try{return falcon512padded['verify'](c,b,a);}catch{return![];}}function hashSha256(a){return sha256(a);}function hashMessage(a){return bytesToHex(sha256(new TextEncoder()['encode'](a)));}function hashPlaintext(a,b,c,d,e){const f=[a['length']+':'+a,e!==void 0x0&&e>=0x0?''+e:'',''+b,c||'',d||'']['join']('|');return'0x'+bytesToHex(sha256(new TextEncoder()['encode'](f)));}function generateNonce(){return bytesToHex(randomBytes(0x10));}function bytesToBase64(a){return Buffer['from'](a)['toString']('base64');}function base64ToBytes(a){return new Uint8Array(Buffer['from'](a,'base64'));}function bytesToHex(a){return Buffer['from'](a)['toString']('hex');}function hexToBytes(a){return new Uint8Array(Buffer['from'](a,'hex'));}function arrayBufferToUint8Array(a){return new Uint8Array(a);}function uint8ArrayToArrayBuffer(a){return a['buffer']['slice'](a['byteOffset'],a['byteOffset']+a['byteLength']);}function bufferEqual(c,d){if(c['byteLength']!==d['byteLength'])return![];const e=new Uint8Array(c),f=new Uint8Array(d);let g=0x0;for(let h=0x0;h<e['length'];h++)g|=e[h]^f[h];return g===0x0;}function normalizeRoot(a){if(!a)throw new Error('Empty\x20Merkle\x20root:\x20expected\x20a\x20valid\x20hash\x20value');let b=a['toLowerCase']();if(!b['startsWith']('0x'))b='0x'+b;return b;}function calculateMerkleLeafHash(a,b){const c=new TextEncoder()['encode'](a),d=new ArrayBuffer(0x8);new DataView(d)['setBigUint64'](0x0,BigInt(b),!![]);const e=new Uint8Array(d),f=new Uint8Array(c['length']+e['length']);return f['set'](c),f['set'](e,c['length']),'0x'+bytesToHex(sha256(f));}function merkleHash(a,b){const c=new TextEncoder()['encode'](a),d=new TextEncoder()['encode'](b),e=new Uint8Array(c['length']+d['length']);return e['set'](c),e['set'](d,c['length']),'0x'+bytesToHex(sha256(e));}function computeNewRoot(a,b,c){const d=new TextEncoder()['encode'](a),e=new TextEncoder()['encode'](b),f=new ArrayBuffer(0x4);new DataView(f)['setUint32'](0x0,c,!![]);const g=new Uint8Array(f),h=new Uint8Array(d['length']+e['length']+g['length']);return h['set'](d),h['set'](e,d['length']),h['set'](g,d['length']+e['length']),'0x'+bytesToHex(sha256(h));}function verifyMerkleProof(a,b){let c=a;for(let d=0x0;d<b['siblings']['length'];d++)if(b['indices'][d]===0x0)c=merkleHash(c,b['siblings'][d]);else c=merkleHash(b['siblings'][d],c);return c===b['root'];}function verifyMerkleChain(a,b){if(a['length']===0x0)return{'valid':!![]};const c=[...a]['sort']((e,f)=>e['leafIndex']-f['leafIndex']);let d=normalizeRoot(b||'0x'+'0'['repeat'](0x40));for(const e of c){if(!e['prevRoot'])return{'valid':![],'error':'Missing\x20prevRoot\x20at\x20leafIndex\x20'+e['leafIndex']};const f=normalizeRoot(e['prevRoot']);if(f!==d)return{'valid':![],'error':'Root\x20chain\x20broken\x20at\x20leafIndex\x20'+e['leafIndex']+':\x20expected\x20prevRoot\x20'+d+',\x20got\x20'+f,'expectedRoot':d,'actualRoot':f};const g=verifySingleMerkleRoot(e['prevRoot'],e['newRoot'],e['plaintextHash'],e['serverTimestamp'],e['leafIndex']);if(!g['valid'])return{'valid':![],'error':g['error']+'\x20at\x20leafIndex\x20'+e['leafIndex'],'expectedRoot':g['expectedRoot'],'actualRoot':g['actualRoot']};d=normalizeRoot(e['newRoot']);}return{'valid':!![]};}function verifySingleMerkleRoot(a,b,c,d,e){if(!a)return{'valid':![],'error':'Missing\x20prevRoot'};if(!b)return{'valid':![],'error':'Missing\x20newRoot'};if(!c)return{'valid':![],'error':'Missing\x20plaintextHash'};if(d===void 0x0||d===null)return{'valid':![],'error':'Missing\x20serverTimestamp'};if(e===void 0x0||e===null)return{'valid':![],'error':'Missing\x20leafIndex'};const f=computeNewRoot(a,calculateMerkleLeafHash(c,d),e);if(f['toLowerCase']()!==b['toLowerCase']())return{'valid':![],'error':'Root\x20computation\x20mismatch:\x20expected\x20'+f+',\x20got\x20'+b,'expectedRoot':f,'actualRoot':b};return{'valid':!![]};}function verifyMessage(a){const {messageId:b,plaintext:c,plaintextHash:d,createdAt:e,guardAddress:f,passportAddress:g,lastReceivedLeafIndex:h,serverSignature:i,serverPublicKey:j,merkleMetadata:k}=a,l=hashPlaintext(c,e,f,g,h),m=n=>{return n['toLowerCase']()['replace'](/^0x/,'');};if(m(l)!==m(d))return{'valid':![],'error':'Plaintext\x20hash\x20mismatch\x20for\x20message\x20'+b+':\x20expected\x20'+d+',\x20got\x20'+l,'failedCheck':'plaintext'};if(k){if(k['proofSiblings']&&k['proofIndices']){if(!verifyMerkleProof(calculateMerkleLeafHash(d,k['serverTimestamp']),{'root':k['newRoot'],'siblings':k['proofSiblings'],'indices':k['proofIndices']}))return{'valid':![],'error':'Merkle\x20proof\x20verification\x20failed\x20for\x20message\x20'+b,'failedCheck':'merkle'};}const n=k['serverTimestamp'];if(!n)return{'valid':![],'error':'Missing\x20server\x20timestamp\x20for\x20Merkle\x20root\x20verification\x20in\x20message\x20'+b,'failedCheck':'merkle'};if(!k['prevRoot'])return{'valid':![],'error':'Missing\x20prevRoot\x20for\x20Merkle\x20root\x20verification\x20in\x20message\x20'+b,'failedCheck':'merkle'};const o=verifySingleMerkleRoot(k['prevRoot'],k['newRoot'],d,n,k['leafIndex']);if(!o['valid'])return{'valid':![],'error':'Merkle\x20root\x20verification\x20failed\x20for\x20message\x20'+b+':\x20'+o['error'],'failedCheck':'merkle'};}if(i&&j){const p=k?.['serverTimestamp'];if(!p)return{'valid':![],'error':'Missing\x20server\x20timestamp\x20for\x20signature\x20verification\x20in\x20message\x20'+b,'failedCheck':'merkle'};if(!k?.['newRoot'])return{'valid':![],'error':'Missing\x20newRoot\x20for\x20signature\x20verification\x20in\x20message\x20'+b,'failedCheck':'merkle'};if(!k?.['prevRoot'])return{'valid':![],'error':'Missing\x20prevRoot\x20for\x20signature\x20verification\x20in\x20message\x20'+b,'failedCheck':'merkle'};if(!verifyFalcon512Signature(j,k['prevRoot']+':'+k['newRoot']+':'+p+':'+j,i))return{'valid':![],'error':'Server\x20signature\x20verification\x20failed\x20for\x20message\x20'+b,'failedCheck':'merkle'};}return{'valid':!![]};}function verifyFalcon512Signature(a,b,c){try{const d=hexToBytes(a['replace']('0x','')),e=hexToBytes(c['replace']('0x',''));return verifyFalcon512(d,new TextEncoder()['encode'](b),e);}catch{return![];}}function verifyWtsMessages(a){if(a['length']===0x0)return{'valid':!![]};const b=[...a]['sort']((d,e)=>d['leafIndex']-e['leafIndex']);for(let d=0x0;d<b['length'];d++){const e=b[d];if(e['plaintext']!=null){if(hashPlaintext(e['plaintext']||'',e['clientTimestamp'],e['guardAddress'],e['passportAddress'],e['lastReceivedLeafIndex'])['toLowerCase']()!==e['plaintextHash']['toLowerCase']())return{'valid':![],'error':'Plaintext\x20hash\x20mismatch\x20for\x20message\x20'+e['id']+'\x20at\x20index\x20'+d,'failedMessageIndex':d,'failedCheck':'plaintext'};}if(e['merkleProof']){if(!verifyMerkleProof(calculateMerkleLeafHash(e['plaintextHash'],e['timestamp']),{'root':e['merkleRoot'],'siblings':e['merkleProof']['siblings'],'indices':e['merkleProof']['indices']}))return{'valid':![],'error':'Merkle\x20proof\x20verification\x20failed\x20for\x20message\x20'+e['id']+'\x20at\x20index\x20'+d,'failedMessageIndex':d,'failedCheck':'merkle'};}if(e['serverSignature']&&e['serverPublicKey']){if(!e['merkleRoot'])return{'valid':![],'error':'Missing\x20merkleRoot\x20for\x20message\x20'+e['id']+'\x20at\x20index\x20'+d,'failedMessageIndex':d,'failedCheck':'merkle'};if(!e['timestamp'])return{'valid':![],'error':'Missing\x20timestamp\x20for\x20message\x20'+e['id']+'\x20at\x20index\x20'+d,'failedMessageIndex':d,'failedCheck':'merkle'};if(!e['prevRoot'])return{'valid':![],'error':'Missing\x20prevRoot\x20for\x20message\x20'+e['id']+'\x20at\x20index\x20'+d,'failedMessageIndex':d,'failedCheck':'merkle'};const f=e['prevRoot']+':'+e['merkleRoot']+':'+e['timestamp']+':'+e['serverPublicKey'];if(!verifyFalcon512Signature(e['serverPublicKey'],f,e['serverSignature']))return{'valid':![],'error':'Server\x20signature\x20verification\x20failed\x20for\x20message\x20'+e['id']+'\x20at\x20index\x20'+d,'failedMessageIndex':d,'failedCheck':'merkle'};}}const c=verifyMerkleChain(b['map'](g=>({'leafIndex':g['leafIndex'],'prevRoot':g['prevRoot']??'','newRoot':g['merkleRoot'],'plaintextHash':g['plaintextHash'],'serverTimestamp':g['timestamp']})));if(!c['valid'])return{'valid':![],'error':c['error'],'failedCheck':'chain'};return{'valid':!![]};}export{arrayBufferToUint8Array,base64ToBytes,bufferEqual,bytesToBase64,bytesToHex,calculateMerkleLeafHash,computeNewRoot,generateNonce,hashMessage,hashPlaintext,hashSha256,hexToBytes,merkleHash,normalizeRoot,uint8ArrayToArrayBuffer,verifyFalcon512Signature,verifyMerkleChain,verifyMerkleProof,verifyMessage,verifySingleMerkleRoot,verifyWtsMessages};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { $r as SendMessageResult, An as SettingsRequest, Ar as MessageContentType, Bn as mark_messages_as_viewed, Br as MessengerErrorCode, Ci as WtsFileResult, Cn as BlacklistRequest, Dn as GuardParam, En as FriendslistResponse, Er as MAX_QUERY_LIMIT, Fn as friendslist, Fr as MessageStatus, Gn as settings, Hn as pull_messages, In as generate_wts, Jn as watch_conversations, Kn as sign_wts, Ln as getMessengerManager, Lr as MessageType, Mn as blacklist, Mr as MessageFilter, Nn as extractZipFromPlaintext, On as GuardlistRequest, Pn as extract_zip_messages, Pr as MessageListResult, Qn as Messenger, Rn as guardlist, Rr as MessengerConfig, Tn as FriendslistRequest, Un as send_file, Vn as proof_message, Vr as NORMAL_MESSAGE_BYTES_LIMIT, Wn as send_message, Xn as wts2html, Yn as watch_messages, Zn as MessengerManager, bi as WTS_MAX_MESSAGE_COUNT, dr as ConversationsFilter, hr as DecryptedMessage, jn as SettingsResponse, jr as MessageDirection, kn as GuardlistResponse, kr as Message, mr as DEFAULT_QUERY_LIMIT, pr as DEFAULT_MESSENGER_CONFIG, qn as verify_wts, ur as ConversationInfo, wi as WtsGenerationParams, wn as BlacklistResponse, yi as WTS_FILE_BYTES_LIMIT, zn as mark_conversation_as_viewed, zr as MessengerError } from "../../index-
|
|
1
|
+
import { $r as SendMessageResult, An as SettingsRequest, Ar as MessageContentType, Bn as mark_messages_as_viewed, Br as MessengerErrorCode, Ci as WtsFileResult, Cn as BlacklistRequest, Dn as GuardParam, En as FriendslistResponse, Er as MAX_QUERY_LIMIT, Fn as friendslist, Fr as MessageStatus, Gn as settings, Hn as pull_messages, In as generate_wts, Jn as watch_conversations, Kn as sign_wts, Ln as getMessengerManager, Lr as MessageType, Mn as blacklist, Mr as MessageFilter, Nn as extractZipFromPlaintext, On as GuardlistRequest, Pn as extract_zip_messages, Pr as MessageListResult, Qn as Messenger, Rn as guardlist, Rr as MessengerConfig, Tn as FriendslistRequest, Un as send_file, Vn as proof_message, Vr as NORMAL_MESSAGE_BYTES_LIMIT, Wn as send_message, Xn as wts2html, Yn as watch_messages, Zn as MessengerManager, bi as WTS_MAX_MESSAGE_COUNT, dr as ConversationsFilter, hr as DecryptedMessage, jn as SettingsResponse, jr as MessageDirection, kn as GuardlistResponse, kr as Message, mr as DEFAULT_QUERY_LIMIT, pr as DEFAULT_MESSENGER_CONFIG, qn as verify_wts, ur as ConversationInfo, wi as WtsGenerationParams, wn as BlacklistResponse, yi as WTS_FILE_BYTES_LIMIT, zn as mark_conversation_as_viewed, zr as MessengerError } from "../../index-C7hBsiex.mjs";
|
|
2
2
|
export { BlacklistRequest, BlacklistResponse, type ConversationInfo, type ConversationsFilter, DEFAULT_MESSENGER_CONFIG, DEFAULT_QUERY_LIMIT, type DecryptedMessage, FriendslistRequest, FriendslistResponse, GuardParam, GuardlistRequest, GuardlistResponse, MAX_QUERY_LIMIT, type Message, type MessageContentType, MessageDirection, type MessageFilter, type MessageListResult, MessageStatus, MessageType, Messenger, type MessengerConfig, MessengerError, MessengerErrorCode, MessengerManager, NORMAL_MESSAGE_BYTES_LIMIT, type SendMessageResult, SettingsRequest, SettingsResponse, WTS_FILE_BYTES_LIMIT, WTS_MAX_MESSAGE_COUNT, type WtsFileResult, type WtsGenerationParams, blacklist, extractZipFromPlaintext, extract_zip_messages, friendslist, generate_wts, getMessengerManager, guardlist, mark_conversation_as_viewed, mark_messages_as_viewed, proof_message, pull_messages, send_file, send_message, settings, sign_wts, verify_wts, watch_conversations, watch_messages, wts2html };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{DEFAULT_MESSENGER_CONFIG,DEFAULT_QUERY_LIMIT,MAX_QUERY_LIMIT,MessageDirection,MessageStatus,MessageType,MessengerError,MessengerErrorCode,NORMAL_MESSAGE_BYTES_LIMIT,WTS_FILE_BYTES_LIMIT,WTS_MAX_MESSAGE_COUNT}from'./types.mjs';import{t as a88a}from'../../messenger-
|
|
1
|
+
import{DEFAULT_MESSENGER_CONFIG,DEFAULT_QUERY_LIMIT,MAX_QUERY_LIMIT,MessageDirection,MessageStatus,MessageType,MessengerError,MessengerErrorCode,NORMAL_MESSAGE_BYTES_LIMIT,WTS_FILE_BYTES_LIMIT,WTS_MAX_MESSAGE_COUNT}from'./types.mjs';import{t as a88a}from'../../messenger-uSvD3cWJ.mjs';import{_ as a88b,a as a88c,b as a88d,c as a88e,d as a88f,f as a88g,g as a88h,h as a88i,i as a88j,l as a88k,m as a88l,n as a88m,o as a88n,p as a88o,r as a88p,s as a88q,t as a88r,u as a88s,v as a88t,y as a88u}from'../../messenger-api-BljlMqMC.mjs';export{DEFAULT_MESSENGER_CONFIG,DEFAULT_QUERY_LIMIT,MAX_QUERY_LIMIT,MessageDirection,MessageStatus,MessageType,a88a as Messenger,MessengerError,MessengerErrorCode,a88d as MessengerManager,NORMAL_MESSAGE_BYTES_LIMIT,WTS_FILE_BYTES_LIMIT,WTS_MAX_MESSAGE_COUNT,a88r as blacklist,a88m as extractZipFromPlaintext,a88p as extract_zip_messages,a88j as friendslist,a88c as generate_wts,a88n as getMessengerManager,a88q as guardlist,a88e as mark_conversation_as_viewed,a88k as mark_messages_as_viewed,a88s as proof_message,a88f as pull_messages,a88g as send_file,a88o as send_message,a88l as settings,a88i as sign_wts,a88h as verify_wts,a88b as watch_conversations,a88t as watch_messages,a88u as wts2html};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { An as SettingsRequest, Bn as mark_messages_as_viewed, Cn as BlacklistRequest, Dn as GuardParam, En as FriendslistResponse, Fn as friendslist, Gn as settings, Hn as pull_messages, In as generate_wts, Jn as watch_conversations, Kn as sign_wts, Ln as getMessengerManager, Mn as blacklist, Nn as extractZipFromPlaintext, On as GuardlistRequest, Pn as extract_zip_messages, Rn as guardlist, Tn as FriendslistRequest, Un as send_file, Vn as proof_message, Wn as send_message, Xn as wts2html, Yn as watch_messages, jn as SettingsResponse, kn as GuardlistResponse, qn as verify_wts, wn as BlacklistResponse, zn as mark_conversation_as_viewed } from "../../index-
|
|
1
|
+
import { An as SettingsRequest, Bn as mark_messages_as_viewed, Cn as BlacklistRequest, Dn as GuardParam, En as FriendslistResponse, Fn as friendslist, Gn as settings, Hn as pull_messages, In as generate_wts, Jn as watch_conversations, Kn as sign_wts, Ln as getMessengerManager, Mn as blacklist, Nn as extractZipFromPlaintext, On as GuardlistRequest, Pn as extract_zip_messages, Rn as guardlist, Tn as FriendslistRequest, Un as send_file, Vn as proof_message, Wn as send_message, Xn as wts2html, Yn as watch_messages, jn as SettingsResponse, kn as GuardlistResponse, qn as verify_wts, wn as BlacklistResponse, zn as mark_conversation_as_viewed } from "../../index-C7hBsiex.mjs";
|
|
2
2
|
export { BlacklistRequest, BlacklistResponse, FriendslistRequest, FriendslistResponse, GuardParam, GuardlistRequest, GuardlistResponse, SettingsRequest, SettingsResponse, blacklist, extractZipFromPlaintext, extract_zip_messages, friendslist, generate_wts, getMessengerManager, guardlist, mark_conversation_as_viewed, mark_messages_as_viewed, proof_message, pull_messages, send_file, send_message, settings, sign_wts, verify_wts, watch_conversations, watch_messages, wts2html };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as a89a,a as a89b,c as a89c,d as a89d,f as a89e,g as a89f,h as a89g,i as a89h,l as a89i,m as a89j,n as a89k,o as a89l,p as a89m,r as a89n,s as a89o,t as a89p,u as a89q,v as a89r,y as a89s}from'../../messenger-api-
|
|
1
|
+
import{_ as a89a,a as a89b,c as a89c,d as a89d,f as a89e,g as a89f,h as a89g,i as a89h,l as a89i,m as a89j,n as a89k,o as a89l,p as a89m,r as a89n,s as a89o,t as a89p,u as a89q,v as a89r,y as a89s}from'../../messenger-api-BljlMqMC.mjs';export{a89p as blacklist,a89k as extractZipFromPlaintext,a89n as extract_zip_messages,a89h as friendslist,a89b as generate_wts,a89l as getMessengerManager,a89o as guardlist,a89c as mark_conversation_as_viewed,a89i as mark_messages_as_viewed,a89q as proof_message,a89d as pull_messages,a89e as send_file,a89m as send_message,a89j as settings,a89g as sign_wts,a89f as verify_wts,a89a as watch_conversations,a89r as watch_messages,a89s as wts2html};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Qn as Messenger } from "../../index-
|
|
1
|
+
import { Qn as Messenger } from "../../index-C7hBsiex.mjs";
|
|
2
2
|
export { Messenger };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as a90a}from'../../messenger-
|
|
1
|
+
import{t as a90a}from'../../messenger-uSvD3cWJ.mjs';export{a90a as Messenger};
|
|
@@ -29,6 +29,7 @@ declare function aesGcmEncrypt(key: Uint8Array, plaintext: Uint8Array, associate
|
|
|
29
29
|
};
|
|
30
30
|
declare function aesGcmDecrypt(key: Uint8Array, ciphertext: Uint8Array, iv: Uint8Array, tag: Uint8Array, associatedData: Uint8Array): Uint8Array;
|
|
31
31
|
declare function sha256Hash(data: Uint8Array): Uint8Array;
|
|
32
|
+
declare function deriveAddressFromFalcon512PublicKey(publicKey: Uint8Array): string;
|
|
32
33
|
declare function constantTimeEqual(a: Uint8Array, b: Uint8Array): boolean;
|
|
33
34
|
declare function bytesToBase64(bytes: Uint8Array): string;
|
|
34
35
|
declare function base64ToBytes(base64: string): Uint8Array;
|
|
@@ -39,4 +40,4 @@ declare function deriveRegistrationId(publicKey: Uint8Array): number;
|
|
|
39
40
|
declare function generateX25519BindingSignature(falcon512PrivateKey: Uint8Array, x25519PublicKey: Uint8Array): Uint8Array;
|
|
40
41
|
declare function verifyX25519BindingSignature(falcon512PublicKey: Uint8Array, x25519PublicKey: Uint8Array, signature: Uint8Array): boolean;
|
|
41
42
|
//#endregion
|
|
42
|
-
export { aesGcmDecrypt, aesGcmEncrypt, base64ToBytes, bytesToBase64, bytesToHex, concatBytes, constantTimeEqual, deriveRegistrationId, falcon512Sign, falcon512Verify, generateFalcon512KeyPair, generateMLKEMKeyPair, generateRandomBytes, generateX25519BindingSignature, generateX25519KeyPair, hexToBytes, hkdfChainKey, hkdfDerive, hkdfMessageKey, hmacSha256, mlkemDecapsulate, mlkemEncapsulate, sha256Hash, verifyX25519BindingSignature, x25519DH };
|
|
43
|
+
export { aesGcmDecrypt, aesGcmEncrypt, base64ToBytes, bytesToBase64, bytesToHex, concatBytes, constantTimeEqual, deriveAddressFromFalcon512PublicKey, deriveRegistrationId, falcon512Sign, falcon512Verify, generateFalcon512KeyPair, generateMLKEMKeyPair, generateRandomBytes, generateX25519BindingSignature, generateX25519KeyPair, hexToBytes, hkdfChainKey, hkdfDerive, hkdfMessageKey, hmacSha256, mlkemDecapsulate, mlkemEncapsulate, sha256Hash, verifyX25519BindingSignature, x25519DH };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import'./types.mjs';import{sha256}from'@noble/hashes/sha2.js';import{randomBytes}from'@noble/hashes/utils.js';import{x25519}from'@noble/curves/ed25519.js';import{hmac}from'@noble/hashes/hmac.js';import{falcon512padded}from'@noble/post-quantum/falcon.js';import{hkdf}from'@noble/hashes/hkdf.js';import{ml_kem768}from'@noble/post-quantum/ml-kem.js';import a91a from'node:crypto';function generateRandomBytes(a){return randomBytes(a);}function generateX25519KeyPair(){const a=randomBytes(0x20);return{'publicKey':x25519['getPublicKey'](a),'privateKey':a};}function x25519DH(a,b){return x25519['getSharedSecret'](a,b);}function generateFalcon512KeyPair(){const {publicKey:a,secretKey:b}=falcon512padded['keygen']();return{'publicKey':a,'privateKey':b};}function falcon512Sign(a,b){return falcon512padded['sign'](b,a);}function falcon512Verify(a,b,c){try{return falcon512padded['verify'](c,b,a);}catch{return![];}}function generateMLKEMKeyPair(){const {publicKey:a,secretKey:b}=ml_kem768['keygen']();return{'publicKey':a,'secretKey':b};}function mlkemEncapsulate(a){const {cipherText:b,sharedSecret:c}=ml_kem768['encapsulate'](a);return{'ciphertext':b,'sharedSecret':c};}function mlkemDecapsulate(a,b){return ml_kem768['decapsulate'](a,b);}function hkdfDerive(a,b,c,d){return hkdf(sha256,a,d||new Uint8Array(0x0),b,c);}function hkdfChainKey(a,b){const c=new Uint8Array(a['length']+b['length']);c['set'](a),c['set'](b,a['length']);const d=hkdfDerive(c,new TextEncoder()['encode']('WowokPQChainKey'),0x40);return{'rootKey':d['slice'](0x0,0x20),'chainKey':d['slice'](0x20,0x40)};}function hkdfMessageKey(a){const b=hkdfDerive(a,new TextEncoder()['encode']('WowokPQMessageKey'),0x40);return{'messageKey':b['slice'](0x0,0x20),'nextChainKey':b['slice'](0x20,0x40)};}function hmacSha256(a,b){return hmac(sha256,a,b);}function aesGcmEncrypt(a,b,c){const d=randomBytes(0xc),e=Buffer['from'](a),f=Buffer['from'](d),g=Buffer['from'](b),h=Buffer['from'](c),i=a91a['createCipheriv']('aes-256-gcm',e,f);i['setAAD'](h);const j=Buffer['concat']([i['update'](g),i['final']()]),k=i['getAuthTag']();return{'ciphertext':new Uint8Array(j),'iv':d,'tag':new Uint8Array(k)};}function aesGcmDecrypt(a,b,c,d,e){const f=Buffer['from'](a),g=Buffer['from'](c),h=Buffer['from'](b),i=Buffer['from'](d),j=Buffer['from'](e),k=a91a['createDecipheriv']('aes-256-gcm',f,g);k['setAAD'](j),k['setAuthTag'](i);const l=Buffer['concat']([k['update'](h),k['final']()]);return new Uint8Array(l);}function sha256Hash(a){return sha256(a);}function constantTimeEqual(c,d){if(c['length']!==d['length'])return![];let e=0x0;for(let f=0x0;f<c['length'];f++)e|=c[f]^d[f];return e===0x0;}function bytesToBase64(a){return Buffer['from'](a)['toString']('base64');}function base64ToBytes(a){return new Uint8Array(Buffer['from'](a,'base64'));}function bytesToHex(a){return Buffer['from'](a)['toString']('hex');}function hexToBytes(a){return new Uint8Array(Buffer['from'](a,'hex'));}function concatBytes(...a){const b=a['reduce']((e,f)=>e+f['length'],0x0),c=new Uint8Array(b);let d=0x0;for(const e of a){c['set'](e,d),d+=e['length'];}return c;}function deriveRegistrationId(a){const b=(a[0x0]<<0x8|a[0x1])>>>0x0;return b===0x0?0x1:b;}function generateX25519BindingSignature(a,b){return falcon512Sign(a,b);}function verifyX25519BindingSignature(a,b,c){return falcon512Verify(a,b,c);}export{aesGcmDecrypt,aesGcmEncrypt,base64ToBytes,bytesToBase64,bytesToHex,concatBytes,constantTimeEqual,deriveRegistrationId,falcon512Sign,falcon512Verify,generateFalcon512KeyPair,generateMLKEMKeyPair,generateRandomBytes,generateX25519BindingSignature,generateX25519KeyPair,hexToBytes,hkdfChainKey,hkdfDerive,hkdfMessageKey,hmacSha256,mlkemDecapsulate,mlkemEncapsulate,sha256Hash,verifyX25519BindingSignature,x25519DH};
|
|
1
|
+
import'./types.mjs';import{blake2b}from'@noble/hashes/blake2.js';import{sha256}from'@noble/hashes/sha2.js';import{randomBytes}from'@noble/hashes/utils.js';import{x25519}from'@noble/curves/ed25519.js';import{hmac}from'@noble/hashes/hmac.js';import{falcon512padded}from'@noble/post-quantum/falcon.js';import{hkdf}from'@noble/hashes/hkdf.js';import{ml_kem768}from'@noble/post-quantum/ml-kem.js';import a91a from'node:crypto';function generateRandomBytes(a){return randomBytes(a);}function generateX25519KeyPair(){const a=randomBytes(0x20);return{'publicKey':x25519['getPublicKey'](a),'privateKey':a};}function x25519DH(a,b){return x25519['getSharedSecret'](a,b);}function generateFalcon512KeyPair(){const {publicKey:a,secretKey:b}=falcon512padded['keygen']();return{'publicKey':a,'privateKey':b};}function falcon512Sign(a,b){return falcon512padded['sign'](b,a);}function falcon512Verify(a,b,c){try{return falcon512padded['verify'](c,b,a);}catch{return![];}}function generateMLKEMKeyPair(){const {publicKey:a,secretKey:b}=ml_kem768['keygen']();return{'publicKey':a,'secretKey':b};}function mlkemEncapsulate(a){const {cipherText:b,sharedSecret:c}=ml_kem768['encapsulate'](a);return{'ciphertext':b,'sharedSecret':c};}function mlkemDecapsulate(a,b){return ml_kem768['decapsulate'](a,b);}function hkdfDerive(a,b,c,d){return hkdf(sha256,a,d||new Uint8Array(0x0),b,c);}function hkdfChainKey(a,b){const c=new Uint8Array(a['length']+b['length']);c['set'](a),c['set'](b,a['length']);const d=hkdfDerive(c,new TextEncoder()['encode']('WowokPQChainKey'),0x40);return{'rootKey':d['slice'](0x0,0x20),'chainKey':d['slice'](0x20,0x40)};}function hkdfMessageKey(a){const b=hkdfDerive(a,new TextEncoder()['encode']('WowokPQMessageKey'),0x40);return{'messageKey':b['slice'](0x0,0x20),'nextChainKey':b['slice'](0x20,0x40)};}function hmacSha256(a,b){return hmac(sha256,a,b);}function aesGcmEncrypt(a,b,c){const d=randomBytes(0xc),e=Buffer['from'](a),f=Buffer['from'](d),g=Buffer['from'](b),h=Buffer['from'](c),i=a91a['createCipheriv']('aes-256-gcm',e,f);i['setAAD'](h);const j=Buffer['concat']([i['update'](g),i['final']()]),k=i['getAuthTag']();return{'ciphertext':new Uint8Array(j),'iv':d,'tag':new Uint8Array(k)};}function aesGcmDecrypt(a,b,c,d,e){const f=Buffer['from'](a),g=Buffer['from'](c),h=Buffer['from'](b),i=Buffer['from'](d),j=Buffer['from'](e),k=a91a['createDecipheriv']('aes-256-gcm',f,g);k['setAAD'](j),k['setAuthTag'](i);const l=Buffer['concat']([k['update'](h),k['final']()]);return new Uint8Array(l);}function sha256Hash(a){return sha256(a);}const FALCON512_SCHEME_FLAG=0x7;function deriveAddressFromFalcon512PublicKey(a){const b=new Uint8Array(a['length']+0x1);return b[0x0]=FALCON512_SCHEME_FLAG,b['set'](a,0x1),'0x'+bytesToHex(blake2b(b,{'dkLen':0x20}));}function constantTimeEqual(c,d){if(c['length']!==d['length'])return![];let e=0x0;for(let f=0x0;f<c['length'];f++)e|=c[f]^d[f];return e===0x0;}function bytesToBase64(a){return Buffer['from'](a)['toString']('base64');}function base64ToBytes(a){return new Uint8Array(Buffer['from'](a,'base64'));}function bytesToHex(a){return Buffer['from'](a)['toString']('hex');}function hexToBytes(a){return new Uint8Array(Buffer['from'](a,'hex'));}function concatBytes(...a){const b=a['reduce']((e,f)=>e+f['length'],0x0),c=new Uint8Array(b);let d=0x0;for(const e of a){c['set'](e,d),d+=e['length'];}return c;}function deriveRegistrationId(a){const b=(a[0x0]<<0x8|a[0x1])>>>0x0;return b===0x0?0x1:b;}function generateX25519BindingSignature(a,b){return falcon512Sign(a,b);}function verifyX25519BindingSignature(a,b,c){return falcon512Verify(a,b,c);}export{aesGcmDecrypt,aesGcmEncrypt,base64ToBytes,bytesToBase64,bytesToHex,concatBytes,constantTimeEqual,deriveAddressFromFalcon512PublicKey,deriveRegistrationId,falcon512Sign,falcon512Verify,generateFalcon512KeyPair,generateMLKEMKeyPair,generateRandomBytes,generateX25519BindingSignature,generateX25519KeyPair,hexToBytes,hkdfChainKey,hkdfDerive,hkdfMessageKey,hmacSha256,mlkemDecapsulate,mlkemEncapsulate,sha256Hash,verifyX25519BindingSignature,x25519DH};
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { AES_GCM_IV_SIZE, AES_GCM_TAG_SIZE, CHAIN_KEY_SIZE, DEFAULT_DEVICE_ID, DH_KEY_SIZE, EncryptedMessage, Falcon512KeyPair, KeyPair, MESSAGE_KEY_SIZE, MLKEMKeyPair, MLKEM_CIPHERTEXT_SIZE, MLKEM_PUBLIC_KEY_SIZE, MLKEM_SECRET_KEY_SIZE, MLKEM_SHARED_SECRET_SIZE, MessageType, PQError, PQErrorCode, PQIdentity, PQPreKeyBundle, PQSessionState, PQXDHResult, ROOT_KEY_SIZE, RatchetState, SIGNATURE_SIZE, SPQRChunk, SPQRPhase, SPQRReceivePhase, SPQRState, SPQR_CHUNK_DATA_SIZE, SPQR_CHUNK_HEADER_SIZE, SPQR_CHUNK_SIZE, SPQR_DATA_CHUNKS, SPQR_TOTAL_CHUNKS, SerializedPQSessionState, SerializedRatchetState, SerializedSPQRState, X25519KeyPair } from "./types.mjs";
|
|
2
|
-
import { aesGcmDecrypt, aesGcmEncrypt, base64ToBytes, bytesToBase64, bytesToHex, concatBytes, constantTimeEqual, deriveRegistrationId, falcon512Sign, falcon512Verify, generateFalcon512KeyPair, generateMLKEMKeyPair, generateRandomBytes, generateX25519BindingSignature, generateX25519KeyPair, hexToBytes, hkdfChainKey, hkdfDerive, hkdfMessageKey, hmacSha256, mlkemDecapsulate, mlkemEncapsulate, sha256Hash, verifyX25519BindingSignature, x25519DH } from "./crypto.mjs";
|
|
2
|
+
import { aesGcmDecrypt, aesGcmEncrypt, base64ToBytes, bytesToBase64, bytesToHex, concatBytes, constantTimeEqual, deriveAddressFromFalcon512PublicKey, deriveRegistrationId, falcon512Sign, falcon512Verify, generateFalcon512KeyPair, generateMLKEMKeyPair, generateRandomBytes, generateX25519BindingSignature, generateX25519KeyPair, hexToBytes, hkdfChainKey, hkdfDerive, hkdfMessageKey, hmacSha256, mlkemDecapsulate, mlkemEncapsulate, sha256Hash, verifyX25519BindingSignature, x25519DH } from "./crypto.mjs";
|
|
3
3
|
import { DATA_SHARDS, PARITY_SHARDS, SHARD_DATA_SIZE, SHARD_HEADER_SIZE, SHARD_SIZE, SPQRChunkData, TOTAL_SHARDS, decodeShards, encodeShards, packChunk, unpackChunk } from "./erasure.mjs";
|
|
4
|
-
import { a as pqxdhReceive, i as pqxdhInitiate, n as PQXDHInitiateResult, o as verifyPreKeyBundle, r as generatePreKeyBundle, t as GeneratedPreKeyBundle } from "../../../pqxdh-
|
|
4
|
+
import { a as pqxdhReceive, i as pqxdhInitiate, n as PQXDHInitiateResult, o as verifyPreKeyBundle, r as generatePreKeyBundle, t as GeneratedPreKeyBundle } from "../../../pqxdh-BqO4C7fY.mjs";
|
|
5
5
|
import { deserializeRatchetState, initRatchet, ratchetDecrypt, ratchetEncrypt, serializeRatchetState } from "./ratchet.mjs";
|
|
6
|
-
import { deserializeSPQRState, initSPQR, serializeSPQRState, spqrGetCurrentKey, spqrGetNextChunk, spqrOnPeerPQPKReceived,
|
|
6
|
+
import { deserializeSPQRState, initSPQR, serializeSPQRState, spqrActivatePendingKey, spqrGetCurrentKey, spqrGetNextChunk, spqrOnPeerPQPKReceived, spqrReceiveChunk } from "./spqr.mjs";
|
|
7
7
|
import { combineKeys } from "./keycombiner.mjs";
|
|
8
8
|
import { PQSessionCipher, PQSessionStore } from "./session.mjs";
|
|
9
9
|
import { PQSessionStoreAdapter } from "./store-adapter.mjs";
|
|
10
|
-
export { AES_GCM_IV_SIZE, AES_GCM_TAG_SIZE, CHAIN_KEY_SIZE, DATA_SHARDS, DEFAULT_DEVICE_ID, DH_KEY_SIZE, EncryptedMessage, Falcon512KeyPair, GeneratedPreKeyBundle, KeyPair, MESSAGE_KEY_SIZE, MLKEMKeyPair, MLKEM_CIPHERTEXT_SIZE, MLKEM_PUBLIC_KEY_SIZE, MLKEM_SECRET_KEY_SIZE, MLKEM_SHARED_SECRET_SIZE, MessageType, PARITY_SHARDS, PQError, PQErrorCode, PQIdentity, PQPreKeyBundle, PQSessionCipher, PQSessionState, PQSessionStore, PQSessionStoreAdapter, PQXDHInitiateResult, PQXDHResult, ROOT_KEY_SIZE, RatchetState, SHARD_DATA_SIZE, SHARD_HEADER_SIZE, SHARD_SIZE, SIGNATURE_SIZE, SPQRChunk, SPQRChunkData, SPQRPhase, SPQRReceivePhase, SPQRState, SPQR_CHUNK_DATA_SIZE, SPQR_CHUNK_HEADER_SIZE, SPQR_CHUNK_SIZE, SPQR_DATA_CHUNKS, SPQR_TOTAL_CHUNKS, SerializedPQSessionState, SerializedRatchetState, SerializedSPQRState, TOTAL_SHARDS, X25519KeyPair, aesGcmDecrypt, aesGcmEncrypt, base64ToBytes, bytesToBase64, bytesToHex, combineKeys, concatBytes, constantTimeEqual, decodeShards, deriveRegistrationId, deserializeRatchetState, deserializeSPQRState, encodeShards, falcon512Sign, falcon512Verify, generateFalcon512KeyPair, generateMLKEMKeyPair, generatePreKeyBundle, generateRandomBytes, generateX25519BindingSignature, generateX25519KeyPair, hexToBytes, hkdfChainKey, hkdfDerive, hkdfMessageKey, hmacSha256, initRatchet, initSPQR, mlkemDecapsulate, mlkemEncapsulate, packChunk, pqxdhInitiate, pqxdhReceive, ratchetDecrypt, ratchetEncrypt, serializeRatchetState, serializeSPQRState, sha256Hash, spqrGetCurrentKey, spqrGetNextChunk, spqrOnPeerPQPKReceived,
|
|
10
|
+
export { AES_GCM_IV_SIZE, AES_GCM_TAG_SIZE, CHAIN_KEY_SIZE, DATA_SHARDS, DEFAULT_DEVICE_ID, DH_KEY_SIZE, EncryptedMessage, Falcon512KeyPair, GeneratedPreKeyBundle, KeyPair, MESSAGE_KEY_SIZE, MLKEMKeyPair, MLKEM_CIPHERTEXT_SIZE, MLKEM_PUBLIC_KEY_SIZE, MLKEM_SECRET_KEY_SIZE, MLKEM_SHARED_SECRET_SIZE, MessageType, PARITY_SHARDS, PQError, PQErrorCode, PQIdentity, PQPreKeyBundle, PQSessionCipher, PQSessionState, PQSessionStore, PQSessionStoreAdapter, PQXDHInitiateResult, PQXDHResult, ROOT_KEY_SIZE, RatchetState, SHARD_DATA_SIZE, SHARD_HEADER_SIZE, SHARD_SIZE, SIGNATURE_SIZE, SPQRChunk, SPQRChunkData, SPQRPhase, SPQRReceivePhase, SPQRState, SPQR_CHUNK_DATA_SIZE, SPQR_CHUNK_HEADER_SIZE, SPQR_CHUNK_SIZE, SPQR_DATA_CHUNKS, SPQR_TOTAL_CHUNKS, SerializedPQSessionState, SerializedRatchetState, SerializedSPQRState, TOTAL_SHARDS, X25519KeyPair, aesGcmDecrypt, aesGcmEncrypt, base64ToBytes, bytesToBase64, bytesToHex, combineKeys, concatBytes, constantTimeEqual, decodeShards, deriveAddressFromFalcon512PublicKey, deriveRegistrationId, deserializeRatchetState, deserializeSPQRState, encodeShards, falcon512Sign, falcon512Verify, generateFalcon512KeyPair, generateMLKEMKeyPair, generatePreKeyBundle, generateRandomBytes, generateX25519BindingSignature, generateX25519KeyPair, hexToBytes, hkdfChainKey, hkdfDerive, hkdfMessageKey, hmacSha256, initRatchet, initSPQR, mlkemDecapsulate, mlkemEncapsulate, packChunk, pqxdhInitiate, pqxdhReceive, ratchetDecrypt, ratchetEncrypt, serializeRatchetState, serializeSPQRState, sha256Hash, spqrActivatePendingKey, spqrGetCurrentKey, spqrGetNextChunk, spqrOnPeerPQPKReceived, spqrReceiveChunk, unpackChunk, verifyPreKeyBundle, verifyX25519BindingSignature, x25519DH };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{AES_GCM_IV_SIZE,AES_GCM_TAG_SIZE,CHAIN_KEY_SIZE,DEFAULT_DEVICE_ID,DH_KEY_SIZE,MESSAGE_KEY_SIZE,MLKEM_CIPHERTEXT_SIZE,MLKEM_PUBLIC_KEY_SIZE,MLKEM_SECRET_KEY_SIZE,MLKEM_SHARED_SECRET_SIZE,MessageType,PQError,PQErrorCode,ROOT_KEY_SIZE,SIGNATURE_SIZE,SPQR_CHUNK_DATA_SIZE,SPQR_CHUNK_HEADER_SIZE,SPQR_CHUNK_SIZE,SPQR_DATA_CHUNKS,SPQR_TOTAL_CHUNKS}from'./types.mjs';import{aesGcmDecrypt,aesGcmEncrypt,base64ToBytes,bytesToBase64,bytesToHex,concatBytes,constantTimeEqual,deriveRegistrationId,falcon512Sign,falcon512Verify,generateFalcon512KeyPair,generateMLKEMKeyPair,generateRandomBytes,generateX25519BindingSignature,generateX25519KeyPair,hexToBytes,hkdfChainKey,hkdfDerive,hkdfMessageKey,hmacSha256,mlkemDecapsulate,mlkemEncapsulate,sha256Hash,verifyX25519BindingSignature,x25519DH}from'./crypto.mjs';import{generatePreKeyBundle,pqxdhInitiate,pqxdhReceive,verifyPreKeyBundle}from'./pqxdh.mjs';import{deserializeRatchetState,initRatchet,ratchetDecrypt,ratchetEncrypt,serializeRatchetState}from'./ratchet.mjs';import{DATA_SHARDS,PARITY_SHARDS,SHARD_DATA_SIZE,SHARD_HEADER_SIZE,SHARD_SIZE,TOTAL_SHARDS,decodeShards,encodeShards,packChunk,unpackChunk}from'./erasure.mjs';import{deserializeSPQRState,initSPQR,serializeSPQRState,spqrGetCurrentKey,spqrGetNextChunk,spqrOnPeerPQPKReceived,
|
|
1
|
+
import{AES_GCM_IV_SIZE,AES_GCM_TAG_SIZE,CHAIN_KEY_SIZE,DEFAULT_DEVICE_ID,DH_KEY_SIZE,MESSAGE_KEY_SIZE,MLKEM_CIPHERTEXT_SIZE,MLKEM_PUBLIC_KEY_SIZE,MLKEM_SECRET_KEY_SIZE,MLKEM_SHARED_SECRET_SIZE,MessageType,PQError,PQErrorCode,ROOT_KEY_SIZE,SIGNATURE_SIZE,SPQR_CHUNK_DATA_SIZE,SPQR_CHUNK_HEADER_SIZE,SPQR_CHUNK_SIZE,SPQR_DATA_CHUNKS,SPQR_TOTAL_CHUNKS}from'./types.mjs';import{aesGcmDecrypt,aesGcmEncrypt,base64ToBytes,bytesToBase64,bytesToHex,concatBytes,constantTimeEqual,deriveAddressFromFalcon512PublicKey,deriveRegistrationId,falcon512Sign,falcon512Verify,generateFalcon512KeyPair,generateMLKEMKeyPair,generateRandomBytes,generateX25519BindingSignature,generateX25519KeyPair,hexToBytes,hkdfChainKey,hkdfDerive,hkdfMessageKey,hmacSha256,mlkemDecapsulate,mlkemEncapsulate,sha256Hash,verifyX25519BindingSignature,x25519DH}from'./crypto.mjs';import{generatePreKeyBundle,pqxdhInitiate,pqxdhReceive,verifyPreKeyBundle}from'./pqxdh.mjs';import{deserializeRatchetState,initRatchet,ratchetDecrypt,ratchetEncrypt,serializeRatchetState}from'./ratchet.mjs';import{DATA_SHARDS,PARITY_SHARDS,SHARD_DATA_SIZE,SHARD_HEADER_SIZE,SHARD_SIZE,TOTAL_SHARDS,decodeShards,encodeShards,packChunk,unpackChunk}from'./erasure.mjs';import{deserializeSPQRState,initSPQR,serializeSPQRState,spqrActivatePendingKey,spqrGetCurrentKey,spqrGetNextChunk,spqrOnPeerPQPKReceived,spqrReceiveChunk}from'./spqr.mjs';import{combineKeys}from'./keycombiner.mjs';import{PQSessionCipher}from'./session.mjs';import{PQSessionStoreAdapter}from'./store-adapter.mjs';export{AES_GCM_IV_SIZE,AES_GCM_TAG_SIZE,CHAIN_KEY_SIZE,DATA_SHARDS,DEFAULT_DEVICE_ID,DH_KEY_SIZE,MESSAGE_KEY_SIZE,MLKEM_CIPHERTEXT_SIZE,MLKEM_PUBLIC_KEY_SIZE,MLKEM_SECRET_KEY_SIZE,MLKEM_SHARED_SECRET_SIZE,MessageType,PARITY_SHARDS,PQError,PQErrorCode,PQSessionCipher,PQSessionStoreAdapter,ROOT_KEY_SIZE,SHARD_DATA_SIZE,SHARD_HEADER_SIZE,SHARD_SIZE,SIGNATURE_SIZE,SPQR_CHUNK_DATA_SIZE,SPQR_CHUNK_HEADER_SIZE,SPQR_CHUNK_SIZE,SPQR_DATA_CHUNKS,SPQR_TOTAL_CHUNKS,TOTAL_SHARDS,aesGcmDecrypt,aesGcmEncrypt,base64ToBytes,bytesToBase64,bytesToHex,combineKeys,concatBytes,constantTimeEqual,decodeShards,deriveAddressFromFalcon512PublicKey,deriveRegistrationId,deserializeRatchetState,deserializeSPQRState,encodeShards,falcon512Sign,falcon512Verify,generateFalcon512KeyPair,generateMLKEMKeyPair,generatePreKeyBundle,generateRandomBytes,generateX25519BindingSignature,generateX25519KeyPair,hexToBytes,hkdfChainKey,hkdfDerive,hkdfMessageKey,hmacSha256,initRatchet,initSPQR,mlkemDecapsulate,mlkemEncapsulate,packChunk,pqxdhInitiate,pqxdhReceive,ratchetDecrypt,ratchetEncrypt,serializeRatchetState,serializeSPQRState,sha256Hash,spqrActivatePendingKey,spqrGetCurrentKey,spqrGetNextChunk,spqrOnPeerPQPKReceived,spqrReceiveChunk,unpackChunk,verifyPreKeyBundle,verifyX25519BindingSignature,x25519DH};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as pqxdhReceive, i as pqxdhInitiate, n as PQXDHInitiateResult, o as verifyPreKeyBundle, r as generatePreKeyBundle, t as GeneratedPreKeyBundle } from "../../../pqxdh-
|
|
1
|
+
import { a as pqxdhReceive, i as pqxdhInitiate, n as PQXDHInitiateResult, o as verifyPreKeyBundle, r as generatePreKeyBundle, t as GeneratedPreKeyBundle } from "../../../pqxdh-BqO4C7fY.mjs";
|
|
2
2
|
export { GeneratedPreKeyBundle, PQXDHInitiateResult, generatePreKeyBundle, pqxdhInitiate, pqxdhReceive, verifyPreKeyBundle };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import'./types.mjs';import{concatBytes,deriveRegistrationId,falcon512Sign,falcon512Verify,generateMLKEMKeyPair,generateX25519KeyPair,hkdfDerive,mlkemDecapsulate,mlkemEncapsulate,x25519DH}from'./crypto.mjs';function pqxdhInitiate(a,b){const c=generateX25519KeyPair(),d=x25519DH(c['privateKey'],b['identityKey']),e=x25519DH(a['privateKey'],b['signedPreKey']['publicKey']),f=x25519DH(c['privateKey'],b['signedPreKey']['publicKey']),{ciphertext:g,sharedSecret:h}=mlkemEncapsulate(b['pqPreKey']['publicKey']);let i;if(b['oneTimePreKey'])i=concatBytes(d,e,f,x25519DH(c['privateKey'],b['oneTimePreKey']['publicKey']),h);else i=concatBytes(d,e,f,h);const j=concatBytes(new TextEncoder()['encode']('WowokPQXDH'),a['publicKey'],b['identityKey']),k=hkdfDerive(i,j,0x40);return{'result':{'rootKey':k['slice'](0x0,0x20),'chainKey':k['slice'](0x20,0x40),'ourDHKeyPair':c,'peerDHPublicKey':b['signedPreKey']['publicKey'],'peerIdentityKey':b['identityKey'],'pqSharedSecret':h},'initialMessage':{'ephemeralPublicKey':c['publicKey'],'mlkemCiphertext':g,'identityKey':a['publicKey']}};}function pqxdhReceive(a,b,c,d,e,f,g){const h=x25519DH(a['privateKey'],e),i=x25519DH(b['privateKey'],f),j=x25519DH(b['privateKey'],e),k=mlkemDecapsulate(g,d['secretKey']);let l;if(c)l=concatBytes(h,i,j,x25519DH(c['privateKey'],e),k);else l=concatBytes(h,i,j,k);const m=concatBytes(new TextEncoder()['encode']('WowokPQXDH'),f,a['publicKey']),n=hkdfDerive(l,m,0x40);return{'rootKey':n['slice'](0x0,0x20),'chainKey':n['slice'](0x20,0x40),'ourDHKeyPair':b,'peerDHPublicKey':e,'peerIdentityKey':f,'pqSharedSecret':k};}function generatePreKeyBundle(a,b,c,d,e){const f=deriveRegistrationId(a['publicKey']),g=generateX25519KeyPair(),h=falcon512Sign(b['privateKey'],g['publicKey']),j=[];for(let m=0x0;m<e;m++)j['push']({'keyId':m+0x1,'keyPair':generateX25519KeyPair()});const k=generateMLKEMKeyPair(),l=falcon512Sign(b['privateKey'],k['publicKey']);return{'identityKeyPair':a,'falcon512KeyPair':b,'registrationId':f,'signedPreKey':{'keyId':c,'keyPair':g,'signature':h},'oneTimePreKeys':j,'pqPreKey':{'keyId':d,'keyPair':k,'signature':l}};}function verifyPreKeyBundle(a){if(!a['falcon512PublicKey']||a['falcon512PublicKey']['length']!==0x381)return![];if(!a['signedPreKey'])return![];if(!falcon512Verify(a['falcon512PublicKey'],a['signedPreKey']['publicKey'],a['signedPreKey']['signature']))return![];if(!a['pqPreKey'])return![];if(!falcon512Verify(a['falcon512PublicKey'],a['pqPreKey']['publicKey'],a['pqPreKey']['signature']))return![];return!![];}export{generatePreKeyBundle,pqxdhInitiate,pqxdhReceive,verifyPreKeyBundle};
|
|
1
|
+
import'./types.mjs';import{concatBytes,deriveAddressFromFalcon512PublicKey,deriveRegistrationId,falcon512Sign,falcon512Verify,generateMLKEMKeyPair,generateX25519KeyPair,hkdfDerive,mlkemDecapsulate,mlkemEncapsulate,x25519DH}from'./crypto.mjs';function pqxdhInitiate(a,b){const c=generateX25519KeyPair(),d=x25519DH(c['privateKey'],b['identityKey']),e=x25519DH(a['privateKey'],b['signedPreKey']['publicKey']),f=x25519DH(c['privateKey'],b['signedPreKey']['publicKey']),{ciphertext:g,sharedSecret:h}=mlkemEncapsulate(b['pqPreKey']['publicKey']);let i;if(b['oneTimePreKey'])i=concatBytes(d,e,f,x25519DH(c['privateKey'],b['oneTimePreKey']['publicKey']),h);else i=concatBytes(d,e,f,h);const j=concatBytes(new TextEncoder()['encode']('WowokPQXDH'),a['publicKey'],b['identityKey']),k=hkdfDerive(i,j,0x40);return{'result':{'rootKey':k['slice'](0x0,0x20),'chainKey':k['slice'](0x20,0x40),'ourDHKeyPair':c,'peerDHPublicKey':b['signedPreKey']['publicKey'],'peerIdentityKey':b['identityKey'],'pqSharedSecret':h},'initialMessage':{'ephemeralPublicKey':c['publicKey'],'mlkemCiphertext':g,'identityKey':a['publicKey']}};}function pqxdhReceive(a,b,c,d,e,f,g){const h=x25519DH(a['privateKey'],e),i=x25519DH(b['privateKey'],f),j=x25519DH(b['privateKey'],e),k=mlkemDecapsulate(g,d['secretKey']);let l;if(c)l=concatBytes(h,i,j,x25519DH(c['privateKey'],e),k);else l=concatBytes(h,i,j,k);const m=concatBytes(new TextEncoder()['encode']('WowokPQXDH'),f,a['publicKey']),n=hkdfDerive(l,m,0x40);return{'rootKey':n['slice'](0x0,0x20),'chainKey':n['slice'](0x20,0x40),'ourDHKeyPair':b,'peerDHPublicKey':e,'peerIdentityKey':f,'pqSharedSecret':k};}function generatePreKeyBundle(a,b,c,d,e){const f=deriveRegistrationId(a['publicKey']),g=generateX25519KeyPair(),h=falcon512Sign(b['privateKey'],g['publicKey']),j=[];for(let m=0x0;m<e;m++)j['push']({'keyId':m+0x1,'keyPair':generateX25519KeyPair()});const k=generateMLKEMKeyPair(),l=falcon512Sign(b['privateKey'],k['publicKey']);return{'identityKeyPair':a,'falcon512KeyPair':b,'registrationId':f,'signedPreKey':{'keyId':c,'keyPair':g,'signature':h},'oneTimePreKeys':j,'pqPreKey':{'keyId':d,'keyPair':k,'signature':l}};}function verifyPreKeyBundle(a,b){if(!a['falcon512PublicKey']||a['falcon512PublicKey']['length']!==0x381)return![];if(b){if(deriveAddressFromFalcon512PublicKey(a['falcon512PublicKey'])['toLowerCase']()!==b['toLowerCase']())return![];}if(!a['signedPreKey'])return![];if(!falcon512Verify(a['falcon512PublicKey'],a['signedPreKey']['publicKey'],a['signedPreKey']['signature']))return![];if(!a['pqPreKey'])return![];if(!falcon512Verify(a['falcon512PublicKey'],a['pqPreKey']['publicKey'],a['pqPreKey']['signature']))return![];return!![];}export{generatePreKeyBundle,pqxdhInitiate,pqxdhReceive,verifyPreKeyBundle};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { EncryptedMessage, RatchetState, SerializedRatchetState, X25519KeyPair } from "./types.mjs";
|
|
2
2
|
//#region src/w/messenger/pq/ratchet.d.ts
|
|
3
3
|
declare function initRatchet(rootKey: Uint8Array, sendingChainKey: Uint8Array, receivingChainKey: Uint8Array, ourDHKeyPair: X25519KeyPair, peerDHPublicKey: Uint8Array): RatchetState;
|
|
4
|
-
declare function ratchetEncrypt(state: RatchetState, plaintext: Uint8Array): {
|
|
4
|
+
declare function ratchetEncrypt(state: RatchetState, plaintext: Uint8Array, keyCombiner?: (messageKey: Uint8Array) => Uint8Array): {
|
|
5
5
|
message: EncryptedMessage;
|
|
6
6
|
newState: RatchetState;
|
|
7
7
|
};
|
|
8
|
-
declare function ratchetDecrypt(state: RatchetState, messageBody: Uint8Array): {
|
|
8
|
+
declare function ratchetDecrypt(state: RatchetState, messageBody: Uint8Array, keyCombiner?: (messageKey: Uint8Array) => Uint8Array): {
|
|
9
9
|
plaintext: Uint8Array;
|
|
10
10
|
newState: RatchetState;
|
|
11
11
|
};
|