#include "ec.h"
#include "group.h"
#include "x25519.h"
+#include "ed25519.h"
#include "cc.h"
#include "gcipher.h"
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 {
{ "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 },