diff options
author | Juergen Christ <jchrist@linux.ibm.com> | 2023-01-02 17:52:25 +0100 |
---|---|---|
committer | Tomas Mraz <tomas@openssl.org> | 2023-01-16 17:07:47 +0100 |
commit | 76aa4f3ac0d76e58f2111cbf87ae7f25c8766190 (patch) | |
tree | 9c205bfb0b4c36f3c767653239097453cdc8c18e /providers | |
parent | cd7a8e96bbdbedb05f7f13a8fb13fb5d9d0d17a6 (diff) |
s390x: Fix keccak xofs via CPACF
CPACF does not directly support xofs. Emulate this by using single block
operations on an empty input block.
Fixes: affc070aabc9 ("s390x: Optimize kmac")
Signed-off-by: Juergen Christ <jchrist@linux.ibm.com>
Reviewed-by: Shane Lontis <shane.lontis@oracle.com>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/19983)
Diffstat (limited to 'providers')
-rw-r--r-- | providers/implementations/digests/sha3_prov.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/providers/implementations/digests/sha3_prov.c b/providers/implementations/digests/sha3_prov.c index 25f630a4c3..33dc6660bf 100644 --- a/providers/implementations/digests/sha3_prov.c +++ b/providers/implementations/digests/sha3_prov.c @@ -182,6 +182,8 @@ static int s390x_keccakc_final(unsigned char *md, void *vctx, int padding) KECCAK1600_CTX *ctx = vctx; size_t bsz = ctx->block_size; size_t num = ctx->bufsz; + size_t needed = ctx->md_size; + static const unsigned char empty[KECCAK1600_WIDTH / 8] = {0}; if (!ossl_prov_is_running()) return 0; @@ -191,7 +193,14 @@ static int s390x_keccakc_final(unsigned char *md, void *vctx, int padding) ctx->buf[num] = padding; ctx->buf[bsz - 1] |= 0x80; s390x_kimd(ctx->buf, bsz, ctx->pad, ctx->A); - memcpy(md, ctx->A, ctx->md_size); + while (needed > bsz) { + memcpy(md, ctx->A, bsz); + needed -= bsz; + md += bsz; + s390x_kimd(empty, bsz, ctx->pad, ctx->A); + } + memcpy(md, ctx->A, needed); + return 1; } |