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
X25519?
On Mon, Nov 14, 2022, 05:23 ORNEST Matej - Contractor via openssl-users <openssl-users@xxxxxxxxxxx> wrote: