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,
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;
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) {
}
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);
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;
if (f) fclose(f);
if (!st) return False;
*sigpriv_r=&st->ops;
+ *closure_r=&st->cl;
return True;
}
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