chiark / gitweb /
secnet: loadpriv interface: Return a closure_t too
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 7 Dec 2019 14:57:04 +0000 (14:57 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 15 Feb 2020 21:56:54 +0000 (21:56 +0000)
We are going to want this for the `load-private' verb.
This is the private key counterpart to:
   secnet: loadpub interface: Return a closure_t too

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
privcache.c
rsa.c
secnet.h

index 1f46eb00d033c323e84e971618acd3a4b741b810..ba5ddc903a0ee4e5fdb4be83d18236bb45048938 100644 (file)
@@ -37,11 +37,13 @@ struct privcache {
     struct hash_if *defhash;
 };
 
-static struct sigprivkey_if *uncached_load_file(
+static bool_t uncached_load_file(
                           const struct sigscheme_info *scheme,
                           const char *path,
                           struct buffer_if *databuf,
                           struct hash_if *defhash,
+                          struct sigprivkey_if **sigpriv_r,
+                          closure_t **closure_r,
                           struct log_if *log);
 
 static struct sigprivkey_if *uncached_get(struct privcache *st,
@@ -61,19 +63,26 @@ static struct sigprivkey_if *uncached_get(struct privcache *st,
           path);
     return 0;
 
- found:
-    return uncached_load_file(scheme,
+ found:;
+    struct sigprivkey_if *sigpriv;
+    closure_t *cl;
+    bool_t ok=uncached_load_file(scheme,
                              path,
                              &st->databuf,
                              st->defhash,
+                             &sigpriv,
+                             &cl,
                              log);
+    return ok ? sigpriv : 0;
 }
 
-static struct sigprivkey_if *uncached_load_file(
+static bool_t uncached_load_file(
                           const struct sigscheme_info *scheme,
                           const char *path,
                           struct buffer_if *databuf,
                           struct hash_if *defhash,
+                          struct sigprivkey_if **sigpriv_r,
+                          closure_t **closure_r,
                           struct log_if *log)
 {
     bool_t ok=False;
@@ -110,7 +119,7 @@ static struct sigprivkey_if *uncached_load_file(
     databuf->start=databuf->base;
     databuf->size=got;
     struct cloc loc = { .file=path, .line=0 };
-    ok=scheme->loadpriv(scheme, databuf, &sigpriv, log, loc);
+    ok=scheme->loadpriv(scheme, databuf, &sigpriv, closure_r, log, loc);
     if (!ok) goto error_out; /* loadpriv will have logged */
 
     if (sigpriv->sethash) {
@@ -122,10 +131,11 @@ static struct sigprivkey_if *uncached_load_file(
        }
        sigpriv->sethash(sigpriv->st,defhash);
     }
+    *sigpriv_r=sigpriv;
 
   out:
     if (f) fclose(f);
-    return ok ? sigpriv : 0;
+    return ok;
 
  error_out:
     if (sigpriv) sigpriv->dispose(sigpriv->st);
diff --git a/rsa.c b/rsa.c
index ef99f91f4967228908885764fca2ef2599ca111c..3f6c7f92f8ea57e4c999cb0ff09a9b4a59e2f49b 100644 (file)
--- a/rsa.c
+++ b/rsa.c
@@ -719,6 +719,7 @@ static bool_t postreadcheck_tryload(struct load_ctx *l, FILE *f)
 bool_t rsa1_loadpriv(const struct sigscheme_info *algo,
                     struct buffer_if *privkeydata,
                     struct sigprivkey_if **sigpriv_r,
+                    closure_t **closure_r,
                     struct log_if *log, struct cloc loc)
 {
     FILE *f=0;
@@ -747,6 +748,7 @@ bool_t rsa1_loadpriv(const struct sigscheme_info *algo,
     if (f) fclose(f);
     if (!st) return False;
     *sigpriv_r=&st->ops;
+    *closure_r=&st->cl;
     return True;
 }
 
index 26a0b552608c35ac46500916d9a54d9b8599e1d6..5b28c82ebec6584c8c6b4c35128a8e33757c7e03 100644 (file)
--- a/secnet.h
+++ b/secnet.h
@@ -418,6 +418,7 @@ typedef bool_t sigscheme_loadpub(const struct sigscheme_info *algo,
 typedef bool_t sigscheme_loadpriv(const struct sigscheme_info *algo,
                                  struct buffer_if *privkeydata,
                                  struct sigprivkey_if **sigpriv_r,
+                                 closure_t **closure_r,
                                  struct log_if *log, struct cloc loc);
   /* Ideally, check whether privkeydata contains data for any algorithm.
    * That avoids security problems if a key file is misidentified (which