OpenSSL:尝试使用通过握手获得的密钥材料来本地加密数据
OpenSSL: Trying to use keying material obtain by handshake to locally encrypt data
这是代码:
bool EncoderTLS::handshake()
{
int sock = getSocket();
SSL *ssl = SSL_new(ctx);
BIO *sbio = BIO_new_socket(sock, BIO_NOCLOSE);
SSL_set_bio(ssl, sbio, sbio);
int r;
int i = 0;
while(i < ATTEMPTS)
{
int s;
if((r = ((isServer) ? SSL_accept(ssl) :SSL_connect(ssl)) )<=0)
{
s = SSL_get_error(ssl,r);
if (SSL_get_error(ssl,r) == SSL_ERROR_SYSCALL)
{
if (errno == 0) break;
printf("errno = %dn",errno);
perror("Syscall error");
}
}
if (s == SSL_ERROR_WANT_READ || s == SSL_ERROR_WANT_WRITE) usleep(10);
else
{
logger->log(Level::WARNING, "SSL handshake failed");
return false;
}
i++;
}
if (!isServer && SSL_get_verify_result(ssl) != X509_V_OK) //Server authentication
{
logger->log(Level::WARNING, "couldn't verify certificate");
printf("Error: %sn", ERR_reason_error_string(ERR_get_error()));
return false;
}
BIO *test = BIO_new(BIO_s_mem());
SSL_set_bio(ssl, test, test);
SSL_write(ssl, "blablablablabla", 10);
char **p;
int length = BIO_get_mem_data(test,p);
printf("Printing encoding of 'blablablab', of length %d:n", length);
for(int j=0; j<length; j++)
printf("%c", p[j]);
printf("n");
return true;
}
我希望SSL_write在最后写入的数据将进入BIO,并进入内存。然而,当我试图从BIO中获取数据时,它告诉我它的长度是0。
我做错了什么?
检查SSL_write()
返回的内容。也许是SSL_ERROR_WANT_READ
,在这种情况下,您必须首先从SSL连接中读取数据,并将读取的数据提供给SSL
对象。如果您在第二个SSL_set_bio()
之前调用SSL_read()
,它将为您完成此操作。
但是,当您成功使用SSL_write()
时,请注意它不会仅加密您的内存BIO中的数据。协议相关的数据也会在那里。
相关文章:
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- 允许从 std::map 的密钥窃取资源?
- TMap::Emplace() 在应用现有密钥时会覆盖吗?
- 在没有密钥的情况下读取密文的剩余噪声预算
- 如何修复无效的API密钥,IP或操作权限错误?
- 所有可能的链接生成器与64位密钥
- 如何在unordered_map中更改密钥?
- 获取当前密钥状态?
- curl_easy_perform() 失败:SSL 对等证书或 SSH 远程密钥不正常
- 将密钥发送到非前台的游戏窗口
- 有哪些方法可以对基于 256 位密钥的矩阵进行加扰?
- 如何在精灵表上的两个不同部分之间来回切换,同时用户仍使用 SFML 持有密钥
- 如何将CNG密钥转换为OpenSSL EVP_PKEY(反之亦然)?
- 运行密钥密码解密知道密钥?
- std::unordered_map 运算符 [] 是否对非现有密钥进行零初始化?
- 封装 std::map 以允许迭代,但没有直接密钥访问?
- 如果我使用同一个密钥推送用户数据两次,会发生什么
- 如何在C++中创建自己的编译密钥
- 重载std::映射不同的密钥类型
- OpenSSL:尝试使用通过握手获得的密钥材料来本地加密数据