Re: [PATCH] powerpc/crypto: Fix aes-gcm-p10 link errors

2023-05-29 Thread Vishal Chourasia

On 5/25/23 20:35, Michael Ellerman wrote:

The recently added P10 AES/GCM code added some files containing
CRYPTOGAMS perl-asm code which are near duplicates of the p8 files
found in drivers/crypto/vmx.

In particular the newly added files produce functions with identical
names to the existing code.

When the kernel is built with CONFIG_CRYPTO_AES_GCM_P10=y and
CONFIG_CRYPTO_DEV_VMX_ENCRYPT=y that leads to link errors, eg:

   ld: drivers/crypto/vmx/aesp8-ppc.o: in function `aes_p8_set_encrypt_key':
   (.text+0xa0): multiple definition of `aes_p8_set_encrypt_key'; 
arch/powerpc/crypto/aesp8-ppc.o:(.text+0xa0): first defined here
   ...
   ld: drivers/crypto/vmx/ghashp8-ppc.o: in function `gcm_ghash_p8':
   (.text+0x140): multiple definition of `gcm_ghash_p8'; 
arch/powerpc/crypto/ghashp8-ppc.o:(.text+0x2e4): first defined here

Fix it for now by renaming the newly added files and functions to use
"p10" instead of "p8" in the names.

Fixes: 45a4672b9a6e ("crypto: p10-aes-gcm - Update Kconfig and Makefile")
Signed-off-by: Michael Ellerman 
---
  arch/powerpc/crypto/Makefile   | 10 +-
  arch/powerpc/crypto/aes-gcm-p10-glue.c | 18 +-
  .../crypto/{aesp8-ppc.pl => aesp10-ppc.pl} |  2 +-
  .../crypto/{ghashp8-ppc.pl => ghashp10-ppc.pl} | 12 ++--
  4 files changed, 21 insertions(+), 21 deletions(-)
  rename arch/powerpc/crypto/{aesp8-ppc.pl => aesp10-ppc.pl} (99%)
  rename arch/powerpc/crypto/{ghashp8-ppc.pl => ghashp10-ppc.pl} (97%)


I missed adding tested-by in previous reply.

After applying the patch, I was able to successfully build the Linux 
kernel v6.4-rc4.


I encountered no errors during the build process. The issue pertaining 
to multiple

definitions of certain functions appears to be resolved.

λ grep -i CRYPTO_AES_GCM_P10 .config
CONFIG_CRYPTO_AES_GCM_P10=y

λ grep -i CRYPTO_DEV_VMX_ENCRYPT .config
CONFIG_CRYPTO_DEV_VMX_ENCRYPT=y

 + make O=${BUILD_DIR} CC=clang ARCH=powerpc
CROSS_COMPILE=powerpc64le-linux-gnu- -j16 -s vmlinux modules

Thank you for the well-detailed fix.

Tested-by: Vishal Chourasia 



Re: [PATCH] powerpc/crypto: Fix aes-gcm-p10 link errors

2023-05-29 Thread Vishal Chourasia
After applying the patch, I was able to successfully build the Linux 
kernel v6.4-rc4.
I encountered no errors during the build process. The issue pertaining 
to multiple

definitions of certain functions appears to be resolved.

λ grep -i CRYPTO_AES_GCM_P10 .config
CONFIG_CRYPTO_AES_GCM_P10=y

λ grep -i CRYPTO_DEV_VMX_ENCRYPT .config
CONFIG_CRYPTO_DEV_VMX_ENCRYPT=y

 + make O=${BUILD_DIR} CC=clang ARCH=powerpc
CROSS_COMPILE=powerpc64le-linux-gnu- -j16 -s vmlinux modules

Thank you for the well-detailed fix.

 -- vishal.c


On 5/25/23 20:35, Michael Ellerman wrote:

The recently added P10 AES/GCM code added some files containing
CRYPTOGAMS perl-asm code which are near duplicates of the p8 files
found in drivers/crypto/vmx.

In particular the newly added files produce functions with identical
names to the existing code.

When the kernel is built with CONFIG_CRYPTO_AES_GCM_P10=y and
CONFIG_CRYPTO_DEV_VMX_ENCRYPT=y that leads to link errors, eg:

   ld: drivers/crypto/vmx/aesp8-ppc.o: in function `aes_p8_set_encrypt_key':
   (.text+0xa0): multiple definition of `aes_p8_set_encrypt_key'; 
