Remove x509_key_get_sign_algor

This commit is contained in:
Zhi Guan
2026-06-22 15:02:45 +08:00
parent f0ff81c1a5
commit 84f92c0747
25 changed files with 344 additions and 130 deletions

View File

@@ -11,7 +11,7 @@
#include <string.h>
#include <stdlib.h>
#include <gmssl/asn1.h>
#include <gmssl/sha2.h>
#include <gmssl/digest.h>
#include <gmssl/rand.h>
#include <gmssl/error.h>
#include <gmssl/ecdsa.h>
@@ -261,17 +261,23 @@ int ecdsa_verify(const SECP256R1_KEY *key, const uint8_t dgst[32], const uint8_t
return ret;
}
int ecdsa_sign_init(ECDSA_SIGN_CTX *ctx, const SECP256R1_KEY *key)
int ecdsa_sign_init(ECDSA_SIGN_CTX *ctx, const SECP256R1_KEY *key, const DIGEST *digest)
{
if (!ctx || !key) {
error_print();
return -1;
}
if (!digest) {
digest = DIGEST_sha256();
}
memset(ctx, 0, sizeof(ECDSA_SIGN_CTX));
ctx->key = *key;
sha256_init(&ctx->sha256_ctx);
if (digest_init(&ctx->digest_ctx, digest) != 1) {
error_print();
return -1;
}
return 1;
}
@@ -282,22 +288,28 @@ int ecdsa_sign_update(ECDSA_SIGN_CTX *ctx, const uint8_t *data, size_t datalen)
error_print();
return -1;
}
if (data && datalen) {
sha256_update(&ctx->sha256_ctx, data, datalen);
if (digest_update(&ctx->digest_ctx, data, datalen) != 1) {
error_print();
return -1;
}
return 1;
}
int ecdsa_sign_finish(ECDSA_SIGN_CTX *ctx, uint8_t *sig, size_t *siglen)
{
uint8_t dgst[32];
uint8_t dgst[DIGEST_MAX_SIZE];
size_t dgstlen;
if (!ctx || !sig || !siglen) {
error_print();
return -1;
}
sha256_finish(&ctx->sha256_ctx, dgst);
if (digest_finish(&ctx->digest_ctx, dgst, &dgstlen) != 1
|| dgstlen < 32) {
error_print();
return -1;
}
if (ecdsa_sign(&ctx->key, dgst, sig, siglen) != 1) {
error_print();
@@ -308,14 +320,19 @@ int ecdsa_sign_finish(ECDSA_SIGN_CTX *ctx, uint8_t *sig, size_t *siglen)
int ecdsa_sign_finish_fixlen(ECDSA_SIGN_CTX *ctx, size_t siglen, uint8_t *sig)
{
uint8_t dgst[32];
uint8_t dgst[DIGEST_MAX_SIZE];
size_t dgstlen;
if (!ctx || !sig || !siglen) {
error_print();
return -1;
}
sha256_finish(&ctx->sha256_ctx, dgst);
if (digest_finish(&ctx->digest_ctx, dgst, &dgstlen) != 1
|| dgstlen < 32) {
error_print();
return -1;
}
if (ecdsa_sign_fixlen(&ctx->key, dgst, siglen, sig) != 1) {
error_print();
@@ -329,7 +346,8 @@ int ecdsa_sign_finish_fixlen(ECDSA_SIGN_CTX *ctx, size_t siglen, uint8_t *sig)
int ecdsa_verify_init(ECDSA_SIGN_CTX *ctx, const SECP256R1_KEY *key, const uint8_t *sig, size_t siglen)
int ecdsa_verify_init(ECDSA_SIGN_CTX *ctx, const SECP256R1_KEY *key, const DIGEST *digest,
const uint8_t *sig, size_t siglen)
{
if (!ctx || !key || !sig || !siglen) {
error_print();
@@ -347,7 +365,13 @@ int ecdsa_verify_init(ECDSA_SIGN_CTX *ctx, const SECP256R1_KEY *key, const uint8
ctx->key = *key;
sha256_init(&ctx->sha256_ctx);
if (!digest) {
digest = DIGEST_sha256();
}
if (digest_init(&ctx->digest_ctx, digest) != 1) {
error_print();
return -1;
}
return 1;
}
@@ -359,8 +383,9 @@ int ecdsa_verify_update(ECDSA_SIGN_CTX *ctx, const uint8_t *data, size_t datalen
error_print();
return -1;
}
if (data && datalen) {
sha256_update(&ctx->sha256_ctx, data, datalen);
if (digest_update(&ctx->digest_ctx, data, datalen) != 1) {
error_print();
return -1;
}
return 1;
}
@@ -368,7 +393,8 @@ int ecdsa_verify_update(ECDSA_SIGN_CTX *ctx, const uint8_t *data, size_t datalen
int ecdsa_verify_finish(ECDSA_SIGN_CTX *ctx)
{
uint8_t dgst[32];
uint8_t dgst[DIGEST_MAX_SIZE];
size_t dgstlen;
int ret;
if (!ctx) {
@@ -376,7 +402,11 @@ int ecdsa_verify_finish(ECDSA_SIGN_CTX *ctx)
return -1;
}
sha256_finish(&ctx->sha256_ctx, dgst);
if (digest_finish(&ctx->digest_ctx, dgst, &dgstlen) != 1
|| dgstlen < 32) {
error_print();
return -1;
}
if ((ret = ecdsa_do_verify(&ctx->key, dgst, &ctx->sig)) < 0) {
error_print();
@@ -384,4 +414,3 @@ int ecdsa_verify_finish(ECDSA_SIGN_CTX *ctx)
}
return ret;
}

View File

@@ -1901,6 +1901,7 @@ int ocsp_sign_init(OCSP_SIGN_CTX *ctx,
ctx->issuer_cert = issuer_cert;
ctx->issuer_cert_len = issuer_cert_len;
ctx->responder_id_type = OCSP_responder_id_by_name;
ctx->signature_algor = OID_sm2sign_with_sm3;
ctx->produced_at = time(NULL);
ctx->next_update = (time_t)-1;
ctx->revocation_reason = -1;
@@ -1926,6 +1927,16 @@ int ocsp_sign_set_responder_id_type(OCSP_SIGN_CTX *ctx, int responder_id_type)
return 1;
}
int ocsp_sign_set_signature_algor(OCSP_SIGN_CTX *ctx, int signature_algor)
{
if (!ctx || !x509_signature_algor_name(signature_algor)) {
error_print();
return -1;
}
ctx->signature_algor = signature_algor;
return 1;
}
int ocsp_sign_set_produced_at(OCSP_SIGN_CTX *ctx, time_t produced_at)
{
if (!ctx || produced_at == (time_t)-1) {
@@ -2107,8 +2118,9 @@ int ocsp_sign(OCSP_SIGN_CTX *ctx,
return -1;
}
if (x509_key_get_sign_algor(sign_key, &sign_algor) != 1
|| x509_key_get_signature_size(sign_key, &signature_len) != 1) {
sign_algor = ctx->signature_algor;
if (x509_key_supports_sign_algor(sign_key, sign_algor) != 1
|| x509_key_get_signature_size(sign_key, sign_algor, &signature_len) != 1) {
error_print();
return -1;
}
@@ -2116,7 +2128,7 @@ int ocsp_sign(OCSP_SIGN_CTX *ctx,
signature_len = SM2_signature_typical_size;
}
if (x509_sign_init(&sign_ctx, sign_key, sign_args, sign_args_len) != 1) {
if (x509_sign_init(&sign_ctx, sign_key, sign_algor, sign_args, sign_args_len) != 1) {
error_print();
return -1;
}
@@ -2200,7 +2212,6 @@ static int ocsp_verify_signature(const uint8_t *response_data, size_t response_d
{
X509_KEY public_key;
X509_SIGN_CTX verify_ctx;
int sign_algor;
const void *sign_args = signer_id;
size_t sign_args_len = signer_id_len;
@@ -2212,12 +2223,11 @@ static int ocsp_verify_signature(const uint8_t *response_data, size_t response_d
error_print();
return -1;
}
if (x509_cert_get_subject_public_key(signer_cert, signer_cert_len, &public_key) != 1
|| x509_key_get_sign_algor(&public_key, &sign_algor) != 1) {
if (x509_cert_get_subject_public_key(signer_cert, signer_cert_len, &public_key) != 1) {
error_print();
return -1;
}
if (signature_algor != sign_algor) {
if (x509_key_supports_sign_algor(&public_key, signature_algor) != 1) {
error_print();
return -1;
}
@@ -2225,7 +2235,7 @@ static int ocsp_verify_signature(const uint8_t *response_data, size_t response_d
sign_args = SM2_DEFAULT_ID;
sign_args_len = SM2_DEFAULT_ID_LENGTH;
}
if (x509_verify_init(&verify_ctx, &public_key, sign_args, sign_args_len,
if (x509_verify_init(&verify_ctx, &public_key, signature_algor, sign_args, sign_args_len,
signature, signature_len) != 1
|| x509_verify_update(&verify_ctx, response_data, response_data_len) != 1
|| x509_verify_finish(&verify_ctx) != 1) {

View File

@@ -296,8 +296,7 @@ int signed_certificate_timestamp_verify(const uint8_t *sct, size_t sct_len,
error_print();
return -1;
}
if (x509_verify_init(&verify_ctx, key, NULL, 0, sig, siglen) != 1
|| verify_ctx.sign_algor != sig_alg_oid
if (x509_verify_init(&verify_ctx, key, sig_alg_oid, NULL, 0, sig, siglen) != 1
|| x509_verify_update(&verify_ctx, signed_data, signed_data_len) != 1
|| x509_verify_finish(&verify_ctx) != 1) {
error_print();
@@ -389,8 +388,7 @@ int sct_list_verify(const uint8_t *sct_list, size_t sct_list_len,
}
if (x509_verify_init(&verify_ctx, &ct_logs[i].log_key,
NULL, 0, sig, siglen) == 1
&& verify_ctx.sign_algor == sig_alg_oid
sig_alg_oid, NULL, 0, sig, siglen) == 1
&& x509_verify_update(&verify_ctx,
signed_data, signed_data_len) == 1
&& x509_verify_finish(&verify_ctx) == 1) {

View File

@@ -1196,6 +1196,7 @@ int tlcp_recv_client_hello(TLS_CONNECT *conn)
switch (conn->cipher_suite) {
case TLS_cipher_ecc_sm4_cbc_sm3:
case TLS_cipher_ecc_sm4_gcm_sm3:
conn->sig_alg = TLS_sig_sm2sig_sm3;
conn->signature_algorithms[0] = TLS_sig_sm2sig_sm3;
break;
case TLS_cipher_ecdhe_sm4_cbc_sm3:

View File

@@ -680,12 +680,24 @@ static int tls12_key_exchange_group_match_cipher_suite(int group, int cipher_sui
}
}
static int tls12_select_tlcp_signature_scheme(int cipher_suite, int *sig_alg)
{
if (!sig_alg) {
error_print();
return -1;
}
switch (cipher_suite) {
case TLS_cipher_ecc_sm4_cbc_sm3:
case TLS_cipher_ecc_sm4_gcm_sm3:
case TLS_cipher_ecdhe_sm4_cbc_sm3:
case TLS_cipher_ecdhe_sm4_gcm_sm3:
*sig_alg = TLS_sig_sm2sig_sm3;
return 1;
default:
error_print();
return -1;
}
}
static int tls12_select_common_cipher_suites(const uint8_t *client_ciphers, size_t client_ciphers_len,
const int *server_ciphers, size_t server_ciphers_cnt,
@@ -1125,6 +1137,12 @@ int tls_recv_server_hello(TLS_CONNECT *conn)
return -1;
}
conn->cipher_suite = cipher_suite;
if (conn->protocol == TLS_protocol_tlcp
&& tls12_select_tlcp_signature_scheme(conn->cipher_suite, &conn->sig_alg) != 1) {
error_print();
tls_send_alert(conn, TLS_alert_handshake_failure);
return -1;
}
if (tls_cipher_suite_get(conn->cipher_suite, &conn->cipher, &conn->digest) != 1) {
error_print();
@@ -1452,7 +1470,8 @@ int tls_recv_server_key_exchange(TLS_CONNECT *conn)
sign_argslen = SM2_DEFAULT_ID_LENGTH;
}
if (x509_verify_init(&sign_ctx, &server_sign_key, sign_args, sign_argslen, sig, siglen) != 1
if (x509_verify_init(&sign_ctx, &server_sign_key, tls_signature_scheme_algorithm_oid(sig_alg),
sign_args, sign_argslen, sig, siglen) != 1
|| x509_verify_update(&sign_ctx, conn->client_random, 32) != 1
|| x509_verify_update(&sign_ctx, conn->server_random, 32) != 1
|| x509_verify_update(&sign_ctx, server_ecdh_params, server_ecdh_params_len) != 1
@@ -1784,15 +1803,21 @@ int tls_send_certificate_verify(TLS_CONNECT *conn)
if (conn->recordlen == 0) {
X509_KEY *sign_key = &conn->ctx->x509_keys[conn->cert_chain_idx - 1];
X509_SIGN_CTX sign_ctx;
int sign_algor = OID_undef;
const uint8_t *signer_id = NULL;
size_t signer_idlen = 0;
sign_algor = tls_signature_scheme_algorithm_oid(conn->sig_alg);
if (sign_algor == OID_undef) {
error_print();
return -1;
}
if (sign_key->algor == OID_ec_public_key && sign_key->algor_param == OID_sm2) {
signer_id = (uint8_t *)SM2_DEFAULT_ID;
signer_idlen = SM2_DEFAULT_ID_LENGTH;
}
if (x509_sign_init(&sign_ctx, sign_key, signer_id, signer_idlen) != 1
if (x509_sign_init(&sign_ctx, sign_key, sign_algor, signer_id, signer_idlen) != 1
|| x509_sign_update(&sign_ctx, conn->transcript, conn->transcript_len) != 1
|| x509_sign_finish(&sign_ctx, sig, &siglen) != 1) {
gmssl_secure_clear(&sign_ctx, sizeof(sign_ctx));
@@ -2322,6 +2347,12 @@ int tls_recv_client_hello(TLS_CONNECT *conn)
tls_send_alert(conn, TLS_alert_handshake_failure);
return -1;
}
if (conn->protocol == TLS_protocol_tlcp
&& tls12_select_tlcp_signature_scheme(conn->cipher_suite, &conn->sig_alg) != 1) {
error_print();
tls_send_alert(conn, TLS_alert_handshake_failure);
return -1;
}
if (tls_cipher_suite_get(conn->cipher_suite, &conn->cipher, &conn->digest) != 1) {
error_print();
@@ -2492,6 +2523,7 @@ int tls_send_server_key_exchange(TLS_CONNECT *conn)
X509_SIGN_CTX sign_ctx;
const void *sign_args = NULL;
size_t sign_argslen = 0;
int sign_algor = tls_signature_scheme_algorithm_oid(conn->sig_alg);
uint8_t sig[X509_SIGNATURE_MAX_SIZE];
size_t siglen;
@@ -2516,7 +2548,11 @@ int tls_send_server_key_exchange(TLS_CONNECT *conn)
sign_args = SM2_DEFAULT_ID;
sign_argslen = SM2_DEFAULT_ID_LENGTH;
}
if (x509_sign_init(&sign_ctx, sign_key, sign_args, sign_argslen) != 1
if (sign_algor == OID_undef) {
error_print();
return -1;
}
if (x509_sign_init(&sign_ctx, sign_key, sign_algor, sign_args, sign_argslen) != 1
|| x509_sign_update(&sign_ctx, conn->client_random, 32) != 1
|| x509_sign_update(&sign_ctx, conn->server_random, 32) != 1
|| x509_sign_update(&sign_ctx, server_ecdh_params, server_ecdh_params_len) != 1
@@ -2879,7 +2915,12 @@ int tls_recv_certificate_verify(TLS_CONNECT *conn)
signer_id = (uint8_t *)SM2_DEFAULT_ID;
signer_idlen = SM2_DEFAULT_ID_LENGTH;
}
if (x509_verify_init(&sign_ctx, &client_sign_key, signer_id, signer_idlen, sig, siglen) != 1
sig_alg = tls_signature_scheme_algorithm_oid(conn->protocol == TLS_protocol_tls12 ? sig_alg : conn->sig_alg);
if (sig_alg == OID_undef) {
error_print();
return -1;
}
if (x509_verify_init(&sign_ctx, &client_sign_key, sig_alg, signer_id, signer_idlen, sig, siglen) != 1
|| x509_verify_update(&sign_ctx, conn->transcript, conn->transcript_len) != 1
|| x509_verify_finish(&sign_ctx) != 1) {
error_print();

View File

@@ -1004,7 +1004,8 @@ int tls13_sign_certificate_verify(int tls_mode, int sig_alg,
return -1;
}
if (x509_sign_init(&sign_ctx, sign_key, signer_id, signer_id_len) != 1
if (x509_sign_init(&sign_ctx, sign_key, tls_signature_scheme_algorithm_oid(sig_alg),
signer_id, signer_id_len) != 1
|| x509_sign_update(&sign_ctx, prefix, 64) != 1
|| x509_sign_update(&sign_ctx, context_str_and_zero, context_str_and_zero_len) != 1
|| x509_sign_update(&sign_ctx, dgst, dgstlen) != 1
@@ -1104,7 +1105,8 @@ int tls13_verify_certificate_verify(int tls_mode, int sig_alg,
format_bytes(stderr, 0, 4, "signature", sig, siglen);
*/
if (x509_verify_init(&sign_ctx, public_key, signer_id, signer_id_len, sig, siglen) != 1
if (x509_verify_init(&sign_ctx, public_key, tls_signature_scheme_algorithm_oid(sig_alg),
signer_id, signer_id_len, sig, siglen) != 1
|| x509_verify_update(&sign_ctx, prefix, 64) != 1
|| x509_verify_update(&sign_ctx, context_str_and_zero, context_str_and_zero_len) != 1
|| x509_verify_update(&sign_ctx, dgst, dgstlen) != 1) {

View File

@@ -1110,15 +1110,14 @@ int x509_cert_sign_to_der(
{
size_t len = 0;
uint8_t *tbs = NULL;
int sig_alg;
uint8_t sig[X509_SIGNATURE_MAX_SIZE];
size_t siglen;
if (x509_key_get_sign_algor(sign_key, &sig_alg) != 1) {
if (x509_key_supports_sign_algor(sign_key, signature_algor) != 1) {
error_print();
return -1;
}
if (x509_key_get_signature_size(sign_key, &siglen) != 1) {
if (x509_key_get_signature_size(sign_key, signature_algor, &siglen) != 1) {
error_print();
return -1;
}
@@ -1138,7 +1137,7 @@ int x509_cert_sign_to_der(
subject_unique_id, subject_unique_id_len,
exts, exts_len,
NULL, &len) != 1
|| x509_signature_algor_to_der(sig_alg, NULL, &len) != 1
|| x509_signature_algor_to_der(signature_algor, NULL, &len) != 1
|| asn1_bit_octets_to_der(sig, siglen, NULL, &len) != 1
|| asn1_sequence_header_to_der(len, out, outlen) != 1) {
error_print();
@@ -1173,7 +1172,7 @@ int x509_cert_sign_to_der(
sign_args = SM2_DEFAULT_ID;
sign_argslen = SM2_DEFAULT_ID_LENGTH;
}
if (x509_sign_init(&sign_ctx, sign_key, sign_args, sign_argslen) != 1) {
if (x509_sign_init(&sign_ctx, sign_key, signature_algor, sign_args, sign_argslen) != 1) {
error_print();
return -1;
}
@@ -1192,7 +1191,7 @@ int x509_cert_sign_to_der(
gmssl_secure_clear(&sign_ctx, sizeof(sign_ctx));
}
if (x509_signature_algor_to_der(sig_alg, out, outlen) != 1
if (x509_signature_algor_to_der(signature_algor, out, outlen) != 1
|| asn1_bit_octets_to_der(sig, siglen, out, outlen) != 1) {
error_print();
return -1;
@@ -1236,22 +1235,16 @@ int x509_signed_verify(const uint8_t *a, size_t alen,
int sig_alg;
const uint8_t *sig;
size_t siglen;
int key_sig_alg;
void *sign_args = NULL;
size_t sign_argslen = 0;
X509_SIGN_CTX verify_ctx;
if (x509_key_get_sign_algor(key, &key_sig_alg) != 1) {
error_print();
return -1;
}
if (x509_signed_from_der(&tbs, &tbslen, &sig_alg, &sig, &siglen, &a, &alen) != 1
|| asn1_length_is_zero(alen) != 1) {
error_print();
return -1;
}
if (sig_alg != key_sig_alg) {
if (x509_key_supports_sign_algor(key, sig_alg) != 1) {
error_print();
return -1;
}
@@ -1261,7 +1254,7 @@ int x509_signed_verify(const uint8_t *a, size_t alen,
sign_args = (uint8_t *)signer_id;
sign_argslen = signer_id_len;
}
if (x509_verify_init(&verify_ctx, key, sign_args, sign_argslen, sig, siglen) != 1
if (x509_verify_init(&verify_ctx, key, sig_alg, sign_args, sign_argslen, sig, siglen) != 1
|| x509_verify_update(&verify_ctx, tbs, tbslen) != 1
|| x509_verify_finish(&verify_ctx) != 1) {
error_print();

View File

@@ -1426,21 +1426,16 @@ int x509_crl_sign_to_der(
X509_KEY *sign_key, const char *signer_id, size_t signer_id_len,
uint8_t **out, size_t *outlen)
{
int key_sig_alg;
size_t len = 0;
uint8_t *tbs = NULL;
uint8_t sig[X509_SIGNATURE_MAX_SIZE];
size_t siglen;
if (x509_key_get_sign_algor(sign_key, &key_sig_alg) != 1) {
if (x509_key_supports_sign_algor(sign_key, sig_alg) != 1) {
error_print();
return -1;
}
if (sig_alg != key_sig_alg) {
error_print();
return -1;
}
if (x509_key_get_signature_size(sign_key, &siglen) != 1) {
if (x509_key_get_signature_size(sign_key, sig_alg, &siglen) != 1) {
error_print();
return -1;
}
@@ -1475,7 +1470,7 @@ int x509_crl_sign_to_der(
sign_args = SM2_DEFAULT_ID;
sign_argslen = SM2_DEFAULT_ID_LENGTH;
}
if (x509_sign_init(&sign_ctx, sign_key, sign_args, sign_argslen) != 1) {
if (x509_sign_init(&sign_ctx, sign_key, sig_alg, sign_args, sign_argslen) != 1) {
error_print();
return -1;
}

View File

@@ -1636,9 +1636,9 @@ int x509_private_keys_from_file(X509_KEY *keys, size_t *keys_cnt, size_t max_cnt
return 1;
}
int x509_key_get_sign_algor(const X509_KEY *key, int *algor)
int x509_key_supports_sign_algor(const X509_KEY *key, int sign_algor)
{
if (!key || !algor) {
if (!key) {
error_print();
return -1;
}
@@ -1647,29 +1647,35 @@ int x509_key_get_sign_algor(const X509_KEY *key, int *algor)
case OID_ec_public_key:
switch (key->algor_param) {
case OID_sm2:
*algor = OID_sm2sign_with_sm3;
break;
return sign_algor == OID_sm2sign_with_sm3 ? 1 : 0;
#ifdef ENABLE_SECP256R1
case OID_secp256r1:
*algor = OID_ecdsa_with_sha256;
break;
switch (sign_algor) {
case OID_ecdsa_with_sha256:
case OID_ecdsa_with_sha384:
case OID_ecdsa_with_sha512:
return 1;
default:
return 0;
}
#endif
default:
error_print();
return -1;
}
break;
#ifdef ENABLE_SM9
case OID_sm9:
switch (key->algor_param) {
case OID_sm9sign:
*algor = OID_sm9sign;
break;
default:
if (key->algor_param != OID_sm9sign) {
error_print();
return -1;
}
break;
return sign_algor == OID_sm9sign ? 1 : 0;
case OID_sm9sign:
if (key->algor_param != OID_undef) {
error_print();
return -1;
}
return sign_algor == OID_sm9sign ? 1 : 0;
#endif
#ifdef ENABLE_LMS
case OID_lms_hashsig:
@@ -1682,8 +1688,7 @@ int x509_key_get_sign_algor(const X509_KEY *key, int *algor)
#ifdef ENABLE_SPHINCS
case OID_sphincs_hashsig:
#endif
*algor = key->algor;
break;
return sign_algor == key->algor ? 1 : 0;
#ifdef ENABLE_KYBER
case OID_kyber_kem:
#endif
@@ -1691,17 +1696,28 @@ int x509_key_get_sign_algor(const X509_KEY *key, int *algor)
error_print();
return -1;
}
return 1;
}
int x509_key_get_signature_size(const X509_KEY *key, size_t *siglen)
int x509_key_get_signature_size(const X509_KEY *key, int sign_algor, size_t *siglen)
{
int ret;
if (!key || !siglen) {
error_print();
return -1;
}
if ((ret = x509_key_supports_sign_algor(key, sign_algor)) != 1) {
if (ret < 0) error_print();
return -1;
}
switch (key->algor) {
case OID_ec_public_key:
*siglen = SM2_signature_max_size;
break;
#ifdef ENABLE_SM9
case OID_sm9:
case OID_sm9sign:
*siglen = SM9_SIGNATURE_SIZE;
break;
#endif
@@ -1750,12 +1766,30 @@ int x509_key_get_signature_size(const X509_KEY *key, size_t *siglen)
return 1;
}
int x509_sign_init(X509_SIGN_CTX *ctx, X509_KEY *key, const void *args, size_t argslen)
static const DIGEST *x509_ecdsa_sign_algor_digest(int sign_algor)
{
switch (sign_algor) {
case OID_ecdsa_with_sha256:
return DIGEST_sha256();
case OID_ecdsa_with_sha384:
return DIGEST_sha384();
case OID_ecdsa_with_sha512:
return DIGEST_sha512();
default:
return NULL;
}
}
int x509_sign_init(X509_SIGN_CTX *ctx, X509_KEY *key, int sign_algor, const void *args, size_t argslen)
{
if (!ctx || !key) {
error_print();
return -1;
}
if (x509_key_supports_sign_algor(key, sign_algor) != 1) {
error_print();
return -1;
}
switch (key->algor) {
#ifdef ENABLE_SM9
case OID_sm9:
@@ -1797,11 +1831,12 @@ int x509_sign_init(X509_SIGN_CTX *ctx, X509_KEY *key, const void *args, size_t a
break;
#ifdef ENABLE_SECP256R1
case OID_secp256r1:
if (ecdsa_sign_init(&ctx->u.ecdsa_sign_ctx, &key->u.secp256r1_key) != 1) {
if (ecdsa_sign_init(&ctx->u.ecdsa_sign_ctx, &key->u.secp256r1_key,
x509_ecdsa_sign_algor_digest(sign_algor)) != 1) {
error_print();
return -1;
}
ctx->sign_algor = OID_ecdsa_with_sha256;
ctx->sign_algor = sign_algor;
break;
#endif
default:
@@ -1890,6 +1925,8 @@ int x509_sign_set_signature_size(X509_SIGN_CTX *ctx, size_t siglen)
case OID_sm2sign_with_sm3:
#ifdef ENABLE_SECP256R1
case OID_ecdsa_with_sha256:
case OID_ecdsa_with_sha384:
case OID_ecdsa_with_sha512:
#endif
switch (siglen) {
case SM2_signature_compact_size:
@@ -1925,6 +1962,8 @@ int x509_sign_update(X509_SIGN_CTX *ctx, const uint8_t *data, size_t datalen)
break;
#ifdef ENABLE_SECP256R1
case OID_ecdsa_with_sha256:
case OID_ecdsa_with_sha384:
case OID_ecdsa_with_sha512:
if (ecdsa_sign_update(&ctx->u.ecdsa_sign_ctx, data, datalen) != 1) {
error_print();
return -1;
@@ -2002,6 +2041,8 @@ int x509_sign_finish(X509_SIGN_CTX *ctx, uint8_t *sig, size_t *siglen)
break;
#ifdef ENABLE_SECP256R1
case OID_ecdsa_with_sha256:
case OID_ecdsa_with_sha384:
case OID_ecdsa_with_sha512:
if (ctx->fixed_siglen) {
if (ecdsa_sign_finish_fixlen(&ctx->u.ecdsa_sign_ctx, ctx->fixed_siglen, sig) != 1) {
error_print();
@@ -2079,6 +2120,8 @@ int x509_sign(X509_SIGN_CTX *ctx, const uint8_t *data, size_t datalen, uint8_t *
case OID_sm2sign_with_sm3:
#ifdef ENABLE_SECP256R1
case OID_ecdsa_with_sha256:
case OID_ecdsa_with_sha384:
case OID_ecdsa_with_sha512:
#endif
#ifdef ENABLE_SM9
case OID_sm9sign:
@@ -2123,13 +2166,17 @@ int x509_sign(X509_SIGN_CTX *ctx, const uint8_t *data, size_t datalen, uint8_t *
return 1;
}
int x509_verify_init(X509_SIGN_CTX *ctx, const X509_KEY *key, const void *args, size_t argslen,
int x509_verify_init(X509_SIGN_CTX *ctx, const X509_KEY *key, int sign_algor, const void *args, size_t argslen,
const uint8_t *sig, size_t siglen)
{
if (!ctx || !key || !sig || !siglen) {
error_print();
return -1;
}
if (x509_key_supports_sign_algor(key, sign_algor) != 1) {
error_print();
return -1;
}
switch (key->algor) {
#ifdef ENABLE_SM9
case OID_sm9:
@@ -2172,11 +2219,12 @@ int x509_verify_init(X509_SIGN_CTX *ctx, const X509_KEY *key, const void *args,
break;
#ifdef ENABLE_SECP256R1
case OID_secp256r1:
if (ecdsa_verify_init(&ctx->u.ecdsa_sign_ctx, &key->u.secp256r1_key, sig, siglen) != 1) {
if (ecdsa_verify_init(&ctx->u.ecdsa_sign_ctx, &key->u.secp256r1_key,
x509_ecdsa_sign_algor_digest(sign_algor), sig, siglen) != 1) {
error_print();
return -1;
}
ctx->sign_algor = OID_ecdsa_with_sha256;
ctx->sign_algor = sign_algor;
break;
#endif
default:
@@ -2261,6 +2309,8 @@ int x509_verify_update(X509_SIGN_CTX *ctx, const uint8_t *data, size_t datalen)
break;
#ifdef ENABLE_SECP256R1
case OID_ecdsa_with_sha256:
case OID_ecdsa_with_sha384:
case OID_ecdsa_with_sha512:
if (ecdsa_verify_update(&ctx->u.ecdsa_sign_ctx, data, datalen) != 1) {
error_print();
return -1;
@@ -2331,6 +2381,8 @@ int x509_verify_finish(X509_SIGN_CTX *ctx)
break;
#ifdef ENABLE_SECP256R1
case OID_ecdsa_with_sha256:
case OID_ecdsa_with_sha384:
case OID_ecdsa_with_sha512:
if ((ret = ecdsa_verify_finish(&ctx->u.ecdsa_sign_ctx)) < 0) {
error_print();
return -1;
@@ -2404,6 +2456,8 @@ int x509_verify(X509_SIGN_CTX *ctx, const uint8_t *data, size_t datalen)
case OID_sm2sign_with_sm3:
#ifdef ENABLE_SECP256R1
case OID_ecdsa_with_sha256:
case OID_ecdsa_with_sha384:
case OID_ecdsa_with_sha512:
#endif
#ifdef ENABLE_LMS
case OID_lms_hashsig:
@@ -2453,6 +2507,8 @@ void x509_sign_ctx_cleanup(X509_SIGN_CTX *ctx)
break;
#ifdef ENABLE_SECP256R1
case OID_ecdsa_with_sha256:
case OID_ecdsa_with_sha384:
case OID_ecdsa_with_sha512:
gmssl_secure_clear(&ctx->u.ecdsa_sign_ctx, sizeof(ECDSA_SIGN_CTX));
break;
#endif

View File

@@ -168,15 +168,14 @@ int x509_req_sign_to_der(
{
size_t len = 0;
uint8_t *tbs = NULL;
int sig_alg;
uint8_t sig[X509_SIGNATURE_MAX_SIZE];
size_t siglen;
if (x509_key_get_sign_algor(sign_key, &sig_alg) != 1) {
if (x509_key_supports_sign_algor(sign_key, signature_algor) != 1) {
error_print();
return -1;
}
if (x509_key_get_signature_size(sign_key, &siglen) != 1) {
if (x509_key_get_signature_size(sign_key, signature_algor, &siglen) != 1) {
error_print();
return -1;
}
@@ -186,7 +185,7 @@ int x509_req_sign_to_der(
if (x509_request_info_to_der(version, subject, subject_len, subject_public_key,
attrs, attrs_len, NULL, &len) != 1
|| x509_signature_algor_to_der(sig_alg, NULL, &len) != 1
|| x509_signature_algor_to_der(signature_algor, NULL, &len) != 1
|| asn1_bit_octets_to_der(sig, siglen, NULL, &len) != 1
|| asn1_sequence_header_to_der(len, out, outlen) != 1) {
error_print();
@@ -209,7 +208,7 @@ int x509_req_sign_to_der(
sign_args = SM2_DEFAULT_ID;
sign_argslen = SM2_DEFAULT_ID_LENGTH;
}
if (x509_sign_init(&sign_ctx, sign_key, sign_args, sign_argslen) != 1) {
if (x509_sign_init(&sign_ctx, sign_key, signature_algor, sign_args, sign_argslen) != 1) {
error_print();
return -1;
}
@@ -227,7 +226,7 @@ int x509_req_sign_to_der(
}
gmssl_secure_clear(&sign_ctx, sizeof(sign_ctx));
}
if (x509_signature_algor_to_der(sig_alg, out, outlen) != 1
if (x509_signature_algor_to_der(signature_algor, out, outlen) != 1
|| asn1_bit_octets_to_der(sig, siglen, out, outlen) != 1) {
error_print();
return -1;

View File

@@ -109,7 +109,6 @@ static int x509_signed_is_verified_by_key(const uint8_t *a, size_t alen,
int sig_alg;
const uint8_t *sig;
size_t siglen;
int key_sig_alg;
void *sign_args = NULL;
size_t sign_argslen = 0;
X509_SIGN_CTX verify_ctx;
@@ -123,13 +122,7 @@ static int x509_signed_is_verified_by_key(const uint8_t *a, size_t alen,
error_print();
return -1;
}
// FIXME: 改为 x509_key_support_algor
if (x509_key_get_sign_algor(key, &key_sig_alg) != 1) {
error_print();
return -1;
}
if (sig_alg != key_sig_alg) {
if (x509_key_supports_sign_algor(key, sig_alg) != 1) {
return 0;
}
@@ -139,7 +132,7 @@ static int x509_signed_is_verified_by_key(const uint8_t *a, size_t alen,
sign_args = (uint8_t *)signer_id;
sign_argslen = signer_id_len;
}
if (x509_verify_init(&verify_ctx, key, sign_args, sign_argslen, sig, siglen) != 1
if (x509_verify_init(&verify_ctx, key, sig_alg, sign_args, sign_argslen, sig, siglen) != 1
|| x509_verify_update(&verify_ctx, tbs, tbslen) != 1
|| x509_verify_finish(&verify_ctx) != 1) {
return 0;