gpt4 book ai didi

c++ - OpenSSL:尝试使用通过握手获得的 key Material 在本地加密数据

转载 作者:太空宇宙 更新时间:2023-11-03 15:06:30 27 4
gpt4 key购买 nike

这是代码:

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 = %d\n",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: %s\n", 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() 成功时 - 请注意,它不仅仅是您的 mem BIO 中的加密数据。与协议(protocol)相关的数据也将在那里。

关于c++ - OpenSSL:尝试使用通过握手获得的 key Material 在本地加密数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7322729/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com