16c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna#ifndef _CRYPTO_LRW_H 26c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna#define _CRYPTO_LRW_H 36c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna 46c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna#include <crypto/b128ops.h> 56c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna 66c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinnastruct scatterlist; 76c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinnastruct gf128mul_64k; 86c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinnastruct blkcipher_desc; 96c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna 106c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna#define LRW_BLOCK_SIZE 16 116c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna 126c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinnastruct lrw_table_ctx { 136c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna /* optimizes multiplying a random (non incrementing, as at the 146c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna * start of a new sector) value with key2, we could also have 156c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna * used 4k optimization tables or no optimization at all. In the 166c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna * latter case we would have to store key2 here */ 176c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna struct gf128mul_64k *table; 186c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna /* stores: 196c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna * key2*{ 0,0,...0,0,0,0,1 }, key2*{ 0,0,...0,0,0,1,1 }, 206c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna * key2*{ 0,0,...0,0,1,1,1 }, key2*{ 0,0,...0,1,1,1,1 } 216c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna * key2*{ 0,0,...1,1,1,1,1 }, etc 226c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna * needed for optimized multiplication of incrementing values 236c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna * with key2 */ 246c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna be128 mulinc[128]; 256c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna}; 266c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna 276c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinnaint lrw_init_table(struct lrw_table_ctx *ctx, const u8 *tweak); 286c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinnavoid lrw_free_table(struct lrw_table_ctx *ctx); 296c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna 306c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinnastruct lrw_crypt_req { 316c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna be128 *tbuf; 326c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna unsigned int tbuflen; 336c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna 346c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna struct lrw_table_ctx *table_ctx; 356c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna void *crypt_ctx; 366c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna void (*crypt_fn)(void *ctx, u8 *blks, unsigned int nbytes); 376c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna}; 386c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna 396c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinnaint lrw_crypt(struct blkcipher_desc *desc, struct scatterlist *dst, 406c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna struct scatterlist *src, unsigned int nbytes, 416c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna struct lrw_crypt_req *req); 426c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna 436c2205b8ffec035f4925b8ee84b7758afeee58b5Jussi Kivilinna#endif /* _CRYPTO_LRW_H */ 44