chiark / gitweb /
rsa: Provide rsa1_loadpub and therefore rsa1 sigscheme
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 23 Nov 2019 17:21:00 +0000 (17:21 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 15 Feb 2020 21:56:50 +0000 (21:56 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
README
modules.c
rsa.c
secnet.h

diff --git a/README b/README
index c05dc44..88dd48b 100644 (file)
--- 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]
index 2fc2e0f..de3e699 100644 (file)
--- 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 (file)
--- 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; })
index 7a93ce8..bd63a7c 100644 (file)
--- 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 *****/