mirror of
https://github.com/guanzhi/GmSSL.git
synced 2026-06-27 15:43:42 +08:00
Fix #1884
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user