uadk_engine/0066-ecc-optimize-sm2-sign-check-function.patch
2023-11-29 16:35:32 +08:00

63 lines
1.7 KiB
Diff

From f4f8c9a20fa60b2b8c97a3b2a5b0edef1fc896b7 Mon Sep 17 00:00:00 2001
From: Zhiqi Song <songzhiqi1@huawei.com>
Date: Sat, 25 Nov 2023 16:13:17 +0800
Subject: [PATCH 66/82] ecc: optimize sm2 sign check function
Enable users to pass NULL sign parameter to obtain the
length of the signature result. If users want to do actual
signature task, they need to call the signature function a
second time.
Signed-off-by: Zhiqi Song <songzhiqi1@huawei.com>
---
src/uadk_sm2.c | 19 +++++++++++++------
1 file changed, 13 insertions(+), 6 deletions(-)
diff --git a/src/uadk_sm2.c b/src/uadk_sm2.c
index f393641..df760fe 100644
--- a/src/uadk_sm2.c
+++ b/src/uadk_sm2.c
@@ -26,6 +26,8 @@
#include "uadk.h"
#include "uadk_pkey.h"
+#define GET_SIGNLEN 1
+
enum {
CTX_INIT_FAIL = -1,
CTX_UNINIT,
@@ -673,6 +675,17 @@ static int sm2_sign_check(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen,
EC_KEY *ec = EVP_PKEY_get0(p_key);
const int sig_sz = ECDSA_size(ec);
+ /*
+ * If 'sig' is NULL, users can use sm2_decrypt API to obtain the valid 'siglen' first,
+ * then users use the value of 'signlen' to alloc the memory of 'sig' and call the
+ * sm2_decrypt API a second time to do the decryption task.
+ */
+ if (!sig) {
+ fprintf(stderr, "sig is NULL, get valid siglen\n");
+ *siglen = (size_t)sig_sz;
+ return GET_SIGNLEN;
+ }
+
if (!smctx || !smctx->sess) {
fprintf(stderr, "smctx or sess NULL\n");
return UADK_DO_SOFT;
@@ -693,12 +706,6 @@ static int sm2_sign_check(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen,
return -EINVAL;
}
- if (!sig) {
- fprintf(stderr, "invalid: sig is NULL\n");
- *siglen = (size_t)sig_sz;
- return -EINVAL;
- }
-
if (tbslen > SM2_KEY_BYTES)
return UADK_DO_SOFT;
--
2.25.1