diff options
Diffstat (limited to 'crypto/michael_mic.c')
| -rw-r--r-- | crypto/michael_mic.c | 40 |
1 files changed, 17 insertions, 23 deletions
diff --git a/crypto/michael_mic.c b/crypto/michael_mic.c index a470bcb3693e..4f6ab23e14ad 100644 --- a/crypto/michael_mic.c +++ b/crypto/michael_mic.c | |||
| @@ -10,10 +10,12 @@ | |||
| 10 | * published by the Free Software Foundation. | 10 | * published by the Free Software Foundation. |
| 11 | */ | 11 | */ |
| 12 | 12 | ||
| 13 | #include <asm/byteorder.h> | ||
| 13 | #include <linux/init.h> | 14 | #include <linux/init.h> |
| 14 | #include <linux/module.h> | 15 | #include <linux/module.h> |
| 15 | #include <linux/string.h> | 16 | #include <linux/string.h> |
| 16 | #include <linux/crypto.h> | 17 | #include <linux/crypto.h> |
| 18 | #include <linux/types.h> | ||
| 17 | 19 | ||
| 18 | 20 | ||
| 19 | struct michael_mic_ctx { | 21 | struct michael_mic_ctx { |
| @@ -43,21 +45,6 @@ do { \ | |||
| 43 | } while (0) | 45 | } while (0) |
| 44 | 46 | ||
| 45 | 47 | ||
| 46 | static inline u32 get_le32(const u8 *p) | ||
| 47 | { | ||
| 48 | return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24); | ||
| 49 | } | ||
| 50 | |||
| 51 | |||
| 52 | static inline void put_le32(u8 *p, u32 v) | ||
| 53 | { | ||
| 54 | p[0] = v; | ||
| 55 | p[1] = v >> 8; | ||
| 56 | p[2] = v >> 16; | ||
| 57 | p[3] = v >> 24; | ||
| 58 | } | ||
| 59 | |||
| 60 | |||
| 61 | static void michael_init(void *ctx) | 48 | static void michael_init(void *ctx) |
| 62 | { | 49 | { |
| 63 | struct michael_mic_ctx *mctx = ctx; | 50 | struct michael_mic_ctx *mctx = ctx; |
| @@ -68,6 +55,7 @@ static void michael_init(void *ctx) | |||
| 68 | static void michael_update(void *ctx, const u8 *data, unsigned int len) | 55 | static void michael_update(void *ctx, const u8 *data, unsigned int len) |
| 69 | { | 56 | { |
| 70 | struct michael_mic_ctx *mctx = ctx; | 57 | struct michael_mic_ctx *mctx = ctx; |
| 58 | const __le32 *src; | ||
| 71 | 59 | ||
| 72 | if (mctx->pending_len) { | 60 | if (mctx->pending_len) { |
| 73 | int flen = 4 - mctx->pending_len; | 61 | int flen = 4 - mctx->pending_len; |
| @@ -81,21 +69,23 @@ static void michael_update(void *ctx, const u8 *data, unsigned int len) | |||
| 81 | if (mctx->pending_len < 4) | 69 | if (mctx->pending_len < 4) |
| 82 | return; | 70 | return; |
| 83 | 71 | ||
| 84 | mctx->l ^= get_le32(mctx->pending); | 72 | src = (const __le32 *)mctx->pending; |
| 73 | mctx->l ^= le32_to_cpup(src); | ||
| 85 | michael_block(mctx->l, mctx->r); | 74 | michael_block(mctx->l, mctx->r); |
| 86 | mctx->pending_len = 0; | 75 | mctx->pending_len = 0; |
| 87 | } | 76 | } |
| 88 | 77 | ||
| 78 | src = (const __le32 *)data; | ||
| 79 | |||
| 89 | while (len >= 4) { | 80 | while (len >= 4) { |
| 90 | mctx->l ^= get_le32(data); | 81 | mctx->l ^= le32_to_cpup(src++); |
| 91 | michael_block(mctx->l, mctx->r); | 82 | michael_block(mctx->l, mctx->r); |
| 92 | data += 4; | ||
| 93 | len -= 4; | 83 | len -= 4; |
| 94 | } | 84 | } |
| 95 | 85 | ||
| 96 | if (len > 0) { | 86 | if (len > 0) { |
| 97 | mctx->pending_len = len; | 87 | mctx->pending_len = len; |
| 98 | memcpy(mctx->pending, data, len); | 88 | memcpy(mctx->pending, src, len); |
| 99 | } | 89 | } |
| 100 | } | 90 | } |
| 101 | 91 | ||
| @@ -104,6 +94,7 @@ static void michael_final(void *ctx, u8 *out) | |||
| 104 | { | 94 | { |
| 105 | struct michael_mic_ctx *mctx = ctx; | 95 | struct michael_mic_ctx *mctx = ctx; |
| 106 | u8 *data = mctx->pending; | 96 | u8 *data = mctx->pending; |
| 97 | __le32 *dst = (__le32 *)out; | ||
| 107 | 98 | ||
| 108 | /* Last block and padding (0x5a, 4..7 x 0) */ | 99 | /* Last block and padding (0x5a, 4..7 x 0) */ |
| 109 | switch (mctx->pending_len) { | 100 | switch (mctx->pending_len) { |
| @@ -125,8 +116,8 @@ static void michael_final(void *ctx, u8 *out) | |||
| 125 | /* l ^= 0; */ | 116 | /* l ^= 0; */ |
| 126 | michael_block(mctx->l, mctx->r); | 117 | michael_block(mctx->l, mctx->r); |
| 127 | 118 | ||
| 128 | put_le32(out, mctx->l); | 119 | dst[0] = cpu_to_le32(mctx->l); |
| 129 | put_le32(out + 4, mctx->r); | 120 | dst[1] = cpu_to_le32(mctx->r); |
| 130 | } | 121 | } |
| 131 | 122 | ||
| 132 | 123 | ||
| @@ -134,13 +125,16 @@ static int michael_setkey(void *ctx, const u8 *key, unsigned int keylen, | |||
| 134 | u32 *flags) | 125 | u32 *flags) |
| 135 | { | 126 | { |
| 136 | struct michael_mic_ctx *mctx = ctx; | 127 | struct michael_mic_ctx *mctx = ctx; |
| 128 | const __le32 *data = (const __le32 *)key; | ||
| 129 | |||
| 137 | if (keylen != 8) { | 130 | if (keylen != 8) { |
| 138 | if (flags) | 131 | if (flags) |
| 139 | *flags = CRYPTO_TFM_RES_BAD_KEY_LEN; | 132 | *flags = CRYPTO_TFM_RES_BAD_KEY_LEN; |
| 140 | return -EINVAL; | 133 | return -EINVAL; |
| 141 | } | 134 | } |
| 142 | mctx->l = get_le32(key); | 135 | |
| 143 | mctx->r = get_le32(key + 4); | 136 | mctx->l = le32_to_cpu(data[0]); |
| 137 | mctx->r = le32_to_cpu(data[1]); | ||
| 144 | return 0; | 138 | return 0; |
| 145 | } | 139 | } |
| 146 | 140 | ||
