sprintf(st->path.write_here, SIGKEYID_PR_FMT, SIGKEYID_PR_VAL(id));
- f = fopen(st->path.buffer,"rb");
+ const char *path=st->path.buffer;
+ struct hash_if *defhash=st->defhash;
+
+ f = fopen(path,"rb");
if (!f) {
if (errno == ENOENT) {
slilog(log,M_DEBUG,"private key %s not found",
- st->path.buffer);
+ path);
} else {
slilog(log,M_ERR,"failed to open private key file %s",
- st->path.buffer);
+ path);
}
goto out;
}
ssize_t got=fread(st->databuf.base,1,st->databuf.alloclen,f);
if (ferror(f)) {
slilog(log,M_ERR,"failed to read private-key file %s",
- st->path.buffer);
+ path);
goto out;
}
if (!feof(f)) {
slilog(log,M_ERR,"private key file %s longer than max %d",
- st->path.buffer, (int)st->databuf.alloclen);
+ path, (int)st->databuf.alloclen);
goto out;
}
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;
- ok=scheme->loadpriv(scheme, &st->databuf, &sigpriv, log);
- 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)",
+ path);
+ goto out;
+
+ found:
+ st->databuf.start=st->databuf.base;
+ st->databuf.size=got;
+ struct cloc loc = { .file=path, .line=0 };
+ ok=scheme->loadpriv(scheme, &st->databuf, &sigpriv, log, loc);
+ if (!ok) goto out; /* loadpriv will have logged */
+
+ if (sigpriv->sethash) {
+ if (!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);
- }
+ path);
+ sigpriv->dispose(sigpriv->st);
+ sigpriv=0;
goto out;
}
+ sigpriv->sethash(sigpriv->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;