OpenSSL: Попытка использовать материал ключа, полученный рукопожатием, для локального шифрования данных - PullRequest
0 голосов
/ 06 сентября 2011

Это код:

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.

Что я делаю не так?

1 Ответ

0 голосов
/ 07 ноября 2011

Проверьте, что возвращает SSL_write().Возможно, это SSL_ERROR_WANT_READ, в этом случае вы должны сначала прочитать ваше SSL-соединение и предоставить данные для чтения вашему SSL объекту.SSL_read() сделает это за вас, если вы позвоните до второго SSL_set_bio().

Но когда вы добьетесь успеха со своим SSL_write() - знайте, что в вашей памяти будут не только зашифрованные данныеBIO.Данные, связанные с протоколом, также будут там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...