server/keymgmt.c (kh_init): Remove pointless setting of `kh->kf'.
[tripe] / server / keymgmt.c
index e086106..e181d0e 100644 (file)
@@ -275,18 +275,15 @@ static int kh_reopen(keyhalf *kh)
   key_file *kf = CREATE(key_file);
 
   if (key_open(kf, kh->kr, KOPEN_READ, keymoan, kh)) {
-    a_warn("KEYMGMT", "%s-keyring", kh->kind, "%s", kh->kr,
-          "io-error", "?ERRNO", A_END);
     DESTROY(kf);
     return (-1);
-  } else {
-    if (kh->kf) {
-      key_close(kh->kf);
-      DESTROY(kh->kf);
-    }
-    kh->kf = kf;
-    return (0);
   }
+  if (kh->kf) {
+    key_close(kh->kf);
+    DESTROY(kh->kf);
+  }
+  kh->kf = kf;
+  return (0);
 }
 
 /* --- @kh_init@ --- *
@@ -306,10 +303,7 @@ static void kh_init(keyhalf *kh, const char *kr)
   kh->kr = kr;
   fwatch_init(&kh->w, kr);
   sym_create(&kh->tab);
-  kh->kf = 0;
-
-  if (kh_reopen(kh))
-    die(EXIT_FAILURE, "failed to load %s keyring `%s'", kh->kind, kr);
+  if (kh_reopen(kh)) exit(EXIT_FAILURE);
 }
 
 /* --- @kh_load@ --- *
@@ -377,7 +371,7 @@ founddh:
   }
 
   if (algs_get(&kd->algs, &e, kh->kf, k) ||
-      (kd->k && algs_check(&kd->algs, &e, kd->grp))) {
+      algs_check(&kd->algs, &e, kd->grp)) {
     a_warn("KEYMGMT", "%s-keyring", kh->kind,
           "%s", kh->kr, "key", "%s", t.buf,
           "*%s", e.buf, A_END);
@@ -387,6 +381,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, {
@@ -556,8 +551,10 @@ void km_init(const char *privkr, const char *pubkr, const char *ptag)
 
   for (hh = ghashtab; *hh; hh++) {
     if ((*hh)->hashsz > MAXHASHSZ) {
-      die(EXIT_FAILURE, "INTERNAL ERROR: %s hash length %lu > MAXHASHSZ %d",
-         (*hh)->name, (unsigned long)(*hh)->hashsz, MAXHASHSZ);
+      a_warn("ABORT", "hash-size-too-large", "hash",
+            "%s", (*hh)->name, "size", "%lu", (*hh)->hashsz,
+            "limit", "%d", MAXHASHSZ, A_END);
+      abort();
     }
   }
 
@@ -616,6 +613,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