lightning
Version:
Lightning Network client library
88 lines (69 loc) • 2.71 kB
JavaScript
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));
});
};