예제 #1
0
void PRE_IO_rekey2file( char *file,PRE_REKEY *rekey,EC_GROUP *G )
{
	FILE *fp;
	if( NULL == (fp = fopen( file,"wb")) )exit(1);
	/*Write order:
	 * v->U->W
	 */
	BN_CTX *ctx = BN_CTX_new();
	char *v = BN_bn2hex(rekey->v);
	char *U = EC_POINT_point2hex(G,rekey->U,PRE_POINT_CONVERSION,ctx);
	char *W = EC_POINT_point2hex(G,rekey->W,PRE_POINT_CONVERSION,ctx);
	int strlenOfV = strlen(v);
	int strlenOfU = strlen(U);
	int strlenOfW = strlen(W);
	fwrite(&strlenOfV,sizeOfInt,1,fp);
	fwrite(&strlenOfU,sizeOfInt,1,fp);
	fwrite(&strlenOfW,sizeOfInt,1,fp);
	fwrite(v,strlenOfV,1,fp);
	fwrite(U,strlenOfU,1,fp);
	fwrite(W,strlenOfW,1,fp);
	BN_CTX_free(ctx);

	fclose(fp);

}
예제 #2
0
void PRE_IO_key2file(char* dir,char* fileName,unsigned char *key,PRE_KEY *key1,PRE_KEY *key2)
{
	FILE *fp;
	if( 0 == PRE_mkdir(dir) ||
		NULL == ( fp = fopen(fileName,"wb+") ))
		exit(1);

	/*Write order:
	 * E->F->U->W
	 */
	PRE_REKEY *reKey = new PRE_REKEY(key1,key2->pk);
	Cipher *C = Encrypt(key1->pk,key);
	Cipher_REKEY *C_r = ReEncrypt(reKey,C);

	BN_CTX *ctx = BN_CTX_new();
	char *F = EC_POINT_point2hex(params->G,C_r->F,PRE_POINT_CONVERSION,ctx);
	char *U = EC_POINT_point2hex(params->G,C_r->U,PRE_POINT_CONVERSION,ctx);
	char *W = EC_POINT_point2hex(params->G,C_r->W,PRE_POINT_CONVERSION,ctx);
	int strlenOfE = 128;//strlen(C_r->E);
	int strlenOfF = strlen(F);
	int strlenOfU = strlen(U);
	int strlenOfW = strlen(W);
	fwrite(&strlenOfE,sizeOfInt,1,fp);
	fwrite(&strlenOfF,sizeOfInt,1,fp);
	fwrite(&strlenOfU,sizeOfInt,1,fp);
	fwrite(&strlenOfW,sizeOfInt,1,fp);
	fwrite(C_r->E,strlenOfE,1,fp);
	fwrite(     F,strlenOfF,     1,fp);
	fwrite(     U,strlenOfU,     1,fp);
	fwrite(     W,strlenOfW,     1,fp);
	fclose(fp);
}
예제 #3
0
static pubkeybatch_t *
pubkeybatch_avl_search(avl_root_t *rootp, const EC_POINT *pubkey,
		       const EC_GROUP *pgroup)
{
	char *pubkey_hex;
	pubkeybatch_t *vp;
	avl_item_t *itemp = rootp->ar_root;
	pubkey_hex = EC_POINT_point2hex(pgroup,
					pubkey,
					POINT_CONVERSION_UNCOMPRESSED,
					NULL);
	while (itemp) {
		int cmpres;
		vp = avl_item_entry(itemp, pubkeybatch_t, avlent);
		cmpres = strcmp(pubkey_hex, vp->pubkey_hex);
		if (cmpres > 0) {
			itemp = itemp->ai_left;
		} else {
			if (cmpres < 0) {
				itemp = itemp->ai_right;
			} else {
				OPENSSL_free(pubkey_hex);
				return vp;
			}
		}
	}
	OPENSSL_free(pubkey_hex);
	return NULL;
}
예제 #4
0
void PRE_IO_Cipher2file(Cipher_REKEY *C,EC_GROUP *G,char *file)
{
	FILE *fp;
	if ( NULL == (fp = fopen( file,"wb")) )exit(1);

	BN_CTX *ctx = BN_CTX_new();
	char *F = EC_POINT_point2hex(G,C->F,PRE_POINT_CONVERSION,ctx);
	char *U = EC_POINT_point2hex(G,C->U,PRE_POINT_CONVERSION,ctx);
	char *W = EC_POINT_point2hex(G,C->W,PRE_POINT_CONVERSION,ctx);
	fwrite(C->E,sizeof(C->E),1,fp);
	fwrite(   F,sizeof(F),   1,fp);
	fwrite(   U,sizeof(U),   1,fp);
	fwrite(   W,sizeof(W),   1,fp);
	
	BN_CTX_free(ctx);

	fclose(fp);
}
예제 #5
0
void PRE_IO_prekey2file(PRE_KEY *key,EC_GROUP *G,char *file)
{
	FILE *fp;
	if ( NULL == (fp = fopen( file,"wb")) )exit(1);

	BN_CTX *ctx = BN_CTX_new();
	char *pk1 = EC_POINT_point2hex(G,key->pk->pk1,POINT_CONVERSION_UNCOMPRESSED,ctx);
	char *pk2 = EC_POINT_point2hex(G,key->pk->pk2,POINT_CONVERSION_UNCOMPRESSED,ctx);
	char *sk1 = BN_bn2hex(key->sk->x1);
	char *sk2 = BN_bn2hex(key->sk->x2);
	int sizeOfPk1 = sizeof(pk1);
	int sizeOfPk2 = sizeof(pk2);
	int sizeOfSk1 = sizeof(sk1);
	int sizeOfSk2 = sizeof(sk2);
	fwrite(&sizeOfPk1,sizeOfInt,1,fp);fwrite(pk1,sizeof(pk1),1,fp);
	fwrite(&sizeOfPk2,sizeOfInt,1,fp);fwrite(pk2,sizeof(pk2),1,fp);
	fwrite(&sizeOfSk1,sizeOfInt,1,fp);fwrite(sk1,sizeof(sk1),1,fp);
	fwrite(&sizeOfSk2,sizeOfInt,1,fp);fwrite(sk2,sizeof(sk2),1,fp);
	BN_CTX_free(ctx);

	fclose(fp);
}
예제 #6
0
int VNEcdsa_ORG_DumpPubKey( const VNAsymCryptCtx_t * ctx,
	struct vn_iovec * hexPubKey )
{
	char * tmp = NULL;
	const EC_POINT * point = NULL;

