static int pkey_ec_signctx(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, EVP_MD_CTX *mctx) { int ret; unsigned int len; EC_PKEY_CTX *dctx = ctx->data; EC_KEY *ec_key = ctx->pkey->pkey.ec; unsigned char dgst[EVP_MAX_MD_SIZE]; unsigned int dgstlen; int type = NID_undef; if (!sig) { *siglen = SM2_signature_size(ec_key); return 1; } else if (*siglen < (size_t)SM2_signature_size(ec_key)) { ECerr(EC_F_PKEY_SM2_SIGNCTX, EC_R_BUFFER_TOO_SMALL); return 0; } if (!EVP_DigestFinal_ex(mctx, dgst, &dgstlen)) { ECerr(EC_F_PKEY_SM2_SIGNCTX, ERR_R_EVP_LIB); return 0; } if (dctx->sign_type == NID_sm2sign) ret = SM2_sign(type, dgst, dgstlen, sig, &len, ec_key); else ret = ECDSA_sign(type, dgst, dgstlen, sig, &len, ec_key); *siglen = (size_t)len; return ret; }
static int pkey_sm2_sign(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, const unsigned char *dgst, size_t dgstlen) { int ret; EC_PKEY_CTX *ec_ctx = ctx->data; EC_KEY *ec_key = ctx->pkey->pkey.ec; int type; unsigned int len; if (!sig) { *siglen = SM2_signature_size(ec_key); return 1; } if (*siglen < (size_t)SM2_signature_size(ec_key)) { ECerr(EC_F_PKEY_SM2_SIGN, EC_R_BUFFER_TOO_SMALL); return 0; } type = ec_ctx->md ? EVP_MD_type(ec_ctx->md) : NID_sm3; if ((ret = SM2_sign(type, dgst, dgstlen, sig, &len, ec_key)) <= 0) { return ret; } *siglen = (size_t)len; return 1; }