Я пытаюсь подключиться к серверу (написанному на C#), который ожидает, что клиент публикует ключ c в формате RFC4050 XML. Мой клиентский ключ publi c, как ожидается, будет сгенерирован с использованием ECDH, и я использую C ++ с библиотеками OpenSSL для этого. Правильно ли заполнить координаты X и Y в RFC4050 XML аффинными координатами клиентского открытого ключа c? Формат RFC4050 XML: <ECDHKeyValue xmlns=\"http://www.w3.org/2001/04/xmldsig-more#\">\r\n <DomainParameters>\r\n <NamedCurve URN=\"urn:oid:1.3.132.0.35\" />\r\n </DomainParameters>\r\n <PublicKey>\r\n <X Value=\"2520557845163750388492015545074233142150157627108850536663892158351128148943058066770537552802950337485463642966856813408541819163604252751347278102301201033\" xsi:type=\"PrimeFieldElemType\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" />\r\n <Y Value=\"610245425257173369381499165085605889107799686396477024964646388921876216416739472882657151487231301777157588118328087154837746015245601575646426965596580871\" xsi:type=\"PrimeFieldElemType\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" />\r\n </PublicKey>\r\n</ECDHKeyValue>
Мой подход к генерации координат X и Y:
int main(void) {
EC_KEY* key = EC_KEY_new_by_curve_name(NID_secp521r1);
if (!key)
{
std::cerr << "Error creating curve key" << '\n';
return EXIT_FAILURE;
}
if (!EC_KEY_generate_key(key))
{
std::cerr << "Error generating curve key" << '\n';
EC_KEY_free(key);
return EXIT_FAILURE;
}
EC_POINT const* pub = EC_KEY_get0_public_key(key);
if (!pub)
{
std::cerr << "Error getting public key" << '\n';
EC_KEY_free(key);
return EXIT_FAILURE;
}
BIGNUM *x = BN_new();
BIGNUM *y = BN_new();
EC_GROUP const* EG = EC_KEY_get0_group(key);
EC_POINT_get_affine_coordinates_GF2m(EG, pub, x, y, nullptr);
std::cout<<"X: " << BN_bn2dec(x) << std::endl;
std::cout <<"Y: " << BN_bn2dec(y);
EC_KEY_free(key);
BN_free(x);
BN_free(y);
}