rename this.hash to this.hash_easy

This commit is contained in:
陆柯 2022-08-03 14:53:31 +08:00
parent cc01e71f48
commit 0cb2547d17

42
ticc.js
View File

@ -188,7 +188,7 @@ class TicCrypto {
// data can be anything, but converts to string or remains be Buffer/TypedArray/DataView
if (this.is_hashable({ data })) {
if (typeof data !== 'string' && !(data instanceof Buffer) && !(data instanceof DataView)) data = JSON.stringify(data)
if (salt && typeof salt === 'string') data = data + this.hash(salt)
if (salt && typeof salt === 'string') data = data + this.hash_easy(salt)
let inputEncoding = input // my.INPUT_LIST.includes(input)?input:my.INPUT // 'utf8', 'ascii' or 'latin1' for string data, default to utf8 if not specified; ignored for Buffer, TypedArray, or DataView.
let outputEncoding = output === 'buf' ? undefined : output // (my.OUTPUT_LIST.includes(output)?output:my.OUTPUT) // output: 留空=》默认输出hex格式或者手动指定 'buf', hex', 'latin1' or 'base64'
return crypto
@ -222,7 +222,7 @@ class TicCrypto {
let inputEncoding = my.INPUT_LIST.includes(input) ? input : my.INPUT // 'utf8' by default, 'ascii', 'latin1' for string or ignored for Buffer/TypedArray/DataView
let outputEncoding = output === 'buf' ? undefined : my.OUTPUT_LIST.includes(output) ? output : my.OUTPUT // 'latin1', 'base64', 'hex' by default or 'buf' to Buffer explicitly
const iv = crypto.randomBytes(16)
let encryptor = crypto.createCipheriv(my.CIPHER_LIST.includes(cipher) ? cipher : my.CIPHER, this.hex_to_buf(this.hash(key)), iv) // cipher 和 key 的长度必须相同,例如 cipher 是 ***-192那么 key 就必须是 192/8=24 字节 = 48 hex 的。
let encryptor = crypto.createCipheriv(my.CIPHER_LIST.includes(cipher) ? cipher : my.CIPHER, this.hex_to_buf(this.hash_easy(key)), iv) // cipher 和 key 的长度必须相同,例如 cipher 是 ***-192那么 key 就必须是 192/8=24 字节 = 48 hex 的。
if (typeof data !== 'string' && !(data instanceof Buffer) && !(data instanceof DataView)) data = JSON.stringify(data)
let ciphertext = encryptor.update(data, inputEncoding, outputEncoding)
ciphertext += encryptor.final(outputEncoding) // 但是 Buffer + Buffer 还是会变成string
@ -268,7 +268,7 @@ class TicCrypto {
let outputEncoding = output === 'buf' ? undefined : my.INPUT_LIST.includes(output) ? output : my.INPUT // output (=input of encrypt) could be 'latin1', 'ascii', 'utf8' by default or 'buf' to Buffer explicitly
let decryptor = crypto.createDecipheriv(
my.CIPHER_LIST.includes(cipher) ? cipher : my.CIPHER,
this.hex_to_buf(this.hash(key)),
this.hex_to_buf(this.hash_easy(key)),
Buffer.from(data.iv, 'hex')
)
let decrypted = decryptor.update(data.ciphertext, inputEncoding, outputEncoding)
@ -302,21 +302,21 @@ class TicCrypto {
if (this.is_hashable({ data }) && this.is_seckey(seckey)) {
if (tool === 'nacl' && seckey.length === 128) {
// 使用nacl的签名算法。注意nacl.sign需要的seckey是64字节=128字符。
let hashBuf = this.hash(data, { output: 'buf' }) // 哈希必须输出为 buffer
let hashBuf = this.hash_easy(data, { output: 'buf' }) // 哈希必须输出为 buffer
let signature = nacl.sign.detached(hashBuf, Buffer.from(seckey, 'hex'))
return Buffer.from(signature).toString('hex') // 签名是64节128个hex字符
} else if (tool === 'eccrypto' && seckey.length === 64) {
// eccrypto 对同一组data,seckey生成的签名是固定的观察到hex长度为140或142是der格式。
let signature = await eccrypto.sign(Buffer.from(seckey, 'hex'), this.hash(data, { output: 'buf' }))
let signature = await eccrypto.sign(Buffer.from(seckey, 'hex'), this.hash_easy(data, { output: 'buf' }))
return signature.toString('hex')
} else if (seckey.length === 64) {
// 纯 crypto
let seckeyPEM = await new keyman.Key('oct', this.hex_to_buf(seckey), { namedCurve: 'P-256K' }).export('pem') // 私钥导出的der格式为144字节。
let signer = crypto.createSign(my.HASHER_LIST.includes(hasher) ? hasher : my.HASHER) // 注意不知为何hasher必须含有'sha'才能完成签名,例如 sha1, sha256, sha512, sha3, RSA-SHA1, id-rsassa-pkcs1-v1_5-with-sha3-224, 其他都会报错。
signer.update(this.hash(data)).end()
signer.update(this.hash_easy(data)).end()
let signature = signer.sign(seckeyPEM, 'hex')
// since nodejs 12, 有了 crypto.sign 方法,但在浏览器中无效:
// let signature = crypto.sign(my.HASHER_LIST.includes(hasher) ? hasher : my.HASHER, Buffer.from(this.hash(data)), seckeyPEM).toString('hex')
// let signature = crypto.sign(my.HASHER_LIST.includes(hasher) ? hasher : my.HASHER, Buffer.from(this.hash_easy(data)), seckeyPEM).toString('hex')
return signature // 发现同样的输入nodejs里每次调用会生成不同的 signature, 且长度不定(140,142,144 hex) 但都可以通过 verify。但在浏览器里调用signature却是固定的。
}
}
@ -338,7 +338,7 @@ class TicCrypto {
// data could be anything, but converts to string or remains be Buffer/TypedArray/DataView
if (this.is_hashable({ data }) && this.is_signature(signature) && this.is_pubkey({ pubkey })) {
if ('nacl' === tool && signature.length === 128) {
let bufHash = this.hash(data, { output: 'buf' })
let bufHash = this.hash_easy(data, { output: 'buf' })
let bufSignature = Buffer.from(signature, 'hex')
let bufPubkey = Buffer.from(pubkey, 'hex')
let verified = nacl.sign.detached.verify(bufHash, bufSignature, bufPubkey)
@ -346,7 +346,7 @@ class TicCrypto {
} else if ('eccrypto' === tool && signature.length >= 140) {
// 默认使用 eccrypto // 发现大小写不影响 eccrypto 验签!都能通过
try {
let result = await eccrypto.verify(Buffer.from(pubkey, 'hex'), this.hash(data, { output: 'buf' }), Buffer.from(signature, 'hex')) // 如果给signature添加1位hexeccrypto 的 verify结果也是true! 估计因为一位hex不被转成字节。
let result = await eccrypto.verify(Buffer.from(pubkey, 'hex'), this.hash_easy(data, { output: 'buf' }), Buffer.from(signature, 'hex')) // 如果给signature添加1位hexeccrypto 的 verify结果也是true! 估计因为一位hex不被转成字节。
return true
} catch (exception) {
// 对能够验证的eccrypto返回 null对无法验证的抛出异常
@ -356,10 +356,10 @@ class TicCrypto {
// 纯 crypto // 发现大小写不影响 crypto 验签!都能通过
let pubkeyPEM = await new keyman.Key('oct', this.hex_to_buf(pubkey), { namedCurve: 'P-256K' }).export('pem') // 公钥导出的der格式为88字节。经测试同一对压缩和非压缩公钥得出的结果一模一样。
let verifier = crypto.createVerify(my.HASHER_LIST.includes(hasher) ? hasher : my.HASHER)
verifier.update(this.hash(data)).end() // end() 在 nodejs 12 里返回verifier自身但在浏览器里返回 undefined因此不能串联运行。
verifier.update(this.hash_easy(data)).end() // end() 在 nodejs 12 里返回verifier自身但在浏览器里返回 undefined因此不能串联运行。
let verified = verifier.verify(pubkeyPEM, signature, 'hex') // 如果给signature添加1位hexcrypto 的 verify结果也是true! 估计因为一位hex不被转成字节。但减少1位会导致false
// since nodejs 12, 有了 crypto.verify 方法,但在浏览器中无效:
// let verified = crypto.verify(my.HASHER_LIST.includes(hasher) ? hasher : my.HASHER, Buffer.from(this.hash(data)), pubkeyPEM, Buffer.from(signature, 'hex'))
// let verified = crypto.verify(my.HASHER_LIST.includes(hasher) ? hasher : my.HASHER, Buffer.from(this.hash_easy(data)), pubkeyPEM, Buffer.from(signature, 'hex'))
return verified
}
}
@ -501,7 +501,7 @@ class TicCrypto {
// 后面还可继续延伸 /xxx/xxx/xxx/......
let path
if (pathRoot) {
let pathHash = this.hash(pathRoot, { hasher: 'md5' })
let pathHash = this.hash_easy(pathRoot, { hasher: 'md5' })
let part0 = parseInt(pathHash.slice(0, 6), 16)
let part1 = parseInt(pathHash.slice(6, 12), 16)
let part2 = parseInt(pathHash.slice(12, 18), 16)
@ -758,7 +758,7 @@ class TicCrypto {
default:
prefix = '4c'
}
let checksum = this.hash(this.hash(prefix + position)).slice(0, 6) // 添加 checksum 使得能够检测大小写错误。[todo] 校验码里要不要包含 prefix?
let checksum = this.hash_easy(this.hash_easy(prefix + position)).slice(0, 6) // 添加 checksum 使得能够检测大小写错误。[todo] 校验码里要不要包含 prefix?
// address = this.hex_to_eip55(prefix + position + checksum) // 前缀1节位置20节校验3节共24节=48字符能够完全转化为8个色彩再转eip55。
address = this.hex_to_b64t(prefix + position + checksum) // 实际采用 b64t, 共 32字符。
return address
@ -790,7 +790,7 @@ class TicCrypto {
// 格式合法
let hex = this.b64t_to_hex(address)
let [all, prefix, position, checksum] = hex.match(/^([\da-fA-F]{2})([\da-fA-F]{40})([\da-fA-F]{6})$/)
if (this.hash(this.hash(position)).slice(0, 6) === checksum) {
if (this.hash_easy(this.hash_easy(position)).slice(0, 6) === checksum) {
return position
}
}
@ -818,7 +818,7 @@ class TicCrypto {
// 格式合法
let hex = Buffer.from(this.b64t_to_b64(address), 'base64').toString('hex')
let [all, prefix, position, checksum] = hex.match(/^([\da-fA-F]{2})([\da-fA-F]{40})([\da-fA-F]{6})$/) // 内容合法
if (this.hash(this.hash(prefix + position)).slice(0, 6) === checksum)
if (this.hash_easy(this.hash_easy(prefix + position)).slice(0, 6) === checksum)
// [todo] 校验码里要不要包含 prefix?
return 'TIC'
}
@ -1046,13 +1046,13 @@ class TicCrypto {
hashList = [...hashList]
if (!Array.isArray(hashList)) return null
var border = hashList.length
if (border == 0) return this.hash('')
if (border == 1) return this.hash(hashList[0])
if (border == 0) return this.hash_easy('')
if (border == 1) return this.hash_easy(hashList[0])
while (1) {
let i = 1,
j = 0
for (; i < border; i = i + 2) {
hashList[j] = this.hash(hashList[i - 1] + hashList[i])
hashList[j] = this.hash_easy(hashList[i - 1] + hashList[i])
if (border == 2) {
return hashList[0]
}
@ -1060,7 +1060,7 @@ class TicCrypto {
j = j + 1
if (i + 2 == border) {
i = i + 1
hashList[j] = this.hash(hashList[i])
hashList[j] = this.hash_easy(hashList[i])
break
}
}
@ -1081,7 +1081,7 @@ class TicCrypto {
static hash_to_sig_distance ({ hash, sig } = {}) {
// hash为64hex字符sig为128hex字符。返回用hex表达的距离。
if (this.is_signature(sig) && this.is_hash({ hash })) {
var hashSig = this.hash(sig) // 把签名也转成32字节的哈希同样长度方便比较
var hashSig = this.hash_easy(sig) // 把签名也转成32字节的哈希同样长度方便比较
return new BigInt(hash, 16)
.subtract(new BigInt(hashSig, 16))
.abs()
@ -1508,7 +1508,7 @@ class TicCrypto {
}
static string_to_raw_cid (str) {
return this.cosh_to_cid({ cosh: this.hash(str), cidVersion: 1, cidCodec: 'raw' })
return this.cosh_to_cid({ cosh: this.hash_easy(str), cidVersion: 1, cidCodec: 'raw' })
}
}