diff options
-rw-r--r-- | doc/relnotes/1_11_3.rst | 4 | ||||
-rw-r--r-- | src/filters/aead/eax/eax.cpp | 10 | ||||
-rw-r--r-- | src/filters/aead/eax/eax.h | 2 | ||||
-rw-r--r-- | src/filters/aead/gcm/gcm.cpp | 10 | ||||
-rw-r--r-- | src/filters/aead/gcm/gcm.h | 2 | ||||
-rw-r--r-- | src/filters/aead/ocb/ocb.cpp | 5 | ||||
-rw-r--r-- | src/filters/aead/ocb/ocb.h | 2 | ||||
-rw-r--r-- | src/filters/filters.h | 16 | ||||
-rw-r--r-- | src/filters/key_filt.h | 10 | ||||
-rw-r--r-- | src/filters/modes/cbc/cbc.h | 6 | ||||
-rw-r--r-- | src/filters/modes/cfb/cfb.h | 6 | ||||
-rw-r--r-- | src/filters/modes/cts/cts.h | 6 | ||||
-rw-r--r-- | src/filters/modes/ecb/ecb.h | 6 | ||||
-rw-r--r-- | src/filters/modes/xts/xts.cpp | 19 | ||||
-rw-r--r-- | src/filters/modes/xts/xts.h | 6 |
15 files changed, 47 insertions, 63 deletions
diff --git a/doc/relnotes/1_11_3.rst b/doc/relnotes/1_11_3.rst index 6b0ba1492..277b670da 100644 --- a/doc/relnotes/1_11_3.rst +++ b/doc/relnotes/1_11_3.rst @@ -4,6 +4,10 @@ Version 1.11.3, Not Yet Released * Implementations of the OCB and GCM authenticated cipher modes are now included +* :cpp:class:`Keyed_Filter` now supports returning a + :cpp:class:`Key_Length_Specification` so the full details of what + keylengths are supported is now available in keyed filters. + * New functions for symmetric encryption are included in cryptobox.h * A new function :cpp:func:`algorithm_kat_detailed` returns a string diff --git a/src/filters/aead/eax/eax.cpp b/src/filters/aead/eax/eax.cpp index 57f62833b..d4a982aaf 100644 --- a/src/filters/aead/eax/eax.cpp +++ b/src/filters/aead/eax/eax.cpp @@ -58,16 +58,6 @@ EAX_Mode::EAX_Mode(BlockCipher* cipher, size_t tag_size, bool decrypting) : } /* -* Check if a keylength is valid for EAX -*/ -bool EAX_Mode::valid_keylength(size_t n) const - { - if(!ctr->valid_keylength(n)) - return false; - return true; - } - -/* * Set the EAX key */ void EAX_Mode::set_key(const SymmetricKey& key) diff --git a/src/filters/aead/eax/eax.h b/src/filters/aead/eax/eax.h index e219487cb..a85377524 100644 --- a/src/filters/aead/eax/eax.h +++ b/src/filters/aead/eax/eax.h @@ -32,7 +32,7 @@ class BOTAN_DLL EAX_Mode : public AEAD_Mode, std::string name() const override; - bool valid_keylength(size_t key_len) const override; + Key_Length_Specification key_spec() const override { return ctr->key_spec(); } // EAX supports arbitrary IV lengths bool valid_iv_length(size_t) const override { return true; } diff --git a/src/filters/aead/gcm/gcm.cpp b/src/filters/aead/gcm/gcm.cpp index 013757b59..32a763df7 100644 --- a/src/filters/aead/gcm/gcm.cpp +++ b/src/filters/aead/gcm/gcm.cpp @@ -107,16 +107,6 @@ GCM_Mode::GCM_Mode(BlockCipher* cipher, size_t tag_size, bool decrypting) : throw Invalid_Argument(name() + ": Bad tag size " + std::to_string(m_tag_size)); } -/* -* Check if a keylength is valid for GCM -*/ -bool GCM_Mode::valid_keylength(size_t n) const - { - if(!m_ctr->valid_keylength(n)) - return false; - return true; - } - void GCM_Mode::set_key(const SymmetricKey& key) { m_ctr->set_key(key); diff --git a/src/filters/aead/gcm/gcm.h b/src/filters/aead/gcm/gcm.h index fa13597ce..067b19298 100644 --- a/src/filters/aead/gcm/gcm.h +++ b/src/filters/aead/gcm/gcm.h @@ -32,7 +32,7 @@ class BOTAN_DLL GCM_Mode : public AEAD_Mode, */ void set_associated_data(const byte ad[], size_t ad_len) override; - bool valid_keylength(size_t key_len) const override; + Key_Length_Specification key_spec() const override { return m_ctr->key_spec(); } // GCM supports arbitrary IV lengths bool valid_iv_length(size_t) const override { return true; } diff --git a/src/filters/aead/ocb/ocb.cpp b/src/filters/aead/ocb/ocb.cpp index ebf440d32..eb10b6e9f 100644 --- a/src/filters/aead/ocb/ocb.cpp +++ b/src/filters/aead/ocb/ocb.cpp @@ -180,11 +180,6 @@ OCB_Mode::OCB_Mode(BlockCipher* cipher, size_t tag_size, bool decrypting) : OCB_Mode::~OCB_Mode() { /* for unique_ptr destructor */ } -bool OCB_Mode::valid_keylength(size_t n) const - { - return m_cipher->valid_keylength(n); - } - std::string OCB_Mode::name() const { return m_cipher->name() + "/OCB"; // include tag size diff --git a/src/filters/aead/ocb/ocb.h b/src/filters/aead/ocb/ocb.h index 5e3c5cf0a..f5209df12 100644 --- a/src/filters/aead/ocb/ocb.h +++ b/src/filters/aead/ocb/ocb.h @@ -37,7 +37,7 @@ class BOTAN_DLL OCB_Mode : public AEAD_Mode, void set_associated_data(const byte ad[], size_t ad_len) override; - bool valid_keylength(size_t n) const override; + Key_Length_Specification key_spec() const override { return m_cipher->key_spec(); } std::string name() const override; diff --git a/src/filters/filters.h b/src/filters/filters.h index 08b505bc0..8fcc2d85d 100644 --- a/src/filters/filters.h +++ b/src/filters/filters.h @@ -58,13 +58,7 @@ class BOTAN_DLL StreamCipher_Filter : public Keyed_Filter */ void set_key(const SymmetricKey& key) { cipher->set_key(key); } - /** - * Check whether a key length is valid for this filter. - * @param length the key length to be checked for validity - * @return true if the key length is valid, false otherwise - */ - bool valid_keylength(size_t length) const - { return cipher->valid_keylength(length); } + Key_Length_Specification key_spec() const override { return cipher->key_spec(); } /** * Construct a stream cipher filter. @@ -153,13 +147,7 @@ class BOTAN_DLL MAC_Filter : public Keyed_Filter */ void set_key(const SymmetricKey& key) { mac->set_key(key); } - /** - * Check whether a key length is valid for this filter. - * @param length the key length to be checked for validity - * @return true if the key length is valid, false otherwise - */ - bool valid_keylength(size_t length) const - { return mac->valid_keylength(length); } + Key_Length_Specification key_spec() const override { return mac->key_spec(); } /** * Construct a MAC filter. The MAC key will be left empty. diff --git a/src/filters/key_filt.h b/src/filters/key_filt.h index 3c79ebac9..6d69d6b83 100644 --- a/src/filters/key_filt.h +++ b/src/filters/key_filt.h @@ -38,7 +38,15 @@ class BOTAN_DLL Keyed_Filter : public Filter * @param length the key length to be checked for validity * @return true if the key length is valid, false otherwise */ - virtual bool valid_keylength(size_t length) const = 0; + bool valid_keylength(size_t length) const + { + return key_spec().valid_keylength(length); + } + + /** + * @return object describing limits on key size + */ + virtual Key_Length_Specification key_spec() const = 0; /** * Check whether an IV length is valid for this filter diff --git a/src/filters/modes/cbc/cbc.h b/src/filters/modes/cbc/cbc.h index 4fd0f7d66..51e217e70 100644 --- a/src/filters/modes/cbc/cbc.h +++ b/src/filters/modes/cbc/cbc.h @@ -28,8 +28,7 @@ class BOTAN_DLL CBC_Encryption : public Keyed_Filter, void set_key(const SymmetricKey& key) { cipher->set_key(key); } - bool valid_keylength(size_t key_len) const - { return cipher->valid_keylength(key_len); } + Key_Length_Specification key_spec() const override { return cipher->key_spec(); } bool valid_iv_length(size_t iv_len) const { return (iv_len == cipher->block_size()); } @@ -68,8 +67,7 @@ class BOTAN_DLL CBC_Decryption : public Keyed_Filter, void set_key(const SymmetricKey& key) { cipher->set_key(key); } - bool valid_keylength(size_t key_len) const - { return cipher->valid_keylength(key_len); } + Key_Length_Specification key_spec() const override { return cipher->key_spec(); } bool valid_iv_length(size_t iv_len) const { return (iv_len == cipher->block_size()); } diff --git a/src/filters/modes/cfb/cfb.h b/src/filters/modes/cfb/cfb.h index 212ac76da..02154ebb9 100644 --- a/src/filters/modes/cfb/cfb.h +++ b/src/filters/modes/cfb/cfb.h @@ -25,8 +25,7 @@ class BOTAN_DLL CFB_Encryption : public Keyed_Filter void set_key(const SymmetricKey& key) { cipher->set_key(key); } - bool valid_keylength(size_t key_len) const - { return cipher->valid_keylength(key_len); } + Key_Length_Specification key_spec() const override { return cipher->key_spec(); } bool valid_iv_length(size_t iv_len) const { return (iv_len == cipher->block_size()); } @@ -59,8 +58,7 @@ class BOTAN_DLL CFB_Decryption : public Keyed_Filter void set_key(const SymmetricKey& key) { cipher->set_key(key); } - bool valid_keylength(size_t key_len) const - { return cipher->valid_keylength(key_len); } + Key_Length_Specification key_spec() const override { return cipher->key_spec(); } bool valid_iv_length(size_t iv_len) const { return (iv_len == cipher->block_size()); } diff --git a/src/filters/modes/cts/cts.h b/src/filters/modes/cts/cts.h index ac296316f..b0efb6944 100644 --- a/src/filters/modes/cts/cts.h +++ b/src/filters/modes/cts/cts.h @@ -25,8 +25,7 @@ class BOTAN_DLL CTS_Encryption : public Keyed_Filter void set_key(const SymmetricKey& key) { cipher->set_key(key); } - bool valid_keylength(size_t key_len) const - { return cipher->valid_keylength(key_len); } + Key_Length_Specification key_spec() const override { return cipher->key_spec(); } bool valid_iv_length(size_t iv_len) const { return (iv_len == cipher->block_size()); } @@ -60,8 +59,7 @@ class BOTAN_DLL CTS_Decryption : public Keyed_Filter void set_key(const SymmetricKey& key) { cipher->set_key(key); } - bool valid_keylength(size_t key_len) const - { return cipher->valid_keylength(key_len); } + Key_Length_Specification key_spec() const override { return cipher->key_spec(); } bool valid_iv_length(size_t iv_len) const { return (iv_len == cipher->block_size()); } diff --git a/src/filters/modes/ecb/ecb.h b/src/filters/modes/ecb/ecb.h index e6476ab5d..8f4e6f1b5 100644 --- a/src/filters/modes/ecb/ecb.h +++ b/src/filters/modes/ecb/ecb.h @@ -26,8 +26,7 @@ class BOTAN_DLL ECB_Encryption : public Keyed_Filter, void set_key(const SymmetricKey& key) { cipher->set_key(key); } - bool valid_keylength(size_t key_len) const - { return cipher->valid_keylength(key_len); } + Key_Length_Specification key_spec() const override { return cipher->key_spec(); } ECB_Encryption(BlockCipher* ciph, BlockCipherModePaddingMethod* pad); @@ -60,8 +59,7 @@ class BOTAN_DLL ECB_Decryption : public Keyed_Filter, void set_key(const SymmetricKey& key) { cipher->set_key(key); } - bool valid_keylength(size_t key_len) const - { return cipher->valid_keylength(key_len); } + Key_Length_Specification key_spec() const override { return cipher->key_spec(); } ECB_Decryption(BlockCipher* ciph, BlockCipherModePaddingMethod* pad); diff --git a/src/filters/modes/xts/xts.cpp b/src/filters/modes/xts/xts.cpp index e29ef6b98..df38614bb 100644 --- a/src/filters/modes/xts/xts.cpp +++ b/src/filters/modes/xts/xts.cpp @@ -39,6 +39,15 @@ size_t xts_parallelism(BlockCipher* cipher) 2 * cipher->block_size()); } +Key_Length_Specification xts_key_spec(const BlockCipher& cipher) + { + const Key_Length_Specification& spec = cipher.key_spec(); + + return Key_Length_Specification(2*spec.minimum_keylength(), + 2*spec.maximum_keylength(), + 2*spec.keylength_multiple()); + } + } /* @@ -82,6 +91,11 @@ std::string XTS_Encryption::name() const return (cipher->name() + "/XTS"); } +Key_Length_Specification XTS_Encryption::key_spec() const + { + return xts_key_spec(*cipher); + } + /* * Set new tweak */ @@ -256,6 +270,11 @@ std::string XTS_Decryption::name() const return (cipher->name() + "/XTS"); } +Key_Length_Specification XTS_Decryption::key_spec() const + { + return xts_key_spec(*cipher); + } + /* * Set new tweak */ diff --git a/src/filters/modes/xts/xts.h b/src/filters/modes/xts/xts.h index d4801cd37..05a779703 100644 --- a/src/filters/modes/xts/xts.h +++ b/src/filters/modes/xts/xts.h @@ -24,8 +24,7 @@ class BOTAN_DLL XTS_Encryption : public Keyed_Filter, void set_key(const SymmetricKey& key); void set_iv(const InitializationVector& iv); - bool valid_keylength(size_t key_len) const - { return cipher->valid_keylength(key_len); } + Key_Length_Specification key_spec() const override; bool valid_iv_length(size_t iv_len) const { return (iv_len == cipher->block_size()); } @@ -61,8 +60,7 @@ class BOTAN_DLL XTS_Decryption : public Keyed_Filter, void set_key(const SymmetricKey& key); void set_iv(const InitializationVector& iv); - bool valid_keylength(size_t key_len) const - { return cipher->valid_keylength(key_len); } + Key_Length_Specification key_spec() const override; bool valid_iv_length(size_t iv_len) const { return (iv_len == cipher->block_size()); } |