mirror of
https://github.com/guanzhi/GmSSL.git
synced 2026-08-06 11:53:39 +08:00
Update ECDSA
This commit is contained in:
@@ -1024,7 +1024,7 @@ endif()
|
|||||||
#
|
#
|
||||||
set(CPACK_PACKAGE_NAME "GmSSL")
|
set(CPACK_PACKAGE_NAME "GmSSL")
|
||||||
set(CPACK_PACKAGE_VENDOR "GmSSL develop team")
|
set(CPACK_PACKAGE_VENDOR "GmSSL develop team")
|
||||||
set(CPACK_PACKAGE_VERSION "3.3.0-dev.1171")
|
set(CPACK_PACKAGE_VERSION "3.3.0-dev.1172")
|
||||||
set(CPACK_PACKAGE_DESCRIPTION_FILE ${PROJECT_SOURCE_DIR}/README.md)
|
set(CPACK_PACKAGE_DESCRIPTION_FILE ${PROJECT_SOURCE_DIR}/README.md)
|
||||||
set(CPACK_NSIS_MODIFY_PATH ON)
|
set(CPACK_NSIS_MODIFY_PATH ON)
|
||||||
include(CPack)
|
include(CPack)
|
||||||
|
|||||||
@@ -44,15 +44,21 @@ int secp256r1_ecdsa_signature_print_ex(FILE *fp, int fmt, int ind, const char *l
|
|||||||
int secp256r1_ecdsa_signature_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *sig, size_t siglen);
|
int secp256r1_ecdsa_signature_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *sig, size_t siglen);
|
||||||
|
|
||||||
|
|
||||||
int secp256r1_ecdsa_do_sign_ex(const SECP256R1_KEY *key, const secp256r1_t k, const uint8_t dgst[32], SECP256R1_ECDSA_SIGNATURE *sig);
|
int secp256r1_ecdsa_do_sign_ex(const SECP256R1_KEY *key, const secp256r1_t k,
|
||||||
int secp256r1_ecdsa_do_sign(const SECP256R1_KEY *key, const uint8_t dgst[32], SECP256R1_ECDSA_SIGNATURE *sig);
|
const uint8_t *dgst, size_t dgstlen, SECP256R1_ECDSA_SIGNATURE *sig);
|
||||||
int secp256r1_ecdsa_do_verify(const SECP256R1_KEY *key, const uint8_t dgst[32], const SECP256R1_ECDSA_SIGNATURE *sig);
|
int secp256r1_ecdsa_do_sign(const SECP256R1_KEY *key,
|
||||||
|
const uint8_t *dgst, size_t dgstlen, 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);
|
||||||
|
|
||||||
|
|
||||||
// 这个函数应该改为将key的类型编程通用支持P256, P384的,摘要可以支持不同长度的
|
// 这个函数应该改为将key的类型编程通用支持P256, P384的,摘要可以支持不同长度的
|
||||||
int secp256r1_ecdsa_sign(const SECP256R1_KEY *key, const uint8_t dgst[32], uint8_t *sig, size_t *siglen);
|
int secp256r1_ecdsa_sign(const SECP256R1_KEY *key,
|
||||||
int secp256r1_ecdsa_sign_fixlen(const SECP256R1_KEY *key, const uint8_t dgst[32], size_t siglen, uint8_t *sig);
|
const uint8_t *dgst, size_t dgstlen, uint8_t *sig, size_t *siglen);
|
||||||
int secp256r1_ecdsa_verify(const SECP256R1_KEY *key, const uint8_t dgst[32], const uint8_t *sig, size_t siglen);
|
int secp256r1_ecdsa_sign_fixlen(const SECP256R1_KEY *key,
|
||||||
|
const uint8_t *dgst, size_t dgstlen, size_t siglen, uint8_t *sig);
|
||||||
|
int secp256r1_ecdsa_verify(const SECP256R1_KEY *key,
|
||||||
|
const uint8_t *dgst, size_t dgstlen, const uint8_t *sig, size_t siglen);
|
||||||
|
|
||||||
|
|
||||||
// 后面的CTX就没有意义了
|
// 后面的CTX就没有意义了
|
||||||
|
|||||||
@@ -44,15 +44,21 @@ int secp384r1_ecdsa_signature_print_ex(FILE *fp, int fmt, int ind, const char *l
|
|||||||
int secp384r1_ecdsa_signature_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *sig, size_t siglen);
|
int secp384r1_ecdsa_signature_print(FILE *fp, int fmt, int ind, const char *label, const uint8_t *sig, size_t siglen);
|
||||||
|
|
||||||
|
|
||||||
int secp384r1_ecdsa_do_sign_ex(const SECP384R1_KEY *key, const secp384r1_t k, const uint8_t dgst[48], SECP384R1_ECDSA_SIGNATURE *sig);
|
int secp384r1_ecdsa_do_sign_ex(const SECP384R1_KEY *key, const secp384r1_t k,
|
||||||
int secp384r1_ecdsa_do_sign(const SECP384R1_KEY *key, const uint8_t dgst[48], SECP384R1_ECDSA_SIGNATURE *sig);
|
const uint8_t *dgst, size_t dgstlen, SECP384R1_ECDSA_SIGNATURE *sig);
|
||||||
int secp384r1_ecdsa_do_verify(const SECP384R1_KEY *key, const uint8_t dgst[48], const SECP384R1_ECDSA_SIGNATURE *sig);
|
int secp384r1_ecdsa_do_sign(const SECP384R1_KEY *key,
|
||||||
|
const uint8_t *dgst, size_t dgstlen, 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);
|
||||||
|
|
||||||
|
|
||||||
// 这个函数应该改为将key的类型编程通用支持P256, P384的,摘要可以支持不同长度的
|
// 这个函数应该改为将key的类型编程通用支持P256, P384的,摘要可以支持不同长度的
|
||||||
int secp384r1_ecdsa_sign(const SECP384R1_KEY *key, const uint8_t dgst[48], uint8_t *sig, size_t *siglen);
|
int secp384r1_ecdsa_sign(const SECP384R1_KEY *key,
|
||||||
int secp384r1_ecdsa_sign_fixlen(const SECP384R1_KEY *key, const uint8_t dgst[48], size_t siglen, uint8_t *sig);
|
const uint8_t *dgst, size_t dgstlen, uint8_t *sig, size_t *siglen);
|
||||||
int secp384r1_ecdsa_verify(const SECP384R1_KEY *key, const uint8_t dgst[48], const uint8_t *sig, size_t siglen);
|
int secp384r1_ecdsa_sign_fixlen(const SECP384R1_KEY *key,
|
||||||
|
const uint8_t *dgst, size_t dgstlen, size_t siglen, uint8_t *sig);
|
||||||
|
int secp384r1_ecdsa_verify(const SECP384R1_KEY *key,
|
||||||
|
const uint8_t *dgst, size_t dgstlen, const uint8_t *sig, size_t siglen);
|
||||||
|
|
||||||
|
|
||||||
// 后面的CTX就没有意义了
|
// 后面的CTX就没有意义了
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ extern "C" {
|
|||||||
|
|
||||||
|
|
||||||
#define GMSSL_VERSION_NUM 30300
|
#define GMSSL_VERSION_NUM 30300
|
||||||
#define GMSSL_VERSION_STR "GmSSL 3.3.0-dev.1171"
|
#define GMSSL_VERSION_STR "GmSSL 3.3.0-dev.1172"
|
||||||
|
|
||||||
int gmssl_version_num(void);
|
int gmssl_version_num(void);
|
||||||
const char *gmssl_version_str(void);
|
const char *gmssl_version_str(void);
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <gmssl/ecdsa.h>
|
#include <gmssl/ecdsa.h>
|
||||||
#ifdef ENABLE_SECP256R1
|
#ifdef ENABLE_SECP256R1
|
||||||
#include <gmssl/secp256r1_ecdsa.h>
|
#include <gmssl/secp256r1_ecdsa.h>
|
||||||
@@ -18,45 +17,6 @@
|
|||||||
#include <gmssl/error.h>
|
#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,
|
int ecdsa_sign(const EC_KEY *key, const uint8_t *dgst, size_t dgstlen,
|
||||||
uint8_t *sig, size_t *siglen)
|
uint8_t *sig, size_t *siglen)
|
||||||
{
|
{
|
||||||
@@ -67,26 +27,18 @@ int ecdsa_sign(const EC_KEY *key, const uint8_t *dgst, size_t dgstlen,
|
|||||||
switch (key->oid) {
|
switch (key->oid) {
|
||||||
#ifdef ENABLE_SECP256R1
|
#ifdef ENABLE_SECP256R1
|
||||||
case OID_secp256r1:
|
case OID_secp256r1:
|
||||||
{
|
if (secp256r1_ecdsa_sign(&key->u.secp256r1_key, dgst, dgstlen, sig, siglen) != 1) {
|
||||||
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();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return 1;
|
return 1;
|
||||||
#endif
|
#endif
|
||||||
#ifdef ENABLE_SECP384R1
|
#ifdef ENABLE_SECP384R1
|
||||||
case OID_secp384r1:
|
case OID_secp384r1:
|
||||||
{
|
if (secp384r1_ecdsa_sign(&key->u.secp384r1_key, dgst, dgstlen, sig, siglen) != 1) {
|
||||||
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();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return 1;
|
return 1;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
@@ -105,26 +57,18 @@ int ecdsa_sign_fixed_len(const EC_KEY *key, const uint8_t *dgst, size_t dgstlen,
|
|||||||
switch (key->oid) {
|
switch (key->oid) {
|
||||||
#ifdef ENABLE_SECP256R1
|
#ifdef ENABLE_SECP256R1
|
||||||
case OID_secp256r1:
|
case OID_secp256r1:
|
||||||
{
|
if (secp256r1_ecdsa_sign_fixlen(&key->u.secp256r1_key, dgst, dgstlen, siglen, sig) != 1) {
|
||||||
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();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return 1;
|
return 1;
|
||||||
#endif
|
#endif
|
||||||
#ifdef ENABLE_SECP384R1
|
#ifdef ENABLE_SECP384R1
|
||||||
case OID_secp384r1:
|
case OID_secp384r1:
|
||||||
{
|
if (secp384r1_ecdsa_sign_fixlen(&key->u.secp384r1_key, dgst, dgstlen, siglen, sig) != 1) {
|
||||||
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();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return 1;
|
return 1;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
@@ -144,13 +88,8 @@ int ecdsa_verify(const EC_KEY *key, const uint8_t *dgst, size_t dgstlen,
|
|||||||
#ifdef ENABLE_SECP256R1
|
#ifdef ENABLE_SECP256R1
|
||||||
case OID_secp256r1:
|
case OID_secp256r1:
|
||||||
{
|
{
|
||||||
uint8_t e[32];
|
|
||||||
int ret;
|
int ret;
|
||||||
if (ecdsa_digest_to_p256(dgst, dgstlen, e) != 1) {
|
if ((ret = secp256r1_ecdsa_verify(&key->u.secp256r1_key, dgst, dgstlen, sig, siglen)) < 0) {
|
||||||
error_print();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if ((ret = secp256r1_ecdsa_verify(&key->u.secp256r1_key, e, sig, siglen)) < 0) {
|
|
||||||
error_print();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -160,13 +99,8 @@ int ecdsa_verify(const EC_KEY *key, const uint8_t *dgst, size_t dgstlen,
|
|||||||
#ifdef ENABLE_SECP384R1
|
#ifdef ENABLE_SECP384R1
|
||||||
case OID_secp384r1:
|
case OID_secp384r1:
|
||||||
{
|
{
|
||||||
uint8_t e[48];
|
|
||||||
int ret;
|
int ret;
|
||||||
if (ecdsa_digest_to_p384(dgst, dgstlen, e) != 1) {
|
if ((ret = secp384r1_ecdsa_verify(&key->u.secp384r1_key, dgst, dgstlen, sig, siglen)) < 0) {
|
||||||
error_print();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if ((ret = secp384r1_ecdsa_verify(&key->u.secp384r1_key, e, sig, siglen)) < 0) {
|
|
||||||
error_print();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
70
src/ecdsa.c
70
src/ecdsa.c
@@ -12,6 +12,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <gmssl/asn1.h>
|
#include <gmssl/asn1.h>
|
||||||
#include <gmssl/digest.h>
|
#include <gmssl/digest.h>
|
||||||
|
#include <gmssl/sha2.h>
|
||||||
#include <gmssl/rand.h>
|
#include <gmssl/rand.h>
|
||||||
#include <gmssl/error.h>
|
#include <gmssl/error.h>
|
||||||
#include <gmssl/secp256r1_ecdsa.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;
|
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 e;
|
||||||
secp256r1_t x1;
|
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;
|
SECP256R1_POINT P;
|
||||||
|
|
||||||
// e = hash(m)
|
// e = hash(m)
|
||||||
if (secp256r1_from_32bytes(e, dgst) != 1
|
if (secp256r1_ecdsa_digest_to_e(e, dgst, dgstlen) != 1) {
|
||||||
|| secp256r1_modn(e, e) != 1) {
|
|
||||||
error_print();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -87,7 +110,8 @@ int secp256r1_ecdsa_do_sign_ex(const SECP256R1_KEY *key, const secp256r1_t k, co
|
|||||||
return 1;
|
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;
|
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);
|
} 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();
|
error_print();
|
||||||
return -1;
|
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 e;
|
||||||
secp256r1_t w;
|
secp256r1_t w;
|
||||||
@@ -129,8 +154,7 @@ int secp256r1_ecdsa_do_verify(const SECP256R1_KEY *key, const uint8_t dgst[32],
|
|||||||
}
|
}
|
||||||
|
|
||||||
// e = hash(m)
|
// e = hash(m)
|
||||||
if (secp256r1_from_32bytes(e, dgst) != 1
|
if (secp256r1_ecdsa_digest_to_e(e, dgst, dgstlen) != 1) {
|
||||||
|| secp256r1_modn(e, e) != 1) {
|
|
||||||
error_print();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -233,11 +257,12 @@ int secp256r1_ecdsa_signature_from_der(SECP256R1_ECDSA_SIGNATURE *sig, const uin
|
|||||||
return 1;
|
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;
|
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();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -249,7 +274,8 @@ int secp256r1_ecdsa_sign(const SECP256R1_KEY *key, const uint8_t dgst[32], uint8
|
|||||||
return 1;
|
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;
|
unsigned int trys = 200;
|
||||||
uint8_t buf[SECP256R1_ECDSA_SIGNATURE_MAX_SIZE];
|
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--) {
|
while (trys--) {
|
||||||
if (secp256r1_ecdsa_sign(key, dgst, buf, &len) != 1) {
|
if (secp256r1_ecdsa_sign(key, dgst, dgstlen, buf, &len) != 1) {
|
||||||
error_print();
|
error_print();
|
||||||
return -1;
|
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;
|
int ret;
|
||||||
SECP256R1_ECDSA_SIGNATURE sig;
|
SECP256R1_ECDSA_SIGNATURE sig;
|
||||||
@@ -295,7 +322,7 @@ int secp256r1_ecdsa_verify(const SECP256R1_KEY *key, const uint8_t dgst[32], con
|
|||||||
error_print();
|
error_print();
|
||||||
return -1;
|
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();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -346,13 +373,12 @@ int secp256r1_ecdsa_sign_finish(SECP256R1_ECDSA_SIGN_CTX *ctx, uint8_t *sig, siz
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (digest_finish(&ctx->digest_ctx, dgst, &dgstlen) != 1
|
if (digest_finish(&ctx->digest_ctx, dgst, &dgstlen) != 1) {
|
||||||
|| dgstlen < 32) {
|
|
||||||
error_print();
|
error_print();
|
||||||
return -1;
|
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();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -369,13 +395,12 @@ int secp256r1_ecdsa_sign_finish_fixlen(SECP256R1_ECDSA_SIGN_CTX *ctx, size_t sig
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (digest_finish(&ctx->digest_ctx, dgst, &dgstlen) != 1
|
if (digest_finish(&ctx->digest_ctx, dgst, &dgstlen) != 1) {
|
||||||
|| dgstlen < 32) {
|
|
||||||
error_print();
|
error_print();
|
||||||
return -1;
|
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();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -443,13 +468,12 @@ int secp256r1_ecdsa_verify_finish(SECP256R1_ECDSA_SIGN_CTX *ctx)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (digest_finish(&ctx->digest_ctx, dgst, &dgstlen) != 1
|
if (digest_finish(&ctx->digest_ctx, dgst, &dgstlen) != 1) {
|
||||||
|| dgstlen < 32) {
|
|
||||||
error_print();
|
error_print();
|
||||||
return -1;
|
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();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <gmssl/asn1.h>
|
#include <gmssl/asn1.h>
|
||||||
#include <gmssl/digest.h>
|
#include <gmssl/digest.h>
|
||||||
|
#include <gmssl/sha2.h>
|
||||||
#include <gmssl/rand.h>
|
#include <gmssl/rand.h>
|
||||||
#include <gmssl/error.h>
|
#include <gmssl/error.h>
|
||||||
#include <gmssl/secp384r1_ecdsa.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;
|
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 e;
|
||||||
secp384r1_t x1;
|
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;
|
SECP384R1_POINT P;
|
||||||
|
|
||||||
// e = hash(m)
|
// e = hash(m)
|
||||||
if (secp384r1_from_48bytes(e, dgst) != 1
|
if (secp384r1_ecdsa_digest_to_e(e, dgst, dgstlen) != 1) {
|
||||||
|| secp384r1_modn(e, e) != 1) {
|
|
||||||
error_print();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -87,7 +114,8 @@ int secp384r1_ecdsa_do_sign_ex(const SECP384R1_KEY *key, const secp384r1_t k, co
|
|||||||
return 1;
|
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;
|
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);
|
} 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();
|
error_print();
|
||||||
return -1;
|
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 e;
|
||||||
secp384r1_t w;
|
secp384r1_t w;
|
||||||
@@ -129,8 +158,7 @@ int secp384r1_ecdsa_do_verify(const SECP384R1_KEY *key, const uint8_t dgst[48],
|
|||||||
}
|
}
|
||||||
|
|
||||||
// e = hash(m)
|
// e = hash(m)
|
||||||
if (secp384r1_from_48bytes(e, dgst) != 1
|
if (secp384r1_ecdsa_digest_to_e(e, dgst, dgstlen) != 1) {
|
||||||
|| secp384r1_modn(e, e) != 1) {
|
|
||||||
error_print();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -237,11 +265,12 @@ int secp384r1_ecdsa_signature_from_der(SECP384R1_ECDSA_SIGNATURE *sig, const uin
|
|||||||
return 1;
|
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;
|
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();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -253,7 +282,8 @@ int secp384r1_ecdsa_sign(const SECP384R1_KEY *key, const uint8_t dgst[48], uint8
|
|||||||
return 1;
|
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;
|
unsigned int trys = 200;
|
||||||
uint8_t buf[SECP384R1_ECDSA_SIGNATURE_MAX_SIZE];
|
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--) {
|
while (trys--) {
|
||||||
if (secp384r1_ecdsa_sign(key, dgst, buf, &len) != 1) {
|
if (secp384r1_ecdsa_sign(key, dgst, dgstlen, buf, &len) != 1) {
|
||||||
error_print();
|
error_print();
|
||||||
return -1;
|
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;
|
int ret;
|
||||||
SECP384R1_ECDSA_SIGNATURE sig;
|
SECP384R1_ECDSA_SIGNATURE sig;
|
||||||
@@ -299,7 +330,7 @@ int secp384r1_ecdsa_verify(const SECP384R1_KEY *key, const uint8_t dgst[48], con
|
|||||||
error_print();
|
error_print();
|
||||||
return -1;
|
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();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -350,13 +381,12 @@ int secp384r1_ecdsa_sign_finish(SECP384R1_ECDSA_SIGN_CTX *ctx, uint8_t *sig, siz
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (digest_finish(&ctx->digest_ctx, dgst, &dgstlen) != 1
|
if (digest_finish(&ctx->digest_ctx, dgst, &dgstlen) != 1) {
|
||||||
|| dgstlen < 48) {
|
|
||||||
error_print();
|
error_print();
|
||||||
return -1;
|
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();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -373,13 +403,12 @@ int secp384r1_ecdsa_sign_finish_fixlen(SECP384R1_ECDSA_SIGN_CTX *ctx, size_t sig
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (digest_finish(&ctx->digest_ctx, dgst, &dgstlen) != 1
|
if (digest_finish(&ctx->digest_ctx, dgst, &dgstlen) != 1) {
|
||||||
|| dgstlen < 48) {
|
|
||||||
error_print();
|
error_print();
|
||||||
return -1;
|
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();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -447,13 +476,12 @@ int secp384r1_ecdsa_verify_finish(SECP384R1_ECDSA_SIGN_CTX *ctx)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (digest_finish(&ctx->digest_ctx, dgst, &dgstlen) != 1
|
if (digest_finish(&ctx->digest_ctx, dgst, &dgstlen) != 1) {
|
||||||
|| dgstlen < 48) {
|
|
||||||
error_print();
|
error_print();
|
||||||
return -1;
|
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();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,13 +55,13 @@ static int test_ecdsa(void)
|
|||||||
dgst[31] = 2;
|
dgst[31] = 2;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
if (secp256r1_ecdsa_do_sign_ex(&key, k, dgst, &sig) != 1) {
|
if (secp256r1_ecdsa_do_sign_ex(&key, k, dgst, sizeof(dgst), &sig) != 1) {
|
||||||
error_print();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (secp256r1_ecdsa_do_sign(&key, dgst, &sig) != 1) {
|
if (secp256r1_ecdsa_do_sign(&key, dgst, sizeof(dgst), &sig) != 1) {
|
||||||
error_print();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -72,7 +72,7 @@ static int test_ecdsa(void)
|
|||||||
secp256r1_print(stderr, 0, 0, "s", sig.s);
|
secp256r1_print(stderr, 0, 0, "s", sig.s);
|
||||||
|
|
||||||
|
|
||||||
if (secp256r1_ecdsa_do_verify(&key, dgst, &sig) != 1) {
|
if (secp256r1_ecdsa_do_verify(&key, dgst, sizeof(dgst), &sig) != 1) {
|
||||||
error_print();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -104,7 +104,48 @@ static int test_ecdsa_verify_infinity(void)
|
|||||||
error_print();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (secp256r1_ecdsa_do_verify(&key, dgst, &sig) != 0) {
|
if (secp256r1_ecdsa_do_verify(&key, dgst, sizeof(dgst), &sig) != 0) {
|
||||||
|
error_print();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%s() ok\n", __FUNCTION__);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_ecdsa_digest_lengths(void)
|
||||||
|
{
|
||||||
|
SECP256R1_KEY key;
|
||||||
|
uint8_t dgst32[32];
|
||||||
|
uint8_t dgst48[48];
|
||||||
|
uint8_t dgst31[31];
|
||||||
|
uint8_t sig[SECP256R1_ECDSA_SIGNATURE_MAX_SIZE];
|
||||||
|
size_t siglen;
|
||||||
|
|
||||||
|
if (secp256r1_key_generate(&key) != 1) {
|
||||||
|
error_print();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
memset(dgst32, 0x32, sizeof(dgst32));
|
||||||
|
memset(dgst48, 0x48, sizeof(dgst48));
|
||||||
|
memset(dgst31, 0x31, sizeof(dgst31));
|
||||||
|
|
||||||
|
if (secp256r1_ecdsa_sign(&key, dgst32, sizeof(dgst32), sig, &siglen) != 1
|
||||||
|
|| siglen > sizeof(sig)
|
||||||
|
|| secp256r1_ecdsa_verify(&key, dgst32, sizeof(dgst32), sig, siglen) != 1) {
|
||||||
|
error_print();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (secp256r1_ecdsa_sign(&key, dgst48, sizeof(dgst48), sig, &siglen) != 1
|
||||||
|
|| siglen > sizeof(sig)
|
||||||
|
|| secp256r1_ecdsa_verify(&key, dgst48, sizeof(dgst48), sig, siglen) != 1
|
||||||
|
|| secp256r1_ecdsa_sign_fixlen(&key, dgst48, sizeof(dgst48), siglen, sig) != 1
|
||||||
|
|| secp256r1_ecdsa_verify(&key, dgst48, sizeof(dgst48), sig, siglen) != 1) {
|
||||||
|
error_print();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (secp256r1_ecdsa_sign(&key, dgst31, sizeof(dgst31), sig, &siglen) >= 0
|
||||||
|
|| secp256r1_ecdsa_verify(&key, dgst31, sizeof(dgst31), sig, siglen) >= 0) {
|
||||||
error_print();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -152,6 +193,10 @@ static int test_ecdsa_generic(void)
|
|||||||
error_print();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
if (ecdsa_sign(&key, dgst32, 31, sig, &siglen) >= 0) {
|
||||||
|
error_print();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
printf("%s() ok\n", __FUNCTION__);
|
printf("%s() ok\n", __FUNCTION__);
|
||||||
return 1;
|
return 1;
|
||||||
@@ -161,6 +206,7 @@ int main(void)
|
|||||||
{
|
{
|
||||||
if (test_ecdsa() != 1) goto err;
|
if (test_ecdsa() != 1) goto err;
|
||||||
if (test_ecdsa_verify_infinity() != 1) goto err;
|
if (test_ecdsa_verify_infinity() != 1) goto err;
|
||||||
|
if (test_ecdsa_digest_lengths() != 1) goto err;
|
||||||
if (test_ecdsa_generic() != 1) goto err;
|
if (test_ecdsa_generic() != 1) goto err;
|
||||||
|
|
||||||
printf("%s all tests passed\n", __FILE__);
|
printf("%s all tests passed\n", __FILE__);
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ static int test_secp384r1_ecdsa_do_sign(void)
|
|||||||
memset(dgst, 0, sizeof(dgst));
|
memset(dgst, 0, sizeof(dgst));
|
||||||
dgst[47] = 2;
|
dgst[47] = 2;
|
||||||
|
|
||||||
if (secp384r1_ecdsa_do_sign_ex(&key, k, dgst, &sig) != 1) {
|
if (secp384r1_ecdsa_do_sign_ex(&key, k, dgst, sizeof(dgst), &sig) != 1) {
|
||||||
error_print();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -49,7 +49,7 @@ static int test_secp384r1_ecdsa_do_sign(void)
|
|||||||
secp384r1_print(stderr, 0, 0, "s", sig.s);
|
secp384r1_print(stderr, 0, 0, "s", sig.s);
|
||||||
|
|
||||||
|
|
||||||
if (secp384r1_ecdsa_do_verify(&key, dgst, &sig) != 1) {
|
if (secp384r1_ecdsa_do_verify(&key, dgst, sizeof(dgst), &sig) != 1) {
|
||||||
error_print();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -61,7 +61,9 @@ static int test_secp384r1_ecdsa_do_sign(void)
|
|||||||
static int test_secp384r1_ecdsa_sign(void)
|
static int test_secp384r1_ecdsa_sign(void)
|
||||||
{
|
{
|
||||||
SECP384R1_KEY key;
|
SECP384R1_KEY key;
|
||||||
uint8_t dgst[48];
|
uint8_t dgst32[32];
|
||||||
|
uint8_t dgst48[48];
|
||||||
|
uint8_t dgst31[31];
|
||||||
uint8_t sig[SECP384R1_ECDSA_SIGNATURE_MAX_SIZE];
|
uint8_t sig[SECP384R1_ECDSA_SIGNATURE_MAX_SIZE];
|
||||||
size_t siglen;
|
size_t siglen;
|
||||||
|
|
||||||
@@ -69,19 +71,34 @@ static int test_secp384r1_ecdsa_sign(void)
|
|||||||
error_print();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
memset(dgst, 0x5a, sizeof(dgst));
|
memset(dgst32, 0x32, sizeof(dgst32));
|
||||||
|
memset(dgst48, 0x48, sizeof(dgst48));
|
||||||
|
memset(dgst31, 0x31, sizeof(dgst31));
|
||||||
|
|
||||||
if (secp384r1_ecdsa_sign(&key, dgst, sig, &siglen) != 1
|
if (secp384r1_ecdsa_sign(&key, dgst48, sizeof(dgst48), sig, &siglen) != 1
|
||||||
|| siglen > sizeof(sig)) {
|
|| siglen > sizeof(sig)) {
|
||||||
error_print();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (secp384r1_ecdsa_verify(&key, dgst, sig, siglen) != 1) {
|
if (secp384r1_ecdsa_verify(&key, dgst48, sizeof(dgst48), sig, siglen) != 1) {
|
||||||
error_print();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
dgst[0] ^= 0x01;
|
dgst48[0] ^= 0x01;
|
||||||
if (secp384r1_ecdsa_verify(&key, dgst, sig, siglen) != 0) {
|
if (secp384r1_ecdsa_verify(&key, dgst48, sizeof(dgst48), sig, siglen) != 0) {
|
||||||
|
error_print();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (secp384r1_ecdsa_sign(&key, dgst32, sizeof(dgst32), sig, &siglen) != 1
|
||||||
|
|| siglen > sizeof(sig)
|
||||||
|
|| secp384r1_ecdsa_verify(&key, dgst32, sizeof(dgst32), sig, siglen) != 1
|
||||||
|
|| secp384r1_ecdsa_sign_fixlen(&key, dgst32, sizeof(dgst32), siglen, sig) != 1
|
||||||
|
|| secp384r1_ecdsa_verify(&key, dgst32, sizeof(dgst32), sig, siglen) != 1) {
|
||||||
|
error_print();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (secp384r1_ecdsa_sign(&key, dgst31, sizeof(dgst31), sig, &siglen) >= 0
|
||||||
|
|| secp384r1_ecdsa_verify(&key, dgst31, sizeof(dgst31), sig, siglen) >= 0) {
|
||||||
error_print();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -144,7 +161,7 @@ static int test_secp384r1_ecdsa_verify_infinity(void)
|
|||||||
error_print();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (secp384r1_ecdsa_do_verify(&key, dgst, &sig) != 0) {
|
if (secp384r1_ecdsa_do_verify(&key, dgst, sizeof(dgst), &sig) != 0) {
|
||||||
error_print();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -192,6 +209,10 @@ static int test_secp384r1_ecdsa_generic(void)
|
|||||||
error_print();
|
error_print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
if (ecdsa_sign(&key, dgst32, 31, sig, &siglen) >= 0) {
|
||||||
|
error_print();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
printf("%s() ok\n", __FUNCTION__);
|
printf("%s() ok\n", __FUNCTION__);
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user