8#include <botan/filters.h>
10#include <botan/assert.h>
15#if defined(BOTAN_HAS_STREAM_CIPHER)
17StreamCipher_Filter::StreamCipher_Filter(
StreamCipher* cipher) :
18 m_cipher(cipher), m_buffer(cipher != nullptr ? cipher->buffer_size() : 0) {
19 BOTAN_ARG_CHECK(m_cipher !=
nullptr,
"StreamCipher_Filter cipher argument must not be null");
22StreamCipher_Filter::StreamCipher_Filter(StreamCipher* cipher,
const SymmetricKey& key) : StreamCipher_Filter(cipher) {
23 m_cipher->set_key(key);
26StreamCipher_Filter::StreamCipher_Filter(std::string_view sc_name) :
27 m_cipher(StreamCipher::create_or_throw(sc_name)), m_buffer(m_cipher->buffer_size()) {}
29StreamCipher_Filter::StreamCipher_Filter(std::string_view sc_name,
const SymmetricKey& key) :
30 StreamCipher_Filter(sc_name) {
31 m_cipher->set_key(key);
34void StreamCipher_Filter::write(
const uint8_t input[],
size_t length) {
36 const size_t copied = std::min<size_t>(length, m_buffer.size());
37 m_cipher->cipher(input, m_buffer.data(), copied);
38 send(m_buffer, copied);
46#if defined(BOTAN_HAS_HASH)
48Hash_Filter::Hash_Filter(std::string_view hash_name,
size_t len) :
49 m_hash(HashFunction::create_or_throw(hash_name)), m_out_len(len) {}
51void Hash_Filter::end_msg() {
52 secure_vector<uint8_t> output = m_hash->final();
54 send(output, std::min<size_t>(m_out_len, output.size()));
61#if defined(BOTAN_HAS_MAC)
63MAC_Filter::MAC_Filter(std::string_view mac_name,
size_t len) :
64 m_mac(MessageAuthenticationCode::create_or_throw(mac_name)), m_out_len(len) {}
66MAC_Filter::MAC_Filter(std::string_view mac_name,
const SymmetricKey& key,
size_t len) : MAC_Filter(mac_name, len) {
70void MAC_Filter::end_msg() {
71 secure_vector<uint8_t> output = m_mac->final();
73 send(output, std::min<size_t>(m_out_len, output.size()));
#define BOTAN_ARG_CHECK(expr, msg)