UNPKG

lightning

Version:
88 lines (69 loc) 2.71 kB
const asyncAuto = require('async/auto'); const {returnResult} = require('asyncjs-util'); const {isLnd} = require('./../../lnd_requests'); const isHex = n => !(n.length % 2) && /^[0-9A-F]*$/i.test(n); const isSchnorrSignatureLength = signature => signature.length === 128; const unimplementedError = '12 UNIMPLEMENTED: unknown service signrpc.Signer'; /** Verify signature of arbitrary bytes When passing a schnorr signature, a BIP-340 x-only public key should be given Requires LND built with `signrpc` build tag Requires `signer:read` permission Validating `schnorr` signatures is unsupported in LND 0.15.0 and below { lnd: <Authenticated LND API Object> preimage: <Message Preimage Bytes Hex Encoded String> public_key: <Signature Valid For Public Key Hex String> signature: <Signature Hex String> } @returns via cbk or Promise { is_valid: <Signature is Valid Bool> } */ module.exports = (args, cbk) => { return new Promise((resolve, reject) => { return asyncAuto({ // Check arguments validate: cbk => { if (!isLnd({lnd: args.lnd, method: 'verifyMessage', type: 'signer'})) { return cbk([400, 'ExpectedLndToVerifyBytesSignature']); } if (!args.preimage || !isHex(args.preimage)) { return cbk([400, 'ExpectedPreimageToVerifyBytesSignature']) } if (!args.public_key || !isHex(args.public_key)) { return cbk([400, 'ExpectedPublicKeyToVerifyBytesSignature']); } if (!args.signature || !isHex(args.signature)) { return cbk([400, 'ExpectedSignatureToVerifyBytesSignature']); } return cbk(); }, // Verify signature verify: ['validate', ({}, cbk) => { return args.lnd.signer.verifyMessage({ is_schnorr_sig: isSchnorrSignatureLength(args.signature), msg: Buffer.from(args.preimage, 'hex'), pubkey: Buffer.from(args.public_key, 'hex'), signature: Buffer.from(args.signature, 'hex'), }, (err, res) => { if (!!err && err.message === unimplementedError) { return cbk([400, 'ExpectedSignerRpcLndBuildTagToVerifySignBytes']); } if (!!err) { return cbk([503, 'UnexpectedErrWhenVerifyingSignedBytes', {err}]); } if (!res) { return cbk([503, 'UnexpectedEmptyResponseWhenVerifyingBytesSig']); } if (res.valid === undefined) { return cbk([503, 'ExpectedValidStateOfSignatureOverBytes']); } return cbk(null, {is_valid: res.valid}); }); }], }, returnResult({reject, resolve, of: 'verify'}, cbk)); }); };