diff options
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/Kconfig | 2 | ||||
-rw-r--r-- | crypto/rmd256.c | 61 |
2 files changed, 33 insertions, 30 deletions
diff --git a/crypto/Kconfig b/crypto/Kconfig index 513b9fb6723d..7f3d7954c929 100644 --- a/crypto/Kconfig +++ b/crypto/Kconfig | |||
@@ -327,7 +327,7 @@ config CRYPTO_RMD160 | |||
327 | 327 | ||
328 | config CRYPTO_RMD256 | 328 | config CRYPTO_RMD256 |
329 | tristate "RIPEMD-256 digest algorithm" | 329 | tristate "RIPEMD-256 digest algorithm" |
330 | select CRYPTO_ALGAPI | 330 | select CRYPTO_HASH |
331 | help | 331 | help |
332 | RIPEMD-256 is an optional extension of RIPEMD-128 with a | 332 | RIPEMD-256 is an optional extension of RIPEMD-128 with a |
333 | 256 bit hash. It is intended for applications that require | 333 | 256 bit hash. It is intended for applications that require |
diff --git a/crypto/rmd256.c b/crypto/rmd256.c index e3de5b4cb47f..72eafa8d2e7b 100644 --- a/crypto/rmd256.c +++ b/crypto/rmd256.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 | ||
@@ -233,9 +232,9 @@ static void rmd256_transform(u32 *state, const __le32 *in) | |||
233 | return; | 232 | return; |
234 | } | 233 | } |
235 | 234 | ||
236 | static void rmd256_init(struct crypto_tfm *tfm) | 235 | static int rmd256_init(struct shash_desc *desc) |
237 | { | 236 | { |
238 | struct rmd256_ctx *rctx = crypto_tfm_ctx(tfm); | 237 | struct rmd256_ctx *rctx = shash_desc_ctx(desc); |
239 | 238 | ||
240 | rctx->byte_count = 0; | 239 | rctx->byte_count = 0; |
241 | 240 | ||
@@ -249,12 +248,14 @@ static void rmd256_init(struct crypto_tfm *tfm) | |||
249 | rctx->state[7] = RMD_H8; | 248 | rctx->state[7] = RMD_H8; |
250 | 249 | ||
251 | memset(rctx->buffer, 0, sizeof(rctx->buffer)); | 250 | memset(rctx->buffer, 0, sizeof(rctx->buffer)); |
251 | |||
252 | return 0; | ||
252 | } | 253 | } |
253 | 254 | ||
254 | static void rmd256_update(struct crypto_tfm *tfm, const u8 *data, | 255 | static int rmd256_update(struct shash_desc *desc, const u8 *data, |
255 | unsigned int len) | 256 | unsigned int len) |
256 | { | 257 | { |
257 | struct rmd256_ctx *rctx = crypto_tfm_ctx(tfm); | 258 | struct rmd256_ctx *rctx = shash_desc_ctx(desc); |
258 | const u32 avail = sizeof(rctx->buffer) - (rctx->byte_count & 0x3f); | 259 | const u32 avail = sizeof(rctx->buffer) - (rctx->byte_count & 0x3f); |
259 | 260 | ||
260 | rctx->byte_count += len; | 261 | rctx->byte_count += len; |
@@ -263,7 +264,7 @@ static void rmd256_update(struct crypto_tfm *tfm, const u8 *data, | |||
263 | if (avail > len) { | 264 | if (avail > len) { |
264 | memcpy((char *)rctx->buffer + (sizeof(rctx->buffer) - avail), | 265 | memcpy((char *)rctx->buffer + (sizeof(rctx->buffer) - avail), |
265 | data, len); | 266 | data, len); |
266 | return; | 267 | goto out; |
267 | } | 268 | } |
268 | 269 | ||
269 | memcpy((char *)rctx->buffer + (sizeof(rctx->buffer) - avail), | 270 | memcpy((char *)rctx->buffer + (sizeof(rctx->buffer) - avail), |
@@ -281,12 +282,15 @@ static void rmd256_update(struct crypto_tfm *tfm, const u8 *data, | |||
281 | } | 282 | } |
282 | 283 | ||
283 | memcpy(rctx->buffer, data, len); | 284 | memcpy(rctx->buffer, data, len); |
285 | |||
286 | out: | ||
287 | return 0; | ||
284 | } | 288 | } |
285 | 289 | ||
286 | /* Add padding and return the message digest. */ | 290 | /* Add padding and return the message digest. */ |
287 | static void rmd256_final(struct crypto_tfm *tfm, u8 *out) | 291 | static int rmd256_final(struct shash_desc *desc, u8 *out) |
288 | { | 292 | { |
289 | struct rmd256_ctx *rctx = crypto_tfm_ctx(tfm); | 293 | struct rmd256_ctx *rctx = shash_desc_ctx(desc); |
290 | u32 i, index, padlen; | 294 | u32 i, index, padlen; |
291 | __le64 bits; | 295 | __le64 bits; |
292 | __le32 *dst = (__le32 *)out; | 296 | __le32 *dst = (__le32 *)out; |
@@ -297,10 +301,10 @@ static void rmd256_final(struct crypto_tfm *tfm, u8 *out) | |||
297 | /* Pad out to 56 mod 64 */ | 301 | /* Pad out to 56 mod 64 */ |
298 | index = rctx->byte_count & 0x3f; | 302 | index = rctx->byte_count & 0x3f; |
299 | padlen = (index < 56) ? (56 - index) : ((64+56) - index); | 303 | padlen = (index < 56) ? (56 - index) : ((64+56) - index); |
300 | rmd256_update(tfm, padding, padlen); | 304 | rmd256_update(desc, padding, padlen); |
301 | 305 | ||
302 | /* Append length */ | 306 | /* Append length */ |
303 | rmd256_update(tfm, (const u8 *)&bits, sizeof(bits)); | 307 | rmd256_update(desc, (const u8 *)&bits, sizeof(bits)); |
304 | 308 | ||
305 | /* Store state in digest */ | 309 | /* Store state in digest */ |
306 | for (i = 0; i < 8; i++) | 310 | for (i = 0; i < 8; i++) |
@@ -308,31 +312,32 @@ static void rmd256_final(struct crypto_tfm *tfm, u8 *out) | |||
308 | 312 | ||
309 | /* Wipe context */ | 313 | /* Wipe context */ |
310 | memset(rctx, 0, sizeof(*rctx)); | 314 | memset(rctx, 0, sizeof(*rctx)); |
315 | |||
316 | return 0; | ||
311 | } | 317 | } |
312 | 318 | ||
313 | static struct crypto_alg alg = { | 319 | static struct shash_alg alg = { |
314 | .cra_name = "rmd256", | 320 | .digestsize = RMD256_DIGEST_SIZE, |
315 | .cra_driver_name = "rmd256", | 321 | .init = rmd256_init, |
316 | .cra_flags = CRYPTO_ALG_TYPE_DIGEST, | 322 | .update = rmd256_update, |
317 | .cra_blocksize = RMD256_BLOCK_SIZE, | 323 | .final = rmd256_final, |
318 | .cra_ctxsize = sizeof(struct rmd256_ctx), | 324 | .descsize = sizeof(struct rmd256_ctx), |
319 | .cra_module = THIS_MODULE, | 325 | .base = { |
320 | .cra_list = LIST_HEAD_INIT(alg.cra_list), | 326 | .cra_name = "rmd256", |
321 | .cra_u = { .digest = { | 327 | .cra_flags = CRYPTO_ALG_TYPE_SHASH, |
322 | .dia_digestsize = RMD256_DIGEST_SIZE, | 328 | .cra_blocksize = RMD256_BLOCK_SIZE, |
323 | .dia_init = rmd256_init, | 329 | .cra_module = THIS_MODULE, |
324 | .dia_update = rmd256_update, | 330 | } |
325 | .dia_final = rmd256_final } } | ||
326 | }; | 331 | }; |
327 | 332 | ||
328 | static int __init rmd256_mod_init(void) | 333 | static int __init rmd256_mod_init(void) |
329 | { | 334 | { |
330 | return crypto_register_alg(&alg); | 335 | return crypto_register_shash(&alg); |
331 | } | 336 | } |
332 | 337 | ||
333 | static void __exit rmd256_mod_fini(void) | 338 | static void __exit rmd256_mod_fini(void) |
334 | { | 339 | { |
335 | crypto_unregister_alg(&alg); | 340 | crypto_unregister_shash(&alg); |
336 | } | 341 | } |
337 | 342 | ||
338 | module_init(rmd256_mod_init); | 343 | module_init(rmd256_mod_init); |
@@ -340,5 +345,3 @@ module_exit(rmd256_mod_fini); | |||
340 | 345 | ||
341 | MODULE_LICENSE("GPL"); | 346 | MODULE_LICENSE("GPL"); |
342 | MODULE_DESCRIPTION("RIPEMD-256 Message Digest"); | 347 | MODULE_DESCRIPTION("RIPEMD-256 Message Digest"); |
343 | |||
344 | MODULE_ALIAS("rmd256"); | ||