From 49fe1c8ed7aea1f109b4bcc4944ddcd0cc30117b Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Thu, 29 Sep 2022 13:18:53 +0930 Subject: [PATCH] lightningd: have `makesecret` take `hex` or `string` (just like `datastore`) Changelog-Added: JSON-RPC: `makesecret` can take a string argument instead of hex. Signed-off-by: Rusty Russell --- doc/lightning-makesecret.7.md | 10 +++------- doc/schemas/makesecret.request.json | 8 +++++--- lightningd/hsm_control.c | 20 +++++++++++++++++--- tests/test_misc.py | 4 ++++ 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/doc/lightning-makesecret.7.md b/doc/lightning-makesecret.7.md index 2a713ded4..fc54dd514 100644 --- a/doc/lightning-makesecret.7.md +++ b/doc/lightning-makesecret.7.md @@ -4,14 +4,15 @@ lightning-makesecret -- Command for deriving pseudorandom key from HSM SYNOPSIS -------- -**makesecret** *hex* +**makesecret** [*hex*] [*string*] DESCRIPTION ----------- The **makesecret** RPC command derives a secret key from the HSM_secret. -The *hex* can be any hex data. +One of *hex* or *string* must be specified: *hex* can be any hex data, +*string* is a UTF-8 string interpreted literally. RETURN VALUE ------------ @@ -32,11 +33,6 @@ AUTHOR Aditya <> is mainly responsible. -SEE ALSO --------- - -lightning-getsharedsecret(7) - RESOURCES --------- diff --git a/doc/schemas/makesecret.request.json b/doc/schemas/makesecret.request.json index c26e3ce4b..5059babd0 100644 --- a/doc/schemas/makesecret.request.json +++ b/doc/schemas/makesecret.request.json @@ -2,13 +2,15 @@ "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "additionalProperties": false, - "required": [ - "hex" - ], + "required": [], "properties": { "hex": { "type": "hex", "description": "This will be used for deriving the secret" + }, + "string": { + "type": "string", + "description": "This will be used for deriving the secret" } } } diff --git a/lightningd/hsm_control.c b/lightningd/hsm_control.c index c5252fc3b..f360d813a 100644 --- a/lightningd/hsm_control.c +++ b/lightningd/hsm_control.c @@ -131,16 +131,30 @@ static struct command_result *json_makesecret(struct command *cmd, const jsmntok_t *obj UNNEEDED, const jsmntok_t *params) { - u8 *info; + u8 *data; + const char *strdata; struct json_stream *response; struct secret secret; if (!param(cmd, buffer, params, - p_req("hex", param_bin_from_hex, &info), + p_opt("hex", param_bin_from_hex, &data), + p_opt("string", param_string, &strdata), NULL)) return command_param_failed(); - u8 *msg = towire_hsmd_derive_secret(cmd, info); + if (strdata) { + if (data) + return command_fail(cmd, JSONRPC2_INVALID_PARAMS, + "Cannot have both hex and string"); + data = tal_dup_arr(cmd, u8, (u8 *)strdata, strlen(strdata), 0); + } else { + if (!data) + return command_fail(cmd, JSONRPC2_INVALID_PARAMS, + "Must have either hex or string"); + } + + + u8 *msg = towire_hsmd_derive_secret(cmd, data); if (!wire_sync_write(cmd->ld->hsm_fd, take(msg))) return command_fail(cmd, LIGHTNINGD, "Could not write to HSM: %s", strerror(errno)); diff --git a/tests/test_misc.py b/tests/test_misc.py index cb54b58d3..b301286a3 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -2281,6 +2281,10 @@ def test_makesecret(node_factory): assert l1.rpc.makesecret(hex="736362207365637265")["secret"] != secret assert l1.rpc.makesecret(hex="7363622073656372657401")["secret"] != secret + # Using string works! + assert l1.rpc.makesecret(string="scb secret")["secret"] == secret + assert l1.rpc.makesecret(None, "scb secret")["secret"] == secret + def test_staticbackup(node_factory): """