OpenSSL 服务器 public 从缓冲区到 EVP_PKEY 的密钥
OpenSSL server public key from buffer to EVP_PKEY
我正在编写一个客户端,该客户端通过连接到 Google 服务器的 TCP 套接字发送消息来参与 TLS 1.2 握手。我正在使用 ECDH 密钥交换方法。
我正在尝试使用 this 代码导出共享密钥。
我通过 serverKeyExchange 消息接收到密钥并将其存储在缓冲区中,所以 我的问题是:如何从缓冲区生成 EVP_PKEY?
我在 this post 中找到了一个可能的解决方案并尝试了:
i2d_PublicKey(peerkey, (unsigned char **) &server_pub_key)
但是当我 运行 代码时,我在这一步出现错误:
/* Provide the peer public key */
if(1 != EVP_PKEY_derive_set_peer(ctx, peerkey)) handleErrors();
这让我觉得我没有成功检索服务器 Public 密钥。
有什么建议吗?我怎么知道密钥是否已成功编码?
如果您有原始 public 密钥,则必须使用正确的参数创建一个 EC_Key。
EVP_PKEY * get_peerkey(const unsigned char * buffer, size_t buffer_len)
{
EC_KEY *tempEcKey = NULL;
EVP_PKEY *peerkey = NULL;
// change this if another curve is required
tempEcKey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
if(tempEcKey == NULL) {
handleErrors();
}
if(EC_KEY_oct2key(tempEcKey, buffer, buffer_len, NULL) != 1) {
handleErrors();
}
if(EC_KEY_check_key(tempEcKey) != 1) {
handleErrors();
}
peerkey = EVP_PKEY_new();
if(peerkey == NULL) {
handleErrors();
}
if(EVP_PKEY_assign_EC_KEY(peerkey, tempEcKey)!= 1) {
handleErrors();
}
return peerkey;
}
如果您有 public 密钥作为 ASN.1 序列,您可以使用内部转换方法:
EVP_PKEY* get_peerkey(const unsigned char *buffer, size_t buffer_len)
{
EVP_PKEY *peerkey = NULL;
const unsigned char *helper = buffer;
// from "openssl/x509.h"
peerkey = d2i_PUBKEY(NULL, &helper, buffer_len);
if (!peerkey) {
handleErrors();
return NULL;
}
return peerkey;
}
我正在编写一个客户端,该客户端通过连接到 Google 服务器的 TCP 套接字发送消息来参与 TLS 1.2 握手。我正在使用 ECDH 密钥交换方法。
我正在尝试使用 this 代码导出共享密钥。
我通过 serverKeyExchange 消息接收到密钥并将其存储在缓冲区中,所以 我的问题是:如何从缓冲区生成 EVP_PKEY? 我在 this post 中找到了一个可能的解决方案并尝试了:
i2d_PublicKey(peerkey, (unsigned char **) &server_pub_key)
但是当我 运行 代码时,我在这一步出现错误:
/* Provide the peer public key */
if(1 != EVP_PKEY_derive_set_peer(ctx, peerkey)) handleErrors();
这让我觉得我没有成功检索服务器 Public 密钥。
有什么建议吗?我怎么知道密钥是否已成功编码?
如果您有原始 public 密钥,则必须使用正确的参数创建一个 EC_Key。
EVP_PKEY * get_peerkey(const unsigned char * buffer, size_t buffer_len)
{
EC_KEY *tempEcKey = NULL;
EVP_PKEY *peerkey = NULL;
// change this if another curve is required
tempEcKey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
if(tempEcKey == NULL) {
handleErrors();
}
if(EC_KEY_oct2key(tempEcKey, buffer, buffer_len, NULL) != 1) {
handleErrors();
}
if(EC_KEY_check_key(tempEcKey) != 1) {
handleErrors();
}
peerkey = EVP_PKEY_new();
if(peerkey == NULL) {
handleErrors();
}
if(EVP_PKEY_assign_EC_KEY(peerkey, tempEcKey)!= 1) {
handleErrors();
}
return peerkey;
}
如果您有 public 密钥作为 ASN.1 序列,您可以使用内部转换方法:
EVP_PKEY* get_peerkey(const unsigned char *buffer, size_t buffer_len)
{
EVP_PKEY *peerkey = NULL;
const unsigned char *helper = buffer;
// from "openssl/x509.h"
peerkey = d2i_PUBKEY(NULL, &helper, buffer_len);
if (!peerkey) {
handleErrors();
return NULL;
}
return peerkey;
}