[PATCH 5/5] dilithium-kyber: Added ppc64le dilithium and kyber (i)NTT support.
Danny Tsen via Gcrypt-devel <[email protected]> Mon, 23 Feb 2026 18:27:53 -0600
| Newsgroups | gmane.comp.encryption.gpg.libgcrypt.devel |
|---|---|
| Message-ID | <[email protected]> |
Updated the following files to ENABLE_PPC_DILITHIUM and ENABLE_PPC_KYBER, dilithium-common.c, kyber-common.c and configure.ac Signed-off-by: Danny Tsen <[email protected]> --- cipher/dilithium-common.c | 13 +++++++++++++ cipher/kyber-common.c | 13 +++++++++++++ configure.ac | 20 ++++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/cipher/dilithium-common.c b/cipher/dilithium-common.c index d16f22f7..0f3d2d96 100644 --- a/cipher/dilithium-common.c +++ b/cipher/dilithium-common.c @@ -50,6 +50,18 @@ static void invntt_tomont(int32_t a[N]); /*************** dilithium/ref/ntt.c */ +#ifdef ENABLE_PPC_DILITHIUM +extern void mldsa_ntt_ppc(int32_t a[N]); +extern void mldsa_intt_ppc(int32_t a[N]); + +void ntt(int32_t a[N]) { + mldsa_ntt_ppc(a); +} + +void invntt_tomont(int32_t a[N]) { + mldsa_intt_ppc(a); +} +#else static const int32_t zetas[N] = { 0, 25847, -2608894, -518909, 237124, -777960, -876248, 466468, 1826347, 2353451, -359251, -2091905, 3119733, -2884855, 3111497, 2680103, @@ -143,6 +155,7 @@ void invntt_tomont(int32_t a[N]) { a[j] = montgomery_reduce((int64_t)f * a[j]); } } +#endif /*************** dilithium/ref/rounding.h */ #if !defined(DILITHIUM_MODE) || DILITHIUM_MODE == 2 static int32_t decompose_88(int32_t *a0, int32_t a); diff --git a/cipher/kyber-common.c b/cipher/kyber-common.c index 54377788..278d0b0b 100644 --- a/cipher/kyber-common.c +++ b/cipher/kyber-common.c @@ -273,6 +273,18 @@ static int16_t fqmul(int16_t a, int16_t b) { return montgomery_reduce((int32_t)a*b); } +#ifdef ENABLE_PPC_KYBER +extern void ntt_ppc(int16_t r[256]); +extern void intt_ppc(int16_t r[256]); + +void ntt(int16_t r[256]) { + ntt_ppc(r); +} + +void invntt(int16_t r[256]) { + intt_ppc(r); +} +#else /************************************************* * Name: ntt * @@ -328,6 +340,7 @@ void invntt(int16_t r[256]) { for(j = 0; j < 256; j++) r[j] = fqmul(r[j], f); } +#endif /************************************************* * Name: basemul diff --git a/configure.ac b/configure.ac index 00572b45..49a094fe 100644 --- a/configure.ac +++ b/configure.ac @@ -3828,6 +3828,16 @@ if test "$found" = "1" ; then GCRYPT_PUBKEY_CIPHERS="$GCRYPT_PUBKEY_CIPHERS \ kyber.lo" AC_DEFINE(USE_KYBER, 1, [Defined if this module should be included]) + + case "${host}" in + powerpc64le-*-*) + if test "$gcry_cv_gcc_inline_asm_ppc_altivec" = "yes" ; then + AC_DEFINE(ENABLE_PPC_KYBER, 1, [Enable support for PPC optimized kyber.]) + GCRYPT_PUBKEY_CIPHERS="$GCRYPT_PUBKEY_CIPHERS kyber_ntt_p8le.lo" + GCRYPT_PUBKEY_CIPHERS="$GCRYPT_PUBKEY_CIPHERS kyber_intt_p8le.lo" + fi + ;; + esac fi LIST_MEMBER(dilithium, $enabled_pubkey_ciphers) @@ -3836,6 +3846,16 @@ if test "$found" = "1" ; then GCRYPT_PUBKEY_CIPHERS="$GCRYPT_PUBKEY_CIPHERS \ dilithium.lo pubkey-dilithium.lo" AC_DEFINE(USE_DILITHIUM, 1, [Defined if this module should be included]) + + case "${host}" in + powerpc64le-*-*) + if test "$gcry_cv_gcc_inline_asm_ppc_altivec" = "yes" ; then + AC_DEFINE(ENABLE_PPC_DILITHIUM, 1, [Enable support for PPC optimized dilithium.]) + GCRYPT_PUBKEY_CIPHERS="$GCRYPT_PUBKEY_CIPHERS dilithium_ntt_p8le.lo" + GCRYPT_PUBKEY_CIPHERS="$GCRYPT_PUBKEY_CIPHERS dilithium_intt_p8le.lo" + fi + ;; + esac fi LIST_MEMBER(crc, $enabled_digests) -- 2.47.3