9#ifndef BOTAN_FILTERS_H_
10#define BOTAN_FILTERS_H_
12#include <botan/cipher_mode.h>
13#include <botan/data_snk.h>
14#include <botan/pipe.h>
15#include <botan/secmem.h>
16#include <botan/symkey.h>
18#if defined(BOTAN_TARGET_OS_HAS_THREADS)
22#if defined(BOTAN_HAS_STREAM_CIPHER)
23 #include <botan/stream_cipher.h>
26#if defined(BOTAN_HAS_HASH)
27 #include <botan/hash.h>
30#if defined(BOTAN_HAS_MAC)
31 #include <botan/mac.h>
48 void write(
const uint8_t in[],
size_t length);
56 template <
typename Alloc>
57 void write(
const std::vector<uint8_t, Alloc>& in,
size_t length) {
58 write(in.data(), length);
114 size_t m_main_block_mod, m_final_minimum;
204 bool valid_iv_length(
size_t length)
const override;
210 std::string name()
const override;
213 void write(
const uint8_t input[],
size_t input_length)
override;
214 void start_msg()
override;
215 void end_msg()
override;
217 void buffered_block(
const uint8_t input[],
size_t input_length)
override;
218 void buffered_final(
const uint8_t input[],
size_t input_length)
override;
220 std::unique_ptr<Cipher_Mode> m_mode;
221 std::vector<uint8_t> m_nonce;
280#if defined(BOTAN_HAS_STREAM_CIPHER)
285class BOTAN_PUBLIC_API(2, 0) StreamCipher_Filter final :
public Keyed_Filter {
291 std::string name()
const override {
return m_cipher->name(); }
298 void write(
const uint8_t input[],
size_t input_len)
override;
305 bool valid_iv_length(
size_t iv_len)
const override {
return m_cipher->valid_iv_length(iv_len); }
311 void set_iv(
const InitializationVector& iv)
override { m_cipher->set_iv(iv.begin(), iv.length()); }
317 void set_key(
const SymmetricKey& key)
override { m_cipher->set_key(key); }
323 Key_Length_Specification key_spec()
const override {
return m_cipher->key_spec(); }
329 explicit StreamCipher_Filter(StreamCipher* cipher);
336 StreamCipher_Filter(StreamCipher* cipher,
const SymmetricKey& key);
342 explicit StreamCipher_Filter(std::string_view cipher);
349 StreamCipher_Filter(std::string_view cipher,
const SymmetricKey& key);
352 std::unique_ptr<StreamCipher> m_cipher;
353 secure_vector<uint8_t> m_buffer;
357#if defined(BOTAN_HAS_HASH)
369 void write(
const uint8_t input[],
size_t len)
override { m_hash->update(input, len); }
374 void end_msg()
override;
380 std::string name()
const override {
return m_hash->name(); }
390 BOTAN_FUTURE_EXPLICIT Hash_Filter(HashFunction* hash,
size_t len = 0) : m_hash(hash), m_out_len(len) {}
403 std::unique_ptr<HashFunction> m_hash;
404 const size_t m_out_len;
408#if defined(BOTAN_HAS_MAC)
420 void write(
const uint8_t input[],
size_t len)
override { m_mac->update(input, len); }
425 void end_msg()
override;
431 std::string name()
const override {
return m_mac->name(); }
437 void set_key(
const SymmetricKey& key)
override { m_mac->set_key(key); }
443 Key_Length_Specification key_spec()
const override {
return m_mac->key_spec(); }
454 m_mac(mac), m_out_len(out_len) {}
465 MAC_Filter(MessageAuthenticationCode* mac,
const SymmetricKey& key,
size_t out_len = 0) :
466 m_mac(mac), m_out_len(out_len) {
489 MAC_Filter(std::string_view mac,
const SymmetricKey& key,
size_t len = 0);
492 std::unique_ptr<MessageAuthenticationCode> m_mac;
493 const size_t m_out_len;
497#if defined(BOTAN_HAS_COMPRESSION)
510 void start_msg()
override;
516 void write(
const uint8_t input[],
size_t input_length)
override;
520 void end_msg()
override;
531 std::string name()
const override;
539 Compression_Filter(std::string_view type,
size_t compression_level,
size_t buffer_size = 4096);
541 ~Compression_Filter()
override;
543 Compression_Filter(
const Compression_Filter& other) =
delete;
544 Compression_Filter(Compression_Filter&& other) =
delete;
545 Compression_Filter& operator=(
const Compression_Filter& other) =
delete;
546 Compression_Filter& operator=(Compression_Filter&& other) =
delete;
549 std::unique_ptr<Compression_Algorithm> m_comp;
550 size_t m_buffersize, m_level;
551 secure_vector<uint8_t> m_buffer;
562 void start_msg()
override;
568 void write(
const uint8_t input[],
size_t input_length)
override;
572 void end_msg()
override;
578 std::string name()
const override;
587 ~Decompression_Filter()
override;
589 Decompression_Filter(
const Decompression_Filter& other) =
delete;
590 Decompression_Filter(Decompression_Filter&& other) =
delete;
591 Decompression_Filter& operator=(
const Decompression_Filter& other) =
delete;
592 Decompression_Filter& operator=(Decompression_Filter&& other) =
delete;
595 std::unique_ptr<Decompression_Algorithm> m_comp;
596 std::size_t m_buffersize;
597 secure_vector<uint8_t> m_buffer;
611 std::string
name()
const override {
return "Base64_Encoder"; }
618 void write(
const uint8_t input[],
size_t length)
override;
623 void end_msg()
override;
632 size_t line_length = 72,
633 bool trailing_newline =
false);
636 void encode_and_send(
const uint8_t input[],
size_t length,
bool final_inputs =
false);
637 void do_output(
const uint8_t output[],
size_t length);
639 const size_t m_line_length;
640 const bool m_trailing_newline;
641 std::vector<uint8_t> m_in, m_out;
642 size_t m_position = 0;
643 size_t m_out_position = 0;
655 std::string
name()
const override {
return "Base64_Decoder"; }
662 void write(
const uint8_t input[],
size_t length)
override;
667 void end_msg()
override;
678 std::vector<uint8_t> m_in;
679 std::vector<uint8_t> m_out;
680 size_t m_position = 0;
698 std::string
name()
const override {
return "Hex_Encoder"; }
705 void write(
const uint8_t in[],
size_t length)
override;
709 void end_msg()
override;
726 void encode_and_send(
const uint8_t input[],
size_t length);
729 const size_t m_line_length;
730 std::vector<uint8_t> m_in;
731 std::vector<uint8_t> m_out;
732 size_t m_position = 0;
733 size_t m_counter = 0;
745 std::string
name()
const override {
return "Hex_Decoder"; }
752 void write(
const uint8_t input[],
size_t length)
override;
756 void end_msg()
override;
767 std::vector<uint8_t> m_in, m_out;
768 size_t m_position = 0;
779 void write(
const uint8_t [],
size_t )
override {
786 std::string
name()
const override {
return "BitBucket"; }
802 void write(
const uint8_t input[],
size_t length)
override {
send(input, length); }
808 std::string
name()
const override {
return "Chain"; }
839 void write(
const uint8_t input[],
size_t length)
override {
send(input, length); }
852 std::string
name()
const override {
return "Fork"; }
867#if defined(BOTAN_HAS_THREAD_UTILS)
886 std::string name()
const override;
892 Threaded_Fork(Filter* f1, Filter* f2, Filter* f3 =
nullptr, Filter* f4 =
nullptr);
899 BOTAN_DEPRECATED(
"Deprecated, use plain Fork") Threaded_Fork(Filter* filter_arr[],
size_t length);
901 ~Threaded_Fork() override;
903 Threaded_Fork(const Threaded_Fork& other) = delete;
904 Threaded_Fork(Threaded_Fork&& other) = delete;
905 Threaded_Fork& operator=(const Threaded_Fork& other) = delete;
906 Threaded_Fork& operator=(Threaded_Fork&& other) = delete;
909 void set_next(Filter* f[],
size_t n);
910 void send(const uint8_t in[],
size_t length) override;
911 void thread_delegate_work(const uint8_t input[],
size_t length);
912 void thread_entry(Filter* filter);
914 std::vector<std::shared_ptr<std::thread>> m_threads;
915 std::unique_ptr<struct Threaded_Fork_Data> m_thread_data;
#define BOTAN_PUBLIC_API(maj, min)
#define BOTAN_DEPRECATED(msg)
#define BOTAN_FUTURE_EXPLICIT
Base64_Decoder(Decoder_Checking checking=NONE)
std::string name() const override
std::string name() const override
BOTAN_FUTURE_EXPLICIT Base64_Encoder(bool line_breaks=false, size_t line_length=72, bool trailing_newline=false)
std::string name() const override
void write(const uint8_t[], size_t) override
virtual ~Buffered_Filter()=default
void write(const std::vector< uint8_t, Alloc > &in, size_t length)
size_t current_position() const
virtual void buffered_block(const uint8_t input[], size_t length)=0
Buffered_Filter(size_t block_size, size_t final_minimum)
virtual void buffered_final(const uint8_t input[], size_t length)=0
size_t buffered_block_size() const
void write(const uint8_t in[], size_t length)
void write(const uint8_t input[], size_t length) override
BOTAN_FUTURE_EXPLICIT Chain(Filter *f1=nullptr, Filter *f2=nullptr, Filter *f3=nullptr, Filter *f4=nullptr)
std::string name() const override
Cipher_Mode_Filter(std::unique_ptr< Cipher_Mode > t)
Cipher_Mode_Filter(Cipher_Mode *t)
static std::unique_ptr< Cipher_Mode > create_or_throw(std::string_view algo, Cipher_Dir direction, std::string_view provider="")
Filter(const Filter &)=delete
virtual void send(const uint8_t in[], size_t length)
virtual std::string name() const =0
std::string name() const override
void write(const uint8_t input[], size_t length) override
Fork(Filter *f1, Filter *f2, Filter *f3=nullptr, Filter *f4=nullptr)
Hex_Decoder(Decoder_Checking checking=NONE)
std::string name() const override
std::string name() const override
Hex_Encoder(Case the_case)
virtual void set_key(const SymmetricKey &key)=0
bool valid_keylength(size_t length) const
virtual void set_iv(const InitializationVector &iv)
virtual bool valid_iv_length(size_t length) const
virtual Key_Length_Specification key_spec() const =0
OctetString InitializationVector
std::vector< T, secure_allocator< T > > secure_vector
Keyed_Filter * get_cipher(std::string_view algo_spec, Cipher_Dir direction)