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 |