Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

s390x: Optimize kmac #18863

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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