X-Git-Url: https://git.distorted.org.uk/~mdw/tripe/blobdiff_plain/b50ba1bda8722c66c40005f43707ebc63515732b..HEAD:/server/keymgmt.c diff --git a/server/keymgmt.c b/server/keymgmt.c index a72164e5..33fa7e21 100644 --- a/server/keymgmt.c +++ b/server/keymgmt.c @@ -145,7 +145,7 @@ typedef struct keyhalf { const char *kind; int (*load)(key_file *, key *, key_data *, const dhops *, kdata *, dstr *, dstr *); - const char *kr; + char *kr; key_file *kf; fwatch w; sym_table tab; @@ -291,19 +291,21 @@ static int kh_reopen(keyhalf *kh) * Arguments: @keyhalf *kh@ = pointer to keyhalf structure to set up * @const char *kr@ = name of the keyring file * - * Returns: --- + * Returns: Zero on success, @-1@ on error. * * Use: Initialize a keyhalf structure, maintaining the private or * public keys. Intended to be called during initialization: * exits if there's some kind of problem. */ -static void kh_init(keyhalf *kh, const char *kr) +static int kh_init(keyhalf *kh, const char *kr) { - kh->kr = kr; + if (kh->kf) return (0); + kh->kr = xstrdup(kr); + if (kh_reopen(kh)) return (-1); fwatch_init(&kh->w, kr); sym_create(&kh->tab); - if (kh_reopen(kh)) exit(EXIT_FAILURE); + return (0); } /* --- @kh_load@ --- * @@ -392,6 +394,8 @@ founddh: if (kd->k) trace(T_CRYPTO, "crypto: k = %s", g->ops->scstr(g, kd->k)); trace(T_CRYPTO, "crypto: K = %s", g->ops->gestr(g, kd->K)); + trace(T_CRYPTO, "crypto: bulk transform = %s", + kd->algs.bulk->ops->name); kd->algs.bulk->ops->tracealgs(kd->algs.bulk); }) }) @@ -547,13 +551,14 @@ static void kh_clear(keyhalf *kh) if (kn->kd) km_unref(kn->kd); sym_destroy(&kh->tab); key_close(kh->kf); + xfree(kh->kr); kh->kf = 0; } /*----- Main code ---------------------------------------------------------*/ -const char *tag_priv; -kdata *master; +char *tag_priv = 0; +kdata *master = 0; /* --- @km_init@ --- * * @@ -561,15 +566,16 @@ kdata *master; * @const char *pubkr@ = public keyring file * @const char *ptag@ = default private-key tag * - * Returns: --- + * Returns: Zero on success, @-1@ on failure. * * Use: Initializes the key-management machinery, loading the * keyrings and so on. */ -void km_init(const char *privkr, const char *pubkr, const char *ptag) +int km_init(const char *privkr, const char *pubkr, const char *ptag) { const gchash *const *hh; + kdata *kd; for (hh = ghashtab; *hh; hh++) { if ((*hh)->hashsz > MAXHASHSZ) { @@ -580,11 +586,17 @@ void km_init(const char *privkr, const char *pubkr, const char *ptag) } } - kh_init(&priv, privkr); - kh_init(&pub, pubkr); + if (kh_init(&priv, privkr) || kh_init(&pub, pubkr)) + return (-1); + + tag_priv = ptag ? xstrdup(ptag) : 0; + kh_refresh(&priv); - tag_priv = ptag; - if ((master = km_findpriv(ptag)) == 0) exit(EXIT_FAILURE); + if ((kd = km_findpriv(tag_priv)) == 0) return (-1); + if (master) km_unref(master); + master = kd; + + return (0); } /* --- @km_reload@ --- * @@ -632,6 +644,7 @@ void km_clear(void) kh_clear(&priv); kh_clear(&pub); if (master) { km_unref(master); master = 0; } + if (tag_priv) { xfree(tag_priv); tag_priv = 0; } } /* --- @km_findpub@, @km_findpriv@ --- *