From 7b3937db4102e6b2adc0fc861965d0f9d4da2d8b Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 7 Dec 2019 14:57:04 +0000 Subject: [PATCH] secnet: loadpriv interface: Return a closure_t too 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 --- privcache.c | 22 ++++++++++++++++------ rsa.c | 2 ++ secnet.h | 1 + 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/privcache.c b/privcache.c index 1f46eb0..ba5ddc9 100644 --- a/privcache.c +++ b/privcache.c @@ -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 ef99f91..3f6c7f9 100644 --- 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; } diff --git a/secnet.h b/secnet.h index 26a0b55..5b28c82 100644 --- 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 -- 2.30.2