diff options
author | Jeffrey Walton <noloader@gmail.com> | 2018-07-05 06:43:04 -0400 |
---|---|---|
committer | Jeffrey Walton <noloader@gmail.com> | 2018-07-05 06:43:04 -0400 |
commit | 989bf6dc5e333791d5e64916be0cd49d026a71c2 (patch) | |
tree | ef831cc7f5837317fd7047d3b31d8af3d462671b /hc256.h | |
parent | 069d85d3f872974a7ed383ad4c8ddadb80f26fa9 (diff) | |
download | cryptopp-git-989bf6dc5e333791d5e64916be0cd49d026a71c2.tar.gz |
Add HC-256 stream cipher (GH #680)
Diffstat (limited to 'hc256.h')
-rw-r--r-- | hc256.h | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/hc256.h b/hc256.h new file mode 100644 index 00000000..360999e7 --- /dev/null +++ b/hc256.h @@ -0,0 +1,67 @@ +// hc256.h - written and placed in the public domain by Jeffrey Walton
+// based on public domain code by Hongjun Wu.
+//
+// The reference materials and source files are available at
+// The eSTREAM Project, http://www.ecrypt.eu.org/stream/hc256.html.
+
+/// \file hc256.h
+/// \brief Classes for HC-256 stream cipher
+/// \sa <A HREF="http://www.ecrypt.eu.org/stream/hc256.html">The
+/// eSTREAM Project | HC-256</A> and
+/// <A HREF="https://www.cryptopp.com/wiki/HC-128">Crypto++ Wiki | HC-128</A>.
+/// \since Crypto++ 7.1
+
+#ifndef CRYPTOPP_HC256_H
+#define CRYPTOPP_HC256_H
+
+#include "strciphr.h"
+#include "secblock.h"
+
+NAMESPACE_BEGIN(CryptoPP)
+
+/// \brief HC-256 stream cipher information
+/// \since Crypto++ 7.1
+struct HC256Info : public FixedKeyLength<32, SimpleKeyingInterface::UNIQUE_IV, 32>
+{
+ CRYPTOPP_STATIC_CONSTEXPR const char* StaticAlgorithmName() { return "HC-256"; }
+};
+
+/// \brief HC-256 stream cipher implementation
+/// \since Crypto++ 7.1
+class HC256Policy : public AdditiveCipherConcretePolicy<word32, 4>, public HC256Info
+{
+protected:
+ void CipherSetKey(const NameValuePairs ¶ms, const byte *key, size_t length);
+ void OperateKeystream(KeystreamOperation operation, byte *output, const byte *input, size_t iterationCount);
+ void CipherResynchronize(byte *keystreamBuffer, const byte *iv, size_t length);
+ bool CanOperateKeystream() const { return true; }
+ bool CipherIsRandomAccess() const { return false; }
+
+ word32 H1(word32 u);
+ word32 H2(word32 u);
+ word32 Generate();
+
+private:
+ word32 m_P[1024];
+ word32 m_Q[1024];
+ word32 m_key[8];
+ word32 m_iv[8];
+ word32 m_ctr;
+};
+
+/// \brief HC-256 stream cipher
+/// \details HC-256 is a stream cipher developed by Hongjun Wu. HC-256 is the
+/// successor to HC-128 from the eSTREAM project.
+/// \sa <A HREF="http://www.ecrypt.eu.org/stream/hc256.html">The
+/// eSTREAM Project | HC-256</A> and
+/// <A HREF="https://www.cryptopp.com/wiki/HC-128">Crypto++ Wiki | HC-128</A>.
+/// \since Crypto++ 7.1
+struct HC256 : public HC256Info, public SymmetricCipherDocumentation
+{
+ typedef SymmetricCipherFinal<ConcretePolicyHolder<HC256Policy, AdditiveCipherTemplate<> >, HC256Info> Encryption;
+ typedef Encryption Decryption;
+};
+
+NAMESPACE_END
+
+#endif // CRYPTOPP_HC256_H
|