diff options
-rw-r--r-- | crypto/shash.c | 39 | ||||
-rw-r--r-- | include/crypto/hash.h | 3 | ||||
-rw-r--r-- | include/crypto/internal/hash.h | 2 |
3 files changed, 31 insertions, 13 deletions
diff --git a/crypto/shash.c b/crypto/shash.c index 131e14d2b572..d8e0f8f8d672 100644 --- a/crypto/shash.c +++ b/crypto/shash.c | |||
@@ -300,14 +300,16 @@ static int crypto_init_shash_ops_async(struct crypto_tfm *tfm) | |||
300 | static int shash_compat_setkey(struct crypto_hash *tfm, const u8 *key, | 300 | static int shash_compat_setkey(struct crypto_hash *tfm, const u8 *key, |
301 | unsigned int keylen) | 301 | unsigned int keylen) |
302 | { | 302 | { |
303 | struct shash_desc *desc = crypto_hash_ctx(tfm); | 303 | struct shash_desc **descp = crypto_hash_ctx(tfm); |
304 | struct shash_desc *desc = *descp; | ||
304 | 305 | ||
305 | return crypto_shash_setkey(desc->tfm, key, keylen); | 306 | return crypto_shash_setkey(desc->tfm, key, keylen); |
306 | } | 307 | } |
307 | 308 | ||
308 | static int shash_compat_init(struct hash_desc *hdesc) | 309 | static int shash_compat_init(struct hash_desc *hdesc) |
309 | { | 310 | { |
310 | struct shash_desc *desc = crypto_hash_ctx(hdesc->tfm); | 311 | struct shash_desc **descp = crypto_hash_ctx(hdesc->tfm); |
312 | struct shash_desc *desc = *descp; | ||
311 | 313 | ||
312 | desc->flags = hdesc->flags; | 314 | desc->flags = hdesc->flags; |
313 | 315 | ||
@@ -317,7 +319,8 @@ static int shash_compat_init(struct hash_desc *hdesc) | |||
317 | static int shash_compat_update(struct hash_desc *hdesc, struct scatterlist *sg, | 319 | static int shash_compat_update(struct hash_desc *hdesc, struct scatterlist *sg, |
318 | unsigned int len) | 320 | unsigned int len) |
319 | { | 321 | { |
320 | struct shash_desc *desc = crypto_hash_ctx(hdesc->tfm); | 322 | struct shash_desc **descp = crypto_hash_ctx(hdesc->tfm); |
323 | struct shash_desc *desc = *descp; | ||
321 | struct crypto_hash_walk walk; | 324 | struct crypto_hash_walk walk; |
322 | int nbytes; | 325 | int nbytes; |
323 | 326 | ||
@@ -330,7 +333,9 @@ static int shash_compat_update(struct hash_desc *hdesc, struct scatterlist *sg, | |||
330 | 333 | ||
331 | static int shash_compat_final(struct hash_desc *hdesc, u8 *out) | 334 | static int shash_compat_final(struct hash_desc *hdesc, u8 *out) |
332 | { | 335 | { |
333 | return crypto_shash_final(crypto_hash_ctx(hdesc->tfm), out); | 336 | struct shash_desc **descp = crypto_hash_ctx(hdesc->tfm); |
337 | |||
338 | return crypto_shash_final(*descp, out); | ||
334 | } | 339 | } |
335 | 340 | ||
336 | static int shash_compat_digest(struct hash_desc *hdesc, struct scatterlist *sg, | 341 | static int shash_compat_digest(struct hash_desc *hdesc, struct scatterlist *sg, |
@@ -340,7 +345,8 @@ static int shash_compat_digest(struct hash_desc *hdesc, struct scatterlist *sg, | |||
340 | int err; | 345 | int err; |
341 | 346 | ||
342 | if (nbytes < min(sg->length, ((unsigned int)(PAGE_SIZE)) - offset)) { | 347 | if (nbytes < min(sg->length, ((unsigned int)(PAGE_SIZE)) - offset)) { |
343 | struct shash_desc *desc = crypto_hash_ctx(hdesc->tfm); | 348 | struct shash_desc **descp = crypto_hash_ctx(hdesc->tfm); |
349 | struct shash_desc *desc = *descp; | ||
344 | void *data; | 350 | void *data; |
345 | 351 | ||
346 | desc->flags = hdesc->flags; | 352 | desc->flags = hdesc->flags; |
@@ -368,9 +374,11 @@ out: | |||
368 | 374 | ||
369 | static void crypto_exit_shash_ops_compat(struct crypto_tfm *tfm) | 375 | static void crypto_exit_shash_ops_compat(struct crypto_tfm *tfm) |
370 | { | 376 | { |
371 | struct shash_desc *desc= crypto_tfm_ctx(tfm); | 377 | struct shash_desc **descp = crypto_tfm_ctx(tfm); |
378 | struct shash_desc *desc = *descp; | ||
372 | 379 | ||
373 | crypto_free_shash(desc->tfm); | 380 | crypto_free_shash(desc->tfm); |
381 | kzfree(desc); | ||
374 | } | 382 | } |
375 | 383 | ||
376 | static int crypto_init_shash_ops_compat(struct crypto_tfm *tfm) | 384 | static int crypto_init_shash_ops_compat(struct crypto_tfm *tfm) |
@@ -378,8 +386,9 @@ static int crypto_init_shash_ops_compat(struct crypto_tfm *tfm) | |||
378 | struct hash_tfm *crt = &tfm->crt_hash; | 386 | struct hash_tfm *crt = &tfm->crt_hash; |
379 | struct crypto_alg *calg = tfm->__crt_alg; | 387 | struct crypto_alg *calg = tfm->__crt_alg; |
380 | struct shash_alg *alg = __crypto_shash_alg(calg); | 388 | struct shash_alg *alg = __crypto_shash_alg(calg); |
381 | struct shash_desc *desc = crypto_tfm_ctx(tfm); | 389 | struct shash_desc **descp = crypto_tfm_ctx(tfm); |
382 | struct crypto_shash *shash; | 390 | struct crypto_shash *shash; |
391 | struct shash_desc *desc; | ||
383 | 392 | ||
384 | if (!crypto_mod_get(calg)) | 393 | if (!crypto_mod_get(calg)) |
385 | return -EAGAIN; | 394 | return -EAGAIN; |
@@ -390,6 +399,14 @@ static int crypto_init_shash_ops_compat(struct crypto_tfm *tfm) | |||
390 | return PTR_ERR(shash); | 399 | return PTR_ERR(shash); |
391 | } | 400 | } |
392 | 401 | ||
402 | desc = kmalloc(sizeof(*desc) + crypto_shash_descsize(shash), | ||
403 | GFP_KERNEL); | ||
404 | if (!desc) { | ||
405 | crypto_free_shash(shash); | ||
406 | return -ENOMEM; | ||
407 | } | ||
408 | |||
409 | *descp = desc; | ||
393 | desc->tfm = shash; | 410 | desc->tfm = shash; |
394 | tfm->exit = crypto_exit_shash_ops_compat; | 411 | tfm->exit = crypto_exit_shash_ops_compat; |
395 | 412 | ||
@@ -419,11 +436,9 @@ static int crypto_init_shash_ops(struct crypto_tfm *tfm, u32 type, u32 mask) | |||
419 | static unsigned int crypto_shash_ctxsize(struct crypto_alg *alg, u32 type, | 436 | static unsigned int crypto_shash_ctxsize(struct crypto_alg *alg, u32 type, |
420 | u32 mask) | 437 | u32 mask) |
421 | { | 438 | { |
422 | struct shash_alg *salg = __crypto_shash_alg(alg); | ||
423 | |||
424 | switch (mask & CRYPTO_ALG_TYPE_MASK) { | 439 | switch (mask & CRYPTO_ALG_TYPE_MASK) { |
425 | case CRYPTO_ALG_TYPE_HASH_MASK: | 440 | case CRYPTO_ALG_TYPE_HASH_MASK: |
426 | return sizeof(struct shash_desc) + salg->descsize; | 441 | return sizeof(struct shash_desc *); |
427 | case CRYPTO_ALG_TYPE_AHASH_MASK: | 442 | case CRYPTO_ALG_TYPE_AHASH_MASK: |
428 | return sizeof(struct crypto_shash *); | 443 | return sizeof(struct crypto_shash *); |
429 | } | 444 | } |
@@ -434,6 +449,9 @@ static unsigned int crypto_shash_ctxsize(struct crypto_alg *alg, u32 type, | |||
434 | static int crypto_shash_init_tfm(struct crypto_tfm *tfm, | 449 | static int crypto_shash_init_tfm(struct crypto_tfm *tfm, |
435 | const struct crypto_type *frontend) | 450 | const struct crypto_type *frontend) |
436 | { | 451 | { |
452 | struct crypto_shash *hash = __crypto_shash_cast(tfm); | ||
453 | |||
454 | hash->descsize = crypto_shash_alg(hash)->descsize; | ||
437 | return 0; | 455 | return 0; |
438 | } | 456 | } |
439 | 457 | ||
@@ -452,7 +470,6 @@ static void crypto_shash_show(struct seq_file *m, struct crypto_alg *alg) | |||
452 | seq_printf(m, "type : shash\n"); | 470 | seq_printf(m, "type : shash\n"); |
453 | seq_printf(m, "blocksize : %u\n", alg->cra_blocksize); | 471 | seq_printf(m, "blocksize : %u\n", alg->cra_blocksize); |
454 | seq_printf(m, "digestsize : %u\n", salg->digestsize); | 472 | seq_printf(m, "digestsize : %u\n", salg->digestsize); |
455 | seq_printf(m, "descsize : %u\n", salg->descsize); | ||
456 | } | 473 | } |
457 | 474 | ||
458 | static const struct crypto_type crypto_shash_type = { | 475 | static const struct crypto_type crypto_shash_type = { |
diff --git a/include/crypto/hash.h b/include/crypto/hash.h index f74214a4b01b..fcc02d978231 100644 --- a/include/crypto/hash.h +++ b/include/crypto/hash.h | |||
@@ -48,6 +48,7 @@ struct crypto_ahash { | |||
48 | }; | 48 | }; |
49 | 49 | ||
50 | struct crypto_shash { | 50 | struct crypto_shash { |
51 | unsigned int descsize; | ||
51 | struct crypto_tfm base; | 52 | struct crypto_tfm base; |
52 | }; | 53 | }; |
53 | 54 | ||
@@ -275,7 +276,7 @@ static inline void crypto_shash_clear_flags(struct crypto_shash *tfm, u32 flags) | |||
275 | 276 | ||
276 | static inline unsigned int crypto_shash_descsize(struct crypto_shash *tfm) | 277 | static inline unsigned int crypto_shash_descsize(struct crypto_shash *tfm) |
277 | { | 278 | { |
278 | return crypto_shash_alg(tfm)->descsize; | 279 | return tfm->descsize; |
279 | } | 280 | } |
280 | 281 | ||
281 | static inline void *shash_desc_ctx(struct shash_desc *desc) | 282 | static inline void *shash_desc_ctx(struct shash_desc *desc) |
diff --git a/include/crypto/internal/hash.h b/include/crypto/internal/hash.h index 069b93e1a8ec..2d1b10f23c91 100644 --- a/include/crypto/internal/hash.h +++ b/include/crypto/internal/hash.h | |||
@@ -135,7 +135,7 @@ static inline void *crypto_shash_ctx_aligned(struct crypto_shash *tfm) | |||
135 | 135 | ||
136 | static inline struct crypto_shash *__crypto_shash_cast(struct crypto_tfm *tfm) | 136 | static inline struct crypto_shash *__crypto_shash_cast(struct crypto_tfm *tfm) |
137 | { | 137 | { |
138 | return (struct crypto_shash *)tfm; | 138 | return container_of(tfm, struct crypto_shash, base); |
139 | } | 139 | } |
140 | 140 | ||
141 | #endif /* _CRYPTO_INTERNAL_HASH_H */ | 141 | #endif /* _CRYPTO_INTERNAL_HASH_H */ |