diff options
| -rw-r--r-- | crypto/Kconfig | 2 | ||||
| -rw-r--r-- | crypto/md4.c | 52 |
2 files changed, 30 insertions, 24 deletions
diff --git a/crypto/Kconfig b/crypto/Kconfig index 5386beb503e3..96f8154147a2 100644 --- a/crypto/Kconfig +++ b/crypto/Kconfig | |||
| @@ -276,7 +276,7 @@ config CRYPTO_CRC32C_INTEL | |||
| 276 | 276 | ||
| 277 | config CRYPTO_MD4 | 277 | config CRYPTO_MD4 |
| 278 | tristate "MD4 digest algorithm" | 278 | tristate "MD4 digest algorithm" |
| 279 | select CRYPTO_ALGAPI | 279 | select CRYPTO_HASH |
| 280 | help | 280 | help |
| 281 | MD4 message digest algorithm (RFC1320). | 281 | MD4 message digest algorithm (RFC1320). |
| 282 | 282 | ||
diff --git a/crypto/md4.c b/crypto/md4.c index a143c4aaa398..7fca1f59a4f5 100644 --- a/crypto/md4.c +++ b/crypto/md4.c | |||
| @@ -20,8 +20,8 @@ | |||
| 20 | * (at your option) any later version. | 20 | * (at your option) any later version. |
| 21 | * | 21 | * |
| 22 | */ | 22 | */ |
| 23 | #include <crypto/internal/hash.h> | ||
| 23 | #include <linux/init.h> | 24 | #include <linux/init.h> |
| 24 | #include <linux/crypto.h> | ||
| 25 | #include <linux/kernel.h> | 25 | #include <linux/kernel.h> |
| 26 | #include <linux/string.h> | 26 | #include <linux/string.h> |
| 27 | #include <linux/types.h> | 27 | #include <linux/types.h> |
| @@ -58,7 +58,7 @@ static inline u32 H(u32 x, u32 y, u32 z) | |||
| 58 | { | 58 | { |
| 59 | return x ^ y ^ z; | 59 | return x ^ y ^ z; |
| 60 | } | 60 | } |
| 61 | 61 | ||
| 62 | #define ROUND1(a,b,c,d,k,s) (a = lshift(a + F(b,c,d) + k, s)) | 62 | #define ROUND1(a,b,c,d,k,s) (a = lshift(a + F(b,c,d) + k, s)) |
| 63 | #define ROUND2(a,b,c,d,k,s) (a = lshift(a + G(b,c,d) + k + (u32)0x5A827999,s)) | 63 | #define ROUND2(a,b,c,d,k,s) (a = lshift(a + G(b,c,d) + k + (u32)0x5A827999,s)) |
| 64 | #define ROUND3(a,b,c,d,k,s) (a = lshift(a + H(b,c,d) + k + (u32)0x6ED9EBA1,s)) | 64 | #define ROUND3(a,b,c,d,k,s) (a = lshift(a + H(b,c,d) + k + (u32)0x6ED9EBA1,s)) |
| @@ -152,20 +152,22 @@ static inline void md4_transform_helper(struct md4_ctx *ctx) | |||
| 152 | md4_transform(ctx->hash, ctx->block); | 152 | md4_transform(ctx->hash, ctx->block); |
| 153 | } | 153 | } |
| 154 | 154 | ||
| 155 | static void md4_init(struct crypto_tfm *tfm) | 155 | static int md4_init(struct shash_desc *desc) |
| 156 | { | 156 | { |
| 157 | struct md4_ctx *mctx = crypto_tfm_ctx(tfm); | 157 | struct md4_ctx *mctx = shash_desc_ctx(desc); |
| 158 | 158 | ||
| 159 | mctx->hash[0] = 0x67452301; | 159 | mctx->hash[0] = 0x67452301; |
| 160 | mctx->hash[1] = 0xefcdab89; | 160 | mctx->hash[1] = 0xefcdab89; |
| 161 | mctx->hash[2] = 0x98badcfe; | 161 | mctx->hash[2] = 0x98badcfe; |
| 162 | mctx->hash[3] = 0x10325476; | 162 | mctx->hash[3] = 0x10325476; |
| 163 | mctx->byte_count = 0; | 163 | mctx->byte_count = 0; |
| 164 | |||
| 165 | return 0; | ||
| 164 | } | 166 | } |
| 165 | 167 | ||
| 166 | static void md4_update(struct crypto_tfm *tfm, const u8 *data, unsigned int len) | 168 | static int md4_update(struct shash_desc *desc, const u8 *data, unsigned int len) |
| 167 | { | 169 | { |
| 168 | struct md4_ctx *mctx = crypto_tfm_ctx(tfm); | 170 | struct md4_ctx *mctx = shash_desc_ctx(desc); |
| 169 | const u32 avail = sizeof(mctx->block) - (mctx->byte_count & 0x3f); | 171 | const u32 avail = sizeof(mctx->block) - (mctx->byte_count & 0x3f); |
| 170 | 172 | ||
| 171 | mctx->byte_count += len; | 173 | mctx->byte_count += len; |
| @@ -173,7 +175,7 @@ static void md4_update(struct crypto_tfm *tfm, const u8 *data, unsigned int len) | |||
| 173 | if (avail > len) { | 175 | if (avail > len) { |
| 174 | memcpy((char *)mctx->block + (sizeof(mctx->block) - avail), | 176 | memcpy((char *)mctx->block + (sizeof(mctx->block) - avail), |
| 175 | data, len); | 177 | data, len); |
| 176 | return; | 178 | return 0; |
| 177 | } | 179 | } |
| 178 | 180 | ||
| 179 | memcpy((char *)mctx->block + (sizeof(mctx->block) - avail), | 181 | memcpy((char *)mctx->block + (sizeof(mctx->block) - avail), |
| @@ -191,11 +193,13 @@ static void md4_update(struct crypto_tfm *tfm, const u8 *data, unsigned int len) | |||
| 191 | } | 193 | } |
| 192 | 194 | ||
| 193 | memcpy(mctx->block, data, len); | 195 | memcpy(mctx->block, data, len); |
| 196 | |||
| 197 | return 0; | ||
| 194 | } | 198 | } |
| 195 | 199 | ||
| 196 | static void md4_final(struct crypto_tfm *tfm, u8 *out) | 200 | static int md4_final(struct shash_desc *desc, u8 *out) |
| 197 | { | 201 | { |
| 198 | struct md4_ctx *mctx = crypto_tfm_ctx(tfm); | 202 | struct md4_ctx *mctx = shash_desc_ctx(desc); |
| 199 | const unsigned int offset = mctx->byte_count & 0x3f; | 203 | const unsigned int offset = mctx->byte_count & 0x3f; |
| 200 | char *p = (char *)mctx->block + offset; | 204 | char *p = (char *)mctx->block + offset; |
| 201 | int padding = 56 - (offset + 1); | 205 | int padding = 56 - (offset + 1); |
| @@ -217,30 +221,32 @@ static void md4_final(struct crypto_tfm *tfm, u8 *out) | |||
| 217 | cpu_to_le32_array(mctx->hash, ARRAY_SIZE(mctx->hash)); | 221 | cpu_to_le32_array(mctx->hash, ARRAY_SIZE(mctx->hash)); |
| 218 | memcpy(out, mctx->hash, sizeof(mctx->hash)); | 222 | memcpy(out, mctx->hash, sizeof(mctx->hash)); |
| 219 | memset(mctx, 0, sizeof(*mctx)); | 223 | memset(mctx, 0, sizeof(*mctx)); |
| 224 | |||
| 225 | return 0; | ||
| 220 | } | 226 | } |
| 221 | 227 | ||
| 222 | static struct crypto_alg alg = { | 228 | static struct shash_alg alg = { |
| 223 | .cra_name = "md4", | 229 | .digestsize = MD4_DIGEST_SIZE, |
| 224 | .cra_flags = CRYPTO_ALG_TYPE_DIGEST, | 230 | .init = md4_init, |
| 225 | .cra_blocksize = MD4_HMAC_BLOCK_SIZE, | 231 | .update = md4_update, |
| 226 | .cra_ctxsize = sizeof(struct md4_ctx), | 232 | .final = md4_final, |
| 227 | .cra_module = THIS_MODULE, | 233 | .descsize = sizeof(struct md4_ctx), |
| 228 | .cra_list = LIST_HEAD_INIT(alg.cra_list), | 234 | .base = { |
| 229 | .cra_u = { .digest = { | 235 | .cra_name = "md4", |
| 230 | .dia_digestsize = MD4_DIGEST_SIZE, | 236 | .cra_flags = CRYPTO_ALG_TYPE_SHASH, |
| 231 | .dia_init = md4_init, | 237 | .cra_blocksize = MD4_HMAC_BLOCK_SIZE, |
| 232 | .dia_update = md4_update, | 238 | .cra_module = THIS_MODULE, |
| 233 | .dia_final = md4_final } } | 239 | } |
| 234 | }; | 240 | }; |
| 235 | 241 | ||
| 236 | static int __init md4_mod_init(void) | 242 | static int __init md4_mod_init(void) |
| 237 | { | 243 | { |
| 238 | return crypto_register_alg(&alg); | 244 | return crypto_register_shash(&alg); |
| 239 | } | 245 | } |
| 240 | 246 | ||
| 241 | static void __exit md4_mod_fini(void) | 247 | static void __exit md4_mod_fini(void) |
| 242 | { | 248 | { |
| 243 | crypto_unregister_alg(&alg); | 249 | crypto_unregister_shash(&alg); |
| 244 | } | 250 | } |
| 245 | 251 | ||
| 246 | module_init(md4_mod_init); | 252 | module_init(md4_mod_init); |
