This commit is contained in:
Zhi Guan
2026-06-21 00:01:39 +08:00
parent 866e3aef67
commit 08b925207e
4 changed files with 61 additions and 6 deletions

View File

@@ -874,7 +874,7 @@ endif()
#
set(CPACK_PACKAGE_NAME "GmSSL")
set(CPACK_PACKAGE_VENDOR "GmSSL develop team")
set(CPACK_PACKAGE_VERSION "3.2.0-dev.1132")
set(CPACK_PACKAGE_VERSION "3.2.0-dev.1133")
set(CPACK_PACKAGE_DESCRIPTION_FILE ${PROJECT_SOURCE_DIR}/README.md)
set(CPACK_NSIS_MODIFY_PATH ON)
include(CPack)

View File

@@ -18,7 +18,7 @@ extern "C" {
#define GMSSL_VERSION_NUM 30200
#define GMSSL_VERSION_STR "GmSSL 3.2.0-dev.1132"
#define GMSSL_VERSION_STR "GmSSL 3.2.0-dev.1133"
int gmssl_version_num(void);
const char *gmssl_version_str(void);

View File

@@ -78,6 +78,7 @@ int sm9_sign_master_key_from_der(SM9_SIGN_MASTER_KEY *msk, const uint8_t **in, s
size_t dlen;
const uint8_t *ks;
size_t kslen;
uint8_t ksbuf[32];
const uint8_t *Ppubs;
size_t Ppubslen;
@@ -87,14 +88,17 @@ int sm9_sign_master_key_from_der(SM9_SIGN_MASTER_KEY *msk, const uint8_t **in, s
}
if (asn1_integer_from_der(&ks, &kslen, &d, &dlen) != 1
|| asn1_bit_octets_from_der(&Ppubs, &Ppubslen, &d, &dlen) != 1
|| asn1_check(kslen == 32) != 1
|| asn1_check(kslen > 0 && kslen <= 32) != 1
|| asn1_check(Ppubslen == 1 + 32 * 4) != 1
|| asn1_length_is_zero(dlen) != 1) {
error_print();
return -1;
}
memset(msk, 0, sizeof(*msk));
sm9_z256_from_bytes(msk->ks, ks);
memset(ksbuf, 0, sizeof(ksbuf));
memcpy(ksbuf + sizeof(ksbuf) - kslen, ks, kslen);
sm9_z256_from_bytes(msk->ks, ksbuf);
gmssl_secure_clear(ksbuf, sizeof(ksbuf));
if (sm9_z256_cmp(msk->ks, sm9_z256_order()) >= 0) {
error_print();
return -1;
@@ -263,6 +267,7 @@ int sm9_enc_master_key_from_der(SM9_ENC_MASTER_KEY *msk, const uint8_t **in, siz
size_t dlen;
const uint8_t *ke;
size_t kelen;
uint8_t kebuf[32];
const uint8_t *Ppube;
size_t Ppubelen;
@@ -272,7 +277,7 @@ int sm9_enc_master_key_from_der(SM9_ENC_MASTER_KEY *msk, const uint8_t **in, siz
}
if (asn1_integer_from_der(&ke, &kelen, &d, &dlen) != 1
|| asn1_bit_octets_from_der(&Ppube, &Ppubelen, &d, &dlen) != 1
|| asn1_check(kelen == 32) != 1
|| asn1_check(kelen > 0 && kelen <= 32) != 1
|| asn1_check(Ppubelen == 1 + 32 * 2) != 1
|| asn1_length_is_zero(dlen) != 1) {
error_print();
@@ -280,7 +285,10 @@ int sm9_enc_master_key_from_der(SM9_ENC_MASTER_KEY *msk, const uint8_t **in, siz
}
memset(msk, 0, sizeof(*msk));
sm9_z256_from_bytes(msk->ke, ke);
memset(kebuf, 0, sizeof(kebuf));
memcpy(kebuf + sizeof(kebuf) - kelen, ke, kelen);
sm9_z256_from_bytes(msk->ke, kebuf);
gmssl_secure_clear(kebuf, sizeof(kebuf));
if (sm9_z256_cmp(msk->ke, sm9_z256_order()) >= 0) {
error_print();
return -1;

View File

@@ -13,6 +13,7 @@
#include <stdlib.h>
#include <time.h>
#include <gmssl/sm9.h>
#include <gmssl/hex.h>
#include <gmssl/error.h>
#include <gmssl/rand.h>
@@ -778,6 +779,51 @@ err:
return -1;
}
int test_sm9_master_key_from_der_leading_zero()
{
char *enc_master_key_der =
"306602200084509d9f11799ba847a142b4c1ed860dd66943ecf79f544d4327882beb229d"
"03420004654a84a614e4e3f670152a4253ef8fe5127ad7a5b0d85a6a009b3a95dadfb"
"25d407d04cf4d90c3addd3b9829ed92a37d1be32af3ae32e5cb3b6fd5a1ddb8fa2c";
char *leading_zero_scalar =
"0084509d9f11799ba847a142b4c1ed860dd66943ecf79f544d4327882beb229d";
SM9_ENC_MASTER_KEY enc_master;
SM9_SIGN_MASTER_KEY sign_master;
SM9_SIGN_MASTER_KEY parsed_sign_master;
uint8_t der[SM9_SIGN_MASTER_KEY_MAX_SIZE];
uint8_t enc_der[SM9_ENC_MASTER_KEY_MAX_SIZE];
uint8_t *p = der;
const uint8_t *cp;
size_t len = 0;
size_t derlen;
int j = 1;
if (hex_to_bytes(enc_master_key_der, strlen(enc_master_key_der), enc_der, &derlen) != 1) goto err; ++j;
cp = enc_der;
len = derlen;
if (sm9_enc_master_key_from_der(&enc_master, &cp, &len) != 1
|| len != 0
|| !sm9_z256_equ_hex(enc_master.ke, leading_zero_scalar)) goto err; ++j;
sm9_z256_from_hex(sign_master.ks, leading_zero_scalar);
sm9_z256_twist_point_mul_generator(&sign_master.Ppubs, sign_master.ks);
len = 0;
if (sm9_sign_master_key_to_der(&sign_master, &p, &len) != 1) goto err; ++j;
cp = der;
derlen = len;
if (sm9_sign_master_key_from_der(&parsed_sign_master, &cp, &derlen) != 1
|| derlen != 0
|| sm9_z256_cmp(parsed_sign_master.ks, sign_master.ks) != 0
|| !sm9_z256_twist_point_equ(&parsed_sign_master.Ppubs, &sign_master.Ppubs)) goto err; ++j;
printf("%s() ok\n", __FUNCTION__);
return 1;
err:
printf("%s test %d failed\n", __FUNCTION__, j);
error_print();
return -1;
}
#define hex_kex "0002E65B0762D042F51F0D23542B13ED8CFA2E9A0E7206361E013A283905E31F"
#define hex_deA \
@@ -844,6 +890,7 @@ int main(void) {
if (test_sm9_z256_sign() != 1) goto err;
if (test_sm9_z256_ciphertext() != 1) goto err;
if (test_sm9_z256_encrypt() != 1) goto err;
if (test_sm9_master_key_from_der_leading_zero() != 1) goto err;
if (test_sm9_z256_exchange() != 1) goto err;
if (test_sm9_z256_pairing_speed() != 1) goto err;