From fd953a1e72b4b16e6e5a74bcf2f893dbf1407ce4 Mon Sep 17 00:00:00 2001 From: cel Date: Sat, 25 Nov 2017 16:01:33 -0700 Subject: [PATCH] Add -K keypair_seed option This can be used with a keypair seed from a scuttlebot invite code. --- sbotc.1 | 10 +++++++++- sbotc.c | 22 ++++++++++++++++++---- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/sbotc.1 b/sbotc.1 index a707823..df80fb1 100644 --- a/sbotc.1 +++ b/sbotc.1 @@ -13,6 +13,7 @@ .Op Fl s Ar host .Op Fl p Ar port .Op Fl k Ar key +.Op Fl K Ar keypair_seed .Op Fl t Ar type .Ar method .Op Ar argument ... @@ -35,7 +36,14 @@ The hostname to connect to. Default is localhost. .It Fl p Ar port The port to connect to. Default is 8008. .It Fl k Ar key -The key to connect to. Default is your public key. +The key to connect to. Default is your public key, as read from your +private key file. +.It Fl K Ar keypair_seed +Private key seed to use for secret-handshake. Default is to use the private key +from your +.Pa ~/.ssb/secret +file or other secret file according to the environmental variables described in +.Sx ENVIRONMENT . .It Fl t Ar type The type of method: .Dq async , diff --git a/sbotc.c b/sbotc.c index 89f80c6..daacba8 100644 --- a/sbotc.c +++ b/sbotc.c @@ -95,8 +95,8 @@ static const unsigned char ssb_cap[] = { }; static void usage() { - fputs("usage: sbotc [-j] [-T] [-a ] [-s ] [-p ] [-k ] [-t ] " - " [...]\n", stderr); + fputs("usage: sbotc [-j] [-T] [-a ] [-s ] [-p ] [-k ] [-K ] \n" + " [-t ] [...]\n", stderr); exit(EXIT_FAILURE); } @@ -801,6 +801,7 @@ static int args_to_json(char *out, size_t outlen, unsigned int argc, char *argv[ int main(int argc, char *argv[]) { int i, s, infd, outfd, rc; const char *key = NULL; + const char *keypair_seed_str = NULL; const char *host = NULL; const char *port = "8008"; const char *typestr = NULL, *methodstr; @@ -839,6 +840,7 @@ int main(int argc, char *argv[]) { case 'T': test = true; break; case 's': host = argv[++i]; break; case 'k': key = argv[++i]; break; + case 'K': keypair_seed_str = argv[++i]; break; case 'p': port = argv[++i]; break; case 't': typestr = argv[++i]; break; default: usage(); @@ -883,9 +885,21 @@ int main(int argc, char *argv[]) { if (rc < 0) errx(0, "unable to convert method name"); } - read_private_key(app_dir, private_key); + if (keypair_seed_str) { + unsigned char seed[crypto_sign_SEEDBYTES]; + unsigned char ed25519_skpk[crypto_sign_ed25519_SECRETKEYBYTES]; + + rc = pubkey_decode(keypair_seed_str, ed25519_skpk); + if (rc < 0) err(1, "unable to decode private key"); + rc = crypto_sign_ed25519_sk_to_seed(seed, ed25519_skpk); + if (rc < 0) err(1, "unable to convert private key to seed"); + rc = crypto_sign_seed_keypair(public_key, private_key, seed); + if (rc < 0) err(1, "unable to generate keypair from seed"); + } else { + read_private_key(app_dir, private_key); + memcpy(public_key, private_key+32, 32); + } - memcpy(public_key, private_key+32, 32); if (key) { rc = pubkey_decode(key, remote_key); if (rc < 0) err(1, "unable to decode remote key '%s'", key);