Skip to content

Commit

Permalink
s390x: Optimize kmac
Browse files Browse the repository at this point in the history
Use hardware acceleration for kmac on s390x.  Since klmd does not support
kmac, perform padding of the last block by hand and use kimd.  Yields a
performance improvement of between 2x and 3x.

Signed-off-by: Juergen Christ <jchrist@linux.ibm.com>

Reviewed-by: Hugo Landau <hlandau@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from openssl#18863)
  • Loading branch information
juergenchrist authored and t8m committed Jul 26, 2022
1 parent 7a86cb6 commit affc070
Showing 1 changed file with 28 additions and 3 deletions.
31 changes: 28 additions & 3 deletions providers/implementations/digests/sha3_prov.c
Expand Up @@ -177,7 +177,8 @@ static int s390x_shake_final(unsigned char *md, void *vctx)
return 1;
}

static int s390x_keccak_final(unsigned char *md, void *vctx) {
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;
Expand All @@ -187,13 +188,23 @@ static int s390x_keccak_final(unsigned char *md, void *vctx) {
if (ctx->md_size == 0)
return 1;
memset(ctx->buf + num, 0, bsz - num);
ctx->buf[num] = 0x01;
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);
return 1;
}

static int s390x_keccak_final(unsigned char *md, void *vctx)
{
return s390x_keccakc_final(md, vctx, 0x01);
}

static int s390x_kmac_final(unsigned char *md, void *vctx)
{
return s390x_keccakc_final(md, vctx, 0x04);
}

static PROV_SHA3_METHOD sha3_s390x_md =
{
s390x_sha3_absorb,
Expand All @@ -212,15 +223,29 @@ static PROV_SHA3_METHOD shake_s390x_md =
s390x_shake_final
};

static PROV_SHA3_METHOD kmac_s390x_md =
{
s390x_sha3_absorb,
s390x_kmac_final
};

# define SHA3_SET_MD(uname, typ) \
if (S390_SHA3_CAPABLE(uname)) { \
ctx->pad = S390X_##uname; \
ctx->meth = typ##_s390x_md; \
} else { \
ctx->meth = sha3_generic_md; \
}
# define KMAC_SET_MD(bitlen) \
if (S390_SHA3_CAPABLE(SHAKE_##bitlen)) { \
ctx->pad = S390X_SHAKE_##bitlen; \
ctx->meth = kmac_s390x_md; \
} else { \
ctx->meth = sha3_generic_md; \
}
#else
# define SHA3_SET_MD(uname, typ) ctx->meth = sha3_generic_md;
# define KMAC_SET_MD(bitlen) ctx->meth = sha3_generic_md;
#endif /* S390_SHA3 */

#define SHA3_newctx(typ, uname, name, bitlen, pad) \
Expand All @@ -247,7 +272,7 @@ static void *uname##_newctx(void *provctx) \
if (ctx == NULL) \
return NULL; \
ossl_keccak_kmac_init(ctx, pad, bitlen); \
ctx->meth = sha3_generic_md; \
KMAC_SET_MD(bitlen) \
return ctx; \
}

Expand Down

0 comments on commit affc070

Please sign in to comment.