Hello,
I'm trying to generate a public key from a private one using the bitcoin library secp256k1
https://github.com/bitcoin-core/secp256k1 in C++:
// private key
std::string privateKey = "baca891f5f0285e043496843d82341d15533f016c223d114e1e4dfd39e60ecb0";
const char* cPrivateKey = privateKey.c_str();
// creating public key from it
secp256k1_context *signingContext = secp256k1_context_create(SECP256K1_CONTEXT_SIGN);
secp256k1_pubkey pkey;
unsigned char *seckey = (unsigned char*) malloc(privateKey.size() * sizeof(unsigned char));
std::copy(cPrivateKey, cPrivateKey + privateKey.size(), seckey);
if (secp256k1_ec_pubkey_create(signingContext, &pkey, seckey) == 0) throw "Creation error";
// print the result in hex
std::stringstream ss;
for (int i = 0; i < 64; ++i)
{
ss << std::setw(2) << std::hex << (0xff & (unsigned int)pkey.data[i]);
}
std::cout << ss.str() << std::endl;
// parsing the result
std::string pkey_data = ss.str();
secp256k1_context *noneContext = secp256k1_context_create(SECP256K1_CONTEXT_NONE);
secp256k1_pubkey pubkey;
if (secp256k1_ec_pubkey_parse(noneContext, &pubkey, pkey.data, 64) == 0) std::cout << "Couldnt parse using pkey.data" << std::endl;
if (secp256k1_ec_pubkey_parse(noneContext, &pubkey, pkay_data, pkey_data.size()) == 0) std::cout << "Couldnt parse using hex public key " << std::endl;
The output:
1b9e55408c5141414e8337adef57ead18f62444fdf5f8c897d0dc812696a6141a919254d3e750075a2a9ba32dc4ed30c84e65f27e431b59b94a2aafe3e80a974
Couldnt parse using pkey.data
Couldnt parse using hex public key
The idea is to parse the public key from the generated one to see if it is really correct. Also, i tried using openssl with the same private key and i get a different public key from the private one using ecdsa secp256k1..
Any help or example on how to use the library in C++ is more than welcome.
Thank you