#include "gcipher.h"
#include "ghash.h"
#include "gmac.h"
+#include "poly1305.h"
#include "ectab.h"
#include "ptab.h"
GH_DESTROY(h);
}
+/* --- Poly1305 --- */
+
+typedef struct poly1305_jobctx {
+ poly1305_key k;
+ octet s[POLY1305_MASKSZ];
+ octet *m;
+ size_t sz;
+ size_t n;
+} poly1305_jobctx;
+
+static void *poly1305_jobinit(opts *o)
+{
+ octet k[POLY1305_KEYSZ];
+ poly1305_jobctx *c = CREATE(poly1305_jobctx);
+ rand_get(RAND_GLOBAL, k, sizeof(k));
+ poly1305_keyinit(&c->k, k, sizeof(k));
+ rand_get(RAND_GLOBAL, c->s, sizeof(c->s));
+ c->sz = o->gbits ? o->gbits : 65536;
+ c->n = o->n ? o->n : 16;
+ c->m = xmalloc(c->sz);
+ return (c);
+}
+
+static void poly1305_jobrun(void *cc)
+{
+ poly1305_jobctx *c = cc;
+ poly1305_ctx ctx;
+ octet t[POLY1305_TAGSZ];
+ size_t i;
+ poly1305_macinit(&ctx, &c->k, c->s);
+ for (i = 0; i < c->n; i++) poly1305_hash(&ctx, c->m, c->sz);
+ poly1305_done(&ctx, t);
+}
+
/* --- Job table --- */
typedef struct jobops {
{ "ksched", ksched_init, ksched_run },
{ "enc", enc_init, enc_run },
{ "hash", hash_init, hash_run },
+ { "poly1305", poly1305_jobinit, poly1305_jobrun },
{ 0, 0, 0 }
};