diff options
Diffstat (limited to 'include/crypto/lrw.h')
| -rw-r--r-- | include/crypto/lrw.h | 43 | 
1 files changed, 43 insertions, 0 deletions
diff --git a/include/crypto/lrw.h b/include/crypto/lrw.h new file mode 100644 index 00000000000..25a2c871637 --- /dev/null +++ b/include/crypto/lrw.h @@ -0,0 +1,43 @@ +#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 */  | 
