*
* This file is part of Trivial IP Encryption (TrIPE).
*
- * TrIPE is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * TrIPE is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 3 of the License, or (at your
+ * option) any later version.
*
- * TrIPE is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
+ * TrIPE is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
*
* You should have received a copy of the GNU General Public License
- * along with TrIPE; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * along with TrIPE. If not, see <https://www.gnu.org/licenses/>.
*/
/*----- Header files ------------------------------------------------------*/
{
int rc;
const char *err;
+ dhge *K;
+ int ok;
if ((rc = dh->ldpriv(kf, k, d, kd, t, e)) != 0)
goto fail_0;
a_format(e, "bad-group", "%s", err, A_END);
goto fail_1;
}
+ K = kd->grp->ops->mul(kd->grp, kd->k, 0);
+ ok = kd->grp->ops->eq(kd->grp, kd->K, K);
+ kd->grp->ops->freege(kd->grp, K);
+ if (!ok) {
+ a_format(e, "incorrect-public-key", A_END);
+ goto fail_1;
+ }
return (0);
fail_1:
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@ --- *
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@ --- *
}
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);
kd->tag = xstrdup(t.buf);
kd->ref = 1;
kd->kn = 0;
+ kd->id = k->id;
kd->t_exp = k->exp;
IF_TRACING(T_KEYMGMT, {
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