Hi all,
I need to implement support for X52219/X448 for DH key exchange (and
Ed52219/Ed448 for DSA) elliptic curves in our project. I need to export public
key for DH exchange in form of DER encoded chunk in form
tag+X-coordinate+Y-coordinate. Thus I need to get EC_POINT from EVP_PKEY and
encode it as needed. I understand that those key types differs from EC types in
way that I need just X coordinate and a flag bit to reconstruct the key, but
still, how do I get the X coordinate?
My solution works for all other EC types such as SecpX and Brainpool families,
but not for X52219/X448 keys and I do not completely understand why.
Specifically when I decode public key previously encoded with i2d_PUBKEY() to
EVP_PEKY and try to get EC_KEY by calling EVP_PKEY_get0_EC_KEY(), it returns
NULL and issues an error that it’s not an EC key…
I’m using following code:
EVP_PKEY *key = … // Decode from DER encoded public key
if(key != nil) {
EC_KEY *ecKey = EVP_PKEY_get0_EC_KEY(key);
/// When X52219 or X448 key is passed, ecKey is NULL
if(ecKey != NULL) {
const EC_POINT *point = EC_KEY_get0_public_key(ecKey);
const EC_GROUP *group = EC_KEY_get0_group(ecKey);
if(point != NULL && group != NULL) {
BIGNUM *bnX = BN_new();
BIGNUM *bnY = BN_new();
if(EC_POINT_get_affine_coordinates(group, point, bnX, bnY,
NULL)) {
char *hexX = BN_bn2hex(bnX);
char *hexY = BN_bn2hex(bnY);
// Convert to custom data structures
…
}
BN_free(bnX);
BN_free(bnY);
}
}
}
Is there any way how to export those key types in desired format? I’m using
OpenSSL version 1.1.1q.
Thank you very much for any hint
Matt