	const VNEcdsa_ORG_Ctx_t * orgCtx = VN_CONTAINER_OF( ctx, VNEcdsa_ORG_Ctx_t, mCtx );
	assert( VN_TYPE_VNEcdsaSign_ORG == ctx->mType );

	point = EC_KEY_get0_public_key( orgCtx->mEcKey );
	tmp = EC_POINT_point2hex( EC_KEY_get0_group( orgCtx->mEcKey ),
			point, POINT_CONVERSION_UNCOMPRESSED, NULL );

	hexPubKey->i.iov_len = strlen( tmp );
	hexPubKey->i.iov_base = strdup( tmp );

	OPENSSL_free( tmp );

	return 0;
}
예제 #7
0
int
server_context_submit_solution(server_context_t *ctxp,
			       workitem_t *work,
			       const char *privkey)
{
	char urlbuf[8192];
	char *pubhex;
	CURL *creq;
	CURLcode res;

	pubhex = EC_POINT_point2hex(EC_KEY_get0_group(ctxp->dummy_key),
				    work->pubkey,
				    POINT_CONVERSION_UNCOMPRESSED,
				    NULL);
	snprintf(urlbuf, sizeof(urlbuf),
		 "%s?key=%s%%3A%s&privateKey=%s&bitcoinAddress=%s",
		 ctxp->submit,
		 work->pattern,
		 pubhex,
		 privkey,
		 ctxp->credit_addr);
	OPENSSL_free(pubhex);
	creq = curl_easy_init();
	if (curl_easy_setopt(creq, CURLOPT_URL, urlbuf) ||
	    curl_easy_setopt(creq, CURLOPT_VERBOSE, ctxp->verbose > 1) ||
	    curl_easy_setopt(creq, CURLOPT_FOLLOWLOCATION, 1)) {
		fprintf(stderr, "Failed to set up libcurl\n");
		exit(1);
	}

	res = curl_easy_perform(creq);
	if (res != CURLE_OK) {
		fprintf(stderr, "Submission failed: %s\n",
			curl_easy_strerror(res));
		curl_easy_cleanup(creq);
		return -1;
	}

	curl_easy_cleanup(creq);
	return 0;
}
예제 #8
0
int
server_workitem_add(server_request_t *reqp, workitem_t *wip)
{
	workitem_t *xwip;
	pubkeybatch_t *pbatch = NULL;

	pbatch = pubkeybatch_avl_search(&reqp->items, wip->pubkey, reqp->group);
	if (pbatch == NULL) {
		pbatch = (pubkeybatch_t *) malloc(sizeof(*pbatch));
		if (pbatch == NULL)
			return -1;
		memset(pbatch, 0, sizeof(*pbatch));
		avl_item_init(&pbatch->avlent);
		avl_root_init(&pbatch->items);
		pbatch->total_value = 0;
		pbatch->pubkey = wip->pubkey;
		pbatch->pubkey_hex = EC_POINT_point2hex(reqp->group, 
					wip->pubkey, 
					POINT_CONVERSION_UNCOMPRESSED, 
					NULL);
		pubkeybatch_avl_insert(&reqp->items, pbatch);
		reqp->nitems++;
	}

	/* Make sure there isn't an overlap */
	xwip = workitem_avl_insert(&pbatch->items, wip);
	if (xwip)
		return -1;

	if (wip->pubkey && wip->pubkey != pbatch->pubkey)
		EC_POINT_free(wip->pubkey);
	wip->pubkey = pbatch->pubkey;
	
	pbatch->nitems++;
	pbatch->total_value += wip->value;
	return 0;
}
예제 #9
0
파일: sm2_enc.c 프로젝트: cuiwm/GmSSL
int SM2_CIPHERTEXT_VALUE_print(BIO *out, const EC_GROUP *ec_group,
	const SM2_CIPHERTEXT_VALUE *cv, int indent, unsigned long flags)
{
	int ret = 0;
	char *hex = NULL;
	BN_CTX *ctx = BN_CTX_new();
	int i;

	if (!ctx) {
		goto end;
	}

	if (!(hex = EC_POINT_point2hex(ec_group, cv->ephem_point,
		POINT_CONVERSION_UNCOMPRESSED, ctx))) {
		goto end;
	}

	BIO_printf(out, "SM2_CIPHERTEXT_VALUE.ephem_point: %s\n", hex);
	BIO_printf(out, "SM2_CIPHERTEXT_VALUE.ciphertext : ");
	for (i = 0; i < cv->ciphertext_size; i++) {
		BIO_printf(out, "%02X", cv->ciphertext[i]);
	}
	BIO_printf(out, "\n");
	BIO_printf(out, "SM2_CIPHERTEXT_VALUE.mactag :");
	for (i = 0; i < cv->mactag_size; i++) {
		BIO_printf(out, "%02X", cv->mactag[i]);
	}
	BIO_printf(out, "\n");

	ret = 1;

end:
	OPENSSL_free(hex);
	BN_CTX_free(ctx);
	return 0;
}
void printPoint(const polypseud_ctx *ctx, EC_POINT *point) {
    printf("%s\n", EC_POINT_point2hex(ctx->ec_group, point, POINT_CONVERSION_UNCOMPRESSED, ctx->bn_ctx));
}
예제 #11
0
파일: ectool.c 프로젝트: LiTianjue/GmSSL
int main(int argc, const char *argv[])
{
	int r;
	int ok = 0;
	char *prog = "ecc";

	
	// libpopt var
	poptContext popt_ctx;
	const char **rest;
	int command = 0;
	char *curve_name = "secp192k1";
	int point_compressed = 0;
	point_conversion_form_t point_form;

	struct poptOption options[] = {
		{"curve-name",		'c', POPT_ARG_STRING, &curve_name, 0,		"elliptic curve name", "NAME"},
		{"point-compressed",	'z', POPT_ARG_NONE, &point_compressed, 0,	"point format, compress or uncompress", NULL},
		{"print-curve",		'p', POPT_ARG_VAL, &command, ECC_PRINT,		"print elliptic curve parameters", NULL},
		{"random-private-key",	 0,  POPT_ARG_VAL, &command, ECC_RAND_SKEY,	"random generate a private key\n", NULL},
		{"random-keypair",	 0,  POPT_ARG_VAL, &command, ECC_RAND_KEYPAIR,	"generate a random key pair\n", NULL},
		{"check-point",		'e', POPT_ARG_VAL, &command, ECC_CHECK_POINT,	"check if point is valid\n", NULL},
		{"point-add",		'a', POPT_ARG_VAL, &command, ECC_ADD,		"elliptic curve point addition", NULL},
		{"point-double",	'b', POPT_ARG_VAL, &command, ECC_DOUBLE,	"elliptic curve point double", NULL},
		{"point-mul",		'x', POPT_ARG_VAL, &command, ECC_MUL,		"k*G", NULL},
		{"point-mul-generator",	'X', POPT_ARG_VAL, &command, ECC_MUL_G,		"elliptic curve point scalar multiply", NULL},
		{"point-invert",	'i', POPT_ARG_VAL, &command, ECC_INVERT,	"elliptic curve point inverse", NULL},
		{"ecdsa-sign",		's', POPT_ARG_VAL, &command, ECC_SIGN,		"ecdsa sign", NULL},
		{"ecdsa-verify",	'v', POPT_ARG_VAL, &command, ECC_VERIFY,	"ecdsa verify", NULL},
		POPT_AUTOHELP
		POPT_TABLEEND
	};

	// openssl var
	EC_GROUP *ec_group = NULL;
	EC_POINT *P = NULL;
	EC_POINT *Q = NULL;
	EC_POINT *R = NULL;
	BIGNUM *k = BN_new();
	BN_CTX *bn_ctx = BN_CTX_new();


	// argument parsing
	popt_ctx = poptGetContext(argv[0], argc, argv, options, 0);
	if ((r = poptGetNextOpt(popt_ctx)) < -1) {
		fprintf(stderr, "%s: bad argument %s: %s\n", argv[0], 
			poptBadOption(popt_ctx, POPT_BADOPTION_NOALIAS), 
			poptStrerror(r));
		goto exit;
	}
	rest = poptGetArgs(popt_ctx);


	// check arguments
	ec_group = EC_GROUP_new_by_curve_name(OBJ_txt2nid(curve_name));
	if (ec_group == NULL) {
		fprintf(stderr, "%s: unknown curve name\n", prog);
		goto exit;
	}

	P = EC_POINT_new(ec_group);
	Q = EC_POINT_new(ec_group);
	R = EC_POINT_new(ec_group);

	point_form = point_compressed ? POINT_CONVERSION_COMPRESSED : POINT_CONVERSION_UNCOMPRESSED;

	switch (command) {
	case ECC_PRINT:
		{
		BIGNUM *p = BN_new();
		BIGNUM *a = BN_new();
		BIGNUM *b = BN_new();
		char *generator;
		BIGNUM *order = BN_new();
		BIGNUM *cofactor = BN_new();

		EC_GROUP_get_curve_GFp(ec_group, p, a, b, bn_ctx);
		generator = EC_POINT_point2hex(ec_group, EC_GROUP_get0_generator(ec_group), point_form, bn_ctx);
		EC_GROUP_get_order(ec_group, order, bn_ctx);
		EC_GROUP_get_cofactor(ec_group, cofactor, bn_ctx);
		
		fprintf(stdout, "Name      : %s\n", OBJ_nid2sn(EC_GROUP_get_curve_name(ec_group)));
		fprintf(stdout, "FieldType : %s\n", "PrimeField");
		fprintf(stdout, "Prime     : %s\n", BN_bn2hex(p));
		fprintf(stdout, "A         : %s\n", BN_bn2hex(a));
		fprintf(stdout, "B         : %s\n", BN_bn2hex(b));
		fprintf(stdout, "Generator : %s\n", generator);
		fprintf(stdout, "Order     : %s\n", BN_bn2hex(order));
		fprintf(stdout, "Cofactor  : %s\n", BN_bn2hex(cofactor));

		BN_free(p);
		BN_free(a);
		BN_free(b);
		BN_free(order);
		BN_free(cofactor);

		break;
		}
	case ECC_CHECK_POINT:
		{
		if (!rest) {
			fprintf(stderr, "%s: short of point\n", prog);
			goto exit;
		}
		if (!rest[0]) {
			fprintf(stderr, "%s: short of point\n", prog);
			goto exit;
		}
		if (EC_POINT_hex2point(ec_group, rest[0], P, bn_ctx))
			fprintf(stdout, "ture\n");
		else
			fprintf(stdout, "false\n");
		break;
		}
	case ECC_RAND_SKEY:
		{
		EC_KEY *ec_key = EC_KEY_new();
		EC_KEY_set_group(ec_key, ec_group);
		EC_KEY_generate_key(ec_key);
		fprintf(stdout, "%s\n", BN_bn2hex(EC_KEY_get0_private_key(ec_key)));
		EC_KEY_free(ec_key);
		break;
		}
	case ECC_RAND_KEYPAIR:
		{
		EC_KEY *ec_key = EC_KEY_new();
		EC_KEY_set_group(ec_key, ec_group);
		EC_KEY_generate_key(ec_key);
		fprintf(stdout, "%s\n", BN_bn2hex(EC_KEY_get0_private_key(ec_key)));
		fprintf(stdout, "%s\n", EC_POINT_point2hex(ec_group, EC_KEY_get0_public_key(ec_key), point_form, bn_ctx));
		EC_KEY_free(ec_key);
		break;
		}
	case ECC_ADD:
		{
		if (!rest) {
			fprintf(stderr, "%s: short of point\n", prog);
			goto exit;
		}
		if (!rest[0] || !rest[1]) {
			fprintf(stderr, "%s: short of point\n", prog);
			goto exit;
		}			
		if (!EC_POINT_hex2point(ec_group, rest[1], P, bn_ctx)) {
			fprintf(stderr, "%s: first point invalid\n", prog);
			goto exit;
		}
		if (!EC_POINT_hex2point(ec_group, rest[1], Q, bn_ctx)) {
			fprintf(stderr, "%s: second point invalid\n", prog);
			goto exit;
		}
		EC_POINT_add(ec_group, R, P, Q, bn_ctx);
		fprintf(stdout, "%s\n", EC_POINT_point2hex(ec_group, R, point_form, bn_ctx));
		break;
		}
	case ECC_DOUBLE:
		{
		EC_POINT_dbl(ec_group, R, P, bn_ctx);
		fprintf(stdout, "%s\n", EC_POINT_point2hex(ec_group, R, point_form, bn_ctx));
		break;
		}
	case ECC_MUL:
		{
		BIGNUM *order = NULL;

		if (!BN_hex2bn(&k, rest[0])) {
			fprintf(stderr, "%s: integer invalid\n", prog);
			goto exit;
		}
		
		order = BN_new();
		EC_GROUP_get_order(ec_group, order, bn_ctx);
		if (BN_cmp(k, order) >= 0) {
			fprintf(stderr, "%s: integer value invalid\n", prog);
			BN_free(order);
			goto exit;
		}
		BN_free(order);

		if (!EC_POINT_hex2point(ec_group, rest[1], P, bn_ctx)) {
			fprintf(stderr, "%s: point invalid\n", prog);
			goto exit;
		}

		EC_POINT_mul(ec_group, R, k, P, NULL, bn_ctx);
		fprintf(stdout, "%s\n", EC_POINT_point2hex(ec_group, R, point_form, bn_ctx));

		break;
		}
	case ECC_MUL_G:
		{
		BIGNUM *order = NULL;
		if (!BN_hex2bn(&k, rest[0])) {
			fprintf(stderr, "%s: integer format invalid\n", prog);
			goto exit;
		}
		
		order = BN_new();
		EC_GROUP_get_order(ec_group, order, bn_ctx);
		if (BN_cmp(k, order) >= 0) {
			fprintf(stderr, "%s: integer value invalid\n", prog);
			BN_free(order);
			goto exit;
		}
		BN_free(order);
		
		EC_POINT_mul(ec_group, R, k, EC_GROUP_get0_generator(ec_group), NULL, bn_ctx);
		fprintf(stdout, "%s\n", EC_POINT_point2hex(ec_group, R, point_form, bn_ctx));
		break;
		}
	default:
		fprintf(stderr, "%s: command is required\n", prog);
		break;
	}
	ok = 1;

exit:
	if (ec_group) EC_GROUP_free(ec_group);
	if (P) EC_POINT_free(P);
	if (k) BN_free(k);
	if (bn_ctx) BN_CTX_free(bn_ctx);

	return ok ? 0 : -1;
}
예제 #12
0
int initialiseRingSigs()
{
    if (fDebugRingSig)
        LogPrintf("initialiseRingSigs()\n");

    if (!(ecGrp = EC_GROUP_new_by_curve_name(NID_secp256k1)))
        return errorN(1, "initialiseRingSigs(): EC_GROUP_new_by_curve_name failed.");

    if (!(bnCtx = BN_CTX_new()))
        return errorN(1, "initialiseRingSigs(): BN_CTX_new failed.");

    BN_CTX_start(bnCtx);

    //Create a new EC group for the keyImage with all of the characteristics of ecGrp.
    if(!(ecGrpKi = EC_GROUP_dup(ecGrp))){
	return errorN(1, "initialiseRingSigs(): EC_GROUP_dup failed.");
    }

    // get order and cofactor
    bnOrder = BN_new();
    if(!EC_GROUP_get_order(ecGrp, bnOrder, bnCtx)){
        return errorN(1, "initialiseRingSigs(): EC_GROUP_get_order failed.");
    }

    BIGNUM *bnCofactor = BN_CTX_get(bnCtx);
    if(!EC_GROUP_get_cofactor(ecGrp, bnCofactor, bnCtx)){
    	return errorN(1, "initialiseRingSigs(): EC_GROUP_get_cofactor failed.");
    }

    // get the original generator
    EC_POINT *ptBase = const_cast<EC_POINT*>(EC_GROUP_get0_generator(ecGrp)); //PS: never clear this point

    // create key image basepoint variable
    EC_POINT *ptBaseKi = EC_POINT_new(ecGrpKi);
    BIGNUM *bnBaseKi = BN_CTX_get(bnCtx);

    // get original basepoint in BIG NUMS.
    EC_POINT_point2bn(ecGrp, ptBase, POINT_CONVERSION_COMPRESSED, bnBaseKi, bnCtx);

    //create "1" in BIG NUMS
    BIGNUM *bnBaseKiAdd = BN_CTX_get(bnCtx);
    std::string num_str = "1";
    BN_dec2bn(&bnBaseKiAdd, num_str.c_str());

    // add 1 to original base point and store in key image basepoint (BIG NUMS)
    BN_add(bnBaseKi, bnBaseKi, bnBaseKiAdd);

    // key image basepoint from bignum to point in ptBaseKi
    if(!EC_POINT_bn2point(ecGrp, bnBaseKi, ptBaseKi, bnCtx))
       return errorN(1, "initialiseRingSigs(): EC_POINT_bn2point failed.");

    // set generator of ecGrpKi
    if(!EC_GROUP_set_generator(ecGrpKi, ptBaseKi, bnOrder, bnCofactor)){
	 return errorN(1, "initialiseRingSigs(): EC_GROUP_set_generator failed.");
    }

    if (fDebugRingSig)
    {
        // Debugging...
        const EC_POINT *generator = EC_GROUP_get0_generator(ecGrp);
        const EC_POINT *generatorKi = EC_GROUP_get0_generator(ecGrpKi);
        char *genPoint = EC_POINT_point2hex(ecGrp, generator, POINT_CONVERSION_UNCOMPRESSED, bnCtx);
        char *genPointKi = EC_POINT_point2hex(ecGrpKi, generatorKi, POINT_CONVERSION_UNCOMPRESSED, bnCtx);

        LogPrintf("generator ecGrp:   %s\ngenerator ecGrpKi: %s\n", genPoint, genPointKi);
    }

    EC_POINT_free(ptBaseKi);
    BN_CTX_end(bnCtx);
    return 0;
};
예제 #13
0
int getPublicKeyFromPem(char *pemstring, char **pubkey) {

    EC_KEY *eckey = NULL;
    EC_KEY *key = NULL;
    EC_POINT *pub_key = NULL;
    BIO *in = NULL;
    const EC_GROUP *group = NULL;
    char *hexPoint = NULL;
    char xval[65] = "";
    char yval[65] = "";
    char *oddNumbers = "13579BDF";

    BIGNUM start;
    const BIGNUM *res;
    BN_CTX *ctx;

    BN_init(&start);
    ctx = BN_CTX_new();

    res = &start;

    const char *cPem = pemstring;
    in = BIO_new(BIO_s_mem());
    BIO_puts(in, cPem);
    key = PEM_read_bio_ECPrivateKey(in, NULL, NULL, NULL);
    res = EC_KEY_get0_private_key(key);
    eckey = EC_KEY_new_by_curve_name(NID_secp256k1);
    group = EC_KEY_get0_group(eckey);
    pub_key = EC_POINT_new(group);

    EC_KEY_set_private_key(eckey, res);

    if (!EC_POINT_mul(group, pub_key, res, NULL, NULL, ctx)) {
        return ERROR;
    }

    EC_KEY_set_public_key(eckey, pub_key);

    hexPoint = EC_POINT_point2hex(group, pub_key, 4, ctx);

    char *hexPointxInit = hexPoint + 2;
    memcpy(xval, hexPointxInit, 64);

    char *hexPointyInit = hexPoint + 66;
    memcpy(yval, hexPointyInit, 64);

    char *lastY = hexPoint + 129;
    hexPoint[130] = '\0';

    char *buildCompPub = calloc(67, sizeof(char));

    if (strstr(oddNumbers, lastY) != NULL) {
        sprintf(buildCompPub, "03%s", xval);
        buildCompPub[66] = '\0';
        memcpy(*pubkey, buildCompPub, 67);
    } else {
        sprintf(buildCompPub, "02%s", xval);
        buildCompPub[66] = '\0';
        memcpy(*pubkey, buildCompPub, 67);
    }

    free(buildCompPub);
    BN_CTX_free(ctx);
    EC_KEY_free(eckey);
    EC_KEY_free(key);
    EC_POINT_free(pub_key);
    BIO_free(in);

    return NOERROR;
};