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; }
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; }