Example #1
0
static int pkey_ec_decrypt(EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen,
	const unsigned char *in, size_t inlen)
{
	int ret;
	EC_PKEY_CTX *dctx = ctx->data;
	EC_KEY *ec_key = ctx->pkey->pkey.ec;

	if (dctx->enc_type == NID_sm2encrypt) {
		ret = SM2_encrypt_with_recommended(out, outlen, in, inlen, ec_key);
	} else {
		ret = ECIES_decrypt_with_recommended(out, outlen, in, inlen, ec_key);
	}

	return ret;
}
Example #2
0
static int ECIES_test(int verbose)
{
	int ret = 0;
	EC_KEY *ec_key = NULL;
	unsigned char mbuf[] = "message to be encrypted";
	size_t mlen = sizeof(mbuf);
	unsigned char *cbuf = NULL;
	unsigned char *pbuf = NULL;
	size_t clen, plen;

	/* generate key pair */
	if (!(ec_key = EC_KEY_new_by_curve_name(NID_secp192k1))) {
		ERR_print_errors_fp(stderr);
		goto end;
	}
	if (!EC_KEY_generate_key(ec_key)) {
		ERR_print_errors_fp(stderr);
		goto end;
	}

	/* estimate output buffer size */
	if (!ECIES_encrypt_with_recommended(mbuf, sizeof(mbuf), NULL, &clen, ec_key)) {
		ERR_print_errors_fp(stderr);
		goto end;
	}
	/* prepare buffer */
	if (!(cbuf = OPENSSL_malloc(clen))) {
		ERR_print_errors_fp(stderr);
		goto end;
	}
	/* encrypt */
	if (!ECIES_encrypt_with_recommended(mbuf, sizeof(mbuf), cbuf, &clen, ec_key)) {
		ERR_print_errors_fp(stderr);
		goto end;
	}

	if (verbose) {
		printf("plaintext = %s\n", (char *)mbuf);
	}

	if (verbose) {
		int i;
		printf("ciphertext = ");
		for (i = 0; i < clen; i++) {
			printf("%02X", cbuf[i]);
		}
		printf("\n");
	}

	/* estimate output buffer size */
	if (!ECIES_decrypt_with_recommended(cbuf, clen, NULL, &plen, ec_key)) {
		ERR_print_errors_fp(stderr);
		goto end;
	}
	/* prepare buffer */
	if (!(pbuf = OPENSSL_zalloc(plen))) {
		ERR_print_errors_fp(stderr);
		goto end;
	}
	/* decrypt */
	if (!ECIES_decrypt_with_recommended(cbuf, clen, pbuf, &plen, ec_key)) {
		ERR_print_errors_fp(stderr);
		goto end;
	}

	if (verbose) {
		printf("plaintext = %s\n", pbuf);
	}

	/* compare plaintext, and set result */
	if (plen == mlen && memcmp(mbuf, pbuf, mlen) == 0) {
		ret = 1;
	}

	if (verbose) {
		printf("%s() %s\n", __FUNCTION__,
			ret == 1 ? "passed" : "failed");
	}

end:
	EC_KEY_free(ec_key);
	OPENSSL_free(cbuf);
	OPENSSL_free(pbuf);
	return ret;
}