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