]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
sm2: update to use generated param decoders for signature operations
authorPauli <ppzgs1@gmail.com>
Mon, 28 Jul 2025 00:11:34 +0000 (10:11 +1000)
committerPauli <ppzgs1@gmail.com>
Wed, 13 Aug 2025 02:07:50 +0000 (12:07 +1000)
Reviewed-by: Paul Yang <paulyang.inf@gmail.com>
Reviewed-by: Shane Lontis <shane.lontis@oracle.com>
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/28150)

providers/implementations/signature/sm2_sig.c.in

index 4da392dad1e6a6e48295057b0d9470f360f2877d..ae2ecef488e2443c2472b5f759dbbe8cfd6819d3 100644 (file)
@@ -6,6 +6,9 @@
  * in the file LICENSE in the source distribution or at
  * https://www.openssl.org/source/license.html
  */
+{-
+use OpenSSL::paramnames qw(produce_param_decoder);
+-}
 
 /*
  * ECDSA low level APIs are deprecated for public use, but still ok for
@@ -396,60 +399,60 @@ static void *sm2sig_dupctx(void *vpsm2ctx)
     return NULL;
 }
 
+{- produce_param_decoder('sm2sig_get_ctx_params',
+                         (['SIGNATURE_PARAM_ALGORITHM_ID', 'algid',  'octet_string'],
+                          ['SIGNATURE_PARAM_DIGEST_SIZE',  'size',   'size_t'],
+                          ['SIGNATURE_PARAM_DIGEST',       'digest', 'utf8_string'],
+                         )); -}
+
 static int sm2sig_get_ctx_params(void *vpsm2ctx, OSSL_PARAM *params)
 {
     PROV_SM2_CTX *psm2ctx = (PROV_SM2_CTX *)vpsm2ctx;
-    OSSL_PARAM *p;
+    struct sm2sig_get_ctx_params_st p;
 
-    if (psm2ctx == NULL)
+    if (psm2ctx == NULL || !sm2sig_get_ctx_params_decoder(params, &p))
         return 0;
 
-    p = OSSL_PARAM_locate(params, OSSL_SIGNATURE_PARAM_ALGORITHM_ID);
-    if (p != NULL
-        && !OSSL_PARAM_set_octet_string(p,
+    if (p.algid != NULL
+        && !OSSL_PARAM_set_octet_string(p.algid,
                                         psm2ctx->aid_len == 0 ? NULL : psm2ctx->aid_buf,
                                         psm2ctx->aid_len))
         return 0;
 
-    p = OSSL_PARAM_locate(params, OSSL_SIGNATURE_PARAM_DIGEST_SIZE);
-    if (p != NULL && !OSSL_PARAM_set_size_t(p, psm2ctx->mdsize))
+    if (p.size != NULL && !OSSL_PARAM_set_size_t(p.size, psm2ctx->mdsize))
         return 0;
 
-    p = OSSL_PARAM_locate(params, OSSL_SIGNATURE_PARAM_DIGEST);
-    if (p != NULL && !OSSL_PARAM_set_utf8_string(p, psm2ctx->md == NULL
-                                                    ? psm2ctx->mdname
-                                                    : EVP_MD_get0_name(psm2ctx->md)))
+    if (p.digest != NULL
+            && !OSSL_PARAM_set_utf8_string(p.digest, psm2ctx->md == NULL
+                                                     ? psm2ctx->mdname
+                                                     : EVP_MD_get0_name(psm2ctx->md)))
         return 0;
 
     return 1;
 }
 
-static const OSSL_PARAM known_gettable_ctx_params[] = {
-    OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_ALGORITHM_ID, NULL, 0),
-    OSSL_PARAM_size_t(OSSL_SIGNATURE_PARAM_DIGEST_SIZE, NULL),
-    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST, NULL, 0),
-    OSSL_PARAM_END
-};
-
 static const OSSL_PARAM *sm2sig_gettable_ctx_params(ossl_unused void *vpsm2ctx,
                                                     ossl_unused void *provctx)
 {
-    return known_gettable_ctx_params;
+    return sm2sig_get_ctx_params_list;
 }
 
+{- produce_param_decoder('sm2sig_set_ctx_params',
+                         (['SIGNATURE_PARAM_DIGEST_SIZE', 'size',   'size_t'],
+                          ['SIGNATURE_PARAM_DIGEST',      'digest', 'utf8_string'],
+                          ['PKEY_PARAM_DIST_ID',          'distid', 'octet_string'],
+                         )); -}
+
 static int sm2sig_set_ctx_params(void *vpsm2ctx, const OSSL_PARAM params[])
 {
     PROV_SM2_CTX *psm2ctx = (PROV_SM2_CTX *)vpsm2ctx;
-    const OSSL_PARAM *p;
+    struct sm2sig_set_ctx_params_st p;
     size_t mdsize;
 
-    if (psm2ctx == NULL)
+    if (psm2ctx == NULL || !sm2sig_set_ctx_params_decoder(params, &p))
         return 0;
-    if (ossl_param_is_empty(params))
-        return 1;
 
-    p = OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_DIST_ID);
-    if (p != NULL) {
+    if (p.distid != NULL) {
         void *tmp_id = NULL;
         size_t tmp_idlen = 0;
 
@@ -459,8 +462,8 @@ static int sm2sig_set_ctx_params(void *vpsm2ctx, const OSSL_PARAM params[])
         if (!psm2ctx->flag_compute_z_digest)
             return 0;
 
-        if (p->data_size != 0
-            && !OSSL_PARAM_get_octet_string(p, &tmp_id, 0, &tmp_idlen))
+        if (p.distid->data_size != 0
+            && !OSSL_PARAM_get_octet_string(p.distid, &tmp_id, 0, &tmp_idlen))
             return 0;
         OPENSSL_free(psm2ctx->id);
         psm2ctx->id = tmp_id;
@@ -473,16 +476,14 @@ static int sm2sig_set_ctx_params(void *vpsm2ctx, const OSSL_PARAM params[])
      * If there is ever any different digest algorithm allowed with SM2
      * this needs to be adjusted accordingly.
      */
