9#ifndef BOTAN_FILTERS_H_
10#define BOTAN_FILTERS_H_
12#include <botan/secmem.h>
13#include <botan/data_snk.h>
14#include <botan/pipe.h>
15#include <botan/symkey.h>
16#include <botan/cipher_mode.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>
49 void write(
const uint8_t in[],
size_t length);
51 template<
typename Alloc>
52 void write(
const std::vector<uint8_t, Alloc>& in,
size_t length)
54 write(in.data(), length);
106 size_t m_main_block_mod, m_final_minimum;
143 return key_spec().valid_keylength(length);
157 {
return (length == 0); }
178 bool valid_iv_length(
size_t length)
const override;
180 std::string
name()
const override;
183 void write(
const uint8_t input[],
size_t input_length)
override;
184 void start_msg()
override;
185 void end_msg()
override;
187 void buffered_block(
const uint8_t input[],
size_t input_length)
override;
188 void buffered_final(
const uint8_t input[],
size_t input_length)
override;
190 std::unique_ptr<Cipher_Mode> m_mode;
191 std::vector<uint8_t> m_nonce;
254#if defined(BOTAN_HAS_STREAM_CIPHER)
263 std::string
name()
const override {
return m_cipher->name(); }
270 void write(
const uint8_t input[],
size_t input_len)
override;
272 bool valid_iv_length(
size_t iv_len)
const override
273 {
return m_cipher->valid_iv_length(iv_len); }
279 void set_iv(
const InitializationVector& iv)
override
281 m_cipher->set_iv(iv.begin(), iv.length());
288 void set_key(
const SymmetricKey& key)
override { m_cipher->set_key(key); }
290 Key_Length_Specification key_spec()
const override {
return m_cipher->key_spec(); }
296 explicit StreamCipher_Filter(StreamCipher* cipher);
303 StreamCipher_Filter(StreamCipher* cipher,
const SymmetricKey& key);
309 explicit StreamCipher_Filter(std::string_view cipher);
316 StreamCipher_Filter(std::string_view cipher,
const SymmetricKey& key);
318 std::unique_ptr<StreamCipher> m_cipher;
319 secure_vector<uint8_t> m_buffer;
323#if defined(BOTAN_HAS_HASH)
331 void write(
const uint8_t input[],
size_t len)
override { m_hash->update(input, len); }
332 void end_msg()
override;
334 std::string
name()
const override {
return m_hash->name(); }
344 Hash_Filter(HashFunction* hash,
size_t len = 0) :
345 m_hash(hash), m_out_len(len) {}
355 Hash_Filter(std::string_view request,
size_t len = 0);
358 std::unique_ptr<HashFunction> m_hash;
359 const size_t m_out_len;
363#if defined(BOTAN_HAS_MAC)
371 void write(
const uint8_t input[],
size_t len)
override { m_mac->update(input, len); }
372 void end_msg()
override;
374 std::string
name()
const override {
return m_mac->name(); }
380 void set_key(
const SymmetricKey& key)
override { m_mac->set_key(key); }
382 Key_Length_Specification key_spec()
const override {
return m_mac->key_spec(); }
392 MAC_Filter(MessageAuthenticationCode* mac,
393 size_t out_len = 0) :
408 MAC_Filter(MessageAuthenticationCode* mac,
409 const SymmetricKey& key,
410 size_t out_len = 0) :
425 MAC_Filter(std::string_view mac,
size_t len = 0);
436 MAC_Filter(std::string_view mac,
const SymmetricKey& key,
439 std::unique_ptr<MessageAuthenticationCode> m_mac;
440 const size_t m_out_len;
444#if defined(BOTAN_HAS_COMPRESSION)
446class Compression_Algorithm;
447class Decompression_Algorithm;
455 void start_msg()
override;
456 void write(
const uint8_t input[],
size_t input_length)
override;
457 void end_msg()
override;
461 std::string
name()
const override;
463 Compression_Filter(std::string_view type,
464 size_t compression_level,
465 size_t buffer_size = 4096);
467 ~Compression_Filter();
469 std::unique_ptr<Compression_Algorithm> m_comp;
470 size_t m_buffersize, m_level;
471 secure_vector<uint8_t> m_buffer;
480 void start_msg()
override;
481 void write(
const uint8_t input[],
size_t input_length)
override;
482 void end_msg()
override;
484 std::string
name()
const override;
486 Decompression_Filter(std::string_view type,
487 size_t buffer_size = 4096);
489 ~Decompression_Filter();
491 std::unique_ptr<Decompression_Algorithm> m_comp;
492 std::size_t m_buffersize;
493 secure_vector<uint8_t> m_buffer;
504 std::string
name()
const override {
return "Base64_Encoder"; }
511 void write(
const uint8_t input[],
size_t length)
override;
516 void end_msg()
override;
525 bool trailing_newline =
false);
527 void encode_and_send(
const uint8_t input[],
size_t length,
528 bool final_inputs =
false);
529 void do_output(
const uint8_t output[],
size_t length);
531 const size_t m_line_length;
532 const bool m_trailing_newline;
533 std::vector<uint8_t> m_in, m_out;
534 size_t m_position, m_out_position;
543 std::string
name()
const override {
return "Base64_Decoder"; }
550 void write(
const uint8_t input[],
size_t length)
override;
555 void end_msg()
override;
565 std::vector<uint8_t> m_in, m_out;
579 enum Case { Uppercase, Lowercase };
581 std::string
name()
const override {
return "Hex_Encoder"; }
583 void write(
const uint8_t in[],
size_t length)
override;
584 void end_msg()
override;
599 size_t line_length = 72,
600 Case the_case = Uppercase);
602 void encode_and_send(
const uint8_t[],
size_t);
605 const size_t m_line_length;
606 std::vector<uint8_t> m_in, m_out;
607 size_t m_position, m_counter;
616 std::string
name()
const override {
return "Hex_Decoder"; }
618 void write(
const uint8_t[],
size_t)
override;
619 void end_msg()
override;
629 std::vector<uint8_t> m_in, m_out;
639 void write(
const uint8_t[],
size_t)
override { }
641 std::string
name()
const override {
return "BitBucket"; }
653 void write(
const uint8_t input[],
size_t length)
override { send(input, length); }
655 std::string
name()
const override {
return "Chain"; }
680 void write(
const uint8_t input[],
size_t length)
override { send(input, length); }
681 void set_port(
size_t n) { Fanout_Filter::set_port(n); }
683 std::string
name()
const override {
return "Fork"; }
698#if defined(BOTAN_HAS_THREAD_UTILS)
708 std::string
name()
const override;
713 Threaded_Fork(Filter*, Filter*, Filter* =
nullptr, Filter* =
nullptr);
720 Threaded_Fork(Filter* filter_arr[],
size_t length);
725 void set_next(Filter* f[],
size_t n);
726 void send(
const uint8_t in[],
size_t length)
override;
727 void thread_delegate_work(
const uint8_t input[],
size_t length);
728 void thread_entry(Filter* filter);
730 std::vector<std::shared_ptr<std::thread>> m_threads;
731 std::unique_ptr<struct Threaded_Fork_Data> m_thread_data;
std::string name() const override
std::string name() const override
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
virtual void buffered_final(const uint8_t input[], size_t length)=0
size_t buffered_block_size() const
void write(const uint8_t input[], size_t length) override
std::string name() const override
Cipher_Mode_Filter(std::unique_ptr< Cipher_Mode > t)
static std::unique_ptr< Cipher_Mode > create_or_throw(std::string_view algo, Cipher_Dir direction, std::string_view provider="")
std::string name() const override
void write(const uint8_t input[], size_t length) override
std::string name() const override
std::string name() const override
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
int(* final)(unsigned char *, CTX *)
#define BOTAN_PUBLIC_API(maj, min)
std::vector< T, secure_allocator< T > > secure_vector
Keyed_Filter * get_cipher(std::string_view algo_spec, Cipher_Dir direction)