diff --git a/.gitignore b/.gitignore index 36e9cc0..470c161 100644 --- a/.gitignore +++ b/.gitignore @@ -13,9 +13,13 @@ ?*.gitignore.* ?*.gitignore.*/ *.gitomit -*.gitomit/ *.gitomit.* +*.gitomit/ *.gitomit.*/ +*.nogit +*.nogit.* +*.nogit/ +*.nogit.*/ # 保留 !.gitignore !.gitignore.* diff --git a/seafile-ignore.txt b/seafile-ignore.txt index 6795407..f761786 100644 --- a/seafile-ignore.txt +++ b/seafile-ignore.txt @@ -17,6 +17,10 @@ *.sfomit.* *.sfomit/ *.sfomit.*/ +*.nosf +*.nosf.* +*.nosf/ +*.nosf.*/ .DS_Store */.DS_Store diff --git a/ticc.js b/ticc.js index 8df5475..5e45cf2 100644 --- a/ticc.js +++ b/ticc.js @@ -1,5 +1,5 @@ -// const BigNumber=require('bignumber.js') // 处理整数 https://github.com/MikeMcl/bignumber.js -const BigInt = require('big-integer') // 处理整数 https://github.com/peterolson/BigInteger.js +// const BigNumber=require('bignumber.js') // 处理整数 https://github.com/MikeMcl/bignumber.js // size: 360K +const BigInt = require('big-integer') // 处理整数 https://github.com/peterolson/BigInteger.js // size: 188K. ethers.js 24M. const crypto = require('crypto') const nacl = require('tweetnacl') const bs58check = require('bs58check') @@ -193,6 +193,7 @@ class TicCrypto { * @param {option} [{ hasher = my.HASHER, salt, input = my.INPUT, output = my.OUTPUT }={}] * @return {String} * @memberof TicCrypto + * 返回结果不包含 0x */ static hash_easy (data, { hasher = my.HASHER, salt, input = my.INPUT, output = my.OUTPUT } = {}) { // data can be anything, but converts to string or remains be Buffer/TypedArray/DataView @@ -264,9 +265,11 @@ class TicCrypto { // data 应当是 encrypt 输出的数据类型 if (mode === 'ecrsa') { if (key?.prikey && key?.pubkey) { - return ecrsa.decryptMessage(data, key?.prikey, key?.pubkey) + return ecrsa.decryptMessage(data, key.prikey, key.pubkey) + } else if (key?.receiverPrikey && key?.senderPubkey) { + return ecrsa.decryptMessage(data, key.receiverPrikey, key.senderPubkey) } else { - return ecrsa.decryptMessage(data, key?.receiverPrikey, key?.senderPubkey) + return null } } else if (mode === 'ecc') { try { @@ -533,6 +536,8 @@ class TicCrypto { return `m/44'/60'/${path}` } else if (coin === 'TIC') { return `m/44'/60000'/${path}` + } else if (coin === 'MATIC') { // Polygon 测试网 (Mumbai): 80001 + return `m/44'/137'/${path}` } else if (/[A-Z]{3}/.test(coin)) { return `m/44'/60${this.alpha_to_digit(coin)}'/${path}` } else { @@ -1097,7 +1102,7 @@ class TicCrypto { // hash为64hex字符,sig为128hex字符。返回用hex表达的距离。 if (this.is_signature({ sig: sig }) && this.is_hash({ hash })) { var hashSig = this.hash_easy(sig) // 把签名也转成32字节的哈希,同样长度方便比较 - return (BigInt('0x' + hash) - BigInt('0x' + hashSig)).toString(16).replace(/^-/, '') + return (new BigInt(hash, 16) - new BigInt(hashSig, 16)).toString(16).replace(/^-/, '') // if using bignumber.js: (BigInt('0x' + hash) - BigInt('0x' + hashSig)).toString(16) } return null } @@ -1455,15 +1460,18 @@ class TicCrypto { return '04' + this.padStart(x.toString(16), 64, '0') + this.padStart(y.toString(16), 64, '0') } + // cosh: content hash. 最核心的纯hex的内容地址,没有任何额外标记。同一个内容的cosh是唯一的,而cid是在cosh基础上有各种不同的编码。cid建议叫做 coid. static cid_to_cosh ({ cid }) { if (/^[Q|1]/.test(cid)) { - return this.b58_to_hex(cid).slice(4) + return this.b58_to_hex(cid).slice(4) // 前2字节是 cid0 的字节序数标记 } else if (/^[b|B]/.test(cid)) { - return this.b32_to_hex(cid.substr(1)).slice(8) + return this.b32_to_hex(cid.substr(1)).slice(8) // 前4字节是 cid1 的标记 } else if (/^z/.test(cid)) { return this.b58_to_hex(cid.substr(1)).slice(8) } else if (/^[m|M|u|U]/.test(cid)) { return Buffer.from(cid.substr(1), 'base64').toString('hex') + } else if (/^9/.test(cid)) { + return new BigInt(cid.substr(1)).toString(16).slice(7) // BigInt toString(16) 后,去掉了 01551220... 的打头的 0,所以只有7位需要跳过了 } } @@ -1522,6 +1530,8 @@ class TicCrypto { converted = Buffer.from(fullHex, 'hex').toString('base64') } else if (cidBase === 'b64') { converted = Buffer.from(fullHex, 'hex').toString('base64').replace(/=/g, '') + } else if (cidBase === 'b10') { + converted = new BigInt(fullHex, 16).toString() } return multibase[cidBase] + converted }