summaryrefslogtreecommitdiff
path: root/threefish.h
diff options
context:
space:
mode:
authorJeffrey Walton <noloader@gmail.com>2017-05-14 13:51:41 -0400
committerJeffrey Walton <noloader@gmail.com>2017-05-14 13:51:41 -0400
commit8c34a5f7f5d17ed295471aa93ff16e4df9a5e9e2 (patch)
tree2ef00e4a7df31306cb4d2116bc64ac20715d93d3 /threefish.h
parent7ee87af86b93dcc766aeb01b9ec4caf05c00ee0d (diff)
downloadcryptopp-git-8c34a5f7f5d17ed295471aa93ff16e4df9a5e9e2.tar.gz
Add Threefish block cipher (Issue 422)
Diffstat (limited to 'threefish.h')
-rw-r--r--threefish.h106
1 files changed, 106 insertions, 0 deletions
diff --git a/threefish.h b/threefish.h
new file mode 100644
index 00000000..97a7949b
--- /dev/null
+++ b/threefish.h
@@ -0,0 +1,106 @@
+// threefish.h - written and placed in the public domain by Jeffrey Walton
+// Based on public domain code by Keru Kuro. Kuro's code is
+// available at http://cppcrypto.sourceforge.net/.
+
+//! \file Threefish.h
+//! \brief Classes for the Threefish block cipher
+//! \since Crypto++ 6.0
+
+#ifndef CRYPTOPP_THREEFISH_H
+#define CRYPTOPP_THREEFISH_H
+
+#include "config.h"
+#include "seckey.h"
+#include "secblock.h"
+
+NAMESPACE_BEGIN(CryptoPP)
+
+//! \class Threefish_Info
+//! \brief Threefish block cipher information
+//! \tparam SIZE block and key size, in bytes
+//! \note Crypto++ provides a byte oriented implementation
+//! \since Crypto++ 6.0
+struct Threefish_Info : public VariableBlockSize<32, 32, 128>
+{
+ CRYPTOPP_STATIC_CONSTEXPR const char* StaticAlgorithmName() {return "Threefish";}
+
+ //! \brief The minimum key length used by the algorithm provided as a constant
+ //! \details MIN_KEYLENGTH is provided in bytes, not bits
+ CRYPTOPP_CONSTANT(MIN_KEYLENGTH=32)
+ //! \brief The maximum key length used by the algorithm provided as a constant
+ //! \details MIN_KEYLENGTH is provided in bytes, not bits
+ CRYPTOPP_CONSTANT(MAX_KEYLENGTH=128)
+ //! \brief The default key length used by the algorithm provided as a constant
+ //! \details MIN_KEYLENGTH is provided in bytes, not bits
+ CRYPTOPP_CONSTANT(DEFAULT_KEYLENGTH=32)
+ //! \brief The default IV requirements for the algorithm provided as a constant
+ //! \details The default value is NOT_RESYNCHRONIZABLE. See IV_Requirement
+ //! in cryptlib.h for allowed values.
+ CRYPTOPP_CONSTANT(IV_REQUIREMENT=SimpleKeyingInterface::UNIQUE_IV)
+ //! \brief The default initialization vector length for the algorithm provided as a constant
+ //! \details IV_LENGTH is provided in bytes, not bits.
+ CRYPTOPP_CONSTANT(IV_LENGTH=32)
+ //! \brief Provides a valid key length for the algorithm provided by a static function.
+ //! \param keylength the size of the key, in bytes
+ //! \details The key length depends on the block size. For each block size, 128, 256 and 512,
+ //! the key length can be either the block size or twice the block size. That means the
+ //! valid key lengths are 126, 256, 512 and 1024. Additionally, it means a key length of,
+ //! say, 32 could be used with either 128-block size or 256-block size.
+ CRYPTOPP_STATIC_CONSTEXPR size_t CRYPTOPP_API StaticGetValidKeyLength(size_t keylength)
+ {
+ // Valid key lengths are 256, 512 and 1024 bits
+ return (keylength >= 128) ? 128 :
+ (keylength >= 64) ? 64 : 32;
+ }
+
+ CRYPTOPP_STATIC_CONSTEXPR size_t CRYPTOPP_API StaticGetValidBlockSize(size_t keylength)
+ {
+ return (keylength >= 128) ? 128 :
+ (keylength >= 64) ? 64 : 32;
+ }
+};
+
+//! \class Threefish1024
+//! \brief Threefish-1024 block cipher
+//! \sa <a href="http://www.weidai.com/scan-mirror/cs.html#Threefish">Threefish</a>
+//! \since Crypto++ 6.0
+class Threefish : public Threefish_Info, public BlockCipherDocumentation
+{
+public:
+ class CRYPTOPP_NO_VTABLE Base : public VariableBlockCipherImpl<Threefish_Info>
+ {
+ public:
+ std::string AlgorithmName() const {
+ return m_blocksize ? "Threefish-" + IntToString(m_blocksize*8) + "(" + IntToString((m_rkey.size()-1)*8) + ")" : StaticAlgorithmName();
+ }
+
+ unsigned int OptimalDataAlignment() const {
+ return GetAlignmentOf<word64>();
+ }
+
+ protected:
+ void UncheckedSetKey(const byte *key, unsigned int keylen, const NameValuePairs &params);
+ void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
+
+ void ProcessAndXorBlock_256(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
+ void ProcessAndXorBlock_512(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
+ void ProcessAndXorBlock_1024(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
+
+ private:
+ typedef SecBlock<word64, AllocatorWithCleanup<word64, true> > AlignedSecBlock64;
+ mutable AlignedSecBlock64 m_wspace; // workspace
+ AlignedSecBlock64 m_rkey; // keys
+ AlignedSecBlock64 m_tweak;
+ };
+
+public:
+ typedef BlockCipherFinal<ENCRYPTION, Base> Encryption;
+ typedef BlockCipherFinal<DECRYPTION, Base> Decryption;
+};
+
+typedef Threefish::Encryption ThreefishEncryption;
+typedef Threefish::Decryption ThreefishDecryption;
+
+NAMESPACE_END
+
+#endif // CRYPTOPP_THREEFISH_H