-    p = OSSL_PARAM_locate_const(params, OSSL_SIGNATURE_PARAM_DIGEST_SIZE);
-    if (p != NULL && (!OSSL_PARAM_get_size_t(p, &mdsize)
-                      || mdsize != psm2ctx->mdsize))
+    if (p.size != NULL && (!OSSL_PARAM_get_size_t(p.size, &mdsize)
+                           || mdsize != psm2ctx->mdsize))
         return 0;
 
-    p = OSSL_PARAM_locate_const(params, OSSL_SIGNATURE_PARAM_DIGEST);
-    if (p != NULL) {
+    if (p.digest != NULL) {
         char *mdname = NULL;
 
-        if (!OSSL_PARAM_get_utf8_string(p, &mdname, 0))
+        if (!OSSL_PARAM_get_utf8_string(p.digest, &mdname, 0))
             return 0;
         if (!sm2sig_set_mdname(psm2ctx, mdname)) {
             OPENSSL_free(mdname);
@@ -494,17 +495,10 @@ static int sm2sig_set_ctx_params(void *vpsm2ctx, const OSSL_PARAM params[])
     return 1;
 }
 
-static const OSSL_PARAM known_settable_ctx_params[] = {
-    OSSL_PARAM_size_t(OSSL_SIGNATURE_PARAM_DIGEST_SIZE, NULL),
-    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST, NULL, 0),
-    OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_DIST_ID, NULL, 0),
-    OSSL_PARAM_END
-};
-
 static const OSSL_PARAM *sm2sig_settable_ctx_params(ossl_unused void *vpsm2ctx,
                                                     ossl_unused void *provctx)
 {
-    return known_settable_ctx_params;
+    return sm2sig_set_ctx_params_list;
 }
 
 static int sm2sig_get_ctx_md_params(void *vpsm2ctx, OSSL_PARAM *params)