如何使用 OpenSSL 函数为 TLS 密钥交换计算 public 密钥?
How to calculate public key for TLS key exchange using OpenSSL functions?
我正在学习 TLS 1.3 方案并尝试在 C++ 中实现基本的握手步骤,而不使用来自 OpenSSL 的现成包装器,例如 SSL_accept
或 SSL_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 */;
我正在学习 TLS 1.3 方案并尝试在 C++ 中实现基本的握手步骤,而不使用来自 OpenSSL 的现成包装器,例如 SSL_accept
或 SSL_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 */;