xref: /OK3568_Linux_fs/kernel/arch/x86/include/asm/crypto/camellia.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef ASM_X86_CAMELLIA_H
3*4882a593Smuzhiyun #define ASM_X86_CAMELLIA_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #include <crypto/b128ops.h>
6*4882a593Smuzhiyun #include <linux/crypto.h>
7*4882a593Smuzhiyun #include <linux/kernel.h>
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #define CAMELLIA_MIN_KEY_SIZE	16
10*4882a593Smuzhiyun #define CAMELLIA_MAX_KEY_SIZE	32
11*4882a593Smuzhiyun #define CAMELLIA_BLOCK_SIZE	16
12*4882a593Smuzhiyun #define CAMELLIA_TABLE_BYTE_LEN	272
13*4882a593Smuzhiyun #define CAMELLIA_PARALLEL_BLOCKS 2
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun struct crypto_skcipher;
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun struct camellia_ctx {
18*4882a593Smuzhiyun 	u64 key_table[CAMELLIA_TABLE_BYTE_LEN / sizeof(u64)];
19*4882a593Smuzhiyun 	u32 key_length;
20*4882a593Smuzhiyun };
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun struct camellia_xts_ctx {
23*4882a593Smuzhiyun 	struct camellia_ctx tweak_ctx;
24*4882a593Smuzhiyun 	struct camellia_ctx crypt_ctx;
25*4882a593Smuzhiyun };
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun extern int __camellia_setkey(struct camellia_ctx *cctx,
28*4882a593Smuzhiyun 			     const unsigned char *key,
29*4882a593Smuzhiyun 			     unsigned int key_len);
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun extern int xts_camellia_setkey(struct crypto_skcipher *tfm, const u8 *key,
32*4882a593Smuzhiyun 			       unsigned int keylen);
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun /* regular block cipher functions */
35*4882a593Smuzhiyun asmlinkage void __camellia_enc_blk(const void *ctx, u8 *dst, const u8 *src,
36*4882a593Smuzhiyun 				   bool xor);
37*4882a593Smuzhiyun asmlinkage void camellia_dec_blk(const void *ctx, u8 *dst, const u8 *src);
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun /* 2-way parallel cipher functions */
40*4882a593Smuzhiyun asmlinkage void __camellia_enc_blk_2way(const void *ctx, u8 *dst, const u8 *src,
41*4882a593Smuzhiyun 					bool xor);
42*4882a593Smuzhiyun asmlinkage void camellia_dec_blk_2way(const void *ctx, u8 *dst, const u8 *src);
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun /* 16-way parallel cipher functions (avx/aes-ni) */
45*4882a593Smuzhiyun asmlinkage void camellia_ecb_enc_16way(const void *ctx, u8 *dst, const u8 *src);
46*4882a593Smuzhiyun asmlinkage void camellia_ecb_dec_16way(const void *ctx, u8 *dst, const u8 *src);
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun asmlinkage void camellia_cbc_dec_16way(const void *ctx, u8 *dst, const u8 *src);
49*4882a593Smuzhiyun asmlinkage void camellia_ctr_16way(const void *ctx, u8 *dst, const u8 *src,
50*4882a593Smuzhiyun 				   le128 *iv);
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun asmlinkage void camellia_xts_enc_16way(const void *ctx, u8 *dst, const u8 *src,
53*4882a593Smuzhiyun 				       le128 *iv);
54*4882a593Smuzhiyun asmlinkage void camellia_xts_dec_16way(const void *ctx, u8 *dst, const u8 *src,
55*4882a593Smuzhiyun 				       le128 *iv);
56*4882a593Smuzhiyun 
camellia_enc_blk(const void * ctx,u8 * dst,const u8 * src)57*4882a593Smuzhiyun static inline void camellia_enc_blk(const void *ctx, u8 *dst, const u8 *src)
58*4882a593Smuzhiyun {
59*4882a593Smuzhiyun 	__camellia_enc_blk(ctx, dst, src, false);
60*4882a593Smuzhiyun }
61*4882a593Smuzhiyun 
camellia_enc_blk_xor(const void * ctx,u8 * dst,const u8 * src)62*4882a593Smuzhiyun static inline void camellia_enc_blk_xor(const void *ctx, u8 *dst, const u8 *src)
63*4882a593Smuzhiyun {
64*4882a593Smuzhiyun 	__camellia_enc_blk(ctx, dst, src, true);
65*4882a593Smuzhiyun }
66*4882a593Smuzhiyun 
camellia_enc_blk_2way(const void * ctx,u8 * dst,const u8 * src)67*4882a593Smuzhiyun static inline void camellia_enc_blk_2way(const void *ctx, u8 *dst,
68*4882a593Smuzhiyun 					 const u8 *src)
69*4882a593Smuzhiyun {
70*4882a593Smuzhiyun 	__camellia_enc_blk_2way(ctx, dst, src, false);
71*4882a593Smuzhiyun }
72*4882a593Smuzhiyun 
camellia_enc_blk_xor_2way(const void * ctx,u8 * dst,const u8 * src)73*4882a593Smuzhiyun static inline void camellia_enc_blk_xor_2way(const void *ctx, u8 *dst,
74*4882a593Smuzhiyun 					     const u8 *src)
75*4882a593Smuzhiyun {
76*4882a593Smuzhiyun 	__camellia_enc_blk_2way(ctx, dst, src, true);
77*4882a593Smuzhiyun }
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun /* glue helpers */
80*4882a593Smuzhiyun extern void camellia_decrypt_cbc_2way(const void *ctx, u8 *dst, const u8 *src);
81*4882a593Smuzhiyun extern void camellia_crypt_ctr(const void *ctx, u8 *dst, const u8 *src,
82*4882a593Smuzhiyun 			       le128 *iv);
83*4882a593Smuzhiyun extern void camellia_crypt_ctr_2way(const void *ctx, u8 *dst, const u8 *src,
84*4882a593Smuzhiyun 				    le128 *iv);
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun extern void camellia_xts_enc(const void *ctx, u8 *dst, const u8 *src,
87*4882a593Smuzhiyun 			     le128 *iv);
88*4882a593Smuzhiyun extern void camellia_xts_dec(const void *ctx, u8 *dst, const u8 *src,
89*4882a593Smuzhiyun 			     le128 *iv);
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun #endif /* ASM_X86_CAMELLIA_H */
92