Refactor X509_KEY

This commit is contained in:
Zhi Guan
2026-06-27 11:36:55 +08:00
parent 52f0f1619e
commit c924503a05
28 changed files with 2692 additions and 3477 deletions

View File

@@ -16,8 +16,7 @@
#include <gmssl/hex.h>
#include <gmssl/rand.h>
#include <gmssl/error.h>
#include <gmssl/ecdsa.h>
#include <gmssl/secp256r1_ecdsa.h>
#include <gmssl/secp256r1.h>
/*
d 0x5
@@ -154,60 +153,11 @@ static int test_ecdsa_digest_lengths(void)
return 1;
}
static int test_ecdsa_generic(void)
{
EC_KEY key;
uint8_t dgst32[32];
uint8_t dgst48[48];
uint8_t sig[SECP256R1_ECDSA_SIGNATURE_MAX_SIZE];
size_t siglen;
key.oid = OID_secp256r1;
if (secp256r1_key_generate(&key.u.secp256r1_key) != 1) {
error_print();
return -1;
}
memset(dgst32, 0x11, sizeof(dgst32));
memset(dgst48, 0x22, sizeof(dgst48));
if (ecdsa_sign(&key, dgst32, sizeof(dgst32), sig, &siglen) != 1
|| siglen > sizeof(sig)
|| ecdsa_verify(&key, dgst32, sizeof(dgst32), sig, siglen) != 1) {
error_print();
return -1;
}
dgst32[0] ^= 0x01;
if (ecdsa_verify(&key, dgst32, sizeof(dgst32), sig, siglen) != 0) {
error_print();
return -1;
}
if (ecdsa_sign(&key, dgst48, sizeof(dgst48), sig, &siglen) != 1
|| siglen > sizeof(sig)
|| ecdsa_verify(&key, dgst48, sizeof(dgst48), sig, siglen) != 1) {
error_print();
return -1;
}
if (ecdsa_sign_fixed_len(&key, dgst48, sizeof(dgst48), siglen, sig) != 1
|| ecdsa_verify(&key, dgst48, sizeof(dgst48), sig, siglen) != 1) {
error_print();
return -1;
}
if (ecdsa_sign(&key, dgst32, 31, sig, &siglen) >= 0) {
error_print();
return -1;
}
printf("%s() ok\n", __FUNCTION__);
return 1;
}
int main(void)
{
if (test_ecdsa() != 1) goto err;
if (test_ecdsa_verify_infinity() != 1) goto err;
if (test_ecdsa_digest_lengths() != 1) goto err;
if (test_ecdsa_generic() != 1) goto err;
printf("%s all tests passed\n", __FILE__);
return 0;

View File

@@ -11,7 +11,6 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <gmssl/sm2.h>
#include <gmssl/ec.h>
#include <gmssl/error.h>
@@ -61,58 +60,9 @@ static int test_ec_named_curve(void)
return 1;
}
static int test_ec_point_print(void)
{
SM2_KEY sm2_key;
uint8_t buf[256];
uint8_t *p = buf;
size_t len = 0;
if (sm2_key_generate(&sm2_key) != 1) {
error_print();
return -1;
}
if (sm2_z256_point_to_der(&(sm2_key.public_key), &p, &len) != 1) {
error_print();
return -1;
}
ec_point_print(stderr, 0, 4, "ECPoint", buf, len);
printf("%s() ok\n", __FUNCTION__);
return 1;
}
static int test_ec_private_key_print(void)
{
SM2_KEY sm2_key;
uint8_t buf[256];
uint8_t *p = buf;
const uint8_t *cp = buf;
size_t len = 0;
const uint8_t *d;
size_t dlen;
if (sm2_key_generate(&sm2_key) != 1) {
error_print();
return -1;
}
if (sm2_private_key_to_der(&sm2_key, &p, &len) != 1
|| asn1_sequence_from_der(&d, &dlen, &cp, &len) != 1
|| asn1_length_is_zero(len) != 1) {
error_print();
return -1;
}
ec_private_key_print(stderr, 0, 4, "ECPrivateKey", d, dlen);
printf("%s() ok\n", __FUNCTION__);
return 1;
}
int main(void)
{
if (test_ec_named_curve() != 1) goto err;
if (test_ec_point_print() != 1) goto err;
if (test_ec_private_key_print() != 1) goto err;
printf("%s all tests passed\n", __FILE__);
return 0;
err:

View File

@@ -16,7 +16,7 @@
#include <gmssl/rand.h>
#include <gmssl/mem.h>
#include <gmssl/error.h>
#include <gmssl/secp256r1_key.h>
#include <gmssl/secp256r1.h>
static int test_secp256r1_key_generate(void)

View File

@@ -16,8 +16,7 @@
#include <gmssl/hex.h>
#include <gmssl/rand.h>
#include <gmssl/error.h>
#include <gmssl/ecdsa.h>
#include <gmssl/secp384r1_ecdsa.h>
#include <gmssl/secp384r1.h>
static int test_secp384r1_ecdsa_do_sign(void)
{
@@ -170,61 +169,12 @@ static int test_secp384r1_ecdsa_verify_infinity(void)
return 1;
}
static int test_secp384r1_ecdsa_generic(void)
{
EC_KEY key;
uint8_t dgst32[32];
uint8_t dgst48[48];
uint8_t sig[SECP384R1_ECDSA_SIGNATURE_MAX_SIZE];
size_t siglen;
key.oid = OID_secp384r1;
if (secp384r1_key_generate(&key.u.secp384r1_key) != 1) {
error_print();
return -1;
}
memset(dgst32, 0x33, sizeof(dgst32));
memset(dgst48, 0x44, sizeof(dgst48));
if (ecdsa_sign(&key, dgst48, sizeof(dgst48), sig, &siglen) != 1
|| siglen > sizeof(sig)
|| ecdsa_verify(&key, dgst48, sizeof(dgst48), sig, siglen) != 1) {
error_print();
return -1;
}
dgst48[0] ^= 0x01;
if (ecdsa_verify(&key, dgst48, sizeof(dgst48), sig, siglen) != 0) {
error_print();
return -1;
}
if (ecdsa_sign(&key, dgst32, sizeof(dgst32), sig, &siglen) != 1
|| siglen > sizeof(sig)
|| ecdsa_verify(&key, dgst32, sizeof(dgst32), sig, siglen) != 1) {
error_print();
return -1;
}
if (ecdsa_sign_fixed_len(&key, dgst32, sizeof(dgst32), siglen, sig) != 1
|| ecdsa_verify(&key, dgst32, sizeof(dgst32), sig, siglen) != 1) {
error_print();
return -1;
}
if (ecdsa_sign(&key, dgst32, 31, sig, &siglen) >= 0) {
error_print();
return -1;
}
printf("%s() ok\n", __FUNCTION__);
return 1;
}
int main(void)
{
if (test_secp384r1_ecdsa_do_sign() != 1) goto err;
if (test_secp384r1_ecdsa_sign() != 1) goto err;
if (test_secp384r1_ecdsa_ctx() != 1) goto err;
if (test_secp384r1_ecdsa_verify_infinity() != 1) goto err;
if (test_secp384r1_ecdsa_generic() != 1) goto err;
printf("%s all tests passed\n", __FILE__);
return 0;

View File

@@ -16,7 +16,7 @@
#include <gmssl/rand.h>
#include <gmssl/mem.h>
#include <gmssl/error.h>
#include <gmssl/secp384r1_key.h>
#include <gmssl/secp384r1.h>
static int test_secp384r1_key_generate(void)

View File

@@ -35,6 +35,9 @@ struct {
#ifdef ENABLE_SECP256R1
{ OID_ec_public_key, OID_secp256r1 },
#endif
#ifdef ENABLE_SECP384R1
{ OID_ec_public_key, OID_secp384r1 },
#endif
#ifdef ENABLE_LMS
{ OID_lms_hashsig, LMS_SM3_M32_H5 },
{ OID_hss_lms_hashsig, OID_undef }, // use lms_types[]
@@ -195,96 +198,6 @@ static int test_x509_public_key_info_to_der(void)
return 1;
}
static int test_ec_private_key_to_der(void)
{
X509_KEY key;
uint8_t buf[512];
int i;
for (i = 0; i < sizeof(tests)/sizeof(tests[0]) && tests[i].algor == OID_ec_public_key; i++) {
const uint8_t *cp = buf;
uint8_t *p = buf;
size_t len = 0;
int encode_params;
int encode_pubkey;
// test 1
encode_params = 0;
encode_pubkey = 0;
if (ec_private_key_to_der(&x509_keys[i], encode_params, encode_pubkey, &p, &len) != 1) {
error_print();
return -1;
}
//format_print(stderr, 0, 0, "ECPrivateKey encode_params = %d, encode_pubkey = %d\n", encode_params, encode_pubkey);
//format_bytes(stderr, 0, 0, "ECPrivateKey", buf, len);
if (ec_private_key_from_der(&key, tests[i].algor_param, &cp, &len) != 1) {
error_print();
return -1;
}
if (x509_public_key_equ(&key, &x509_keys[i]) != 1) {
error_print();
return -1;
}
// test 2
encode_params = 0;
encode_pubkey = 1;
if (ec_private_key_to_der(&x509_keys[i], encode_params, encode_pubkey, &p, &len) != 1) {
error_print();
return -1;
}
//format_print(stderr, 0, 0, "ECPrivateKey encode_params = %d, encode_pubkey = %d\n", encode_params, encode_pubkey);
//format_bytes(stderr, 0, 0, "ECPrivateKey", buf, len);
if (ec_private_key_from_der(&key, tests[i].algor_param, &cp, &len) != 1) {
error_print();
return -1;
}
if (x509_public_key_equ(&key, &x509_keys[i]) != 1) {
error_print();
return -1;
}
// test 3
encode_params = 1;
encode_pubkey = 0;
if (ec_private_key_to_der(&x509_keys[i], encode_params, encode_pubkey, &p, &len) != 1) {
error_print();
return -1;
}
//format_print(stderr, 0, 0, "ECPrivateKey encode_params = %d, encode_pubkey = %d\n", encode_params, encode_pubkey);
//format_bytes(stderr, 0, 0, "ECPrivateKey", buf, len);
if (ec_private_key_from_der(&key, tests[i].algor_param, &cp, &len) != 1) {
error_print();
return -1;
}
if (x509_public_key_equ(&key, &x509_keys[i]) != 1) {
error_print();
return -1;
}
// test 4
encode_params = 1;
encode_pubkey = 1;
if (ec_private_key_to_der(&x509_keys[i], encode_params, encode_pubkey, &p, &len) != 1) {
error_print();
return -1;
}
//format_print(stderr, 0, 0, "ECPrivateKey encode_params = %d, encode_pubkey = %d\n", encode_params, encode_pubkey);
//format_bytes(stderr, 0, 0, "ECPrivateKey", buf, len);
if (ec_private_key_from_der(&key, tests[i].algor_param, &cp, &len) != 1) {
error_print();
return -1;
}
if (x509_public_key_equ(&key, &x509_keys[i]) != 1) {
error_print();
return -1;
}
}
printf("%s() ok\n", __FUNCTION__);
return 1;
}
static int test_x509_private_key_info_to_der(void)
{
X509_KEY key;
@@ -455,11 +368,17 @@ static int test_x509_sign(void)
memset(msg, 0xa5, sizeof(msg));
for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
int sign_algor;
if (tests[i].algor == OID_kyber_kem) {
continue;
}
sign_algor = test_sign_algor(&x509_keys[i]);
if (sign_algor == OID_undef) {
continue;
}
//format_print(stderr, 0, 4, "%s\n", x509_public_key_algor_name(tests[i].algor));
if (x509_sign_init(&sign_ctx, &x509_keys[i], test_sign_algor(&x509_keys[i]), args, argslen) != 1) {
if (x509_sign_init(&sign_ctx, &x509_keys[i], sign_algor, args, argslen) != 1) {
error_print();
return -1;
}
@@ -468,7 +387,7 @@ static int test_x509_sign(void)
return -1;
}
format_print(stderr, 0, 4, "%s: %zu\n", x509_public_key_algor_name(tests[i].algor), siglen);
if (x509_verify_init(&sign_ctx, &x509_keys[i], test_sign_algor(&x509_keys[i]), args, argslen, sig, siglen) != 1) {
if (x509_verify_init(&sign_ctx, &x509_keys[i], sign_algor, args, argslen, sig, siglen) != 1) {
error_print();
return -1;
}
@@ -558,6 +477,9 @@ static int test_x509_key_exchange(void)
if (tests[i].algor != OID_ec_public_key) {
continue;
}
if (tests[i].algor_param == OID_secp384r1) {
continue;
}
if (x509_key_generate(&key, tests[i].algor, &tests[i].algor_param, sizeof(tests[i].algor_param)) != 1) {
error_print();
return -1;
@@ -660,7 +582,6 @@ int main(void)
if (test_x509_key_generate() != 1) goto err;
if (test_x509_public_key_to_bytes() != 1) goto err;
if (test_x509_public_key_info_to_der() != 1) goto err;
if (test_ec_private_key_to_der() != 1) goto err;
if (test_x509_private_key_info_to_der() != 1) goto err;
if (test_x509_private_key_info_encrypt_to_der() != 1) goto err;
if (test_x509_private_key_info_encrypt_to_pem() != 1) goto err;