/* This file is in the public domain. */ #include #include #include "algs.h" typedef struct chachastate CHACHASTATE; struct chachastate { CHACHA_STATE s; } ; static void *enc_chacha_init(const void *key, const void *iv __attribute__((__unused__))) { CHACHASTATE *s; s = malloc(sizeof(CHACHASTATE)); if (s == 0) return(0); chacha_init(&s->s); chacha_setkey(&s->s,key); chacha_setcounter(&s->s,((const char *)key)+32); return(s); } static void enc_chacha_process(void *state, const void *in, void *out, int datalen) { CHACHASTATE *s; s = state; chacha_crypt(&s->s,in,datalen,out); } static void enc_chacha_done(void *state) { bzero(state,sizeof(CHACHASTATE)); free(state); } ENCALG encalg_chacha = { "chacha@rodents.montreal.qc.ca", "ChaCha-20", 1, 0, 48, 0, &enc_chacha_init, &enc_chacha_init, &enc_chacha_process, &enc_chacha_done };