diff options
Diffstat (limited to 'arch/x86/include/asm/crypto/glue_helper.h')
| -rw-r--r-- | arch/x86/include/asm/crypto/glue_helper.h | 24 | 
1 files changed, 24 insertions, 0 deletions
diff --git a/arch/x86/include/asm/crypto/glue_helper.h b/arch/x86/include/asm/crypto/glue_helper.h index e2d65b061d2..1eef55596e8 100644 --- a/arch/x86/include/asm/crypto/glue_helper.h +++ b/arch/x86/include/asm/crypto/glue_helper.h @@ -14,10 +14,13 @@ typedef void (*common_glue_func_t)(void *ctx, u8 *dst, const u8 *src);  typedef void (*common_glue_cbc_func_t)(void *ctx, u128 *dst, const u128 *src);  typedef void (*common_glue_ctr_func_t)(void *ctx, u128 *dst, const u128 *src,  				       le128 *iv); +typedef void (*common_glue_xts_func_t)(void *ctx, u128 *dst, const u128 *src, +				       le128 *iv);  #define GLUE_FUNC_CAST(fn) ((common_glue_func_t)(fn))  #define GLUE_CBC_FUNC_CAST(fn) ((common_glue_cbc_func_t)(fn))  #define GLUE_CTR_FUNC_CAST(fn) ((common_glue_ctr_func_t)(fn)) +#define GLUE_XTS_FUNC_CAST(fn) ((common_glue_xts_func_t)(fn))  struct common_glue_func_entry {  	unsigned int num_blocks; /* number of blocks that @fn will process */ @@ -25,6 +28,7 @@ struct common_glue_func_entry {  		common_glue_func_t ecb;  		common_glue_cbc_func_t cbc;  		common_glue_ctr_func_t ctr; +		common_glue_xts_func_t xts;  	} fn_u;  }; @@ -96,6 +100,16 @@ static inline void le128_inc(le128 *i)  	i->b = cpu_to_le64(b);  } +static inline void le128_gf128mul_x_ble(le128 *dst, const le128 *src) +{ +	u64 a = le64_to_cpu(src->a); +	u64 b = le64_to_cpu(src->b); +	u64 _tt = ((s64)a >> 63) & 0x87; + +	dst->a = cpu_to_le64((a << 1) ^ (b >> 63)); +	dst->b = cpu_to_le64((b << 1) ^ _tt); +} +  extern int glue_ecb_crypt_128bit(const struct common_glue_ctx *gctx,  				 struct blkcipher_desc *desc,  				 struct scatterlist *dst, @@ -118,4 +132,14 @@ extern int glue_ctr_crypt_128bit(const struct common_glue_ctx *gctx,  				 struct scatterlist *dst,  				 struct scatterlist *src, unsigned int nbytes); +extern int glue_xts_crypt_128bit(const struct common_glue_ctx *gctx, +				 struct blkcipher_desc *desc, +				 struct scatterlist *dst, +				 struct scatterlist *src, unsigned int nbytes, +				 common_glue_func_t tweak_fn, void *tweak_ctx, +				 void *crypt_ctx); + +extern void glue_xts_crypt_128bit_one(void *ctx, u128 *dst, const u128 *src, +				      le128 *iv, common_glue_func_t fn); +  #endif /* _CRYPTO_GLUE_HELPER_H */  |