X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=privcache.c;h=5377c9049452500d36ce409cdee35fdcfc575f31;hb=686e21aa2afbd14c3e59962f02a31c4dcd62e5d8;hp=719a2d0da72e2f5b3fd0674814719bb6bf41c0bf;hpb=328b84f50045a70a56b8a8b61fd0d4644b7bf6d1;p=secnet.git diff --git a/privcache.c b/privcache.c index 719a2d0..5377c90 100644 --- a/privcache.c +++ b/privcache.c @@ -126,7 +126,7 @@ static bool_t uncached_load_file( if (sigpriv->sethash) { if (!defhash) { slilog(log,M_ERR, - "private key %s requires `hash' config key for privcache to load", + "private key %s requires `hash' config key to load", path); goto error_out; } @@ -219,7 +219,39 @@ static list_t *privcache_apply(closure_t *self, struct cloc loc, return new_closure(&st->cl); } +static list_t *loadprivate_apply(closure_t *self, struct cloc loc, + dict_t *context, list_t *args) +{ + CL_GET_STR_ARG(0,algname,"algorithm name"); + CL_GET_STR_ARG(1,path,"private key path"); + + const struct sigscheme_info *sch=sigscheme_lookup(algname); + if (!sch) cfgfatal(algname_i->loc,"load-private", + "unknown algorithm `%s'",algname); + + struct buffer_if databuf; + buffer_new(&databuf,DEFAULT_MAXPRIV_BYTES); + BUF_ALLOC(&databuf,"load-private data buf"); + + struct hash_if *defhash= + find_cl_if(context,"hash",CL_HASH,False,"load-private",loc); + + struct cfgfile_log log; + cfgfile_log_init(&log,loc,"load-private"); + + struct sigprivkey_if *sigpriv; + closure_t *cl; + bool_t ok= + uncached_load_file(sch,path,&databuf,defhash,&sigpriv,&cl,&log.log); + if (!ok) cfgfatal(loc,"load-private","private key loading failed"); + + BUF_FREE(&databuf); + buffer_destroy(&databuf); + return new_closure(cl); +} + void privcache_module(dict_t *dict) { add_closure(dict,"priv-cache",privcache_apply); + add_closure(dict,"load-private",loadprivate_apply); }