arch/powerpc/crypto/aesp8-ppc.o:(.text+0xa0): first defined here
   ...
   ld: drivers/crypto/vmx/ghashp8-ppc.o: in function `gcm_ghash_p8':
   (.text+0x140): multiple definition of `gcm_ghash_p8'; 
arch/powerpc/crypto/ghashp8-ppc.o:(.text+0x2e4): first defined here

Fix it for now by renaming the newly added files and functions to use
"p10" instead of "p8" in the names.

Fixes: 45a4672b9a6e ("crypto: p10-aes-gcm - Update Kconfig and Makefile")
Signed-off-by: Michael Ellerman 
---
  arch/powerpc/crypto/Makefile   | 10 +-
  arch/powerpc/crypto/aes-gcm-p10-glue.c | 18 +-
  .../crypto/{aesp8-ppc.pl => aesp10-ppc.pl} |  2 +-
  .../crypto/{ghashp8-ppc.pl => ghashp10-ppc.pl} | 12 ++--
  4 files changed, 21 insertions(+), 21 deletions(-)
  rename arch/powerpc/crypto/{aesp8-ppc.pl => aesp10-ppc.pl} (99%)
  rename arch/powerpc/crypto/{ghashp8-ppc.pl => ghashp10-ppc.pl} (97%)

diff --git a/arch/powerpc/crypto/Makefile b/arch/powerpc/crypto/Makefile
index 05c7486f42c5..7b4f516abec1 100644
--- a/arch/powerpc/crypto/Makefile
+++ b/arch/powerpc/crypto/Makefile
@@ -22,15 +22,15 @@ sha1-ppc-spe-y := sha1-spe-asm.o sha1-spe-glue.o
  sha256-ppc-spe-y := sha256-spe-asm.o sha256-spe-glue.o
  crc32c-vpmsum-y := crc32c-vpmsum_asm.o crc32c-vpmsum_glue.o
  crct10dif-vpmsum-y := crct10dif-vpmsum_asm.o crct10dif-vpmsum_glue.o
-aes-gcm-p10-crypto-y := aes-gcm-p10-glue.o aes-gcm-p10.o ghashp8-ppc.o 
aesp8-ppc.o
+aes-gcm-p10-crypto-y := aes-gcm-p10-glue.o aes-gcm-p10.o ghashp10-ppc.o 
aesp10-ppc.o
  
  quiet_cmd_perl = PERL$@

cmd_perl = $(PERL) $< $(if $(CONFIG_CPU_LITTLE_ENDIAN), linux-ppc64le, 
linux-ppc64) > $@
  
-targets += aesp8-ppc.S ghashp8-ppc.S

+targets += aesp10-ppc.S ghashp10-ppc.S
  
-$(obj)/aesp8-ppc.S $(obj)/ghashp8-ppc.S: $(obj)/%.S: $(src)/%.pl FORCE

+$(obj)/aesp10-ppc.S $(obj)/ghashp10-ppc.S: $(obj)/%.S: $(src)/%.pl FORCE
$(call if_changed,perl)
  
-OBJECT_FILES_NON_STANDARD_aesp8-ppc.o := y

