Я использую 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).
Могу ли я заранее проверить, что у меня полный блок?
Заранее спасибо