diff --git a/devtools/onion.c b/devtools/onion.c index 5a8d53eaf..f58756394 100644 --- a/devtools/onion.c +++ b/devtools/onion.c @@ -16,12 +16,14 @@ #include #include #include +#include #include #define ASSOC_DATA_SIZE 32 static void do_generate(int argc, char **argv, - const u8 assocdata[ASSOC_DATA_SIZE]) + const u8 assocdata[ASSOC_DATA_SIZE], + const struct node_id *rvnode_id) { const tal_t *ctx = talz(NULL, tal_t); int num_hops = argc - 2; @@ -36,6 +38,7 @@ static void do_generate(int argc, char **argv, memset(&session_key, 'A', sizeof(struct secret)); sp = sphinx_path_new_with_key(ctx, tmp_assocdata, &session_key); + sphinx_path_set_rendezvous(sp, rvnode_id); for (int i = 0; i < num_hops; i++) { size_t klen = strcspn(argv[2 + i], "/"); @@ -92,6 +95,10 @@ static void do_generate(int argc, char **argv, struct onionpacket *res = create_onionpacket(ctx, sp, &shared_secrets); + if (rvnode_id != NULL) + printf("Rendezvous onion: %s\n", + tal_hex(ctx, serialize_compressed_onion(ctx, sp, res))); + u8 *serialized = serialize_onionpacket(ctx, res); if (!serialized) errx(1, "Error serializing message."); @@ -172,6 +179,12 @@ static void opt_show_ad(char buf[OPT_SHOW_LEN], const u8 *assocdata) hex_encode(assocdata, ASSOC_DATA_SIZE, buf, OPT_SHOW_LEN); } +static char *opt_set_node_id(const char *arg, struct node_id *node_id) +{ + node_id_from_hexstr(arg, strlen(arg), node_id); + return NULL; +} + /** * Run an onion encoding/decoding unit-test from a file */ @@ -301,15 +314,18 @@ int main(int argc, char **argv) setup_locale(); const char *method; u8 assocdata[ASSOC_DATA_SIZE]; + struct node_id rendezvous_id; memset(&assocdata, 'B', sizeof(assocdata)); + memset(&rendezvous_id, 0, sizeof(struct node_id)); secp256k1_ctx = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY | SECP256K1_CONTEXT_SIGN); opt_set_alloc(opt_allocfn, tal_reallocfn, tal_freefn); - opt_register_arg("--assoc-data", opt_set_ad, opt_show_ad, - assocdata, + opt_register_arg("--assoc-data", opt_set_ad, opt_show_ad, assocdata, "Associated data (usu. payment_hash of payment)"); + opt_register_arg("--rendezvous-id", opt_set_node_id, NULL, + &rendezvous_id, "Node ID of the rendez-vous node"); opt_register_noarg("--help|-h", opt_usage_and_exit, "\n\n\tdecode \n" "\tgenerate ...\n" @@ -333,7 +349,10 @@ int main(int argc, char **argv) errx(1, "'runtest' requires a filename argument"); runtest(argv[2]); } else if (streq(method, "generate")) { - do_generate(argc, argv, assocdata); + if (memeqzero(&rendezvous_id, sizeof(rendezvous_id))) + do_generate(argc, argv, assocdata, NULL); + else + do_generate(argc, argv, assocdata, &rendezvous_id); } else if (streq(method, "decode")) { do_decode(argc, argv, assocdata); } else {