How do I set the private key for signing messages when using ECDSA in OpenSSL programmatically? I have the following code:
static int create_signature(unsigned char* hash)
{
EC_KEY *eckey=NULL;
EC_GROUP *ecgroup=NULL;
EVP_PKEY *evpkey=NULL;
unsigned char *signature=NULL;
point_conversion_form_t form = POINT_CONVERSION_UNCOMPRESSED;
int signature_size, block_size;
unsigned char * block=NULL;
ecgroup = get_ec_group_192();
EC_GROUP_set_asn1_flag(ecgroup, OPENSSL_EC_NAMED_CURVE);
EC_GROUP_set_point_conversion_form(ecgroup, form);
eckey=EC_KEY_new();
EC_KEY_set_group(eckey,ecgroup);
EC_KEY_generate_key(eckey);
evpkey=EVP_PKEY_new();
EVP_PKEY_assign_EC_KEY(evpkey,eckey);
signature=OPENSSL_malloc(EVP_PKEY_size(evpkey));
ECDSA_sign(0, hash, sizeof(hash), signature, &signature_size, eckey);
printf("%s", signature);
return 0;
}
The function get_ec_group_192()
is created by running openssl ecparam -C -name secp192k1 -genkey
which also generates some EC PARAMETERS
and a EC PRIVATE KEY
.
What I am trying to do is to encrypt the message contained in hash
with my private key so that only public key can decrypt it. Is that possible with the above code, or am I doing this completely wrong?
Their is a small bug in the above code. The hash that is passed is an unsigned char, this hash CAN have 0x00 values in it! Do NOT use the strlen(hash) to calculate the length, as that will possibly pass the incorrect length to the routine IF the hash has a 0x00 in it anywhere. Hashes are fixed length, and should be passed as such. sha256 for example should be of length 64.
The following verifies successfully for me: