Память OpenSSL BIO и блоки частичного шифрования - PullRequest
0 голосов
/ 02 октября 2011

Я использую OpenSSL в архитектуре, которая требует, чтобы я выполнял шифрование и дешифрование локально.

Функция дешифрования получает буфер, который был зашифрован на другой стороне соединения. Процесс шифрования / дешифрования обычно работает нормально, но для случая, когда буфер содержит блок частичного шифрования.

Полагаю, моя проблема сводится к следующему: Пусть s будет объектом SSL, а buf будет буфером памяти или зашифрованными данными. То, что я делаю для его расшифровки (минус обработка ошибок, безопасность потоков, безопасность памяти и т. Д.), Соответствует принципу

int decDataBufSize = 1000000; //approximation of length of decrypted data
int8_t* decData = (int8_t*)malloc(decDataBufSize*sizeof(int8_t)); //room for the decrypted data to be written into
BIO* bio = BIO_new_mem_buf(encData, decDataBufSize); //set up BIO pointing to the encrypted data
int decDataLength;
BIO_set_close(bio, BIO_NOCLOSE); //This means OpenSSL doesn't try to free the encrypted data buffer
int totalDecData = 0;
for(int remaining_length = buffie->getBuffer()->limit() ; remaining_length > 0 ; )
{
    SSL_set_bio(ssl, bio, bio);
    remaining_length -= BIO_pending(bio);
    int decDataLength = SSL_read(ssl, decData + totalDecData, decDataBufSize - totalDecData);
    totalDecData += decDataLength;
    remaining_length += BIO_pending(bio);
}
return decData;

Это, кажется, работает нормально, но для случая, когда у меня есть часть блока в буфере. Я знаю, что если бы я работал с сокетом вместо памяти BIO, я бы получил SSL_ERROR_WANT_READ, но в моем случае я получаю самый лаконичный SSL_ERROR_SSL (сбой расшифровки или плохая запись mac).

Могу ли я заранее проверить, что у меня полный блок?

Заранее спасибо

1 Ответ

1 голос
/ 03 октября 2011

Очевидно, что решение заключается в BIO_get_mem_data.

Что-то вроде: #define DEC_BUF_SIZE 1000000 static int buffer_length;static int8_t *partal_block;

int8_t* decrypt(int8_t* ecnData) { 
    int decDataBufSize = 1000000; //approximation of length of decrypted data
    int8_t* decData = (int8_t*)malloc(decDataBufSize*sizeof(int8_t)); //room for the decrypted data to be written into
    if (buffer_length == 0) /*prepend the contents of partial_block to encData somehow*/;
    BIO* bio = BIO_new_mem_buf(encData, decDataBufSize); //set up BIO pointing to the encrypted data
    int decDataLength;
    BIO_set_close(bio, BIO_NOCLOSE); //This means OpenSSL doesn't try to free the encrypted data buffer
    int totalDecData = 0;
    for(int remaining_length = buffie->getBuffer()->limit() ; remaining_length > 0 ; ) {
        buffer_length = BIO_get_mem_data(bio,&partial_block);
        SSL_set_bio(ssl, bio, bio);
        remaining_length -= BIO_pending(bio);
        int decDataLength = SSL_read(ssl, decData + totalDecData, decDataBufSize - totalDecData);
        totalDecData += decDataLength;
        remaining_length += BIO_pending(bio);
    }
return decData;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...