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