-OBJECT_FILES_NON_STANDARD_ghashp8-ppc.o := y
+OBJECT_FILES_NON_STANDARD_aesp10-ppc.o := y
+OBJECT_FILES_NON_STANDARD_ghashp10-ppc.o := y
diff --git a/arch/powerpc/crypto/aes-gcm-p10-glue.c 
b/arch/powerpc/crypto/aes-gcm-p10-glue.c
index bd3475f5348d..4b6e899895e7 100644
--- a/arch/powerpc/crypto/aes-gcm-p10-glue.c
+++ b/arch/powerpc/crypto/aes-gcm-p10-glue.c
@@ -30,15 +30,15 @@ MODULE_AUTHOR("Danny Tsen   
-asmlinkage int aes_p8_set_encrypt_key(const u8 *userKey, const int bits,

+asmlinkage int aes_p10_set_encrypt_key(const u8 *userKey, const int bits,
  void *key);
-asmlinkage void aes_p8_encrypt(const u8 *in, u8 *out, const void *key);
+asmlinkage void aes_p10_encrypt(const u8 *in, u8 *out, const void *key);
  asmlinkage void aes_p10_gcm_encrypt(u8 *in, u8 *out, size_t len,
void *rkey, u8 *iv, void *Xi);
  asmlinkage void aes_p10_gcm_decrypt(u8 *in, u8 *out, size_t len,
void *rkey, u8 *iv, void *Xi);
  asmlinkage void gcm_init_htable(unsigned char htable[256], unsigned char 
Xi[16]);
-asmlinkage void gcm_ghash_p8(unsigned char *Xi, unsigned char *Htable,
+asmlinkage void gcm_ghash_p10(unsigned char *Xi, unsigned char *Htable,
unsigned char *aad, unsigned int alen);
  
  struct aes_key {

@@ -93,7 +93,7 @@ static void set_aad(struct gcm_ctx *gctx, struct Hash_ctx 
*hash,
gctx->aadLen = alen;
i = alen & ~0xf;
if (i) {
-   gcm_ghash_p8(nXi, hash->Htable+32, aad, i);
+   gcm_ghash_p10(nXi, hash->Htable+32, aad, i);
aad += i;
alen -= i;
}
@@ -102,7 +102,7 @@ static void set_aad(struct gcm_ctx *gctx, struct Hash_ctx 
*hash,
nXi[i] ^= aad[i];
  
  		memset(gctx->aad_hash, 0, 16);

-   gcm_ghash_p8(gctx->aad_hash, 

[PATCH] powerpc/crypto: Fix aes-gcm-p10 link errors

2023-05-25 Thread Michael Ellerman
The recently added P10 AES/GCM code added some files containing
CRYPTOGAMS perl-asm code which are near duplicates of the p8 files
found in drivers/crypto/vmx.

In particular the newly added files produce functions with identical
names to the existing code.

When the kernel is built with CONFIG_CRYPTO_AES_GCM_P10=y and
CONFIG_CRYPTO_DEV_VMX_ENCRYPT=y that leads to link errors, eg:

  ld: drivers/crypto/vmx/aesp8-ppc.o: in function `aes_p8_set_encrypt_key':
  (.text+0xa0): multiple definition of `aes_p8_set_encrypt_key'; 
arch/powerpc/crypto/aesp8-ppc.o:(.text+0xa0): first defined here
  ...
  ld: drivers/crypto/vmx/ghashp8-ppc.o: in function `gcm_ghash_p8':
  (.text+0x140): multiple definition of `gcm_ghash_p8'; 
arch/powerpc/crypto/ghashp8-ppc.o:(.text+0x2e4): first defined here

Fix it for now by renaming the newly added files and functions to use
"p10" instead of "p8" in the names.

Fixes: 45a4672b9a6e ("crypto: p10-aes-gcm - Update Kconfig and Makefile")
Signed-off-by: Michael Ellerman 
---
 arch/powerpc/crypto/Makefile   | 10 +-
 arch/powerpc/crypto/aes-gcm-p10-glue.c | 18 +-
 .../crypto/{aesp8-ppc.pl => aesp10-ppc.pl} |  2 +-
 .../crypto/{ghashp8-ppc.pl => ghashp10-ppc.pl} | 12 ++--
 4 files changed, 21 insertions(+), 21 deletions(-)
 rename arch/powerpc/crypto/{aesp8-ppc.pl => aesp10-ppc.pl} (99%)
 rename arch/powerpc/crypto/{ghashp8-ppc.pl => ghashp10-ppc.pl} (97%)

diff --git a/arch/powerpc/crypto/Makefile b/arch/powerpc/crypto/Makefile
index 05c7486f42c5..7b4f516abec1 100644
--- a/arch/powerpc/crypto/Makefile
+++ b/arch/powerpc/crypto/Makefile
@@ -22,15 +22,15 @@ sha1-ppc-spe-y := sha1-spe-asm.o sha1-spe-glue.o
 sha256-ppc-spe-y := sha256-spe-asm.o sha256-spe-glue.o
 crc32c-vpmsum-y := crc32c-vpmsum_asm.o crc32c-vpmsum_glue.o
 crct10dif-vpmsum-y := crct10dif-vpmsum_asm.o crct10dif-vpmsum_glue.o
-aes-gcm-p10-crypto-y := aes-gcm-p10-glue.o aes-gcm-p10.o ghashp8-ppc.o 
aesp8-ppc.o
+aes-gcm-p10-crypto-y := aes-gcm-p10-glue.o aes-gcm-p10.o ghashp10-ppc.o 
aesp10-ppc.o
 
 quiet_cmd_perl = PERL$@
   cmd_perl = $(PERL) $< $(if $(CONFIG_CPU_LITTLE_ENDIAN), linux-ppc64le, 
linux-ppc64) > $@
 
-targets += aesp8-ppc.S ghashp8-ppc.S
+targets += aesp10-ppc.S ghashp10-ppc.S
 
-$(obj)/aesp8-ppc.S $(obj)/ghashp8-ppc.S: $(obj)/%.S: $(src)/%.pl FORCE
+$(obj)/aesp10-ppc.S $(obj)/ghashp10-ppc.S: $(obj)/%.S: $(src)/%.pl FORCE
$(call if_changed,perl)
 
-OBJECT_FILES_NON_STANDARD_aesp8-ppc.o := y
-OBJECT_FILES_NON_STANDARD_ghashp8-ppc.o := y
+OBJECT_FILES_NON_STANDARD_aesp10-ppc.o := y
+OBJECT_FILES_NON_STANDARD_ghashp10-ppc.o := y
diff --git a/arch/powerpc/crypto/aes-gcm-p10-glue.c 
b/arch/powerpc/crypto/aes-gcm-p10-glue.c
index bd3475f5348d..4b6e899895e7 100644
--- a/arch/powerpc/crypto/aes-gcm-p10-glue.c
+++ b/arch/powerpc/crypto/aes-gcm-p10-glue.c
@@ -30,15 +30,15 @@ MODULE_AUTHOR("Danny Tsen aadLen = alen;
i = alen & ~0xf;
if (i) {
-   gcm_ghash_p8(nXi, hash->Htable+32, aad, i);
+   gcm_ghash_p10(nXi, hash->Htable+32, aad, i);
aad += i;
alen -= i;
}
@@ -102,7 +102,7 @@ static void set_aad(struct gcm_ctx *gctx, struct Hash_ctx 
*hash,
nXi[i] ^= aad[i];
 
memset(gctx->aad_hash, 0, 16);
-   gcm_ghash_p8(gctx->aad_hash, hash->Htable+32, nXi, 16);
+   gcm_ghash_p10(gctx->aad_hash, hash->Htable+32, nXi, 16);
} else {
memcpy(gctx->aad_hash, nXi, 16);
}
@@ -115,7 +115,7 @@ static void gcmp10_init(struct gcm_ctx *gctx, u8 *iv, 
unsigned char *rdkey,
 {
__be32 counter = cpu_to_be32(1);
 
-   aes_p8_encrypt(hash->H, hash->H, rdkey);
+   aes_p10_encrypt(hash->H, hash->H, rdkey);
set_subkey(hash->H);
gcm_init_htable(hash->Htable+32, hash->H);
 
@@ -126,7 +126,7 @@ static void gcmp10_init(struct gcm_ctx *gctx, u8 *iv, 
unsigned char *rdkey,
/*
 * Encrypt counter vector as iv tag and increment counter.
 */
-   aes_p8_encrypt(iv, gctx->ivtag, rdkey);
+   aes_p10_encrypt(iv, gctx->ivtag, rdkey);
 
counter = cpu_to_be32(2);
*((__be32 *)(iv+12)) = counter;
@@ -160,7 +160,7 @@ static void finish_tag(struct gcm_ctx *gctx, struct 
Hash_ctx *hash, int len)
/*
 * hash (AAD len and len)
 */
-   gcm_ghash_p8(hash->Htable, hash->Htable+32, aclen, 16);
+   gcm_ghash_p10(hash->Htable, hash->Htable+32, aclen, 16);
 
for (i = 0; i < 16; i++)
hash->Htable[i] ^= gctx->ivtag[i];
@@ -192,7 +192,7 @@ static int p10_aes_gcm_setkey(struct crypto_aead *aead, 
const u8 *key,
int ret;
 
vsx_begin();
-   ret = aes_p8_set_encrypt_key(key, keylen * 8, >enc_key);
+   ret = aes_p10_set_encrypt_key(key, keylen * 8, >enc_key);
vsx_end();
 
return ret ? -EINVAL : 0;
diff --git a/arch/powerpc/crypto/aesp8-ppc.pl