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