chiark / gitweb /
server/admin.c: Don't leak `privtag' from `ADD' command.
[tripe] / server / admin.c
index 06922dbb18f0509d4525814a4e3b67e1ef3bba09..3774da036355186ad2db86c84d9b7fb061a8726b 100644 (file)
@@ -9,19 +9,18 @@
  *
  * 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 ------------------------------------------------------*/
@@ -285,14 +284,11 @@ void a_vformat(dstr *d, const char *fmt, va_list *ap)
       } else if (strcmp(fmt, "?B64") == 0) {
        const octet *p = va_arg(*ap, const octet *);
        size_t n = va_arg(*ap, size_t);
-       base64_ctx b64;
+       codec *b64 = base64_class.encoder(CDCF_NOEQPAD, "", 0);
        dstr_putc(d, ' ');
-       base64_init(&b64);
-       b64.indent = "";
-       b64.maxline = 0;
-       base64_encode(&b64, p, n, d);
-       base64_encode(&b64, 0, 0, d);
-       while (d->len && d->buf[d->len - 1] == '=') d->len--;
+       b64->ops->code(b64, p, n, d);
+       b64->ops->code(b64, 0, 0, d);
+       b64->ops->destroy(b64);
       } else if (strcmp(fmt, "?TOKENS") == 0) {
        const char *const *av = va_arg(*ap, const char *const *);
        while (*av) u_quotify(d, *av++);
@@ -374,7 +370,7 @@ static void a_write(admin *a, const char *status, const char *tag,
   va_end(ap);
 }
 
-/* --- @a_ok@, @a_info@, @a_fail@ --- *
+/* --- @a_ok@, @a_fail@ --- *
  *
  * Arguments:  @admin *a@ = connection
  *             @const char *fmt@ = format string
@@ -387,21 +383,32 @@ static void a_write(admin *a, const char *status, const char *tag,
 
 static void a_ok(admin *a) { a_write(a, "OK", 0, A_END); }
 
-static void a_info(admin *a, const char *fmt, ...)
+static void a_fail(admin *a, const char *fmt, ...)
 {
   va_list ap;
 
   va_start(ap, fmt);
-  a_vwrite(a, "INFO", 0, fmt, &ap);
+  a_vwrite(a, "FAIL", 0, fmt, &ap);
   va_end(ap);
 }
 
-static void a_fail(admin *a, const char *fmt, ...)
+/* --- @a_info@ --- *
+ *
+ * Arguments:  @admin *a@ = connection
+ *             @const char *fmt@ = format string
+ *             @...@ = other arguments
+ *
+ * Returns:    ---
+ *
+ * Use:                Report information to an admin client.
+ */
+
+void a_info(admin *a, const char *fmt, ...)
 {
   va_list ap;
 
   va_start(ap, fmt);
-  a_vwrite(a, "FAIL", 0, fmt, &ap);
+  a_vwrite(a, "INFO", 0, fmt, &ap);
   va_end(ap);
 }
 
@@ -1229,6 +1236,7 @@ static void a_doadd(admin_resop *r, int rc)
   }
 
   if (add->peer.tag) xfree(add->peer.tag);
+  if (add->peer.privtag) xfree(add->peer.privtag);
   xfree(add->peer.name);
 }
 
@@ -1709,7 +1717,7 @@ static void acmd_algs(admin *a, unsigned ac, char *av[])
 {
   peer *p;
   const kdata *kd;
-  const group *g;
+  const dhgrp *g;
   const algswitch *algs;
 
   if (!ac)
@@ -1718,47 +1726,25 @@ static void acmd_algs(admin *a, unsigned ac, char *av[])
     if ((p = a_findpeer(a, av[0])) == 0) return;
     kd = p->kx.kpriv;
   }
-  g = kd->g;
+  g = kd->grp;
   algs = &kd->algs;
 
-  a_info(a,
-        "kx-group=%s", g->ops->name,
-        "kx-group-order-bits=%lu", (unsigned long)mp_bits(g->r),
-        "kx-group-elt-bits=%lu", (unsigned long)g->nbits,
-        A_END);
+  g->ops->grpinfo(g, a);
   a_info(a,
         "hash=%s", algs->h->name,
         "mgf=%s", algs->mgf->name,
         "hash-sz=%lu", (unsigned long)algs->h->hashsz,
         A_END);
   a_info(a,
-        "bulk-transform=%s", algs->bulk->name,
-        "bulk-overhead=%lu", (unsigned long)algs->bulk->overhead(algs),
+        "bulk-transform=%s", algs->bulk->ops->name,
+        "bulk-overhead=%lu",
+        (unsigned long)algs->bulk->ops->overhead(algs->bulk),
         A_END);
-  if (algs->c) {
-    a_info(a,
-          "cipher=%s", algs->c->name,
-          "cipher-keysz=%lu", (unsigned long)algs->cksz,
-          "cipher-blksz=%lu", (unsigned long)algs->c->blksz,
-          A_END);
-  }
+  algs->bulk->ops->alginfo(algs->bulk, a);
   a_info(a,
-        "cipher-data-limit=%lu", (unsigned long)algs->expsz,
+        "cipher-data-limit=%lu",
+        (unsigned long)algs->bulk->ops->expsz(algs->bulk),
         A_END);
-  if (algs->m) {
-    a_info(a,
-          "mac=%s", algs->m->name,
-          "mac-keysz=%lu", (unsigned long)algs->mksz,
-          "mac-tagsz=%lu", (unsigned long)algs->tagsz,
-          A_END);
-  }
-  if (algs->b) {
-    a_info(a,
-          "blkc=%.*s", strlen(algs->b->name) - 4, algs->b->name,
-          "blkc-keysz=%lu", (unsigned long)algs->bksz,
-          "blkc-blksz=%lu", (unsigned long)algs->b->blksz,
-          A_END);
-  }
   a_ok(a);
 }
 
@@ -1801,35 +1787,43 @@ static void acmd_getchal(admin *a, unsigned ac, char *av[])
 
 static void acmd_checkchal(admin *a, unsigned ac, char *av[])
 {
-  base64_ctx b64;
+  codec *b64 = base64_class.decoder(CDCF_NOEQPAD);
+  int err;
   buf b;
   dstr d = DSTR_INIT;
 
-  base64_init(&b64);
-  base64_decode(&b64, av[0], strlen(av[0]), &d);
-  base64_decode(&b64, 0, 0, &d);
-  buf_init(&b, d.buf, d.len);
-  if (c_check(&b) || BBAD(&b) || BLEFT(&b))
-    a_fail(a, "invalid-challenge", A_END);
-  else
-    a_ok(a);
+  if ((err = b64->ops->code(b64, av[0], strlen(av[0]), &d)) != 0 ||
+      (err = b64->ops->code(b64, 0, 0, &d)) != 0)
+    a_fail(a, "bad-base64", "%s", codec_strerror(err), A_END);
+  else {
+    buf_init(&b, d.buf, d.len);
+    if (c_check(&b) || BBAD(&b) || BLEFT(&b))
+      a_fail(a, "invalid-challenge", A_END);
+    else
+      a_ok(a);
+  }
+  b64->ops->destroy(b64);
   dstr_destroy(&d);
 }
 
 static void acmd_greet(admin *a, unsigned ac, char *av[])
 {
   peer *p;
-  base64_ctx b64;
+  int err;
+  codec *b64;
   dstr d = DSTR_INIT;
 
-  if ((p = a_findpeer(a, av[0])) != 0) {
-    base64_init(&b64);
-    base64_decode(&b64, av[1], strlen(av[1]), &d);
-    base64_decode(&b64, 0, 0, &d);
+  if ((p = a_findpeer(a, av[0])) == 0) return;
+  b64 = base64_class.decoder(CDCF_NOEQPAD);
+  if ((err = b64->ops->code(b64, av[1], strlen(av[1]), &d)) != 0 ||
+      (err = b64->ops->code(b64, 0, 0, &d)) != 0)
+    a_fail(a, "bad-base64", "%s", codec_strerror(err), A_END);
+  else {
     p_greet(p, d.buf, d.len);
-    dstr_destroy(&d);
     a_ok(a);
   }
+  b64->ops->destroy(b64);
+  dstr_destroy(&d);
 }
 
 static void acmd_addr(admin *a, unsigned ac, char *av[])