UNPKG

@taquito/utils

Version:

Encoding, crypto, and utility helpers for Taquito.

137 lines (136 loc) 5.03 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.POP_DST = exports.BLS12_381_DST = void 0; exports.verifySignature = verifySignature; const ed25519_1 = require("@noble/curves/ed25519"); const blake2_js_1 = require("@noble/hashes/blake2.js"); const encoding_1 = require("./encoding"); const constants_1 = require("./constants"); const secp256k1_1 = require("@noble/curves/secp256k1"); const nist_1 = require("@noble/curves/nist"); const core_1 = require("@taquito/core"); const bls12_381_1 = require("@noble/curves/bls12-381"); exports.BLS12_381_DST = 'BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_'; exports.POP_DST = 'BLS_POP_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_'; /** * Verify signature of a payload * @param message The forged message including the magic byte (11 for block, 12 for preattestation, 13 for attestation, 3 for generic, 5 for the PACK format of michelson) in string or Uint8Array * @param publicKey The public key to verify the signature against * @param signature The signature to verify * @param watermark Optional if not included in the message * @param pop Optional if verifying proof of possession signature * @returns A boolean indicating if the signature matches * @throws InvalidPublicKeyError | InvalidSignatureError | InvalidMessageError * @example * ``` * const message = '03d0c10e3ed11d7c6e3357f6ef335bab9e8f2bd54d0ce20c482e241191a6e4b8ce6c01be917311d9ac46959750e405d57e268e2ed9e174a80794fbd504e12a4a000141eb3781afed2f69679ff2bbe1c5375950b0e40d00ff000000005e05050505050507070100000024747a32526773486e74516b72794670707352466261313652546656503539684b72654a4d07070100000024747a315a6672455263414c42776d4171776f6e525859565142445439426a4e6a42484a750001'; * const pk = 'sppk7c7hkPj47yjYFEHX85q46sFJGw6RBrqoVSHwAJAT4e14KJwzoey'; * const sig = 'spsig1cdLkp1RLgUHAp13aRFkZ6MQDPp7xCnjAExGL3MBSdMDmT6JgQSX8cufyDgJRM3sinFtiCzLbsyP6d365EHoNevxhT47nx' * * const response = verifySignature(message, pk, sig); * ``` * */ function verifySignature(message, publicKey, signature, watermark, pop) { const [pk, pre] = (() => { try { return (0, encoding_1.b58DecodeAndCheckPrefix)(publicKey, encoding_1.publicKeyPrefixes); } catch (err) { if (err instanceof core_1.ParameterValidationError) { throw new core_1.InvalidPublicKeyError(publicKey, err.result); } else { throw err; } } })(); const sig = (() => { try { const [sig] = (0, encoding_1.b58DecodeAndCheckPrefix)(signature, encoding_1.signaturePrefixes); return sig; } catch (err) { if (err instanceof core_1.ParameterValidationError) { throw new core_1.InvalidSignatureError(signature, err.result); } else { throw err; } } })(); let msg; if (typeof message === 'string') { msg = (0, encoding_1.hex2buf)(message); } else { msg = message; } if (msg.length === 0) { throw new core_1.InvalidMessageError((0, encoding_1.buf2hex)(msg), `can't be empty`); } if (typeof watermark !== 'undefined') { msg = (0, encoding_1.mergebuf)(watermark, msg); } if (pop) { return verifyBLSPopSignature(sig, msg, pk); } else { switch (pre) { case constants_1.PrefixV2.P256PublicKey: return verifyP2Signature(sig, msg, pk); case constants_1.PrefixV2.Secp256k1PublicKey: return verifySpSignature(sig, msg, pk); case constants_1.PrefixV2.Ed25519PublicKey: return verifyEdSignature(sig, msg, pk); default: return verifyBLSSignature(sig, msg, pk); } } } function verifyEdSignature(sig, msg, publicKey) { const hash = (0, blake2_js_1.blake2b)(msg, { dkLen: 32 }); try { return ed25519_1.ed25519.verify(sig, hash, publicKey); } catch { return false; } } function verifySpSignature(sig, msg, publicKey) { const hash = (0, blake2_js_1.blake2b)(msg, { dkLen: 32 }); try { return secp256k1_1.secp256k1.verify(sig, hash, publicKey); } catch { return false; } } function verifyP2Signature(sig, msg, publicKey) { const hash = (0, blake2_js_1.blake2b)(msg, { dkLen: 32 }); try { return nist_1.p256.verify(sig, hash, publicKey); } catch { return false; } } const bls = bls12_381_1.bls12_381.longSignatures; // AKA MinPK function verifyBLSSignature(sig, msg, publicKey) { try { const point = bls.hash(msg, exports.BLS12_381_DST); return bls.verify(sig, point, publicKey); } catch { return false; } } function verifyBLSPopSignature(sig, msg, publicKey) { try { const point = bls.hash(msg, exports.POP_DST); return bls.verify(sig, point, publicKey); } catch { return false; } }