From 8db6adcb8cc98608c8e29e2b78b48d68be9dbef0 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 23 Nov 2019 17:21:00 +0000 Subject: [PATCH] rsa: Provide rsa1_loadpub and therefore rsa1 sigscheme Signed-off-by: Ian Jackson --- README | 6 ++++++ modules.c | 1 + rsa.c | 40 ++++++++++++++++++++++++++++++++++++++++ secnet.h | 1 + 4 files changed, 48 insertions(+) diff --git a/README b/README index c05dc44..88dd48b 100644 --- a/README +++ b/README @@ -576,9 +576,15 @@ priv-cache: dict argument ** rsa Defines: + sigscheme algorithm 00 "rsa1" rsa-private (closure => rsaprivkey closure) rsa-public (closure => rsapubkey closure) +rsa1 sigscheme algorithm: + private key: SSH private key file, version 1, no password + public key: SSH public key file, version 1 + (length, restrictions, email, etc., ignored) + rsa-private: string[,bool] arg1: filename of SSH private key file (version 1, no password) arg2: whether to check that the key is usable [default True] diff --git a/modules.c b/modules.c index 2fc2e0f..de3e699 100644 --- a/modules.c +++ b/modules.c @@ -41,5 +41,6 @@ void init_builtin_modules(dict_t *dict) } const struct sigscheme_info sigschemes[]={ + { "rsa1", 0x00, rsa1_loadpub, rsa1_loadpriv }, { 0 } }; diff --git a/rsa.c b/rsa.c index 78dfb99..3f2fbd1 100644 --- a/rsa.c +++ b/rsa.c @@ -401,6 +401,46 @@ static list_t *rsapub_apply(closure_t *self, struct cloc loc, dict_t *context, return new_closure(&st->cl); } +bool_t rsa1_loadpub(const struct sigscheme_info *algo, + struct buffer_if *pubkeydata, + struct sigpubkey_if **sigpub_r, + struct log_if *log, struct cloc loc) +{ + struct rsapub *st=0; + + struct load_ctx l[1]; + l->verror=verror_tryload; + l->postreadcheck=0; + l->what="rsa1_loadpub"; + l->loc=loc; + l->u.tryload.log=log; + + char *nul=buf_append(pubkeydata,1); + if (!nul) LDPUBFATAL(0,"rsa1 public key data too long for extra nul"); + *nul=0; + + const char *delim=" \t\n"; + char *saveptr; + /*unused*/ strtok_r(pubkeydata->start,delim,&saveptr); + +#define RSAPUB_TRYLOAD_GETBN(ix,en,what) \ + struct cloc en##_loc=loc; \ + const char *en##s=strtok_r(0,delim,&saveptr); \ + if (!en##s) LDPUBFATAL(0,"end of pubkey data looking for " what); + + RSAPUB_BNS(RSAPUB_TRYLOAD_GETBN); + + st=rsa_loadpub_core(RSAPUB_BNS(RSAPUB_LOADCORE_PASSBN) l); + if (!st) goto error_out; + + *sigpub_r=&st->ops; + return True; + + error_out: + rsapub_dispose(st); + return False; +} + #define LDFATAL(...) ({ load_err(l,0,0,0,__VA_ARGS__); goto error_out; }) #define LDUNSUP(...) ({ load_err(l,0,0,1,__VA_ARGS__); goto error_out; }) #define LDFATAL_FILE(...) ({ load_err(l,0,f,0,__VA_ARGS__); goto error_out; }) diff --git a/secnet.h b/secnet.h index 7a93ce8..bd63a7c 100644 --- a/secnet.h +++ b/secnet.h @@ -434,6 +434,7 @@ extern const struct sigscheme_info sigschemes[]; /* sentinel has name==0 */ const struct sigscheme_info *sigscheme_lookup(const char *name); extern sigscheme_loadpriv rsa1_loadpriv; +extern sigscheme_loadpub rsa1_loadpub; /***** END of signature schemes *****/ -- 2.30.2