14 #include <linux/module.h>
15 #include <linux/string.h>
30 return (val << bits) | (val >> (32 -
bits));
36 return (val >> bits) | (val << (32 -
bits));
40 static inline u32 xswap(
u32 val)
42 return ((val & 0x00ff00ff) << 8) | ((val & 0xff00ff00) >> 8);
46 #define michael_block(l, r) \
59 static inline u32 get_le32(
const u8 *
p)
61 return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24);
65 static inline void put_le32(
u8 *
p,
u32 v)
74 static void michael_init(
void *
ctx)
81 static void michael_update(
void *
ctx,
const u8 *
data,
unsigned int len)
103 mctx->
l ^= get_le32(data);
116 static void michael_final(
void *ctx,
u8 *
out)
127 mctx->
l ^= data[0] | 0x5a00;
130 mctx->
l ^= data[0] | (data[1] << 8) | 0x5a0000;
133 mctx->
l ^= data[0] | (data[1] << 8) | (data[2] << 16) |
141 put_le32(out, mctx->
l);
142 put_le32(out + 4, mctx->
r);
146 static int michael_setkey(
void *ctx,
const u8 *
key,
unsigned int keylen,
155 mctx->
l = get_le32(key);
156 mctx->
r = get_le32(key + 4);
162 .cra_name =
"michael_mic",
168 .cra_u = { .digest = {
170 .dia_init = michael_init,
171 .dia_update = michael_update,
172 .dia_final = michael_final,
173 .dia_setkey = michael_setkey } }
177 static int __init michael_mic_init(
void)
183 static void __exit michael_mic_exit(
void)