X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=privcache.c;h=790281df61fa4e48608fceb7f9335f135a7116db;hb=b65782b25170087bef9556729d7168395770b42b;hp=81b04fcc65f456e3585001fd7425236b37d66ba5;hpb=52893bf3a9ac6bca4d39c15d003de3f405e9de63;p=secnet.git diff --git a/privcache.c b/privcache.c index 81b04fc..790281d 100644 --- a/privcache.c +++ b/privcache.c @@ -73,32 +73,36 @@ static struct sigprivkey_if *uncached_get(struct privcache *st, fclose(f); f=0; struct sigprivkey_if *sigpriv=0; - for (const struct sigscheme_info *scheme=sigschemes; + const struct sigscheme_info *scheme; + for (scheme=sigschemes; scheme->name; - scheme++) { - st->databuf.start=st->databuf.base; - st->databuf.size=got; - struct cloc loc = { .file=st->path.buffer, .line=0 }; - ok=scheme->loadpriv(scheme, &st->databuf, &sigpriv, log, loc); - if (ok) { - if (sigpriv->sethash) { - if (!st->defhash) { - slilog(log,M_ERR, + scheme++) + if (scheme->algid == id->b[GRPIDSZ]) + goto found; + + slilog(log,M_ERR,"private key file %s not loaded (unknown algid)", + st->path.buffer); + goto out; + + found: + st->databuf.start=st->databuf.base; + st->databuf.size=got; + struct cloc loc = { .file=st->path.buffer, .line=0 }; + ok=scheme->loadpriv(scheme, &st->databuf, &sigpriv, log, loc); + if (!ok) goto out; /* loadpriv will have logged */ + + if (sigpriv->sethash) { + if (!st->defhash) { + slilog(log,M_ERR, "private key %s requires `hash' config key for privcache to load", - st->path.buffer); - sigpriv->dispose(sigpriv->st); - sigpriv=0; - goto out; - } - sigpriv->sethash(sigpriv->st,st->defhash); - } + st->path.buffer); + sigpriv->dispose(sigpriv->st); + sigpriv=0; goto out; } + sigpriv->sethash(sigpriv->st,st->defhash); } - slilog(log,M_ERR,"private key file %s not loaded (not recognised?)", - st->path.buffer); - out: if (f) fclose(f); return ok ? sigpriv : 0;