pub/, progs/: Implement Bernstein's Ed25519 signature scheme.
[catacomb] / progs / perftest.c
index ebed017..3377487 100644 (file)
@@ -63,6 +63,7 @@
 #include "ec.h"
 #include "group.h"
 #include "x25519.h"
+#include "ed25519.h"
 
 #include "cc.h"
 #include "gcipher.h"
@@ -288,6 +289,56 @@ static void *x25519_jobinit(opts *o)
 static void x25519_jobrun(void *cc)
   { x25519_jobctx *c = cc; octet z[X25519_OUTSZ]; x25519(z, c->k, c->p); }
 
+/* --- Ed25519 --- */
+
+typedef struct ed25519_signctx {
+  octet k[ED25519_KEYSZ];
+  octet K[ED25519_PUBSZ];
+  octet m[64];
+} ed25519_signctx;
+
+typedef struct ed25519_vrfctx {
+  octet K[ED25519_PUBSZ];
+  octet m[64];
+  octet sig[ED25519_SIGSZ];
+} ed25519_vrfctx;
+
+static void *ed25519_signinit(opts *o)
+{
+  ed25519_signctx *c = CREATE(ed25519_signctx);
+
+  rand_get(RAND_GLOBAL, c->k, sizeof(c->k));
+  rand_get(RAND_GLOBAL, c->m, sizeof(c->m));
+  ed25519_pubkey(c->K, c->k, sizeof(c->k));
+  return (c);
+}
+
+static void ed25519_signrun(void *cc)
+{
+  ed25519_signctx *c = cc;
+  octet sig[ED25519_SIGSZ];
+
+  ed25519_sign(sig, c->k, sizeof(c->k), c->K, c->m, sizeof(c->m));
+}
+
+static void *ed25519_vrfinit(opts *o)
+{
+  octet k[ED25519_KEYSZ];
+  ed25519_vrfctx *c = CREATE(ed25519_vrfctx);
+
+  rand_get(RAND_GLOBAL, k, sizeof(k));
+  rand_get(RAND_GLOBAL, c->m, sizeof(c->m));
+  ed25519_pubkey(c->K, k, sizeof(k));
+  ed25519_sign(c->sig, k, sizeof(k), c->K, c->m, sizeof(c->m));
+  return (c);
+}
+
+static void ed25519_vrfrun(void *cc)
+{
+  ed25519_vrfctx *c = cc;
+  ed25519_verify(c->K, c->m, sizeof(c->m), c->sig);
+}
+
 /* --- RSA --- */
 
 typedef struct rsapriv_ctx {
@@ -505,6 +556,8 @@ static const jobops jobtab[] = {
   { "rsa-priv-blind",          rsaprivblind_init,      rsapriv_run },
   { "rsa-pub",                 rsapub_init,            rsapub_run },
   { "x25519",                  x25519_jobinit,         x25519_jobrun },
+  { "ed25519-sign",            ed25519_signinit,       ed25519_signrun },
+  { "ed25519-vrf",             ed25519_vrfinit,        ed25519_vrfrun },
   { "ksched",                  ksched_init,            ksched_run },
   { "enc",                     enc_init,               enc_run },
   { "hash",                    hash_init,              hash_run },