Browse Source

lightningd: add signmessage JSON command.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
travis-debug
Rusty Russell 5 years ago
committed by neil saitug
parent
commit
fc9a2a5dba
  1. 1
      CHANGELOG.md
  2. 9
      lightningd/Makefile
  3. 60
      lightningd/signmessage.c

1
CHANGELOG.md

@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- JSON API: `listfunds` now lists a blockheight for confirmed transactions, and has `connected` and `state` fields for channels, like `listpeers`. - JSON API: `listfunds` now lists a blockheight for confirmed transactions, and has `connected` and `state` fields for channels, like `listpeers`.
- JSON API: `fundchannel_start` now includes field `scriptpubkey` - JSON API: `fundchannel_start` now includes field `scriptpubkey`
- JSON API: New method `listtransactions` - JSON API: New method `listtransactions`
- JSON API: `signmessage` will now create a signature from your node on a message.
- Plugin: new notifications `sendpay_success` and `sendpay_failure`. - Plugin: new notifications `sendpay_success` and `sendpay_failure`.
- Protocol: nodes now announce features in `node_announcement` broadcasts. - Protocol: nodes now announce features in `node_announcement` broadcasts.
- Protocol: we now offer `option_gossip_queries_ex` for finegrained gossip control. - Protocol: we now offer `option_gossip_queries_ex` for finegrained gossip control.

9
lightningd/Makefile

@ -96,7 +96,10 @@ LIGHTNINGD_SRC := \
lightningd/subd.c \ lightningd/subd.c \
lightningd/watch.c lightningd/watch.c
LIGHTNINGD_OBJS := $(LIGHTNINGD_SRC:.c=.o) LIGHTNINGD_SRC_NOHDR := \
lightningd/signmessage.c
LIGHTNINGD_OBJS := $(LIGHTNINGD_SRC:.c=.o) $(LIGHTNINGD_SRC_NOHDR:.c=.o)
# Make sure these depend on everything. # Make sure these depend on everything.
ALL_OBJS += $(LIGHTNINGD_OBJS) ALL_OBJS += $(LIGHTNINGD_OBJS)
@ -124,9 +127,9 @@ lightningd/gen_channel_state_names.h: lightningd/channel_state.h ccan/ccan/cdump
check-source: $(LIGHTNINGD_SRC:%=check-src-include-order/%) $(LIGHTNINGD_SRC_NOHDR:%=check-src-include-order/%) check-source: $(LIGHTNINGD_SRC:%=check-src-include-order/%) $(LIGHTNINGD_SRC_NOHDR:%=check-src-include-order/%)
check-source: $(LIGHTNINGD_HEADERS_NOGEN:%=check-hdr-include-order/%) check-source: $(LIGHTNINGD_HEADERS_NOGEN:%=check-hdr-include-order/%)
check-source-bolt: $(LIGHTNINGD_SRC:%=bolt-check/%) $(LIGHTNINGD_HEADERS_NOGEN:%=bolt-check/%) check-source-bolt: $(LIGHTNINGD_SRC:%=bolt-check/%) $(LIGHTNINGD_SRC_NOHDR:%=bolt-check/%) $(LIGHTNINGD_HEADERS_NOGEN:%=bolt-check/%)
check-whitespace: $(LIGHTNINGD_SRC:%=check-whitespace/%) $(LIGHTNINGD_HEADERS_NOGEN:%=check-whitespace/%) check-whitespace: $(LIGHTNINGD_SRC:%=check-whitespace/%) $(LIGHTNINGD_SRC_NOHDR:%=check-whitespace/%) $(LIGHTNINGD_HEADERS_NOGEN:%=check-whitespace/%)
check-makefile: check-lightningd-makefile check-makefile: check-lightningd-makefile
check-lightningd-makefile: check-lightningd-makefile:

60
lightningd/signmessage.c

@ -0,0 +1,60 @@
#include <common/json_helpers.h>
#include <common/jsonrpc_errors.h>
#include <common/param.h>
#include <common/type_to_string.h>
#include <common/utils.h>
#include <errno.h>
#include <gossipd/gen_gossip_wire.h>
#include <hsmd/gen_hsm_wire.h>
#include <string.h>
#include <wire/wire_sync.h>
static struct command_result *json_signmessage(struct command *cmd,
const char *buffer,
const jsmntok_t *obj UNNEEDED,
const jsmntok_t *params)
{
const char *message;
secp256k1_ecdsa_recoverable_signature rsig;
struct json_stream *response;
u8 sig[64], recidu8, *msg;
int recid;
if (!param(cmd, buffer, params,
p_req("message", param_string, &message),
NULL))
return command_param_failed();
if (strlen(message) > 65535)
return command_fail(cmd, JSONRPC2_INVALID_PARAMS,
"Message must be < 64k");
msg = towire_hsm_sign_message(NULL,
tal_dup_arr(tmpctx, u8, (u8 *)message,
strlen(message), 0));
if (!wire_sync_write(cmd->ld->hsm_fd, take(msg)))
fatal("Could not write to HSM: %s", strerror(errno));
msg = wire_sync_read(tmpctx, cmd->ld->hsm_fd);
if (!fromwire_hsm_sign_message_reply(msg, &rsig))
fatal("HSM gave bad hsm_sign_message_reply %s",
tal_hex(msg, msg));
secp256k1_ecdsa_recoverable_signature_serialize_compact(secp256k1_ctx,
sig, &recid,
&rsig);
response = json_stream_success(cmd);
json_add_hex(response, "signature", sig, sizeof(sig));
recidu8 = recid;
json_add_hex(response, "recid", &recidu8, sizeof(recidu8));
return command_success(cmd, response);
}
static const struct json_command json_signmessage_cmd = {
"signmessage",
"utility",
json_signmessage,
"Create a digital signature of {message}",
};
AUTODATA(json_command, &json_signmessage_cmd);
Loading…
Cancel
Save