lightning
Version:
Lightning Network client library
87 lines (70 loc) • 2.5 kB
JavaScript
const asyncAuto = require('async/auto');
const {returnResult} = require('asyncjs-util');
const {isLnd} = require('./../../lnd_requests');
const defaultKeyFamily = 6;
const defaultKeyIndex = 0;
const {isBuffer} = Buffer;
const isHex = n => !(n.length % 2) && /^[0-9A-F]*$/i.test(n);
const method = 'deriveSharedKey';
const type = 'signer';
const unimplementedError = 'unknown service signrpc.Signer';
/** Derive a shared secret
Key family and key index default to 6 and 0, which is the node identity key
Requires LND built with `signrpc` build tag
Requires `signer:generate` permission
{
[key_family]: <Key Family Number>
[key_index]: <Key Index Number>
lnd: <Authenticated LND API Object>
partner_public_key: <Public Key Hex String>
}
@returns via cbk or Promise
{
secret: <Shared Secret Hex String>
}
*/
module.exports = (args, cbk) => {
return new Promise((resolve, reject) => {
return asyncAuto({
// Check arguments
validate: cbk => {
if (!isLnd({method, type, lnd: args.lnd})) {
return cbk([400, 'ExpectedAuthenticatedLndToComputeSharedSecret']);
}
if (!args.partner_public_key || !isHex(args.partner_public_key)) {
return cbk([400, 'ExpectedHexEncodedPartnerPublicKey']);
}
return cbk();
},
// Derive the shared key
deriveKey: ['validate', ({}, cbk) => {
return args.lnd[type][method]({
ephemeral_pubkey: Buffer.from(args.partner_public_key, 'hex'),
key_loc: {
key_family: args.key_family || defaultKeyFamily,
key_index: args.key_index || defaultKeyIndex,
},
},
(err, res) => {
if (!!err && err.details === unimplementedError) {
return cbk([400, 'ExpectedLndWithSupportForDeriveSharedKey']);
}
if (!!err) {
return cbk([503, 'UnexpetedErrorDerivingSharedKey', {err}]);
}
if (!res) {
return cbk([503, 'ExpectedResultOfDeriveSharedKeyRequest']);
}
if (!isBuffer(res.shared_key)) {
return cbk([503, 'ExpectedSharedKeyBufferInDeriveKeyResponse']);
}
if (!res.shared_key.length) {
return cbk([503, 'UnexpectedSharedKeyLengthInDeriveKeyResponse']);
}
return cbk(null, {secret: res.shared_key.toString('hex')});
});
}],
},
returnResult({reject, resolve, of: 'deriveKey'}, cbk));
});
};