если я вызываю MessageEnd(), я получаю следующее исключение: BufferedTransformation: this object doesn't allow input
...
Правильный. FileSource
является источником, и сообщение должно существовать. Вы не можете вызвать Put
или Put2
для источника, чтобы добавить дополнительные данные в сообщение.
Я думаю, у вас есть два варианта, чтобы лучше контролировать сигналы.
Первый
Позвоните Flush
по телефону Source
.
const int opts = AuthenticatedDecryptionFilter::THROW_EXCEPTION |
AuthenticatedDecryptionFilter::MAC_AT_END;
FileSource fe(fileUrl.c_str(), false,
new AuthenticatedDecryptionFilter(decryptor, new FileSink(
std::string(fileUrl).c_str()), opts));
fe.Flush(true);
Также см. комментарии для Flush
по адресу Filter::Flush в руководстве.
Второй
Спрячьте указатель на фильтр и вызовите для него MessageEnd
.
const int opts = AuthenticatedDecryptionFilter::THROW_EXCEPTION |
AuthenticatedDecryptionFilter::MAC_AT_END;
AuthenticatedDecryptionFilter* adf = NULL;
FileSource fe(fileUrl.c_str(), false,
adf = new AuthenticatedDecryptionFilter(decryptor, new FileSink(
std::string(fileUrl).c_str()), opts));
adf.MessageEnd();
Это довольно необычно, поэтому я не уверен, с какими побочными эффектами вы столкнетесь.
Не удаляйте указатель. FileSource
удалит его, когда он выйдет за пределы области действия закрывающей скобки.
... мой расшифрованный файл короче на 16 байт...
На мой взгляд, это проблема, которую вы должны решить, если вызов Flush
на Source
не работает для вас.
Также имейте в виду... Результатом AuthenticatedEncryptionFilter
является 2-кортеж {ciphertext,mac}
, поэтому вы получаете зашифрованный текст расширение 16-байт из-за MAC. Позже, когда вы используете AuthenticatedDecryptionFilter
, mac удаляется после его проверки. Таким образом, восстановленный текст должен быть того же размера, что и обычный текст, оба из которых должны быть на 16 байт меньше, чем зашифрованный текст.
Что мне не ясно, так это то, что все работает так, как ожидалось, но вы не понимаете, как это должно работать. Или вы действительно где-то теряете 16 байт восстановленного текста.
person
jww
schedule
02.03.2016