static int test_sm2_sign(void) { int rv; EC_KEY *ec_key = NULL; unsigned char dgst[32]; ECDSA_SIG *sig = NULL; unsigned char sigbuf[128]; unsigned int siglen; ec_key = EC_KEY_new_by_curve_name(NID_sm2p256v1); OPENSSL_assert(ec_key); rv = EC_KEY_generate_key(ec_key); OPENSSL_assert(rv == 1); RAND_bytes(dgst, sizeof(dgst)); sig = SM2_do_sign(dgst, (int)sizeof(dgst), ec_key); OPENSSL_assert(sig); rv = SM2_do_verify(dgst, (int)sizeof(dgst), sig, ec_key); OPENSSL_assert(rv == 1); rv = SM2_sign(0, dgst, sizeof(dgst), sigbuf, &siglen, ec_key); OPENSSL_assert(rv == 1); rv = SM2_verify(0, dgst, sizeof(dgst), sigbuf, siglen, ec_key); OPENSSL_assert(rv == 1); EC_KEY_free(ec_key); ECDSA_SIG_free(sig); printf("%s() success\n", __FUNCTION__); return 0; }
static int pkey_sm2_verify(EVP_PKEY_CTX *ctx, const unsigned char *sig, size_t siglen, const unsigned char *dgst, size_t dgstlen) { EC_PKEY_CTX *ec_ctx = ctx->data; EC_KEY *ec_key = ctx->pkey->pkey.ec; int type = ec_ctx->md ? EVP_MD_type(ec_ctx->md) : NID_sm3; return SM2_verify(type, dgst, dgstlen, sig, siglen, ec_key); }
static int pkey_ec_verifyctx(EVP_PKEY_CTX *ctx, const unsigned char *sig, int siglen, EVP_MD_CTX *mctx) { unsigned char dgst[EVP_MAX_MD_SIZE]; unsigned int dgstlen; EC_PKEY_CTX *ec_ctx = ctx->data; EC_KEY *ec_key = ctx->pkey->pkey.ec; int type = ec_ctx->md ? EVP_MD_type(ec_ctx->md) : NID_sm3; dgstlen = sizeof(dgst); if (!EVP_DigestFinal_ex(mctx, dgst, &dgstlen)) { return -1; } return SM2_verify(type, dgst, dgstlen, sig, siglen, ec_key); }
static int pkey_ec_verify(EVP_PKEY_CTX *ctx, const unsigned char *sig, size_t siglen, const unsigned char *dgst, size_t dgstlen) { int ret, type; EC_PKEY_CTX *dctx = ctx->data; EC_KEY *ec_key = ctx->pkey->pkey.ec; if (dctx->md) type = EVP_MD_type(dctx->md); else type = NID_sha1; if (dctx->sign_type == NID_sm2sign) ret = SM2_verify(type, dgst, dgstlen, sig, siglen, ec_key); else ret = ECDSA_verify(type, dgst, dgstlen, sig, siglen, ec_key); return ret; }
static int pkey_ec_verify(EVP_PKEY_CTX *ctx, const unsigned char *sig, size_t siglen, const unsigned char *tbs, size_t tbslen) { int ret, type; EC_PKEY_CTX *dctx = ctx->data; EC_KEY *ec = ctx->pkey->pkey.ec; if (dctx->md) type = EVP_MD_type(dctx->md); else type = NID_sha1; #ifndef OPENSSL_NO_SM2 if (dctx->ec_scheme == NID_sm_scheme) ret = SM2_verify(NID_undef, tbs, tbslen, sig, siglen, ec); else #endif ret = ECDSA_verify(type, tbs, tbslen, sig, siglen, ec); return ret; }