mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
crypto: arm64/sha-ce - implement export/import
When an ahash algorithm fallback to another ahash and that fallback is shaXXX-CE, doing export/import lead to error like this: alg: ahash: sha1-sun8i-ce export() overran state buffer on test vector 0, cfg=\"import/export\" This is due to the descsize of shaxxx-ce being larger than struct shaxxx_state off by an u32. For fixing this, let's implement export/import which rip the finalize variant instead of using generic export/import. Fixes:6ba6c74dfc
("arm64/crypto: SHA-224/SHA-256 using ARMv8 Crypto Extensions") Fixes:2c98833a42
("arm64/crypto: SHA-1 using ARMv8 Crypto Extensions") Signed-off-by: Corentin Labbe <clabbe@baylibre.com> Reviewed-by: Ard Biesheuvel <ardb@kernel.org> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
567be3a5d2
commit
d282eeeb11
2 changed files with 43 additions and 0 deletions
|
@ -91,12 +91,32 @@ static int sha1_ce_final(struct shash_desc *desc, u8 *out)
|
|||
return sha1_base_finish(desc, out);
|
||||
}
|
||||
|
||||
static int sha1_ce_export(struct shash_desc *desc, void *out)
|
||||
{
|
||||
struct sha1_ce_state *sctx = shash_desc_ctx(desc);
|
||||
|
||||
memcpy(out, &sctx->sst, sizeof(struct sha1_state));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sha1_ce_import(struct shash_desc *desc, const void *in)
|
||||
{
|
||||
struct sha1_ce_state *sctx = shash_desc_ctx(desc);
|
||||
|
||||
memcpy(&sctx->sst, in, sizeof(struct sha1_state));
|
||||
sctx->finalize = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct shash_alg alg = {
|
||||
.init = sha1_base_init,
|
||||
.update = sha1_ce_update,
|
||||
.final = sha1_ce_final,
|
||||
.finup = sha1_ce_finup,
|
||||
.import = sha1_ce_import,
|
||||
.export = sha1_ce_export,
|
||||
.descsize = sizeof(struct sha1_ce_state),
|
||||
.statesize = sizeof(struct sha1_state),
|
||||
.digestsize = SHA1_DIGEST_SIZE,
|
||||
.base = {
|
||||
.cra_name = "sha1",
|
||||
|
|
|
@ -109,12 +109,32 @@ static int sha256_ce_final(struct shash_desc *desc, u8 *out)
|
|||
return sha256_base_finish(desc, out);
|
||||
}
|
||||
|
||||
static int sha256_ce_export(struct shash_desc *desc, void *out)
|
||||
{
|
||||
struct sha256_ce_state *sctx = shash_desc_ctx(desc);
|
||||
|
||||
memcpy(out, &sctx->sst, sizeof(struct sha256_state));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sha256_ce_import(struct shash_desc *desc, const void *in)
|
||||
{
|
||||
struct sha256_ce_state *sctx = shash_desc_ctx(desc);
|
||||
|
||||
memcpy(&sctx->sst, in, sizeof(struct sha256_state));
|
||||
sctx->finalize = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct shash_alg algs[] = { {
|
||||
.init = sha224_base_init,
|
||||
.update = sha256_ce_update,
|
||||
.final = sha256_ce_final,
|
||||
.finup = sha256_ce_finup,
|
||||
.export = sha256_ce_export,
|
||||
.import = sha256_ce_import,
|
||||
.descsize = sizeof(struct sha256_ce_state),
|
||||
.statesize = sizeof(struct sha256_state),
|
||||
.digestsize = SHA224_DIGEST_SIZE,
|
||||
.base = {
|
||||
.cra_name = "sha224",
|
||||
|
@ -128,7 +148,10 @@ static struct shash_alg algs[] = { {
|
|||
.update = sha256_ce_update,
|
||||
.final = sha256_ce_final,
|
||||
.finup = sha256_ce_finup,
|
||||
.export = sha256_ce_export,
|
||||
.import = sha256_ce_import,
|
||||
.descsize = sizeof(struct sha256_ce_state),
|
||||
.statesize = sizeof(struct sha256_state),
|
||||
.digestsize = SHA256_DIGEST_SIZE,
|
||||
.base = {
|
||||
.cra_name = "sha256",
|
||||
|
|
Loading…
Reference in a new issue