xref: /linux/include/crypto/chacha.h (revision 1ca1b917)
1*1ca1b917SEric Biggers /* SPDX-License-Identifier: GPL-2.0 */
2*1ca1b917SEric Biggers /*
3*1ca1b917SEric Biggers  * Common values and helper functions for the ChaCha and XChaCha stream ciphers.
4*1ca1b917SEric Biggers  *
5*1ca1b917SEric Biggers  * XChaCha extends ChaCha's nonce to 192 bits, while provably retaining ChaCha's
6*1ca1b917SEric Biggers  * security.  Here they share the same key size, tfm context, and setkey
7*1ca1b917SEric Biggers  * function; only their IV size and encrypt/decrypt function differ.
8*1ca1b917SEric Biggers  */
9*1ca1b917SEric Biggers 
10*1ca1b917SEric Biggers #ifndef _CRYPTO_CHACHA_H
11*1ca1b917SEric Biggers #define _CRYPTO_CHACHA_H
12*1ca1b917SEric Biggers 
13*1ca1b917SEric Biggers #include <crypto/skcipher.h>
14*1ca1b917SEric Biggers #include <linux/types.h>
15*1ca1b917SEric Biggers #include <linux/crypto.h>
16*1ca1b917SEric Biggers 
17*1ca1b917SEric Biggers /* 32-bit stream position, then 96-bit nonce (RFC7539 convention) */
18*1ca1b917SEric Biggers #define CHACHA_IV_SIZE		16
19*1ca1b917SEric Biggers 
20*1ca1b917SEric Biggers #define CHACHA_KEY_SIZE		32
21*1ca1b917SEric Biggers #define CHACHA_BLOCK_SIZE	64
22*1ca1b917SEric Biggers #define CHACHAPOLY_IV_SIZE	12
23*1ca1b917SEric Biggers 
24*1ca1b917SEric Biggers /* 192-bit nonce, then 64-bit stream position */
25*1ca1b917SEric Biggers #define XCHACHA_IV_SIZE		32
26*1ca1b917SEric Biggers 
27*1ca1b917SEric Biggers struct chacha_ctx {
28*1ca1b917SEric Biggers 	u32 key[8];
29*1ca1b917SEric Biggers 	int nrounds;
30*1ca1b917SEric Biggers };
31*1ca1b917SEric Biggers 
32*1ca1b917SEric Biggers void chacha_block(u32 *state, u8 *stream, int nrounds);
33*1ca1b917SEric Biggers static inline void chacha20_block(u32 *state, u8 *stream)
34*1ca1b917SEric Biggers {
35*1ca1b917SEric Biggers 	chacha_block(state, stream, 20);
36*1ca1b917SEric Biggers }
37*1ca1b917SEric Biggers void hchacha_block(const u32 *in, u32 *out, int nrounds);
38*1ca1b917SEric Biggers 
39*1ca1b917SEric Biggers void crypto_chacha_init(u32 *state, struct chacha_ctx *ctx, u8 *iv);
40*1ca1b917SEric Biggers 
41*1ca1b917SEric Biggers int crypto_chacha20_setkey(struct crypto_skcipher *tfm, const u8 *key,
42*1ca1b917SEric Biggers 			   unsigned int keysize);
43*1ca1b917SEric Biggers 
44*1ca1b917SEric Biggers int crypto_chacha_crypt(struct skcipher_request *req);
45*1ca1b917SEric Biggers int crypto_xchacha_crypt(struct skcipher_request *req);
46*1ca1b917SEric Biggers 
47*1ca1b917SEric Biggers #endif /* _CRYPTO_CHACHA_H */
48