如何使用 OpenSSL 函数为 TLS 密钥交换计算 public 密钥?

How to calculate public key for TLS key exchange using OpenSSL functions?

我正在学习 TLS 1.3 方案并尝试在 C++ 中实现基本的握手步骤,而不使用来自 OpenSSL 的现成包装器,例如 SSL_acceptSSL_do_handshake。该项目已经使用 OpenSSL 进行常见的加密操作,因此我不想 link 它与 x25519 计算比在 OpenSSL 中更明显的任何其他加密库一起使用。所以...

有两个缓冲区:

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

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

我应该使用 OpenSSL 的哪种方法来使用 x25519 算法(尽可能少地复制和分配)从 private_key 计算出的字节填充 public_key 缓冲区?

使用函数 EVP_PKEY_new_raw_private_key 创建一个 EVP_PKEY 对象,如下所述:

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 获取 public 关键字节,如上述同一页所述:

    size_t publen = sizeof(public_key);
    if (!EVP_PKEY_get_raw_public_key(key, public_key, &publen))
        /* Error */;