From 2c8a618a039af991fe4e0917175fb11d257a763d Mon Sep 17 00:00:00 2001 From: Jeffrey Walton Date: Thu, 23 Nov 2017 11:41:40 -0500 Subject: Add SM4 block ciphers (GH #540) --- sm4.h | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 sm4.h (limited to 'sm4.h') diff --git a/sm4.h b/sm4.h new file mode 100644 index 00000000..37cf4727 --- /dev/null +++ b/sm4.h @@ -0,0 +1,75 @@ +// sm4.h - written and placed in the public domain by Jeffrey Walton and Han Lulu + +//! \file sm4.h +//! \brief Classes for the SM4 block cipher +//! \details SM4 is a Chinese national block cipher. +//! \sa SMS4 Encryption Algorithm for Wireless Networks +//! \since Crypto++ 6.0 + +#ifndef CRYPTOPP_SM4_H +#define CRYPTOPP_SM4_H + +#include "config.h" +#include "seckey.h" +#include "secblock.h" + +NAMESPACE_BEGIN(CryptoPP) + +//! \class SM4_Info +//! \brief SM4 block cipher information +//! \since Crypto++ 6.0 +struct SM4_Info : public FixedBlockSize<16>, FixedKeyLength<16> +{ + static const std::string StaticAlgorithmName() + { + return "SM4"; + } +}; + +//! \file sm4.h +//! \brief Classes for the SM4 block cipher +//! \details SM4 is a Chinese national block cipher. +//! \sa SMS4 Encryption Algorithm for Wireless Networks +//! \since Crypto++ 6.0 +class CRYPTOPP_NO_VTABLE SM4 : public SM4_Info, public BlockCipherDocumentation +{ +public: + //! \brief SM4 block cipher transformation functions + //! \details Provides implementation common to encryption and decryption + //! \since Crypto++ 6.0 + class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl + { + protected: + void UncheckedSetKey(const byte *userKey, unsigned int keyLength, const NameValuePairs ¶ms); + protected: + SecBlock > m_rkeys; + mutable SecBlock > m_wspace; + }; + + //! \brief Provides implementation for encryption transformation + //! \details Enc provides implementation for encryption transformation. All key + //! sizes are supported. + //! \since Crypto++ 6.0 + class CRYPTOPP_NO_VTABLE Enc : public Base + { + protected: + void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const; + }; + + //! \brief Provides implementation for encryption transformation + //! \details Dec provides implementation for decryption transformation. All key + //! sizes are supported. + //! \since Crypto++ 6.0 + class CRYPTOPP_NO_VTABLE Dec : public Base + { + protected: + void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const; + }; + + typedef BlockCipherFinal Encryption; + typedef BlockCipherFinal Decryption; +}; + +NAMESPACE_END + +#endif // CRYPTOPP_SM4_H -- cgit v1.2.1