pub/, progs/: Implement Bernstein's Ed25519 signature scheme.
[catacomb] / progs / key.c
index 29cc1b7..b2b9080 100644 (file)
@@ -69,6 +69,8 @@
 #include "pgen.h"
 #include "ptab.h"
 #include "rsa.h"
+#include "x25519.h"
+#include "ed25519.h"
 
 #include "cc.h"
 #include "sha-mgf.h"
@@ -936,6 +938,42 @@ static void alg_ec(keyopts *k)
   mp_drop(x);
 }
 
+static void alg_x25519(keyopts *k)
+{
+  key_data *kd, *kkd;
+  octet priv[X25519_KEYSZ], pub[X25519_PUBSZ];
+
+  copyparam(k, 0);
+  k->r->ops->fill(k->r, priv, sizeof(priv));
+  x25519(pub, priv, x25519_base);
+  kkd = key_newstruct();
+  key_structsteal(kkd, "priv",
+                 key_newbinary(KCAT_PRIV | KF_BURN, priv, sizeof(priv)));
+  kd = key_newstruct();
+  key_structsteal(kd, "private", kkd);
+  key_structsteal(kd, "pub", key_newbinary(KCAT_PUB, pub, sizeof(pub)));
+
+  key_setkeydata(k->kf, k->k, kd);
+}
+
+static void alg_ed25519(keyopts *k)
+{
+  key_data *kd, *kkd;
+  octet priv[ED25519_KEYSZ], pub[ED25519_PUBSZ];
+
+  copyparam(k, 0);
+  k->r->ops->fill(k->r, priv, sizeof(priv));
+  ed25519_pubkey(pub, priv, sizeof(priv));
+  kkd = key_newstruct();
+  key_structsteal(kkd, "priv",
+                 key_newbinary(KCAT_PRIV | KF_BURN, priv, sizeof(priv)));
+  kd = key_newstruct();
+  key_structsteal(kd, "private", kkd);
+  key_structsteal(kd, "pub", key_newbinary(KCAT_PUB, pub, sizeof(pub)));
+
+  key_setkeydata(k->kf, k->k, kd);
+}
+
 /* --- The algorithm tables --- */
 
 typedef struct keyalg {
@@ -957,6 +995,8 @@ static keyalg algtab[] = {
   { "bindh-param",     alg_binparam,   "Binary-field DH parameters" },
   { "ec-param",                alg_ecparam,    "Elliptic curve parameters" },
   { "ec",              alg_ec,         "Elliptic curve crypto" },
+  { "x25519",          alg_x25519,     "X25519 key exchange" },
+  { "ed25519",         alg_ed25519,    "Ed25519 digital signatures" },
   { "empty",           alg_empty,      "Empty parametrs-only key" },
   { 0,                 0 }
 };