diff options
Diffstat (limited to 'src/lib/stream')
-rw-r--r-- | src/lib/stream/chacha/chacha.cpp | 15 | ||||
-rw-r--r-- | src/lib/stream/chacha/chacha.h | 11 | ||||
-rw-r--r-- | src/lib/stream/ctr/ctr.cpp | 22 | ||||
-rw-r--r-- | src/lib/stream/ctr/ctr.h | 13 | ||||
-rw-r--r-- | src/lib/stream/ofb/ofb.cpp | 20 | ||||
-rw-r--r-- | src/lib/stream/ofb/ofb.h | 13 | ||||
-rw-r--r-- | src/lib/stream/rc4/rc4.cpp | 10 | ||||
-rw-r--r-- | src/lib/stream/rc4/rc4.h | 7 | ||||
-rw-r--r-- | src/lib/stream/salsa20/salsa20.cpp | 23 | ||||
-rw-r--r-- | src/lib/stream/salsa20/salsa20.h | 12 | ||||
-rw-r--r-- | src/lib/stream/shake_cipher/shake_cipher.cpp | 20 | ||||
-rw-r--r-- | src/lib/stream/shake_cipher/shake_cipher.h | 13 |
12 files changed, 127 insertions, 52 deletions
diff --git a/src/lib/stream/chacha/chacha.cpp b/src/lib/stream/chacha/chacha.cpp index fac9a5a36..d2d31a12e 100644 --- a/src/lib/stream/chacha/chacha.cpp +++ b/src/lib/stream/chacha/chacha.cpp @@ -233,6 +233,21 @@ void ChaCha::key_schedule(const uint8_t key[], size_t length) set_iv(nullptr, 0); } +size_t ChaCha::default_iv_length() const + { + return 24; + } + +Key_Length_Specification ChaCha::key_spec() const + { + return Key_Length_Specification(16, 32, 16); + } + +StreamCipher* ChaCha::clone() const + { + return new ChaCha(m_rounds); + } + bool ChaCha::valid_iv_length(size_t iv_len) const { return (iv_len == 0 || iv_len == 8 || iv_len == 12 || iv_len == 24); diff --git a/src/lib/stream/chacha/chacha.h b/src/lib/stream/chacha/chacha.h index d0e131315..e41fd927f 100644 --- a/src/lib/stream/chacha/chacha.h +++ b/src/lib/stream/chacha/chacha.h @@ -18,8 +18,6 @@ namespace Botan { class BOTAN_PUBLIC_API(2,0) ChaCha final : public StreamCipher { public: - StreamCipher* clone() const override { return new ChaCha(m_rounds); } - /** * @param rounds number of rounds * @note Currently only 8, 12 or 20 rounds are supported, all others @@ -41,15 +39,14 @@ class BOTAN_PUBLIC_API(2,0) ChaCha final : public StreamCipher */ bool valid_iv_length(size_t iv_len) const override; - size_t default_iv_length() const override { return 24; } + size_t default_iv_length() const override; - Key_Length_Specification key_spec() const override - { - return Key_Length_Specification(16, 32, 16); - } + Key_Length_Specification key_spec() const override; void clear() override; + StreamCipher* clone() const override; + std::string name() const override; void seek(uint64_t offset) override; diff --git a/src/lib/stream/ctr/ctr.cpp b/src/lib/stream/ctr/ctr.cpp index 261646344..6a7d81729 100644 --- a/src/lib/stream/ctr/ctr.cpp +++ b/src/lib/stream/ctr/ctr.cpp @@ -44,6 +44,26 @@ void CTR_BE::clear() m_pad_pos = 0; } +size_t CTR_BE::default_iv_length() const + { + return m_block_size; + } + +bool CTR_BE::valid_iv_length(size_t iv_len) const + { + return (iv_len <= m_block_size); + } + +Key_Length_Specification CTR_BE::key_spec() const + { + return m_cipher->key_spec(); + } + +CTR_BE* CTR_BE::clone() const + { + return new CTR_BE(m_cipher->clone(), m_ctr_size); + } + void CTR_BE::key_schedule(const uint8_t key[], size_t key_len) { m_cipher->set_key(key, key_len); @@ -106,7 +126,7 @@ void CTR_BE::set_iv(const uint8_t iv[], size_t iv_len) if(!valid_iv_length(iv_len)) throw Invalid_IV_Length(name(), iv_len); - m_iv.resize(m_cipher->block_size()); + m_iv.resize(m_block_size); zeroise(m_iv); buffer_insert(m_iv, 0, iv, iv_len); diff --git a/src/lib/stream/ctr/ctr.h b/src/lib/stream/ctr/ctr.h index 3e0208363..79911b2fe 100644 --- a/src/lib/stream/ctr/ctr.h +++ b/src/lib/stream/ctr/ctr.h @@ -23,20 +23,15 @@ class BOTAN_PUBLIC_API(2,0) CTR_BE final : public StreamCipher void set_iv(const uint8_t iv[], size_t iv_len) override; - size_t default_iv_length() const override { return m_cipher->block_size(); } + size_t default_iv_length() const override; - bool valid_iv_length(size_t iv_len) const override - { return (iv_len <= m_cipher->block_size()); } + bool valid_iv_length(size_t iv_len) const override; - Key_Length_Specification key_spec() const override - { - return m_cipher->key_spec(); - } + Key_Length_Specification key_spec() const override; std::string name() const override; - CTR_BE* clone() const override - { return new CTR_BE(m_cipher->clone(), m_ctr_size); } + CTR_BE* clone() const override; void clear() override; diff --git a/src/lib/stream/ofb/ofb.cpp b/src/lib/stream/ofb/ofb.cpp index ca3971dc2..dde468117 100644 --- a/src/lib/stream/ofb/ofb.cpp +++ b/src/lib/stream/ofb/ofb.cpp @@ -37,6 +37,26 @@ std::string OFB::name() const return "OFB(" + m_cipher->name() + ")"; } +size_t OFB::default_iv_length() const + { + return m_cipher->block_size(); + } + +bool OFB::valid_iv_length(size_t iv_len) const + { + return (iv_len <= m_cipher->block_size()); + } + +Key_Length_Specification OFB::key_spec() const + { + return m_cipher->key_spec(); + } + +OFB* OFB::clone() const + { + return new OFB(m_cipher->clone()); + } + void OFB::cipher(const uint8_t in[], uint8_t out[], size_t length) { while(length >= m_buffer.size() - m_buf_pos) diff --git a/src/lib/stream/ofb/ofb.h b/src/lib/stream/ofb/ofb.h index afba43753..1e9866c64 100644 --- a/src/lib/stream/ofb/ofb.h +++ b/src/lib/stream/ofb/ofb.h @@ -23,20 +23,15 @@ class BOTAN_PUBLIC_API(2,0) OFB final : public StreamCipher void set_iv(const uint8_t iv[], size_t iv_len) override; - size_t default_iv_length() const override { return m_cipher->block_size(); } + size_t default_iv_length() const override; - bool valid_iv_length(size_t iv_len) const override - { return (iv_len <= m_cipher->block_size()); } + bool valid_iv_length(size_t iv_len) const override; - Key_Length_Specification key_spec() const override - { - return m_cipher->key_spec(); - } + Key_Length_Specification key_spec() const override; std::string name() const override; - OFB* clone() const override - { return new OFB(m_cipher->clone()); } + OFB* clone() const override; void clear() override; diff --git a/src/lib/stream/rc4/rc4.cpp b/src/lib/stream/rc4/rc4.cpp index 9f0a44d6e..e427c0288 100644 --- a/src/lib/stream/rc4/rc4.cpp +++ b/src/lib/stream/rc4/rc4.cpp @@ -29,6 +29,16 @@ void RC4::cipher(const uint8_t in[], uint8_t out[], size_t length) m_position += length; } +StreamCipher* RC4::clone() const + { + return new RC4(m_SKIP); + } + +Key_Length_Specification RC4::key_spec() const + { + return Key_Length_Specification(1, 256); + } + void RC4::set_iv(const uint8_t*, size_t length) { if(length > 0) diff --git a/src/lib/stream/rc4/rc4.h b/src/lib/stream/rc4/rc4.h index 796e8d9f9..d59ce01f0 100644 --- a/src/lib/stream/rc4/rc4.h +++ b/src/lib/stream/rc4/rc4.h @@ -26,12 +26,9 @@ class BOTAN_PUBLIC_API(2,0) RC4 final : public StreamCipher void clear() override; std::string name() const override; - StreamCipher* clone() const override { return new RC4(m_SKIP); } + StreamCipher* clone() const override; - Key_Length_Specification key_spec() const override - { - return Key_Length_Specification(1, 256); - } + Key_Length_Specification key_spec() const override; /** * @param skip skip this many initial bytes in the keystream diff --git a/src/lib/stream/salsa20/salsa20.cpp b/src/lib/stream/salsa20/salsa20.cpp index ff24995ee..cc1d80568 100644 --- a/src/lib/stream/salsa20/salsa20.cpp +++ b/src/lib/stream/salsa20/salsa20.cpp @@ -243,9 +243,26 @@ void Salsa20::set_iv(const uint8_t iv[], size_t length) m_position = 0; } -/* -* Return the name of this type -*/ +bool Salsa20::valid_iv_length(size_t iv_len) const + { + return (iv_len == 0 || iv_len == 8 || iv_len == 24); + } + +size_t Salsa20::default_iv_length() const + { + return 24; + } + +Key_Length_Specification Salsa20::key_spec() const + { + return Key_Length_Specification(16, 32, 16); + } + +StreamCipher* Salsa20::clone() const + { + return new Salsa20; + } + std::string Salsa20::name() const { return "Salsa20"; diff --git a/src/lib/stream/salsa20/salsa20.h b/src/lib/stream/salsa20/salsa20.h index ea193273c..60143f8e0 100644 --- a/src/lib/stream/salsa20/salsa20.h +++ b/src/lib/stream/salsa20/salsa20.h @@ -22,19 +22,15 @@ class BOTAN_PUBLIC_API(2,0) Salsa20 final : public StreamCipher void set_iv(const uint8_t iv[], size_t iv_len) override; - bool valid_iv_length(size_t iv_len) const override - { return (iv_len == 0 || iv_len == 8 || iv_len == 24); } + bool valid_iv_length(size_t iv_len) const override; - size_t default_iv_length() const override { return 24; } + size_t default_iv_length() const override; - Key_Length_Specification key_spec() const override - { - return Key_Length_Specification(16, 32, 16); - } + Key_Length_Specification key_spec() const override; void clear() override; std::string name() const override; - StreamCipher* clone() const override { return new Salsa20; } + StreamCipher* clone() const override; static void salsa_core(uint8_t output[64], const uint32_t input[16], size_t rounds); diff --git a/src/lib/stream/shake_cipher/shake_cipher.cpp b/src/lib/stream/shake_cipher/shake_cipher.cpp index f6cac8354..b0e08a700 100644 --- a/src/lib/stream/shake_cipher/shake_cipher.cpp +++ b/src/lib/stream/shake_cipher/shake_cipher.cpp @@ -75,4 +75,24 @@ void SHAKE_128_Cipher::seek(uint64_t) { throw Not_Implemented("SHAKE_128_Cipher::seek"); } + +Key_Length_Specification SHAKE_128_Cipher::key_spec() const + { + /* + In principle SHAKE can accept arbitrary length inputs, but this + does not seem required for a stream cipher. + */ + return Key_Length_Specification(16, 160, 8); + } + +std::string SHAKE_128_Cipher::name() const + { + return "SHAKE-128"; + } + +StreamCipher* SHAKE_128_Cipher::clone() const + { + return new SHAKE_128_Cipher; + } + } diff --git a/src/lib/stream/shake_cipher/shake_cipher.h b/src/lib/stream/shake_cipher/shake_cipher.h index 344ac965b..492341a7c 100644 --- a/src/lib/stream/shake_cipher/shake_cipher.h +++ b/src/lib/stream/shake_cipher/shake_cipher.h @@ -36,18 +36,11 @@ class BOTAN_PUBLIC_API(2,0) SHAKE_128_Cipher final : public StreamCipher */ void set_iv(const uint8_t iv[], size_t iv_len) override; - /** - * In principle SHAKE can accept arbitrary length inputs, but this - * does not seem required for a stream cipher. - */ - Key_Length_Specification key_spec() const override - { - return Key_Length_Specification(16, 160, 8); - } + Key_Length_Specification key_spec() const override; void clear() override; - std::string name() const override { return "SHAKE-128"; } - StreamCipher* clone() const override { return new SHAKE_128_Cipher; } + std::string name() const override; + StreamCipher* clone() const override; private: void key_schedule(const uint8_t key[], size_t key_len) override; |