X-Git-Url: https://git.distorted.org.uk/~mdw/tripe/blobdiff_plain/19220671b286fcd7e9818be2e7262094411519c5..fb6a9f13a40d1b9e797b4fe858a06cfdbcc1109b:/server/keymgmt.c diff --git a/server/keymgmt.c b/server/keymgmt.c index 51a13d70..7386408f 100644 --- a/server/keymgmt.c +++ b/server/keymgmt.c @@ -387,6 +387,7 @@ founddh: kd->tag = xstrdup(t.buf); kd->ref = 1; kd->kn = 0; + kd->id = k->id; kd->t_exp = k->exp; IF_TRACING(T_KEYMGMT, { @@ -616,6 +617,41 @@ kdata *km_findpriv(const char *tag) else return (kh_find(&priv, tag ? tag : "tripe-dh", 1)); } +/* --- @km_findpubbyid@, @km_findprivbyid@ --- * + * + * Arguments: @uint32 id@ = key id to load + * + * Returns: Pointer to the kdata object if successful, or null on error. + * + * Use: Fetches a public or private key from the keyring given its + * numeric id. + */ + +static kdata *findbyid(keyhalf *kh, uint32 id) +{ + key *k; + kdata *kd; + + k = key_byid(kh->kf, id); if (!k) goto notfound; + kd = kh_find(kh, k->tag, 1); if (!kd) goto notfound; + if (kd->id != id) { km_unref(kd); goto notfound; } + return (kd); + +notfound: + a_warn("KX", "%s-keyring", kh->kind, "%s", kh->kr, + "unknown-key-id", "0x%08lx", (unsigned long)id, + A_END); + return (0); +} + +kdata *km_findpubbyid(uint32 id) { return (findbyid(&pub, id)); } + +kdata *km_findprivbyid(uint32 id) +{ + if (id == master->id) { km_ref(master); return (master); } + else return findbyid(&priv, id); +} + /* --- @km_tag@ --- * * * Arguments: @kdata *kd@ - pointer to the kdata object