#ifndef CHACHA_H_ #define CHACHA_H_ 1 #include #define TLS_CHACHA20_IV_LENGTH 12 /* ChaCha20 implementation by D. J. Bernstein * Public domain. */ #define CHACHA_MINKEYLEN 16 #define CHACHA_NONCELEN 8 #define CHACHA_NONCELEN_96 12 #define CHACHA_CTRLEN 8 #define CHACHA_CTRLEN_96 4 #define CHACHA_STATELEN (CHACHA_NONCELEN+CHACHA_CTRLEN) #define CHACHA_BLOCKLEN 64 #define POLY1305_MAX_AAD 32 #define POLY1305_KEYLEN 32 #define POLY1305_TAGLEN 16 #define POLY1305_BLOCK_SIZE 16 struct chacha_ctx { uint32_t input[16]; uint8_t ks[CHACHA_BLOCKLEN]; uint8_t unused; }; /* 17 + sizeof(size_t) + 14*sizeof(unsigned long) */ struct poly1305_context { unsigned long r[5]; unsigned long h[5]; unsigned long pad[4]; size_t leftover; unsigned char buffer[POLY1305_BLOCK_SIZE]; unsigned char final; }; void chacha_keysetup(struct chacha_ctx *x, const unsigned char *k, unsigned int kbits); void chacha_ivsetup(struct chacha_ctx *x, const unsigned char *iv, const unsigned char *ctr); void chacha_ivsetup_96bitnonce(struct chacha_ctx *x, const unsigned char *iv, const unsigned char *ctr); void chacha_encrypt_bytes(struct chacha_ctx *x, const unsigned char *m, unsigned char *c, unsigned int bytes); int poly1305_generate_key(unsigned char *key256, unsigned char *nonce, unsigned int noncelen, unsigned char *poly_key, unsigned int counter); void chacha_ivupdate(struct chacha_ctx *x, const uint8_t *iv, const uint8_t *aad, const uint8_t *counter); void chacha20_poly1305_key(struct chacha_ctx *ctx, unsigned char *poly1305_key); int chacha20_poly1305_aead(struct chacha_ctx *ctx, unsigned char *pt, unsigned int len, unsigned char *aad, unsigned int aad_len, unsigned char *poly_key, unsigned char *out); void tls_poly1305_init(struct poly1305_context *ctx, const unsigned char key[32]); void tls_poly1305_update(struct poly1305_context *ctx, const unsigned char *m, size_t bytes); void tls_poly1305_finish(struct poly1305_context *ctx, unsigned char mac[16]); #endif