diff mbox series

[v2,2/6] crypto: arm64/sm3-ce - make dependent on sm3 library

Message ID 20211222045022.27069-3-tianjia.zhang@linux.alibaba.com (mailing list archive)
State New, archived
Headers show
Series Introduce x86 assembly accelerated implementation for SM3 algorithm | expand

Commit Message

tianjia.zhang Dec. 22, 2021, 4:50 a.m. UTC
SM3 generic library is stand-alone implementation, sm3-ce can depend
on the SM3 library instead of sm3-generic.

Signed-off-by: Tianjia Zhang <tianjia.zhang@linux.alibaba.com>
---
 arch/arm64/crypto/Kconfig       |  2 +-
 arch/arm64/crypto/sm3-ce-glue.c | 20 ++++++++++++++------
 2 files changed, 15 insertions(+), 7 deletions(-)

Comments

liulongfang Dec. 31, 2021, 7:05 a.m. UTC | #1
On 2021/12/22 12:50, Tianjia Zhang Wrote:
> SM3 generic library is stand-alone implementation, sm3-ce can depend
> on the SM3 library instead of sm3-generic.
> 
> Signed-off-by: Tianjia Zhang <tianjia.zhang@linux.alibaba.com>
> ---
>  arch/arm64/crypto/Kconfig       |  2 +-
>  arch/arm64/crypto/sm3-ce-glue.c | 20 ++++++++++++++------
>  2 files changed, 15 insertions(+), 7 deletions(-)
> 
> diff --git a/arch/arm64/crypto/Kconfig b/arch/arm64/crypto/Kconfig
> index addfa413650b..2a965aa0188d 100644
> --- a/arch/arm64/crypto/Kconfig
> +++ b/arch/arm64/crypto/Kconfig
> @@ -45,7 +45,7 @@ config CRYPTO_SM3_ARM64_CE
>  	tristate "SM3 digest algorithm (ARMv8.2 Crypto Extensions)"
>  	depends on KERNEL_MODE_NEON
>  	select CRYPTO_HASH
> -	select CRYPTO_SM3
> +	select CRYPTO_LIB_SM3
>  
>  config CRYPTO_SM4_ARM64_CE
>  	tristate "SM4 symmetric cipher (ARMv8.2 Crypto Extensions)"
> diff --git a/arch/arm64/crypto/sm3-ce-glue.c b/arch/arm64/crypto/sm3-ce-glue.c
> index d71faca322f2..3198f31c9446 100644
> --- a/arch/arm64/crypto/sm3-ce-glue.c
> +++ b/arch/arm64/crypto/sm3-ce-glue.c
> @@ -27,7 +27,7 @@ static int sm3_ce_update(struct shash_desc *desc, const u8 *data,
>  			 unsigned int len)
>  {
>  	if (!crypto_simd_usable())
> -		return crypto_sm3_update(desc, data, len);
> +		return sm3_update(shash_desc_ctx(desc), data, len);
>  
>  	kernel_neon_begin();
>  	sm3_base_do_update(desc, data, len, sm3_ce_transform);
> @@ -39,7 +39,7 @@ static int sm3_ce_update(struct shash_desc *desc, const u8 *data,
>  static int sm3_ce_final(struct shash_desc *desc, u8 *out)
>  {
>  	if (!crypto_simd_usable())
> -		return crypto_sm3_finup(desc, NULL, 0, out);
> +		return sm3_final(shash_desc_ctx(desc), out);
>  
>  	kernel_neon_begin();
>  	sm3_base_do_finalize(desc, sm3_ce_transform);
> @@ -51,14 +51,22 @@ static int sm3_ce_final(struct shash_desc *desc, u8 *out)
>  static int sm3_ce_finup(struct shash_desc *desc, const u8 *data,
>  			unsigned int len, u8 *out)
>  {
> -	if (!crypto_simd_usable())
> -		return crypto_sm3_finup(desc, data, len, out);
> +	if (!crypto_simd_usable()) {
> +		struct sm3_state *sctx = shash_desc_ctx(desc);
> +
> +		if (len)
> +			sm3_update(sctx, data, len);
> +		sm3_final(sctx, out);
> +		return 0;
> +	}
>  
>  	kernel_neon_begin();
> -	sm3_base_do_update(desc, data, len, sm3_ce_transform);
> +	if (len)
> +		sm3_base_do_update(desc, data, len, sm3_ce_transform);
> +	sm3_base_do_finalize(desc, sm3_ce_transform);
>  	kernel_neon_end();
>  
> -	return sm3_ce_final(desc, out);
> +	return sm3_base_finish(desc, out);
>  }
>  
>  static struct shash_alg sm3_alg = {
>You have modified the implementation of SM3 algorithm, so what benefits will be gained
after such modification?
What flaws are solved or can performance be improved?
Thanks.
Longfang.
tianjia.zhang Dec. 31, 2021, 11 a.m. UTC | #2
Hi

On 12/31/21 3:05 PM, liulongfang wrote:
> On 2021/12/22 12:50, Tianjia Zhang Wrote:
>> SM3 generic library is stand-alone implementation, sm3-ce can depend
>> on the SM3 library instead of sm3-generic.
>>
>> Signed-off-by: Tianjia Zhang <tianjia.zhang@linux.alibaba.com>
>> ---
>>   arch/arm64/crypto/Kconfig       |  2 +-
>>   arch/arm64/crypto/sm3-ce-glue.c | 20 ++++++++++++++------
>>   2 files changed, 15 insertions(+), 7 deletions(-)
>>
>> diff --git a/arch/arm64/crypto/Kconfig b/arch/arm64/crypto/Kconfig
>> index addfa413650b..2a965aa0188d 100644
>> --- a/arch/arm64/crypto/Kconfig
>> +++ b/arch/arm64/crypto/Kconfig
>> @@ -45,7 +45,7 @@ config CRYPTO_SM3_ARM64_CE
>>   	tristate "SM3 digest algorithm (ARMv8.2 Crypto Extensions)"
>>   	depends on KERNEL_MODE_NEON
>>   	select CRYPTO_HASH
>> -	select CRYPTO_SM3
>> +	select CRYPTO_LIB_SM3
>>   
>>   config CRYPTO_SM4_ARM64_CE
>>   	tristate "SM4 symmetric cipher (ARMv8.2 Crypto Extensions)"
>> diff --git a/arch/arm64/crypto/sm3-ce-glue.c b/arch/arm64/crypto/sm3-ce-glue.c
>> index d71faca322f2..3198f31c9446 100644
>> --- a/arch/arm64/crypto/sm3-ce-glue.c
>> +++ b/arch/arm64/crypto/sm3-ce-glue.c
>> @@ -27,7 +27,7 @@ static int sm3_ce_update(struct shash_desc *desc, const u8 *data,
>>   			 unsigned int len)
>>   {
>>   	if (!crypto_simd_usable())
>> -		return crypto_sm3_update(desc, data, len);
>> +		return sm3_update(shash_desc_ctx(desc), data, len);
>>   
>>   	kernel_neon_begin();
>>   	sm3_base_do_update(desc, data, len, sm3_ce_transform);
>> @@ -39,7 +39,7 @@ static int sm3_ce_update(struct shash_desc *desc, const u8 *data,
>>   static int sm3_ce_final(struct shash_desc *desc, u8 *out)
>>   {
>>   	if (!crypto_simd_usable())
>> -		return crypto_sm3_finup(desc, NULL, 0, out);
>> +		return sm3_final(shash_desc_ctx(desc), out);
>>   
>>   	kernel_neon_begin();
>>   	sm3_base_do_finalize(desc, sm3_ce_transform);
>> @@ -51,14 +51,22 @@ static int sm3_ce_final(struct shash_desc *desc, u8 *out)
>>   static int sm3_ce_finup(struct shash_desc *desc, const u8 *data,
>>   			unsigned int len, u8 *out)
>>   {
>> -	if (!crypto_simd_usable())
>> -		return crypto_sm3_finup(desc, data, len, out);
>> +	if (!crypto_simd_usable()) {
>> +		struct sm3_state *sctx = shash_desc_ctx(desc);
>> +
>> +		if (len)
>> +			sm3_update(sctx, data, len);
>> +		sm3_final(sctx, out);
>> +		return 0;
>> +	}
>>   
>>   	kernel_neon_begin();
>> -	sm3_base_do_update(desc, data, len, sm3_ce_transform);
>> +	if (len)
>> +		sm3_base_do_update(desc, data, len, sm3_ce_transform);
>> +	sm3_base_do_finalize(desc, sm3_ce_transform);
>>   	kernel_neon_end();
>>   
>> -	return sm3_ce_final(desc, out);
>> +	return sm3_base_finish(desc, out);
>>   }
>>   
>>   static struct shash_alg sm3_alg = {
>> You have modified the implementation of SM3 algorithm, so what benefits will be gained
> after such modification?
> What flaws are solved or can performance be improved?
> Thanks.
> Longfang.

This modification does not bring obvious performance improvement, but
makes the code logic more reasonable in terms of architecture and
calling level. The calling relationship before modification is:
   sm3-ce -> sm3-generic -> sm3-lib,
after this modification is: sm3-ce -> sm3-lib.

Best regards,
Tianjia
diff mbox series

Patch

diff --git a/arch/arm64/crypto/Kconfig b/arch/arm64/crypto/Kconfig
index addfa413650b..2a965aa0188d 100644
--- a/arch/arm64/crypto/Kconfig
+++ b/arch/arm64/crypto/Kconfig
@@ -45,7 +45,7 @@  config CRYPTO_SM3_ARM64_CE
 	tristate "SM3 digest algorithm (ARMv8.2 Crypto Extensions)"
 	depends on KERNEL_MODE_NEON
 	select CRYPTO_HASH
-	select CRYPTO_SM3
+	select CRYPTO_LIB_SM3
 
 config CRYPTO_SM4_ARM64_CE
 	tristate "SM4 symmetric cipher (ARMv8.2 Crypto Extensions)"
diff --git a/arch/arm64/crypto/sm3-ce-glue.c b/arch/arm64/crypto/sm3-ce-glue.c
index d71faca322f2..3198f31c9446 100644
--- a/arch/arm64/crypto/sm3-ce-glue.c
+++ b/arch/arm64/crypto/sm3-ce-glue.c
@@ -27,7 +27,7 @@  static int sm3_ce_update(struct shash_desc *desc, const u8 *data,
 			 unsigned int len)
 {
 	if (!crypto_simd_usable())
-		return crypto_sm3_update(desc, data, len);
+		return sm3_update(shash_desc_ctx(desc), data, len);
 
 	kernel_neon_begin();
 	sm3_base_do_update(desc, data, len, sm3_ce_transform);
@@ -39,7 +39,7 @@  static int sm3_ce_update(struct shash_desc *desc, const u8 *data,
 static int sm3_ce_final(struct shash_desc *desc, u8 *out)
 {
 	if (!crypto_simd_usable())
-		return crypto_sm3_finup(desc, NULL, 0, out);
+		return sm3_final(shash_desc_ctx(desc), out);
 
 	kernel_neon_begin();
 	sm3_base_do_finalize(desc, sm3_ce_transform);
@@ -51,14 +51,22 @@  static int sm3_ce_final(struct shash_desc *desc, u8 *out)
 static int sm3_ce_finup(struct shash_desc *desc, const u8 *data,
 			unsigned int len, u8 *out)
 {
-	if (!crypto_simd_usable())
-		return crypto_sm3_finup(desc, data, len, out);
+	if (!crypto_simd_usable()) {
+		struct sm3_state *sctx = shash_desc_ctx(desc);
+
+		if (len)
+			sm3_update(sctx, data, len);
+		sm3_final(sctx, out);
+		return 0;
+	}
 
 	kernel_neon_begin();
-	sm3_base_do_update(desc, data, len, sm3_ce_transform);
+	if (len)
+		sm3_base_do_update(desc, data, len, sm3_ce_transform);
+	sm3_base_do_finalize(desc, sm3_ce_transform);
 	kernel_neon_end();
 
-	return sm3_ce_final(desc, out);
+	return sm3_base_finish(desc, out);
 }
 
 static struct shash_alg sm3_alg = {