diff options
-rw-r--r-- | crypto/Kconfig | 2 | ||||
-rw-r--r-- | crypto/rmd160.c | 61 |
2 files changed, 33 insertions, 30 deletions
diff --git a/crypto/Kconfig b/crypto/Kconfig index 848c886d6675..513b9fb6723d 100644 --- a/crypto/Kconfig +++ b/crypto/Kconfig | |||
@@ -310,7 +310,7 @@ config CRYPTO_RMD128 | |||
310 | 310 | ||
311 | config CRYPTO_RMD160 | 311 | config CRYPTO_RMD160 |
312 | tristate "RIPEMD-160 digest algorithm" | 312 | tristate "RIPEMD-160 digest algorithm" |
313 | select CRYPTO_ALGAPI | 313 | select CRYPTO_HASH |
314 | help | 314 | help |
315 | RIPEMD-160 (ISO/IEC 10118-3:2004). | 315 | RIPEMD-160 (ISO/IEC 10118-3:2004). |
316 | 316 | ||
diff --git a/crypto/rmd160.c b/crypto/rmd160.c index f001ec775e1f..472261fc913f 100644 --- a/crypto/rmd160.c +++ b/crypto/rmd160.c | |||
@@ -13,11 +13,10 @@ | |||
13 | * any later version. | 13 | * any later version. |
14 | * | 14 | * |
15 | */ | 15 | */ |
16 | #include <crypto/internal/hash.h> | ||
16 | #include <linux/init.h> | 17 | #include <linux/init.h> |
17 | #include <linux/module.h> | 18 | #include <linux/module.h> |
18 | #include <linux/mm.h> | 19 | #include <linux/mm.h> |
19 | #include <linux/crypto.h> | ||
20 | #include <linux/cryptohash.h> | ||
21 | #include <linux/types.h> | 20 | #include <linux/types.h> |
22 | #include <asm/byteorder.h> | 21 | #include <asm/byteorder.h> |
23 | 22 | ||
@@ -261,9 +260,9 @@ static void rmd160_transform(u32 *state, const __le32 *in) | |||
261 | return; | 260 | return; |
262 | } | 261 | } |
263 | 262 | ||
264 | static void rmd160_init(struct crypto_tfm *tfm) | 263 | static int rmd160_init(struct shash_desc *desc) |
265 | { | 264 | { |
266 | struct rmd160_ctx *rctx = crypto_tfm_ctx(tfm); | 265 | struct rmd160_ctx *rctx = shash_desc_ctx(desc); |
267 | 266 | ||
268 | rctx->byte_count = 0; | 267 | rctx->byte_count = 0; |
269 | 268 | ||
@@ -274,12 +273,14 @@ static void rmd160_init(struct crypto_tfm *tfm) | |||
274 | rctx->state[4] = RMD_H4; | 273 | rctx->state[4] = RMD_H4; |
275 | 274 | ||
276 | memset(rctx->buffer, 0, sizeof(rctx->buffer)); | 275 | memset(rctx->buffer, 0, sizeof(rctx->buffer)); |
276 | |||
277 | return 0; | ||
277 | } | 278 | } |
278 | 279 | ||
279 | static void rmd160_update(struct crypto_tfm *tfm, const u8 *data, | 280 | static int rmd160_update(struct shash_desc *desc, const u8 *data, |
280 | unsigned int len) | 281 | unsigned int len) |
281 | { | 282 | { |
282 | struct rmd160_ctx *rctx = crypto_tfm_ctx(tfm); | 283 | struct rmd160_ctx *rctx = shash_desc_ctx(desc); |
283 | const u32 avail = sizeof(rctx->buffer) - (rctx->byte_count & 0x3f); | 284 | const u32 avail = sizeof(rctx->buffer) - (rctx->byte_count & 0x3f); |
284 | 285 | ||
285 | rctx->byte_count += len; | 286 | rctx->byte_count += len; |
@@ -288,7 +289,7 @@ static void rmd160_update(struct crypto_tfm *tfm, const u8 *data, | |||
288 | if (avail > len) { | 289 | if (avail > len) { |
289 | memcpy((char *)rctx->buffer + (sizeof(rctx->buffer) - avail), | 290 | memcpy((char *)rctx->buffer + (sizeof(rctx->buffer) - avail), |
290 | data, len); | 291 | data, len); |
291 | return; | 292 | goto out; |
292 | } | 293 | } |
293 | 294 | ||
294 | memcpy((char *)rctx->buffer + (sizeof(rctx->buffer) - avail), | 295 | memcpy((char *)rctx->buffer + (sizeof(rctx->buffer) - avail), |
@@ -306,12 +307,15 @@ static void rmd160_update(struct crypto_tfm *tfm, const u8 *data, | |||
306 | } | 307 | } |
307 | 308 | ||
308 | memcpy(rctx->buffer, data, len); | 309 | memcpy(rctx->buffer, data, len); |
310 | |||
311 | out: | ||
312 | return 0; | ||
309 | } | 313 | } |
310 | 314 | ||
311 | /* Add padding and return the message digest. */ | 315 | /* Add padding and return the message digest. */ |
312 | static void rmd160_final(struct crypto_tfm *tfm, u8 *out) | 316 | static int rmd160_final(struct shash_desc *desc, u8 *out) |
313 | { | 317 | { |
314 | struct rmd160_ctx *rctx = crypto_tfm_ctx(tfm); | 318 | struct rmd160_ctx *rctx = shash_desc_ctx(desc); |
315 | u32 i, index, padlen; | 319 | u32 i, index, padlen; |
316 | __le64 bits; | 320 | __le64 bits; |
317 | __le32 *dst = (__le32 *)out; | 321 | __le32 *dst = (__le32 *)out; |
@@ -322,10 +326,10 @@ static void rmd160_final(struct crypto_tfm *tfm, u8 *out) | |||
322 | /* Pad out to 56 mod 64 */ | 326 | /* Pad out to 56 mod 64 */ |
323 | index = rctx->byte_count & 0x3f; | 327 | index = rctx->byte_count & 0x3f; |
324 | padlen = (index < 56) ? (56 - index) : ((64+56) - index); | 328 | padlen = (index < 56) ? (56 - index) : ((64+56) - index); |
325 | rmd160_update(tfm, padding, padlen); | 329 | rmd160_update(desc, padding, padlen); |
326 | 330 | ||
327 | /* Append length */ | 331 | /* Append length */ |
328 | rmd160_update(tfm, (const u8 *)&bits, sizeof(bits)); | 332 | rmd160_update(desc, (const u8 *)&bits, sizeof(bits)); |
329 | 333 | ||
330 | /* Store state in digest */ | 334 | /* Store state in digest */ |
331 | for (i = 0; i < 5; i++) | 335 | for (i = 0; i < 5; i++) |
@@ -333,31 +337,32 @@ static void rmd160_final(struct crypto_tfm *tfm, u8 *out) | |||
333 | 337 | ||
334 | /* Wipe context */ | 338 | /* Wipe context */ |
335 | memset(rctx, 0, sizeof(*rctx)); | 339 | memset(rctx, 0, sizeof(*rctx)); |
340 | |||
341 | return 0; | ||
336 | } | 342 | } |
337 | 343 | ||
338 | static struct crypto_alg alg = { | 344 | static struct shash_alg alg = { |
339 | .cra_name = "rmd160", | 345 | .digestsize = RMD160_DIGEST_SIZE, |
340 | .cra_driver_name = "rmd160", | 346 | .init = rmd160_init, |
341 | .cra_flags = CRYPTO_ALG_TYPE_DIGEST, | 347 | .update = rmd160_update, |
342 | .cra_blocksize = RMD160_BLOCK_SIZE, | 348 | .final = rmd160_final, |
343 | .cra_ctxsize = sizeof(struct rmd160_ctx), | 349 | .descsize = sizeof(struct rmd160_ctx), |
344 | .cra_module = THIS_MODULE, | 350 | .base = { |
345 | .cra_list = LIST_HEAD_INIT(alg.cra_list), | 351 | .cra_name = "rmd160", |
346 | .cra_u = { .digest = { | 352 | .cra_flags = CRYPTO_ALG_TYPE_SHASH, |
347 | .dia_digestsize = RMD160_DIGEST_SIZE, | 353 | .cra_blocksize = RMD160_BLOCK_SIZE, |
348 | .dia_init = rmd160_init, | 354 | .cra_module = THIS_MODULE, |
349 | .dia_update = rmd160_update, | 355 | } |
350 | .dia_final = rmd160_final } } | ||
351 | }; | 356 | }; |
352 | 357 | ||
353 | static int __init rmd160_mod_init(void) | 358 | static int __init rmd160_mod_init(void) |
354 | { | 359 | { |
355 | return crypto_register_alg(&alg); | 360 | return crypto_register_shash(&alg); |
356 | } | 361 | } |
357 | 362 | ||
358 | static void __exit rmd160_mod_fini(void) | 363 | static void __exit rmd160_mod_fini(void) |
359 | { | 364 | { |
360 | crypto_unregister_alg(&alg); | 365 | crypto_unregister_shash(&alg); |
361 | } | 366 | } |
362 | 367 | ||
363 | module_init(rmd160_mod_init); | 368 | module_init(rmd160_mod_init); |
@@ -365,5 +370,3 @@ module_exit(rmd160_mod_fini); | |||
365 | 370 | ||
366 | MODULE_LICENSE("GPL"); | 371 | MODULE_LICENSE("GPL"); |
367 | MODULE_DESCRIPTION("RIPEMD-160 Message Digest"); | 372 | MODULE_DESCRIPTION("RIPEMD-160 Message Digest"); |
368 | |||
369 | MODULE_ALIAS("rmd160"); | ||