Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}