Как отформатировать данные RFC4050 XML, используя ECDH publi c, ключевые координаты, используя C ++ OpenSSL - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь подключиться к серверу (написанному на 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);
}
...