summaryrefslogtreecommitdiff
path: root/cipher
diff options
context:
space:
mode:
authorJussi Kivilinna <jussi.kivilinna@iki.fi>2023-01-04 19:41:24 +0200
committerJussi Kivilinna <jussi.kivilinna@iki.fi>2023-01-04 19:48:52 +0200
commit30c9a1d101b45908a17c68fa50f4cdf9bd113792 (patch)
treeb076ba496430fe9ccb26a23914e94f200d064fe9 /cipher
parent86db4b02c6e5fd41ae958fb5e1fcf3e296a820ad (diff)
downloadlibgcrypt-30c9a1d101b45908a17c68fa50f4cdf9bd113792.tar.gz
sm4: add missing OCB 16-way GFNI-AVX512 path
* cipher/sm4.c (_gcry_sm4_ocb_crypt) [USE_GFNI_AVX512]: Add 16-way GFNI-AVX512 handling. -- Signed-off-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
Diffstat (limited to 'cipher')
-rw-r--r--cipher/sm4.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/cipher/sm4.c b/cipher/sm4.c
index 0e89be78..b0402b64 100644
--- a/cipher/sm4.c
+++ b/cipher/sm4.c
@@ -1663,6 +1663,26 @@ _gcry_sm4_ocb_crypt (gcry_cipher_hd_t c, void *outbuf_arg,
inbuf += 32 * 16;
}
}
+
+ if (nblocks >= 16)
+ {
+ l = bulk_ocb_prepare_L_pointers_array_blk16 (c, Ls, blkn);
+
+ /* Process data in 16 block chunks. */
+ blkn += 16;
+ *l = (uintptr_t)(void *)ocb_get_l(c, blkn - blkn % 16);
+
+ if (encrypt)
+ _gcry_sm4_gfni_avx512_ocb_enc(ctx->rkey_enc, outbuf, inbuf,
+ c->u_iv.iv, c->u_ctr.ctr, Ls);
+ else
+ _gcry_sm4_gfni_avx512_ocb_dec(ctx->rkey_dec, outbuf, inbuf,
+ c->u_iv.iv, c->u_ctr.ctr, Ls);
+
+ nblocks -= 16;
+ outbuf += 16 * 16;
+ inbuf += 16 * 16;
+ }
}
#endif