mirror of
https://github.com/guanzhi/GmSSL.git
synced 2026-08-06 11:53:39 +08:00
Update ECDSA
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
70
src/ecdsa.c
70
src/ecdsa.c
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user