@taquito/utils
Version:
Encoding, crypto, and utility helpers for Taquito.
137 lines (136 loc) • 5.03 kB
JavaScript
;
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;
}
}