Update X509_KEY API to support SM9

This commit is contained in:
Zhi Guan
2026-02-24 10:45:33 +08:00
parent b2cfb59da0
commit cac8f394a0
11 changed files with 455 additions and 58 deletions

View File

@@ -22,6 +22,22 @@ static int lms_types[] = {
LMS_HASH256_M32_H5,
};
static int test_print_consts(void)
{
format_print(stderr, 0, 4, "sizeof(LMS_PUBLIC_KEY): %zu\n", sizeof(LMS_PUBLIC_KEY));
format_print(stderr, 0, 4, "LMS_PUBLIC_KEY_SIZE: %zu\n", LMS_PUBLIC_KEY_SIZE);
format_print(stderr, 0, 4, "LMS_PRIVATE_KEY_SIZE: %zu\n", LMS_PRIVATE_KEY_SIZE);
format_print(stderr, 0, 4, "sizeof(LMS_SIGNATURE): %zu\n", sizeof(LMS_SIGNATURE));
format_print(stderr, 0, 4, "LMS_SIGNATURE_MAX_SIZE: %zu\n", LMS_SIGNATURE_MAX_SIZE);
format_print(stderr, 0, 4, "sizeof(HSS_PUBLIC_KEY): %zu\n", sizeof(HSS_PUBLIC_KEY));
format_print(stderr, 0, 4, "HSS_PUBLIC_KEY_SIZE: %zu\n", HSS_PUBLIC_KEY_SIZE);
format_print(stderr, 0, 4, "HSS_PRIVATE_KEY_MAX_SIZE: %zu\n", HSS_PRIVATE_KEY_MAX_SIZE);
format_print(stderr, 0, 4, "sizeof(HSS_SIGNATURE): %zu\n", sizeof(HSS_SIGNATURE));
format_print(stderr, 0, 4, "HSS_SIGNATURE_MAX_SIZE: %zu\n", HSS_SIGNATURE_MAX_SIZE);
printf("%s() ok\n", __FUNCTION__);
return 1;
}
#if defined(ENABLE_LMS_CROSSCHECK) && defined(ENABLE_SHA2)
static int test_rfc8554_test1(void)
@@ -1030,6 +1046,7 @@ static int test_hss_public_key_algor(void)
int main(void)
{
if (test_print_consts() != 1) goto err;
#if defined(ENABLE_LMS_CROSSCHECK) && defined(ENABLE_SHA2)
if (test_rfc8554_test1() != 1) goto err;
#endif

View File

@@ -375,6 +375,7 @@ static int test_x509_sign(void)
error_print();
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], args, argslen, sig, siglen) != 1) {
error_print();
return -1;
@@ -389,6 +390,65 @@ static int test_x509_sign(void)
return 1;
}
static int test_x509_sign_sm9(void)
{
SM9_SIGN_MASTER_KEY sm9_sign_master_key;
SM9_SIGN_KEY sm9_sign_key;
char *id = "guan@pku.edu.cn";
size_t idlen = strlen(id);
X509_KEY x509_key;
X509_SIGN_CTX sign_ctx;
uint8_t msg[66];
uint8_t sig[128]; // sm9 signature size = 104
size_t siglen;
if (sm9_sign_master_key_generate(&sm9_sign_master_key) != 1) {
error_print();
return -1;
}
if (sm9_sign_master_key_extract_key(&sm9_sign_master_key, id, idlen, &sm9_sign_key) != 1) {
error_print();
return -1;
}
if (x509_key_set_sm9_sign_key(&x509_key, &sm9_sign_key) != 1) {
error_print();
return -1;
}
if (x509_sign_init(&sign_ctx, &x509_key, NULL, 0) != 1) {
error_print();
return -1;
}
if (x509_sign_update(&sign_ctx, msg, sizeof(msg)) != 1) {
error_print();
return -1;
}
if (x509_sign_finish(&sign_ctx, sig, &siglen) != 1) {
error_print();
return -1;
}
if (x509_key_set_sm9_sign_master_key(&x509_key, &sm9_sign_master_key) != 1) {
error_print();
return -1;
}
if (x509_verify_init(&sign_ctx, &x509_key, id, idlen, sig, siglen) != 1) {
error_print();
return -1;
}
if (x509_verify_update(&sign_ctx, msg, sizeof(msg)) != 1) {
error_print();
return -1;
}
if (x509_verify_finish(&sign_ctx) != 1) {
error_print();
return -1;
}
printf("%s() ok\n", __FUNCTION__);
return 1;
}
static int test_x509_key_exchange(void)
{
X509_KEY key;
@@ -510,6 +570,7 @@ int main(void)
if (test_x509_private_key_info_encrypt_to_der() != 1) goto err;
if (test_x509_private_key_info_encrypt_to_pem() != 1) goto err;
if (test_x509_sign() != 1) goto err;
if (test_x509_sign_sm9() != 1) goto err;
if (test_x509_key_exchange() != 1) goto err;
if (test_x509_kem() != 1) goto err;