Как рассчитать открытый ключ для обмена ключами TLS с использованием функций OpenSSL?

Я изучаю схему TLS 1.3 и пытаюсь реализовать основные шаги рукопожатия на C++ без использования готовых оболочек из OpenSSL, таких как SSL_accept или SSL_do_handshake. В проекте уже используется OpenSSL для обычных криптографических операций, поэтому я бы не хотел связывать его с любыми другими крипто-библиотеками, где расчет x25519 более очевиден, чем в OpenSSL. Так...

есть два буфера:

unsigned char private_key[32];
RAND_bytes(private_key, 32);

unsigned char public_key[32];
memset(public_key, 0, 32);

Какие методы OpenSSL мне следует использовать для заполнения public_key буфер с байтами, вычисленными из private_key используя алгоритм x25519 (копирование и выделение как можно меньше)?

1 ответ

Решение

Создать EVP_PKEY объект с помощью функции EVP_PKEY_new_raw_private_key как описано здесь:

https://www.openssl.org/docs/man1.1.1/man3/EVP_PKEY_new_raw_private_key.html

    EVP_PKEY key = EVP_PKEY_new_raw_private_key(EVP_PKEY_X25519, NULL, private_key, sizeof(private_key));
    if (key == NULL)
        /* Error */;

Затем вы можете получить байты открытого ключа с помощью функции EVP_PKEY_get_raw_public_key как описано на той же странице, что и выше:

    size_t publen = sizeof(public_key);
    if (!EVP_PKEY_get_raw_public_key(key, public_key, &publen))
        /* Error */;
Другие вопросы по тегам