1*6a126883Stobhe /* $OpenBSD: chachapoly.h,v 1.4 2020/07/22 13:54:30 tobhe Exp $ */ 226e58685Smikeb /* 326e58685Smikeb * Copyright (c) 2015 Mike Belopuhov 426e58685Smikeb * 526e58685Smikeb * Permission to use, copy, modify, and distribute this software for any 626e58685Smikeb * purpose with or without fee is hereby granted, provided that the above 726e58685Smikeb * copyright notice and this permission notice appear in all copies. 826e58685Smikeb * 926e58685Smikeb * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 1026e58685Smikeb * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1126e58685Smikeb * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1226e58685Smikeb * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1326e58685Smikeb * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1426e58685Smikeb * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1526e58685Smikeb * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1626e58685Smikeb */ 1726e58685Smikeb 1826e58685Smikeb #ifndef _CHACHAPOLY_H_ 1926e58685Smikeb #define _CHACHAPOLY_H_ 2026e58685Smikeb 2126e58685Smikeb #define CHACHA20_KEYSIZE 32 2226e58685Smikeb #define CHACHA20_CTR 4 2326e58685Smikeb #define CHACHA20_SALT 4 2426e58685Smikeb #define CHACHA20_NONCE 8 2526e58685Smikeb #define CHACHA20_BLOCK_LEN 64 2626e58685Smikeb 2726e58685Smikeb struct chacha20_ctx { 2826e58685Smikeb uint8_t block[CHACHA20_BLOCK_LEN]; 2926e58685Smikeb uint8_t nonce[CHACHA20_NONCE]; 3026e58685Smikeb }; 3126e58685Smikeb 3226e58685Smikeb int chacha20_setkey(void *, u_int8_t *, int); 3326e58685Smikeb void chacha20_reinit(caddr_t, u_int8_t *); 3426e58685Smikeb void chacha20_crypt(caddr_t, u_int8_t *); 3526e58685Smikeb 3626e58685Smikeb 3726e58685Smikeb #define POLY1305_KEYLEN 32 3826e58685Smikeb #define POLY1305_TAGLEN 16 3926e58685Smikeb #define POLY1305_BLOCK_LEN 16 4026e58685Smikeb 4126e58685Smikeb struct poly1305_ctx { 4226e58685Smikeb /* r, h, pad, leftover */ 4326e58685Smikeb unsigned long state[5+5+4]; 4426e58685Smikeb size_t leftover; 4526e58685Smikeb unsigned char buffer[POLY1305_BLOCK_LEN]; 4626e58685Smikeb unsigned char final; 4726e58685Smikeb }; 4826e58685Smikeb 4926e58685Smikeb typedef struct { 5026e58685Smikeb uint8_t key[POLY1305_KEYLEN]; 5126e58685Smikeb /* counter, salt */ 5226e58685Smikeb uint8_t nonce[CHACHA20_NONCE]; 5326e58685Smikeb struct chacha20_ctx chacha; 5426e58685Smikeb struct poly1305_ctx poly; 5526e58685Smikeb } CHACHA20_POLY1305_CTX; 5626e58685Smikeb 57a9a4b78eSmikeb void Chacha20_Poly1305_Init(void *); 58a9a4b78eSmikeb void Chacha20_Poly1305_Setkey(void *, const uint8_t *, uint16_t); 59a9a4b78eSmikeb void Chacha20_Poly1305_Reinit(void *, const uint8_t *, uint16_t); 60a9a4b78eSmikeb int Chacha20_Poly1305_Update(void *, const uint8_t *, uint16_t); 61a9a4b78eSmikeb void Chacha20_Poly1305_Final(uint8_t[POLY1305_TAGLEN], void *); 6226e58685Smikeb 6376a075beSdlg /* WireGuard crypto */ 6476a075beSdlg #define CHACHA20POLY1305_KEY_SIZE CHACHA20_KEYSIZE 6576a075beSdlg #define CHACHA20POLY1305_AUTHTAG_SIZE POLY1305_TAGLEN 6676a075beSdlg #define XCHACHA20POLY1305_NONCE_SIZE 24 6776a075beSdlg 6876a075beSdlg void chacha20poly1305_encrypt(uint8_t *, const uint8_t *, const size_t, 6976a075beSdlg const uint8_t *, const size_t, const uint64_t, 7076a075beSdlg const uint8_t[CHACHA20POLY1305_KEY_SIZE]); 7176a075beSdlg 7276a075beSdlg int chacha20poly1305_decrypt(uint8_t *, const uint8_t *, const size_t, 7376a075beSdlg const uint8_t *, const size_t, const uint64_t, 7476a075beSdlg const uint8_t[CHACHA20POLY1305_KEY_SIZE]); 7576a075beSdlg 7676a075beSdlg void xchacha20poly1305_encrypt(uint8_t *, const uint8_t *, const size_t, 7776a075beSdlg const uint8_t *, const size_t, 7876a075beSdlg const uint8_t[XCHACHA20POLY1305_NONCE_SIZE], 7976a075beSdlg const uint8_t[CHACHA20POLY1305_KEY_SIZE]); 8076a075beSdlg 8176a075beSdlg int xchacha20poly1305_decrypt(uint8_t *, const uint8_t *, const size_t, 8276a075beSdlg const uint8_t *, const size_t, 8376a075beSdlg const uint8_t[XCHACHA20POLY1305_NONCE_SIZE], 8476a075beSdlg const uint8_t[CHACHA20POLY1305_KEY_SIZE]); 8576a075beSdlg 8626e58685Smikeb #endif /* _CHACHAPOLY_H_ */ 87