xref: /openbsd/sys/crypto/chachapoly.h (revision 6a126883)
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