diff options
| -rw-r--r-- | crypto/Kconfig | 2 | ||||
| -rw-r--r-- | crypto/rmd320.c | 61 |
2 files changed, 33 insertions, 30 deletions
diff --git a/crypto/Kconfig b/crypto/Kconfig index 7f3d7954c929..edf6c71b576e 100644 --- a/crypto/Kconfig +++ b/crypto/Kconfig | |||
| @@ -339,7 +339,7 @@ config CRYPTO_RMD256 | |||
| 339 | 339 | ||
| 340 | config CRYPTO_RMD320 | 340 | config CRYPTO_RMD320 |
| 341 | tristate "RIPEMD-320 digest algorithm" | 341 | tristate "RIPEMD-320 digest algorithm" |
| 342 | select CRYPTO_ALGAPI | 342 | select CRYPTO_HASH |
| 343 | help | 343 | help |
| 344 | RIPEMD-320 is an optional extension of RIPEMD-160 with a | 344 | RIPEMD-320 is an optional extension of RIPEMD-160 with a |
| 345 | 320 bit hash. It is intended for applications that require | 345 | 320 bit hash. It is intended for applications that require |
diff --git a/crypto/rmd320.c b/crypto/rmd320.c index b143d66e42c8..86becaba2f05 100644 --- a/crypto/rmd320.c +++ b/crypto/rmd320.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 | ||
| @@ -280,9 +279,9 @@ static void rmd320_transform(u32 *state, const __le32 *in) | |||
| 280 | return; | 279 | return; |
| 281 | } | 280 | } |
| 282 | 281 | ||
| 283 | static void rmd320_init(struct crypto_tfm *tfm) | 282 | static int rmd320_init(struct shash_desc *desc) |
| 284 | { | 283 | { |
| 285 | struct rmd320_ctx *rctx = crypto_tfm_ctx(tfm); | 284 | struct rmd320_ctx *rctx = shash_desc_ctx(desc); |
| 286 | 285 | ||
| 287 | rctx->byte_count = 0; | 286 | rctx->byte_count = 0; |
| 288 | 287 | ||
| @@ -298,12 +297,14 @@ static void rmd320_init(struct crypto_tfm *tfm) | |||
| 298 | rctx->state[9] = RMD_H9; | 297 | rctx->state[9] = RMD_H9; |
| 299 | 298 | ||
| 300 | memset(rctx->buffer, 0, sizeof(rctx->buffer)); | 299 | memset(rctx->buffer, 0, sizeof(rctx->buffer)); |
| 300 | |||
| 301 | return 0; | ||
| 301 | } | 302 | } |
| 302 | 303 | ||
| 303 | static void rmd320_update(struct crypto_tfm *tfm, const u8 *data, | 304 | static int rmd320_update(struct shash_desc *desc, const u8 *data, |
| 304 | unsigned int len) | 305 | unsigned int len) |
| 305 | { | 306 | { |
| 306 | struct rmd320_ctx *rctx = crypto_tfm_ctx(tfm); | 307 | struct rmd320_ctx *rctx = shash_desc_ctx(desc); |
| 307 | const u32 avail = sizeof(rctx->buffer) - (rctx->byte_count & 0x3f); | 308 | const u32 avail = sizeof(rctx->buffer) - (rctx->byte_count & 0x3f); |
| 308 | 309 | ||
| 309 | rctx->byte_count += len; | 310 | rctx->byte_count += len; |
| @@ -312,7 +313,7 @@ static void rmd320_update(struct crypto_tfm *tfm, const u8 *data, | |||
| 312 | if (avail > len) { | 313 | if (avail > len) { |
| 313 | memcpy((char *)rctx->buffer + (sizeof(rctx->buffer) - avail), | 314 | memcpy((char *)rctx->buffer + (sizeof(rctx->buffer) - avail), |
| 314 | data, len); | 315 | data, len); |
| 315 | return; | 316 | goto out; |
| 316 | } | 317 | } |
| 317 | 318 | ||
| 318 | memcpy((char *)rctx->buffer + (sizeof(rctx->buffer) - avail), | 319 | memcpy((char *)rctx->buffer + (sizeof(rctx->buffer) - avail), |
| @@ -330,12 +331,15 @@ static void rmd320_update(struct crypto_tfm *tfm, const u8 *data, | |||
| 330 | } | 331 | } |
| 331 | 332 | ||
| 332 | memcpy(rctx->buffer, data, len); | 333 | memcpy(rctx->buffer, data, len); |
| 334 | |||
| 335 | out: | ||
| 336 | return 0; | ||
| 333 | } | 337 | } |
| 334 | 338 | ||
| 335 | /* Add padding and return the message digest. */ | 339 | /* Add padding and return the message digest. */ |
| 336 | static void rmd320_final(struct crypto_tfm *tfm, u8 *out) | 340 | static int rmd320_final(struct shash_desc *desc, u8 *out) |
| 337 | { | 341 | { |
| 338 | struct rmd320_ctx *rctx = crypto_tfm_ctx(tfm); | 342 | struct rmd320_ctx *rctx = shash_desc_ctx(desc); |
| 339 | u32 i, index, padlen; | 343 | u32 i, index, padlen; |
| 340 | __le64 bits; | 344 | __le64 bits; |
| 341 | __le32 *dst = (__le32 *)out; | 345 | __le32 *dst = (__le32 *)out; |
| @@ -346,10 +350,10 @@ static void rmd320_final(struct crypto_tfm *tfm, u8 *out) | |||
| 346 | /* Pad out to 56 mod 64 */ | 350 | /* Pad out to 56 mod 64 */ |
| 347 | index = rctx->byte_count & 0x3f; | 351 | index = rctx->byte_count & 0x3f; |
| 348 | padlen = (index < 56) ? (56 - index) : ((64+56) - index); | 352 | padlen = (index < 56) ? (56 - index) : ((64+56) - index); |
| 349 | rmd320_update(tfm, padding, padlen); | 353 | rmd320_update(desc, padding, padlen); |
| 350 | 354 | ||
| 351 | /* Append length */ | 355 | /* Append length */ |
| 352 | rmd320_update(tfm, (const u8 *)&bits, sizeof(bits)); | 356 | rmd320_update(desc, (const u8 *)&bits, sizeof(bits)); |
| 353 | 357 | ||
| 354 | /* Store state in digest */ | 358 | /* Store state in digest */ |
| 355 | for (i = 0; i < 10; i++) | 359 | for (i = 0; i < 10; i++) |
| @@ -357,31 +361,32 @@ static void rmd320_final(struct crypto_tfm *tfm, u8 *out) | |||
| 357 | 361 | ||
| 358 | /* Wipe context */ | 362 | /* Wipe context */ |
| 359 | memset(rctx, 0, sizeof(*rctx)); | 363 | memset(rctx, 0, sizeof(*rctx)); |
| 364 | |||
| 365 | return 0; | ||
| 360 | } | 366 | } |
| 361 | 367 | ||
| 362 | static struct crypto_alg alg = { | 368 | static struct shash_alg alg = { |
| 363 | .cra_name = "rmd320", | 369 | .digestsize = RMD320_DIGEST_SIZE, |
| 364 | .cra_driver_name = "rmd320", | 370 | .init = rmd320_init, |
| 365 | .cra_flags = CRYPTO_ALG_TYPE_DIGEST, | 371 | .update = rmd320_update, |
| 366 | .cra_blocksize = RMD320_BLOCK_SIZE, | 372 | .final = rmd320_final, |
| 367 | .cra_ctxsize = sizeof(struct rmd320_ctx), | 373 | .descsize = sizeof(struct rmd320_ctx), |
| 368 | .cra_module = THIS_MODULE, | 374 | .base = { |
| 369 | .cra_list = LIST_HEAD_INIT(alg.cra_list), | 375 | .cra_name = "rmd320", |
| 370 | .cra_u = { .digest = { | 376 | .cra_flags = CRYPTO_ALG_TYPE_SHASH, |
| 371 | .dia_digestsize = RMD320_DIGEST_SIZE, | 377 | .cra_blocksize = RMD320_BLOCK_SIZE, |
| 372 | .dia_init = rmd320_init, | 378 | .cra_module = THIS_MODULE, |
| 373 | .dia_update = rmd320_update, | 379 | } |
| 374 | .dia_final = rmd320_final } } | ||
| 375 | }; | 380 | }; |
| 376 | 381 | ||
| 377 | static int __init rmd320_mod_init(void) | 382 | static int __init rmd320_mod_init(void) |
| 378 | { | 383 | { |
| 379 | return crypto_register_alg(&alg); | 384 | return crypto_register_shash(&alg); |
| 380 | } | 385 | } |
| 381 | 386 | ||
| 382 | static void __exit rmd320_mod_fini(void) | 387 | static void __exit rmd320_mod_fini(void) |
| 383 | { | 388 | { |
| 384 | crypto_unregister_alg(&alg); | 389 | crypto_unregister_shash(&alg); |
| 385 | } | 390 | } |
| 386 | 391 | ||
| 387 | module_init(rmd320_mod_init); | 392 | module_init(rmd320_mod_init); |
| @@ -389,5 +394,3 @@ module_exit(rmd320_mod_fini); | |||
| 389 | 394 | ||
| 390 | MODULE_LICENSE("GPL"); | 395 | MODULE_LICENSE("GPL"); |
| 391 | MODULE_DESCRIPTION("RIPEMD-320 Message Digest"); | 396 | MODULE_DESCRIPTION("RIPEMD-320 Message Digest"); |
| 392 | |||
| 393 | MODULE_ALIAS("rmd320"); | ||
