@ -4,6 +4,8 @@
* Copyright ( C ) 2012 Johannes Goetzfried
* < Johannes . Goetzfried @ informatik . stud . uni - erlangen . de >
*
* Copyright © 2013 Jussi Kivilinna < jussi . kivilinna @ iki . fi >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
@ -50,6 +52,23 @@ asmlinkage void cast6_cbc_dec_8way(struct cast6_ctx *ctx, u8 *dst,
asmlinkage void cast6_ctr_8way ( struct cast6_ctx * ctx , u8 * dst , const u8 * src ,
le128 * iv ) ;
asmlinkage void cast6_xts_enc_8way ( struct cast6_ctx * ctx , u8 * dst ,
const u8 * src , le128 * iv ) ;
asmlinkage void cast6_xts_dec_8way ( struct cast6_ctx * ctx , u8 * dst ,
const u8 * src , le128 * iv ) ;
static void cast6_xts_enc ( void * ctx , u128 * dst , const u128 * src , le128 * iv )
{
glue_xts_crypt_128bit_one ( ctx , dst , src , iv ,
GLUE_FUNC_CAST ( __cast6_encrypt ) ) ;
}
static void cast6_xts_dec ( void * ctx , u128 * dst , const u128 * src , le128 * iv )
{
glue_xts_crypt_128bit_one ( ctx , dst , src , iv ,
GLUE_FUNC_CAST ( __cast6_decrypt ) ) ;
}
static void cast6_crypt_ctr ( void * ctx , u128 * dst , const u128 * src , le128 * iv )
{
be128 ctrblk ;
@ -87,6 +106,19 @@ static const struct common_glue_ctx cast6_ctr = {
} }
} ;
static const struct common_glue_ctx cast6_enc_xts = {
. num_funcs = 2 ,
. fpu_blocks_limit = CAST6_PARALLEL_BLOCKS ,
. funcs = { {
. num_blocks = CAST6_PARALLEL_BLOCKS ,
. fn_u = { . xts = GLUE_XTS_FUNC_CAST ( cast6_xts_enc_8way ) }
} , {
. num_blocks = 1 ,
. fn_u = { . xts = GLUE_XTS_FUNC_CAST ( cast6_xts_enc ) }
} }
} ;
static const struct common_glue_ctx cast6_dec = {
. num_funcs = 2 ,
. fpu_blocks_limit = CAST6_PARALLEL_BLOCKS ,
@ -113,6 +145,19 @@ static const struct common_glue_ctx cast6_dec_cbc = {
} }
} ;
static const struct common_glue_ctx cast6_dec_xts = {
. num_funcs = 2 ,
. fpu_blocks_limit = CAST6_PARALLEL_BLOCKS ,
. funcs = { {
. num_blocks = CAST6_PARALLEL_BLOCKS ,
. fn_u = { . xts = GLUE_XTS_FUNC_CAST ( cast6_xts_dec_8way ) }
} , {
. num_blocks = 1 ,
. fn_u = { . xts = GLUE_XTS_FUNC_CAST ( cast6_xts_dec ) }
} }
} ;
static int ecb_encrypt ( struct blkcipher_desc * desc , struct scatterlist * dst ,
struct scatterlist * src , unsigned int nbytes )
{
@ -307,54 +352,20 @@ static int xts_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
struct scatterlist * src , unsigned int nbytes )
{
struct cast6_xts_ctx * ctx = crypto_blkcipher_ctx ( desc - > tfm ) ;
be128 buf [ CAST6_PARALLEL_BLOCKS ] ;
struct crypt_priv crypt_ctx = {
. ctx = & ctx - > crypt_ctx ,
. fpu_enabled = false ,
} ;
struct xts_crypt_req req = {
. tbuf = buf ,
. tbuflen = sizeof ( buf ) ,
. tweak_ctx = & ctx - > tweak_ctx ,
. tweak_fn = XTS_TWEAK_CAST ( __cast6_encrypt ) ,
. crypt_ctx = & crypt_ctx ,
. crypt_fn = encrypt_callback ,
} ;
int ret ;
desc - > flags & = ~ CRYPTO_TFM_REQ_MAY_SLEEP ;
ret = xts_crypt ( desc , dst , src , nbytes , & req ) ;
cast6_fpu_end ( crypt_ctx . fpu_enabled ) ;
return ret ;
return glue_xts_crypt_128bit ( & cast6_enc_xts , desc , dst , src , nbytes ,
XTS_TWEAK_CAST ( __cast6_encrypt ) ,
& ctx - > tweak_ctx , & ctx - > crypt_ctx ) ;
}
static int xts_decrypt ( struct blkcipher_desc * desc , struct scatterlist * dst ,
struct scatterlist * src , unsigned int nbytes )
{
struct cast6_xts_ctx * ctx = crypto_blkcipher_ctx ( desc - > tfm ) ;
be128 buf [ CAST6_PARALLEL_BLOCKS ] ;
struct crypt_priv crypt_ctx = {
. ctx = & ctx - > crypt_ctx ,
. fpu_enabled = false ,
} ;
struct xts_crypt_req req = {
. tbuf = buf ,
. tbuflen = sizeof ( buf ) ,
. tweak_ctx = & ctx - > tweak_ctx ,
. tweak_fn = XTS_TWEAK_CAST ( __cast6_encrypt ) ,
. crypt_ctx = & crypt_ctx ,
. crypt_fn = decrypt_callback ,
} ;
int ret ;
desc - > flags & = ~ CRYPTO_TFM_REQ_MAY_SLEEP ;
ret = xts_crypt ( desc , dst , src , nbytes , & req ) ;
cast6_fpu_end ( crypt_ctx . fpu_enabled ) ;
return ret ;
return glue_xts_crypt_128bit ( & cast6_dec_xts , desc , dst , src , nbytes ,
XTS_TWEAK_CAST ( __cast6_encrypt ) ,
& ctx - > tweak_ctx , & ctx - > crypt_ctx ) ;
}
static struct crypto_alg cast6_algs [ 10 ] = { {