|  | #ifndef _CRYPTO_LRW_H | 
|  | #define _CRYPTO_LRW_H | 
|  |  | 
|  | #include <crypto/b128ops.h> | 
|  |  | 
|  | struct scatterlist; | 
|  | struct gf128mul_64k; | 
|  | struct blkcipher_desc; | 
|  |  | 
|  | #define LRW_BLOCK_SIZE 16 | 
|  |  | 
|  | struct lrw_table_ctx { | 
|  | /* optimizes multiplying a random (non incrementing, as at the | 
|  | * start of a new sector) value with key2, we could also have | 
|  | * used 4k optimization tables or no optimization at all. In the | 
|  | * latter case we would have to store key2 here */ | 
|  | struct gf128mul_64k *table; | 
|  | /* stores: | 
|  | *  key2*{ 0,0,...0,0,0,0,1 }, key2*{ 0,0,...0,0,0,1,1 }, | 
|  | *  key2*{ 0,0,...0,0,1,1,1 }, key2*{ 0,0,...0,1,1,1,1 } | 
|  | *  key2*{ 0,0,...1,1,1,1,1 }, etc | 
|  | * needed for optimized multiplication of incrementing values | 
|  | * with key2 */ | 
|  | be128 mulinc[128]; | 
|  | }; | 
|  |  | 
|  | int lrw_init_table(struct lrw_table_ctx *ctx, const u8 *tweak); | 
|  | void lrw_free_table(struct lrw_table_ctx *ctx); | 
|  |  | 
|  | struct lrw_crypt_req { | 
|  | be128 *tbuf; | 
|  | unsigned int tbuflen; | 
|  |  | 
|  | struct lrw_table_ctx *table_ctx; | 
|  | void *crypt_ctx; | 
|  | void (*crypt_fn)(void *ctx, u8 *blks, unsigned int nbytes); | 
|  | }; | 
|  |  | 
|  | int lrw_crypt(struct blkcipher_desc *desc, struct scatterlist *dst, | 
|  | struct scatterlist *src, unsigned int nbytes, | 
|  | struct lrw_crypt_req *req); | 
|  |  | 
|  | #endif  /* _CRYPTO_LRW_H */ |