Update ECDSA

This commit is contained in:
Zhi Guan
2026-06-25 14:29:51 +08:00
parent 8bd870d354
commit d804ea4e9b
9 changed files with 218 additions and 153 deletions

View File

@@ -7,7 +7,6 @@
* http://www.apache.org/licenses/LICENSE-2.0
*/
#include <string.h>
#include <gmssl/ecdsa.h>
#ifdef ENABLE_SECP256R1
#include <gmssl/secp256r1_ecdsa.h>
@@ -18,45 +17,6 @@
#include <gmssl/error.h>
#ifdef ENABLE_SECP256R1
static int ecdsa_digest_to_p256(const uint8_t *dgst, size_t dgstlen, uint8_t out[32])
{
if (!dgst || !out) {
error_print();
return -1;
}
if (dgstlen == 32) {
memcpy(out, dgst, 32);
} else if (dgstlen == 48) {
memcpy(out, dgst, 32);
} else {
error_print();
return -1;
}
return 1;
}
#endif
#ifdef ENABLE_SECP384R1
static int ecdsa_digest_to_p384(const uint8_t *dgst, size_t dgstlen, uint8_t out[48])
{
if (!dgst || !out) {
error_print();
return -1;
}
if (dgstlen == 32) {
memset(out, 0, 16);
memcpy(out + 16, dgst, 32);
} else if (dgstlen == 48) {
memcpy(out, dgst, 48);
} else {
error_print();
return -1;
}
return 1;
}
#endif
int ecdsa_sign(const EC_KEY *key, const uint8_t *dgst, size_t dgstlen,
uint8_t *sig, size_t *siglen)
{
@@ -67,25 +27,17 @@ int ecdsa_sign(const EC_KEY *key, const uint8_t *dgst, size_t dgstlen,
switch (key->oid) {
#ifdef ENABLE_SECP256R1
case OID_secp256r1:
{
uint8_t e[32];
if (ecdsa_digest_to_p256(dgst, dgstlen, e) != 1
|| secp256r1_ecdsa_sign(&key->u.secp256r1_key, e, sig, siglen) != 1) {
error_print();
return -1;
}
if (secp256r1_ecdsa_sign(&key->u.secp256r1_key, dgst, dgstlen, sig, siglen) != 1) {
error_print();
return -1;
}
return 1;
#endif
#ifdef ENABLE_SECP384R1
case OID_secp384r1:
{
uint8_t e[48];
if (ecdsa_digest_to_p384(dgst, dgstlen, e) != 1
|| secp384r1_ecdsa_sign(&key->u.secp384r1_key, e, sig, siglen) != 1) {
error_print();
return -1;
}
if (secp384r1_ecdsa_sign(&key->u.secp384r1_key, dgst, dgstlen, sig, siglen) != 1) {
error_print();
return -1;
}
return 1;
#endif
@@ -105,25 +57,17 @@ int ecdsa_sign_fixed_len(const EC_KEY *key, const uint8_t *dgst, size_t dgstlen,
switch (key->oid) {
#ifdef ENABLE_SECP256R1
case OID_secp256r1:
{
uint8_t e[32];
if (ecdsa_digest_to_p256(dgst, dgstlen, e) != 1
|| secp256r1_ecdsa_sign_fixlen(&key->u.secp256r1_key, e, siglen, sig) != 1) {
error_print();
return -1;
}
if (secp256r1_ecdsa_sign_fixlen(&key->u.secp256r1_key, dgst, dgstlen, siglen, sig) != 1) {
error_print();
return -1;
}
return 1;
#endif
#ifdef ENABLE_SECP384R1
case OID_secp384r1:
{
uint8_t e[48];
if (ecdsa_digest_to_p384(dgst, dgstlen, e) != 1
|| secp384r1_ecdsa_sign_fixlen(&key->u.secp384r1_key, e, siglen, sig) != 1) {
error_print();
return -1;
}
if (secp384r1_ecdsa_sign_fixlen(&key->u.secp384r1_key, dgst, dgstlen, siglen, sig) != 1) {
error_print();
return -1;
}
return 1;
#endif
@@ -144,13 +88,8 @@ int ecdsa_verify(const EC_KEY *key, const uint8_t *dgst, size_t dgstlen,
#ifdef ENABLE_SECP256R1
case OID_secp256r1:
{
uint8_t e[32];
int ret;
if (ecdsa_digest_to_p256(dgst, dgstlen, e) != 1) {
error_print();
return -1;
}
if ((ret = secp256r1_ecdsa_verify(&key->u.secp256r1_key, e, sig, siglen)) < 0) {
if ((ret = secp256r1_ecdsa_verify(&key->u.secp256r1_key, dgst, dgstlen, sig, siglen)) < 0) {
error_print();
return -1;
}
@@ -160,13 +99,8 @@ int ecdsa_verify(const EC_KEY *key, const uint8_t *dgst, size_t dgstlen,
#ifdef ENABLE_SECP384R1
case OID_secp384r1:
{
uint8_t e[48];
int ret;
if (ecdsa_digest_to_p384(dgst, dgstlen, e) != 1) {
error_print();
return -1;
}
if ((ret = secp384r1_ecdsa_verify(&key->u.secp384r1_key, e, sig, siglen)) < 0) {
if ((ret = secp384r1_ecdsa_verify(&key->u.secp384r1_key, dgst, dgstlen, sig, siglen)) < 0) {
error_print();
return -1;
}

View File

@@ -12,6 +12,7 @@
#include <stdlib.h>
#include <gmssl/asn1.h>
#include <gmssl/digest.h>
#include <gmssl/sha2.h>
#include <gmssl/rand.h>
#include <gmssl/error.h>
#include <gmssl/secp256r1_ecdsa.h>
@@ -47,7 +48,30 @@ int secp256r1_ecdsa_signature_print(FILE *fp, int fmt, int ind, const char *labe
return 1;
}
int secp256r1_ecdsa_do_sign_ex(const SECP256R1_KEY *key, const secp256r1_t k, const uint8_t dgst[32], SECP256R1_ECDSA_SIGNATURE *sig)
static int secp256r1_ecdsa_digest_to_e(secp256r1_t e, const uint8_t *dgst, size_t dgstlen)
{
uint8_t buf[SHA256_DIGEST_SIZE];
if (!dgst) {
error_print();
return -1;
}
if (dgstlen != SHA256_DIGEST_SIZE && dgstlen != SHA384_DIGEST_SIZE) {
error_print();
return -1;
}
memcpy(buf, dgst, sizeof(buf));
if (secp256r1_from_32bytes(e, buf) != 1
|| secp256r1_modn(e, e) != 1) {
error_print();
return -1;
}
return 1;
}
int secp256r1_ecdsa_do_sign_ex(const SECP256R1_KEY *key, const secp256r1_t k,
const uint8_t *dgst, size_t dgstlen, SECP256R1_ECDSA_SIGNATURE *sig)
{
secp256r1_t e;
secp256r1_t x1;
@@ -56,8 +80,7 @@ int secp256r1_ecdsa_do_sign_ex(const SECP256R1_KEY *key, const secp256r1_t k, co
SECP256R1_POINT P;
// e = hash(m)
if (secp256r1_from_32bytes(e, dgst) != 1
|| secp256r1_modn(e, e) != 1) {
if (secp256r1_ecdsa_digest_to_e(e, dgst, dgstlen) != 1) {
error_print();
return -1;
}
@@ -87,7 +110,8 @@ int secp256r1_ecdsa_do_sign_ex(const SECP256R1_KEY *key, const secp256r1_t k, co
return 1;
}
int secp256r1_ecdsa_do_sign(const SECP256R1_KEY *key, const uint8_t dgst[32], SECP256R1_ECDSA_SIGNATURE *sig)
int secp256r1_ecdsa_do_sign(const SECP256R1_KEY *key,
const uint8_t *dgst, size_t dgstlen, SECP256R1_ECDSA_SIGNATURE *sig)
{
secp256r1_t k;
@@ -99,7 +123,7 @@ int secp256r1_ecdsa_do_sign(const SECP256R1_KEY *key, const uint8_t dgst[32], SE
}
} while (secp256r1_is_zero(k) || secp256r1_cmp(k, SECP256R1_N) >= 0);
if (secp256r1_ecdsa_do_sign_ex(key, k, dgst, sig) != 1) {
if (secp256r1_ecdsa_do_sign_ex(key, k, dgst, dgstlen, sig) != 1) {
error_print();
return -1;
}
@@ -107,7 +131,8 @@ int secp256r1_ecdsa_do_sign(const SECP256R1_KEY *key, const uint8_t dgst[32], SE
}
int secp256r1_ecdsa_do_verify(const SECP256R1_KEY *key, const uint8_t dgst[32], const SECP256R1_ECDSA_SIGNATURE *sig)
int secp256r1_ecdsa_do_verify(const SECP256R1_KEY *key,
const uint8_t *dgst, size_t dgstlen, const SECP256R1_ECDSA_SIGNATURE *sig)
{
secp256r1_t e;
secp256r1_t w;
@@ -129,8 +154,7 @@ int secp256r1_ecdsa_do_verify(const SECP256R1_KEY *key, const uint8_t dgst[32],
}
// e = hash(m)
if (secp256r1_from_32bytes(e, dgst) != 1
|| secp256r1_modn(e, e) != 1) {
if (secp256r1_ecdsa_digest_to_e(e, dgst, dgstlen) != 1) {
error_print();
return -1;
}
@@ -233,11 +257,12 @@ int secp256r1_ecdsa_signature_from_der(SECP256R1_ECDSA_SIGNATURE *sig, const uin
return 1;
}
int secp256r1_ecdsa_sign(const SECP256R1_KEY *key, const uint8_t dgst[32], uint8_t *sigbuf, size_t *siglen)
int secp256r1_ecdsa_sign(const SECP256R1_KEY *key,
const uint8_t *dgst, size_t dgstlen, uint8_t *sigbuf, size_t *siglen)
{
SECP256R1_ECDSA_SIGNATURE sig;
if (secp256r1_ecdsa_do_sign(key, dgst, &sig) != 1) {
if (secp256r1_ecdsa_do_sign(key, dgst, dgstlen, &sig) != 1) {
error_print();
return -1;
}
@@ -249,7 +274,8 @@ int secp256r1_ecdsa_sign(const SECP256R1_KEY *key, const uint8_t dgst[32], uint8
return 1;
}
int secp256r1_ecdsa_sign_fixlen(const SECP256R1_KEY *key, const uint8_t dgst[32], size_t siglen, uint8_t *sig)
int secp256r1_ecdsa_sign_fixlen(const SECP256R1_KEY *key,
const uint8_t *dgst, size_t dgstlen, size_t siglen, uint8_t *sig)
{
unsigned int trys = 200;
uint8_t buf[SECP256R1_ECDSA_SIGNATURE_MAX_SIZE];
@@ -266,7 +292,7 @@ int secp256r1_ecdsa_sign_fixlen(const SECP256R1_KEY *key, const uint8_t dgst[32]
}
while (trys--) {
if (secp256r1_ecdsa_sign(key, dgst, buf, &len) != 1) {
if (secp256r1_ecdsa_sign(key, dgst, dgstlen, buf, &len) != 1) {
error_print();
return -1;
}
@@ -282,7 +308,8 @@ int secp256r1_ecdsa_sign_fixlen(const SECP256R1_KEY *key, const uint8_t dgst[32]
}
int secp256r1_ecdsa_verify(const SECP256R1_KEY *key, const uint8_t dgst[32], const uint8_t *sigbuf, size_t siglen)
int secp256r1_ecdsa_verify(const SECP256R1_KEY *key,
const uint8_t *dgst, size_t dgstlen, const uint8_t *sigbuf, size_t siglen)
{
int ret;
SECP256R1_ECDSA_SIGNATURE sig;
@@ -295,7 +322,7 @@ int secp256r1_ecdsa_verify(const SECP256R1_KEY *key, const uint8_t dgst[32], con
error_print();
return -1;
}
if ((ret = secp256r1_ecdsa_do_verify(key, dgst, &sig)) < 0) {
if ((ret = secp256r1_ecdsa_do_verify(key, dgst, dgstlen, &sig)) < 0) {
error_print();
return -1;
}
@@ -346,13 +373,12 @@ int secp256r1_ecdsa_sign_finish(SECP256R1_ECDSA_SIGN_CTX *ctx, uint8_t *sig, siz
return -1;
}
if (digest_finish(&ctx->digest_ctx, dgst, &dgstlen) != 1
|| dgstlen < 32) {
if (digest_finish(&ctx->digest_ctx, dgst, &dgstlen) != 1) {
error_print();
return -1;
}
if (secp256r1_ecdsa_sign(&ctx->key, dgst, sig, siglen) != 1) {
if (secp256r1_ecdsa_sign(&ctx->key, dgst, dgstlen, sig, siglen) != 1) {
error_print();
return -1;
}
@@ -369,13 +395,12 @@ int secp256r1_ecdsa_sign_finish_fixlen(SECP256R1_ECDSA_SIGN_CTX *ctx, size_t sig
return -1;
}
if (digest_finish(&ctx->digest_ctx, dgst, &dgstlen) != 1
|| dgstlen < 32) {
if (digest_finish(&ctx->digest_ctx, dgst, &dgstlen) != 1) {
error_print();
return -1;
}
if (secp256r1_ecdsa_sign_fixlen(&ctx->key, dgst, siglen, sig) != 1) {
if (secp256r1_ecdsa_sign_fixlen(&ctx->key, dgst, dgstlen, siglen, sig) != 1) {
error_print();
return -1;
}
@@ -443,13 +468,12 @@ int secp256r1_ecdsa_verify_finish(SECP256R1_ECDSA_SIGN_CTX *ctx)
return -1;
}
if (digest_finish(&ctx->digest_ctx, dgst, &dgstlen) != 1
|| dgstlen < 32) {
if (digest_finish(&ctx->digest_ctx, dgst, &dgstlen) != 1) {
error_print();
return -1;
}
if ((ret = secp256r1_ecdsa_do_verify(&ctx->key, dgst, &ctx->sig)) < 0) {
if ((ret = secp256r1_ecdsa_do_verify(&ctx->key, dgst, dgstlen, &ctx->sig)) < 0) {
error_print();
return -1;
}

View File

@@ -12,6 +12,7 @@
#include <stdlib.h>
#include <gmssl/asn1.h>
#include <gmssl/digest.h>
#include <gmssl/sha2.h>
#include <gmssl/rand.h>
#include <gmssl/error.h>
#include <gmssl/secp384r1_ecdsa.h>
@@ -47,7 +48,34 @@ int secp384r1_ecdsa_signature_print(FILE *fp, int fmt, int ind, const char *labe
return 1;
}
int secp384r1_ecdsa_do_sign_ex(const SECP384R1_KEY *key, const secp384r1_t k, const uint8_t dgst[48], SECP384R1_ECDSA_SIGNATURE *sig)
static int secp384r1_ecdsa_digest_to_e(secp384r1_t e, const uint8_t *dgst, size_t dgstlen)
{
uint8_t buf[SHA384_DIGEST_SIZE];
if (!dgst) {
error_print();
return -1;
}
if (dgstlen == SHA256_DIGEST_SIZE) {
memset(buf, 0, SHA384_DIGEST_SIZE - SHA256_DIGEST_SIZE);
memcpy(buf + SHA384_DIGEST_SIZE - SHA256_DIGEST_SIZE, dgst, SHA256_DIGEST_SIZE);
} else if (dgstlen == SHA384_DIGEST_SIZE) {
memcpy(buf, dgst, sizeof(buf));
} else {
error_print();
return -1;
}
if (secp384r1_from_48bytes(e, buf) != 1
|| secp384r1_modn(e, e) != 1) {
error_print();
return -1;
}
return 1;
}
int secp384r1_ecdsa_do_sign_ex(const SECP384R1_KEY *key, const secp384r1_t k,
const uint8_t *dgst, size_t dgstlen, SECP384R1_ECDSA_SIGNATURE *sig)
{
secp384r1_t e;
secp384r1_t x1;
@@ -56,8 +84,7 @@ int secp384r1_ecdsa_do_sign_ex(const SECP384R1_KEY *key, const secp384r1_t k, co
SECP384R1_POINT P;
// e = hash(m)
if (secp384r1_from_48bytes(e, dgst) != 1
|| secp384r1_modn(e, e) != 1) {
if (secp384r1_ecdsa_digest_to_e(e, dgst, dgstlen) != 1) {
error_print();
return -1;
}
@@ -87,7 +114,8 @@ int secp384r1_ecdsa_do_sign_ex(const SECP384R1_KEY *key, const secp384r1_t k, co
return 1;
}
int secp384r1_ecdsa_do_sign(const SECP384R1_KEY *key, const uint8_t dgst[48], SECP384R1_ECDSA_SIGNATURE *sig)
int secp384r1_ecdsa_do_sign(const SECP384R1_KEY *key,
const uint8_t *dgst, size_t dgstlen, SECP384R1_ECDSA_SIGNATURE *sig)
{
secp384r1_t k;
@@ -99,7 +127,7 @@ int secp384r1_ecdsa_do_sign(const SECP384R1_KEY *key, const uint8_t dgst[48], SE
}
} while (secp384r1_is_zero(k) || secp384r1_cmp(k, SECP384R1_N) >= 0);
if (secp384r1_ecdsa_do_sign_ex(key, k, dgst, sig) != 1) {
if (secp384r1_ecdsa_do_sign_ex(key, k, dgst, dgstlen, sig) != 1) {
error_print();
return -1;
}
@@ -107,7 +135,8 @@ int secp384r1_ecdsa_do_sign(const SECP384R1_KEY *key, const uint8_t dgst[48], SE
}
int secp384r1_ecdsa_do_verify(const SECP384R1_KEY *key, const uint8_t dgst[48], const SECP384R1_ECDSA_SIGNATURE *sig)
int secp384r1_ecdsa_do_verify(const SECP384R1_KEY *key,
const uint8_t *dgst, size_t dgstlen, const SECP384R1_ECDSA_SIGNATURE *sig)
{
secp384r1_t e;
secp384r1_t w;
@@ -129,8 +158,7 @@ int secp384r1_ecdsa_do_verify(const SECP384R1_KEY *key, const uint8_t dgst[48],
}
// e = hash(m)
if (secp384r1_from_48bytes(e, dgst) != 1
|| secp384r1_modn(e, e) != 1) {
if (secp384r1_ecdsa_digest_to_e(e, dgst, dgstlen) != 1) {
error_print();
return -1;
}
@@ -237,11 +265,12 @@ int secp384r1_ecdsa_signature_from_der(SECP384R1_ECDSA_SIGNATURE *sig, const uin
return 1;
}
int secp384r1_ecdsa_sign(const SECP384R1_KEY *key, const uint8_t dgst[48], uint8_t *sigbuf, size_t *siglen)
int secp384r1_ecdsa_sign(const SECP384R1_KEY *key,
const uint8_t *dgst, size_t dgstlen, uint8_t *sigbuf, size_t *siglen)
{
SECP384R1_ECDSA_SIGNATURE sig;
if (secp384r1_ecdsa_do_sign(key, dgst, &sig) != 1) {
if (secp384r1_ecdsa_do_sign(key, dgst, dgstlen, &sig) != 1) {
error_print();
return -1;
}
@@ -253,7 +282,8 @@ int secp384r1_ecdsa_sign(const SECP384R1_KEY *key, const uint8_t dgst[48], uint8
return 1;
}
int secp384r1_ecdsa_sign_fixlen(const SECP384R1_KEY *key, const uint8_t dgst[48], size_t siglen, uint8_t *sig)
int secp384r1_ecdsa_sign_fixlen(const SECP384R1_KEY *key,
const uint8_t *dgst, size_t dgstlen, size_t siglen, uint8_t *sig)
{
unsigned int trys = 200;
uint8_t buf[SECP384R1_ECDSA_SIGNATURE_MAX_SIZE];
@@ -270,7 +300,7 @@ int secp384r1_ecdsa_sign_fixlen(const SECP384R1_KEY *key, const uint8_t dgst[48]
}
while (trys--) {
if (secp384r1_ecdsa_sign(key, dgst, buf, &len) != 1) {
if (secp384r1_ecdsa_sign(key, dgst, dgstlen, buf, &len) != 1) {
error_print();
return -1;
}
@@ -286,7 +316,8 @@ int secp384r1_ecdsa_sign_fixlen(const SECP384R1_KEY *key, const uint8_t dgst[48]
}
int secp384r1_ecdsa_verify(const SECP384R1_KEY *key, const uint8_t dgst[48], const uint8_t *sigbuf, size_t siglen)
int secp384r1_ecdsa_verify(const SECP384R1_KEY *key,
const uint8_t *dgst, size_t dgstlen, const uint8_t *sigbuf, size_t siglen)
{
int ret;
SECP384R1_ECDSA_SIGNATURE sig;
@@ -299,7 +330,7 @@ int secp384r1_ecdsa_verify(const SECP384R1_KEY *key, const uint8_t dgst[48], con
error_print();
return -1;
}
if ((ret = secp384r1_ecdsa_do_verify(key, dgst, &sig)) < 0) {
if ((ret = secp384r1_ecdsa_do_verify(key, dgst, dgstlen, &sig)) < 0) {
error_print();
return -1;
}
@@ -350,13 +381,12 @@ int secp384r1_ecdsa_sign_finish(SECP384R1_ECDSA_SIGN_CTX *ctx, uint8_t *sig, siz
return -1;
}
if (digest_finish(&ctx->digest_ctx, dgst, &dgstlen) != 1
|| dgstlen < 48) {
if (digest_finish(&ctx->digest_ctx, dgst, &dgstlen) != 1) {
error_print();
return -1;
}
if (secp384r1_ecdsa_sign(&ctx->key, dgst, sig, siglen) != 1) {
if (secp384r1_ecdsa_sign(&ctx->key, dgst, dgstlen, sig, siglen) != 1) {
error_print();
return -1;
}
@@ -373,13 +403,12 @@ int secp384r1_ecdsa_sign_finish_fixlen(SECP384R1_ECDSA_SIGN_CTX *ctx, size_t sig
return -1;
}
if (digest_finish(&ctx->digest_ctx, dgst, &dgstlen) != 1
|| dgstlen < 48) {
if (digest_finish(&ctx->digest_ctx, dgst, &dgstlen) != 1) {
error_print();
return -1;
}
if (secp384r1_ecdsa_sign_fixlen(&ctx->key, dgst, siglen, sig) != 1) {
if (secp384r1_ecdsa_sign_fixlen(&ctx->key, dgst, dgstlen, siglen, sig) != 1) {
error_print();
return -1;
}
@@ -447,13 +476,12 @@ int secp384r1_ecdsa_verify_finish(SECP384R1_ECDSA_SIGN_CTX *ctx)
return -1;
}
if (digest_finish(&ctx->digest_ctx, dgst, &dgstlen) != 1
|| dgstlen < 48) {
if (digest_finish(&ctx->digest_ctx, dgst, &dgstlen) != 1) {
error_print();
return -1;
}
if ((ret = secp384r1_ecdsa_do_verify(&ctx->key, dgst, &ctx->sig)) < 0) {
if ((ret = secp384r1_ecdsa_do_verify(&ctx->key, dgst, dgstlen, &ctx->sig)) < 0) {
error_print();
return -1;
}