Commit 1409546f57 for openssl.org
commit 1409546f57e109ef2f38bb2bfc87c37a7d3afbdb
Author: Viktor Dukhovni <openssl-users@dukhovni.org>
Date: Wed Feb 11 02:45:02 2026 +1100
New SM2 "tls-version" signature parameter
When the version is TLS 1.3, this sets the SM2 distinguished identifier to
the RFC8998 specified value: "TLSv1.3+GM+Cipher+Suite".
Reviewed-by: Tim Hudson <tjh@openssl.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Paul Yang <paulyang.inf@gmail.com>
MergeDate: Sat Feb 21 13:25:39 2026
(Merged from https://github.com/openssl/openssl/pull/29953)
diff --git a/providers/implementations/signature/sm2_sig.c b/providers/implementations/signature/sm2_sig.c
index 96d1c6892a..4b40a66093 100644
--- a/providers/implementations/signature/sm2_sig.c
+++ b/providers/implementations/signature/sm2_sig.c
@@ -21,6 +21,7 @@
#include <openssl/params.h>
#include <openssl/evp.h>
#include <openssl/err.h>
+#include <openssl/prov_ssl.h>
#include <openssl/proverr.h>
#include "internal/nelem.h"
#include "internal/sizes.h"
@@ -432,6 +433,22 @@ static const OSSL_PARAM *sm2sig_gettable_ctx_params(ossl_unused void *vpsm2ctx,
static int sm2sig_set_ctx_params(void *vpsm2ctx, const OSSL_PARAM params[])
{
+ /*
+ * (https://datatracker.ietf.org/doc/html/rfc8998#section-3.2.1)
+ *
+ * The SM2 signature algorithm requests an identifier value when generating
+ * or verifying a signature. In all uses except when a client of a server
+ * needs to verify a peer's SM2 certificate in the Certificate message, an
+ * implementation of this document MUST use the following ASCII string
+ * value as the SM2 identifier when doing a TLS 1.3 key exchange:
+ *
+ * TLSv1.3+GM+Cipher+Suite
+ */
+ static const uint8_t sm2_tls_id[] = {
+ 0x54, 0x4c, 0x53, 0x76, 0x31, 0x2e, 0x33, 0x2b,
+ 0x47, 0x4d, 0x2b, 0x43, 0x69, 0x70, 0x68, 0x65,
+ 0x72, 0x2b, 0x53, 0x75, 0x69, 0x74, 0x65
+ };
PROV_SM2_CTX *psm2ctx = (PROV_SM2_CTX *)vpsm2ctx;
struct sm2sig_set_ctx_params_st p;
size_t mdsize;
@@ -455,6 +472,17 @@ static int sm2sig_set_ctx_params(void *vpsm2ctx, const OSSL_PARAM params[])
OPENSSL_free(psm2ctx->id);
psm2ctx->id = tmp_id;
psm2ctx->id_len = tmp_idlen;
+ } else if (p.tlsver != NULL) {
+ unsigned int ver = 0;
+
+ if (!psm2ctx->flag_compute_z_digest
+ || !OSSL_PARAM_get_uint(p.tlsver, &ver))
+ return 0;
+ if (ver == TLS1_3_VERSION) {
+ OPENSSL_free(psm2ctx->id);
+ psm2ctx->id_len = sizeof(sm2_tls_id);
+ psm2ctx->id = OPENSSL_memdup(sm2_tls_id, psm2ctx->id_len);
+ }
}
/*
diff --git a/providers/implementations/signature/sm2_sig.inc.in b/providers/implementations/signature/sm2_sig.inc.in
index f410d74a47..3a34316609 100644
--- a/providers/implementations/signature/sm2_sig.inc.in
+++ b/providers/implementations/signature/sm2_sig.inc.in
@@ -21,4 +21,5 @@ use OpenSSL::paramnames qw(produce_param_decoder);
(['OSSL_SIGNATURE_PARAM_DIGEST_SIZE', 'size', 'size_t'],
['OSSL_SIGNATURE_PARAM_DIGEST', 'digest', 'utf8_string'],
['OSSL_PKEY_PARAM_DIST_ID', 'distid', 'octet_string'],
+ ['OSSL_SIGNATURE_PARAM_TLS_VERSION', 'tlsver', 'uint'],
)); -}
diff --git a/util/perl/OpenSSL/paramnames.pm b/util/perl/OpenSSL/paramnames.pm
index 680f4f3317..a99cade68f 100644
--- a/util/perl/OpenSSL/paramnames.pm
+++ b/util/perl/OpenSSL/paramnames.pm
@@ -513,6 +513,7 @@ my %params = (
'OSSL_SIGNATURE_PARAM_MU' => "mu", # int
'OSSL_SIGNATURE_PARAM_TEST_ENTROPY' => "test-entropy",
'OSSL_SIGNATURE_PARAM_ADD_RANDOM' => "additional-random",
+ 'OSSL_SIGNATURE_PARAM_TLS_VERSION' => "tls-version",
# Asym cipher parameters
'OSSL_ASYM_CIPHER_PARAM_DIGEST' => '*OSSL_PKEY_PARAM_DIGEST',