Always return -1 on sign/verify failure

This commit is contained in:
Zhi Guan
2023-02-08 22:44:19 +08:00
parent da9ef786eb
commit 930a359120

View File

@@ -152,7 +152,8 @@ int sm2_do_verify(const SM2_KEY *key, const uint8_t dgst[32], const SM2_SIGNATUR
// check if r == r' // check if r == r'
if (sm2_bn_cmp(e, r) != 0) { if (sm2_bn_cmp(e, r) != 0) {
return 0; error_print();
return -1;
} }
return 1; return 1;
} }
@@ -273,7 +274,6 @@ int sm2_sign_fixlen(const SM2_KEY *key, const uint8_t dgst[32], size_t siglen, u
int sm2_verify(const SM2_KEY *key, const uint8_t dgst[32], const uint8_t *sigbuf, size_t siglen) int sm2_verify(const SM2_KEY *key, const uint8_t dgst[32], const uint8_t *sigbuf, size_t siglen)
{ {
int ret;
SM2_SIGNATURE sig; SM2_SIGNATURE sig;
if (!key || !dgst || !sigbuf || !siglen) { if (!key || !dgst || !sigbuf || !siglen) {
@@ -286,10 +286,9 @@ int sm2_verify(const SM2_KEY *key, const uint8_t dgst[32], const uint8_t *sigbuf
error_print(); error_print();
return -1; return -1;
} }
if ((ret = sm2_do_verify(key, dgst, &sig)) != 1) { if (sm2_do_verify(key, dgst, &sig) != 1) {
if (ret < 0) error_print(); error_print();
else error_print(); return -1;
return ret;
} }
return 1; return 1;
} }
@@ -368,7 +367,6 @@ int sm2_sign_update(SM2_SIGN_CTX *ctx, const uint8_t *data, size_t datalen)
int sm2_sign_finish(SM2_SIGN_CTX *ctx, uint8_t *sig, size_t *siglen) int sm2_sign_finish(SM2_SIGN_CTX *ctx, uint8_t *sig, size_t *siglen)
{ {
int ret;
uint8_t dgst[SM3_DIGEST_SIZE]; uint8_t dgst[SM3_DIGEST_SIZE];
if (!ctx || !sig || !siglen) { if (!ctx || !sig || !siglen) {
@@ -376,16 +374,15 @@ int sm2_sign_finish(SM2_SIGN_CTX *ctx, uint8_t *sig, size_t *siglen)
return -1; return -1;
} }
sm3_finish(&ctx->sm3_ctx, dgst); sm3_finish(&ctx->sm3_ctx, dgst);
if ((ret = sm2_sign(&ctx->key, dgst, sig, siglen)) != 1) { if (sm2_sign(&ctx->key, dgst, sig, siglen) != 1) {
if (ret < 0) error_print(); error_print();
return ret; return -1;
} }
return 1; return 1;
} }
int sm2_sign_finish_fixlen(SM2_SIGN_CTX *ctx, size_t siglen, uint8_t *sig) int sm2_sign_finish_fixlen(SM2_SIGN_CTX *ctx, size_t siglen, uint8_t *sig)
{ {
int ret;
uint8_t dgst[SM3_DIGEST_SIZE]; uint8_t dgst[SM3_DIGEST_SIZE];
if (!ctx || !sig || !siglen) { if (!ctx || !sig || !siglen) {
@@ -393,9 +390,9 @@ int sm2_sign_finish_fixlen(SM2_SIGN_CTX *ctx, size_t siglen, uint8_t *sig)
return -1; return -1;
} }
sm3_finish(&ctx->sm3_ctx, dgst); sm3_finish(&ctx->sm3_ctx, dgst);
if ((ret = sm2_sign_fixlen(&ctx->key, dgst, siglen, sig)) != 1) { if (sm2_sign_fixlen(&ctx->key, dgst, siglen, sig) != 1) {
if (ret < 0) error_print(); error_print();
return ret; return -1;
} }
return 1; return 1;
} }
@@ -406,7 +403,8 @@ int sm2_verify_init(SM2_SIGN_CTX *ctx, const SM2_KEY *key, const char *id, size_
error_print(); error_print();
return -1; return -1;
} }
ctx->key = *key; //FIXME: only copy public_key memset(ctx, 0, sizeof(*ctx));
ctx->key.public_key = key->public_key;
sm3_init(&ctx->sm3_ctx); sm3_init(&ctx->sm3_ctx);
if (id) { if (id) {
@@ -435,7 +433,6 @@ int sm2_verify_update(SM2_SIGN_CTX *ctx, const uint8_t *data, size_t datalen)
int sm2_verify_finish(SM2_SIGN_CTX *ctx, const uint8_t *sig, size_t siglen) int sm2_verify_finish(SM2_SIGN_CTX *ctx, const uint8_t *sig, size_t siglen)
{ {
int ret;
uint8_t dgst[SM3_DIGEST_SIZE]; uint8_t dgst[SM3_DIGEST_SIZE];
if (!ctx || !sig) { if (!ctx || !sig) {
@@ -443,10 +440,9 @@ int sm2_verify_finish(SM2_SIGN_CTX *ctx, const uint8_t *sig, size_t siglen)
return -1; return -1;
} }
sm3_finish(&ctx->sm3_ctx, dgst); sm3_finish(&ctx->sm3_ctx, dgst);
if ((ret = sm2_verify(&ctx->key, dgst, sig, siglen)) != 1) { if (sm2_verify(&ctx->key, dgst, sig, siglen) != 1) {
if (ret < 0) error_print(); error_print();
else error_print(); return -1;
return ret;
} }
return 1; return 1;
} }
@@ -793,6 +789,15 @@ int sm2_encrypt(const SM2_KEY *key, const uint8_t *in, size_t inlen, uint8_t *ou
{ {
SM2_CIPHERTEXT C; SM2_CIPHERTEXT C;
if (!key || !in || !out || !outlen) {
error_print();
return -1;
}
if (!inlen) {
error_print();
return -1;
}
if (sm2_do_encrypt(key, in, inlen, &C) != 1) { if (sm2_do_encrypt(key, in, inlen, &C) != 1) {
error_print(); error_print();
return -1; return -1;
@@ -809,6 +814,15 @@ int sm2_encrypt_fixlen(const SM2_KEY *key, const uint8_t *in, size_t inlen, int
{ {
SM2_CIPHERTEXT C; SM2_CIPHERTEXT C;
if (!key || !in || !out || !outlen) {
error_print();
return -1;
}
if (!inlen) {
error_print();
return -1;
}
if (sm2_do_encrypt_fixlen(key, in, inlen, point_size, &C) != 1) { if (sm2_do_encrypt_fixlen(key, in, inlen, point_size, &C) != 1) {
error_print(); error_print();
return -1; return -1;
@@ -830,8 +844,7 @@ int sm2_decrypt(const SM2_KEY *key, const uint8_t *in, size_t inlen, uint8_t *ou
return -1; return -1;
} }
if (sm2_ciphertext_from_der(&C, &in, &inlen) != 1 if (sm2_ciphertext_from_der(&C, &in, &inlen) != 1
|| asn1_length_is_zero(inlen) != 1 || asn1_length_is_zero(inlen) != 1) {
) {
error_print(); error_print();
return -1; return -1;
} }
@@ -844,10 +857,12 @@ int sm2_decrypt(const SM2_KEY *key, const uint8_t *in, size_t inlen, uint8_t *ou
int sm2_do_ecdh(const SM2_KEY *key, const SM2_POINT *peer_public, SM2_POINT *out) int sm2_do_ecdh(const SM2_KEY *key, const SM2_POINT *peer_public, SM2_POINT *out)
{ {
if (!key || !peer_public || !out) { /*
if (sm2_point_is_on_curve(peer_public) != 1) {
error_print(); error_print();
return -1; return -1;
} }
*/
if (sm2_point_mul(out, key->private_key, peer_public) != 1) { if (sm2_point_mul(out, key->private_key, peer_public) != 1) {
error_print(); error_print();
return -1; return -1;
@@ -859,6 +874,10 @@ int sm2_ecdh(const SM2_KEY *key, const uint8_t *peer_public, size_t peer_public_
{ {
SM2_POINT point; SM2_POINT point;
if (!key || !peer_public || !peer_public_len || !out) {
error_print();
return -1;
}
if (sm2_point_from_octets(&point, peer_public, peer_public_len) != 1) { if (sm2_point_from_octets(&point, peer_public, peer_public_len) != 1) {
error_print(); error_print();
return -1; return -1;
@@ -894,7 +913,10 @@ int sm2_do_sign_fast(const SM2_Fn d, const uint8_t dgst[32], SM2_SIGNATURE *sig)
// rand k in [1, n - 1] // rand k in [1, n - 1]
do { do {
sm2_fn_rand(k); if (sm2_fn_rand(k) != 1) {
error_print();
return -1;
}
} while (sm2_bn_is_zero(k)); } while (sm2_bn_is_zero(k));
// (x1, y1) = kG // (x1, y1) = kG