2 * Shared glue code for 128bit block ciphers
5 #ifndef _CRYPTO_GLUE_HELPER_H
6 #define _CRYPTO_GLUE_HELPER_H
8 #include <linux/kernel.h>
9 #include <linux/crypto.h>
10 #include <asm/fpu/api.h>
11 #include <crypto/b128ops.h>
13 typedef void (*common_glue_func_t
)(void *ctx
, u8
*dst
, const u8
*src
);
14 typedef void (*common_glue_cbc_func_t
)(void *ctx
, u128
*dst
, const u128
*src
);
15 typedef void (*common_glue_ctr_func_t
)(void *ctx
, u128
*dst
, const u128
*src
,
17 typedef void (*common_glue_xts_func_t
)(void *ctx
, u128
*dst
, const u128
*src
,
20 #define GLUE_FUNC_CAST(fn) ((common_glue_func_t)(fn))
21 #define GLUE_CBC_FUNC_CAST(fn) ((common_glue_cbc_func_t)(fn))
22 #define GLUE_CTR_FUNC_CAST(fn) ((common_glue_ctr_func_t)(fn))
23 #define GLUE_XTS_FUNC_CAST(fn) ((common_glue_xts_func_t)(fn))
25 struct common_glue_func_entry
{
26 unsigned int num_blocks
; /* number of blocks that @fn will process */
28 common_glue_func_t ecb
;
29 common_glue_cbc_func_t cbc
;
30 common_glue_ctr_func_t ctr
;
31 common_glue_xts_func_t xts
;
35 struct common_glue_ctx
{
36 unsigned int num_funcs
;
37 int fpu_blocks_limit
; /* -1 means fpu not needed at all */
40 * First funcs entry must have largest num_blocks and last funcs entry
41 * must have num_blocks == 1!
43 struct common_glue_func_entry funcs
[];
46 static inline bool glue_fpu_begin(unsigned int bsize
, int fpu_blocks_limit
,
47 struct blkcipher_desc
*desc
,
48 bool fpu_enabled
, unsigned int nbytes
)
50 if (likely(fpu_blocks_limit
< 0))
57 * Vector-registers are only used when chunk to be processed is large
58 * enough, so do not enable FPU until it is necessary.
60 if (nbytes
< bsize
* (unsigned int)fpu_blocks_limit
)
64 /* prevent sleeping if FPU is in use */
65 desc
->flags
&= ~CRYPTO_TFM_REQ_MAY_SLEEP
;
72 static inline void glue_fpu_end(bool fpu_enabled
)
78 static inline void le128_to_be128(be128
*dst
, const le128
*src
)
80 dst
->a
= cpu_to_be64(le64_to_cpu(src
->a
));
81 dst
->b
= cpu_to_be64(le64_to_cpu(src
->b
));
84 static inline void be128_to_le128(le128
*dst
, const be128
*src
)
86 dst
->a
= cpu_to_le64(be64_to_cpu(src
->a
));
87 dst
->b
= cpu_to_le64(be64_to_cpu(src
->b
));
90 static inline void le128_inc(le128
*i
)
92 u64 a
= le64_to_cpu(i
->a
);
93 u64 b
= le64_to_cpu(i
->b
);
99 i
->a
= cpu_to_le64(a
);
100 i
->b
= cpu_to_le64(b
);
103 static inline void le128_gf128mul_x_ble(le128
*dst
, const le128
*src
)
105 u64 a
= le64_to_cpu(src
->a
);
106 u64 b
= le64_to_cpu(src
->b
);
107 u64 _tt
= ((s64
)a
>> 63) & 0x87;
109 dst
->a
= cpu_to_le64((a
<< 1) ^ (b
>> 63));
110 dst
->b
= cpu_to_le64((b
<< 1) ^ _tt
);
113 extern int glue_ecb_crypt_128bit(const struct common_glue_ctx
*gctx
,
114 struct blkcipher_desc
*desc
,
115 struct scatterlist
*dst
,
116 struct scatterlist
*src
, unsigned int nbytes
);
118 extern int glue_cbc_encrypt_128bit(const common_glue_func_t fn
,
119 struct blkcipher_desc
*desc
,
120 struct scatterlist
*dst
,
121 struct scatterlist
*src
,
122 unsigned int nbytes
);
124 extern int glue_cbc_decrypt_128bit(const struct common_glue_ctx
*gctx
,
125 struct blkcipher_desc
*desc
,
126 struct scatterlist
*dst
,
127 struct scatterlist
*src
,
128 unsigned int nbytes
);
130 extern int glue_ctr_crypt_128bit(const struct common_glue_ctx
*gctx
,
131 struct blkcipher_desc
*desc
,
132 struct scatterlist
*dst
,
133 struct scatterlist
*src
, unsigned int nbytes
);
135 extern int glue_xts_crypt_128bit(const struct common_glue_ctx
*gctx
,
136 struct blkcipher_desc
*desc
,
137 struct scatterlist
*dst
,
138 struct scatterlist
*src
, unsigned int nbytes
,
139 common_glue_func_t tweak_fn
, void *tweak_ctx
,
142 extern void glue_xts_crypt_128bit_one(void *ctx
, u128
*dst
, const u128
*src
,
143 le128
*iv
, common_glue_func_t fn
);
145 #endif /* _CRYPTO_GLUE_HELPER_H */