]>
Commit | Line | Data |
---|---|---|
1ca1b917 EB |
1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* | |
3 | * Common values and helper functions for the ChaCha and XChaCha stream ciphers. | |
4 | * | |
5 | * XChaCha extends ChaCha's nonce to 192 bits, while provably retaining ChaCha's | |
6 | * security. Here they share the same key size, tfm context, and setkey | |
7 | * function; only their IV size and encrypt/decrypt function differ. | |
aa762409 EB |
8 | * |
9 | * The ChaCha paper specifies 20, 12, and 8-round variants. In general, it is | |
10 | * recommended to use the 20-round variant ChaCha20. However, the other | |
11 | * variants can be needed in some performance-sensitive scenarios. The generic | |
12 | * ChaCha code currently allows only the 20 and 12-round variants. | |
1ca1b917 EB |
13 | */ |
14 | ||
15 | #ifndef _CRYPTO_CHACHA_H | |
16 | #define _CRYPTO_CHACHA_H | |
17 | ||
18 | #include <crypto/skcipher.h> | |
19 | #include <linux/types.h> | |
20 | #include <linux/crypto.h> | |
21 | ||
22 | /* 32-bit stream position, then 96-bit nonce (RFC7539 convention) */ | |
23 | #define CHACHA_IV_SIZE 16 | |
24 | ||
25 | #define CHACHA_KEY_SIZE 32 | |
26 | #define CHACHA_BLOCK_SIZE 64 | |
27 | #define CHACHAPOLY_IV_SIZE 12 | |
28 | ||
29 | /* 192-bit nonce, then 64-bit stream position */ | |
30 | #define XCHACHA_IV_SIZE 32 | |
31 | ||
32 | struct chacha_ctx { | |
33 | u32 key[8]; | |
34 | int nrounds; | |
35 | }; | |
36 | ||
37 | void chacha_block(u32 *state, u8 *stream, int nrounds); | |
38 | static inline void chacha20_block(u32 *state, u8 *stream) | |
39 | { | |
40 | chacha_block(state, stream, 20); | |
41 | } | |
42 | void hchacha_block(const u32 *in, u32 *out, int nrounds); | |
43 | ||
860ab2e5 | 44 | void crypto_chacha_init(u32 *state, const struct chacha_ctx *ctx, const u8 *iv); |
1ca1b917 EB |
45 | |
46 | int crypto_chacha20_setkey(struct crypto_skcipher *tfm, const u8 *key, | |
47 | unsigned int keysize); | |
aa762409 EB |
48 | int crypto_chacha12_setkey(struct crypto_skcipher *tfm, const u8 *key, |
49 | unsigned int keysize); | |
1ca1b917 EB |
50 | |
51 | int crypto_chacha_crypt(struct skcipher_request *req); | |
52 | int crypto_xchacha_crypt(struct skcipher_request *req); | |
53 | ||
54 | #endif /* _CRYPTO_CHACHA_H */ |