Crypto++  8.2
Free C++ class library of cryptographic schemes
simeck.h
Go to the documentation of this file.
1 // simeck.h - written and placed in the public domain by Gangqiang Yang and Jeffrey Walton.
2 // Based on "The Simeck Family of Lightweight Block Ciphers" by Gangqiang Yang,
3 // Bo Zhu, Valentin Suder, Mark D. Aagaard, and Guang Gong
4 
5 /// \file simeck.h
6 /// \brief Classes for the SIMECK block cipher
7 /// \sa <a href="http://www.cryptopp.com/wiki/SIMECK">SIMECK</a>,
8 /// <a href="https://eprint.iacr.org/2015/612.pdf">The Simeck
9 /// Family of Lightweight Block Ciphers</a>
10 /// \since Crypto++ 8.0
11 
12 #ifndef CRYPTOPP_SIMECK_H
13 #define CRYPTOPP_SIMECK_H
14 
15 #include "config.h"
16 #include "seckey.h"
17 #include "secblock.h"
18 #include "algparam.h"
19 
20 #if (CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X86)
21 # define CRYPTOPP_SIMECK_ADVANCED_PROCESS_BLOCKS 1
22 #endif
23 
24 // Yet another SunStudio/SunCC workaround. Failed self tests
25 // in SSE code paths on i386 for SunStudio 12.3 and below.
26 #if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x5120)
27 # undef CRYPTOPP_SIMECK_ADVANCED_PROCESS_BLOCKS
28 #endif
29 
30 NAMESPACE_BEGIN(CryptoPP)
31 
32 /// \brief SIMECK block cipher information
33 /// \since Crypto++ 8.0
34 struct SIMECK32_Info : public FixedBlockSize<4>, public FixedKeyLength<8>, public FixedRounds<32>
35 {
36  /// \brief The algorithm name
37  /// \returns the algorithm name
38  /// \details StaticAlgorithmName returns the algorithm's name as a static
39  /// member function.
40  static const std::string StaticAlgorithmName()
41  {
42  // Format is Cipher-Blocksize
43  return "SIMECK-32";
44  }
45 };
46 
47 /// \brief SIMECK block cipher information
48 /// \since Crypto++ 8.0
49 struct SIMECK64_Info : public FixedBlockSize<8>, public FixedKeyLength<16>, public FixedRounds<44>
50 {
51  /// \brief The algorithm name
52  /// \returns the algorithm name
53  /// \details StaticAlgorithmName returns the algorithm's name as a static
54  /// member function.
55  static const std::string StaticAlgorithmName()
56  {
57  // Format is Cipher-Blocksize
58  return "SIMECK-64";
59  }
60 };
61 
62 /// \brief SIMECK 32-bit block cipher
63 /// \details SIMECK32 provides 32-bit block size. The valid key size is 64-bit.
64 /// \note Crypto++ provides a byte oriented implementation
65 /// \sa SIMECK64, <a href="http://www.cryptopp.com/wiki/SIMECK">SIMECK</a>,
66 /// <a href="https://eprint.iacr.org/2015/612.pdf">The Simeck Family of
67 /// Lightweight Block Ciphers</a>
68 /// \since Crypto++ 8.0
69 class CRYPTOPP_NO_VTABLE SIMECK32 : public SIMECK32_Info, public BlockCipherDocumentation
70 {
71 public:
72  /// \brief SIMECK block cipher transformation functions
73  /// \details Provides implementation common to encryption and decryption
74  /// \since Crypto++ 8.0
75  class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl<SIMECK32_Info>
76  {
77  protected:
78  void UncheckedSetKey(const byte *userKey, unsigned int keyLength, const NameValuePairs &params);
79  std::string AlgorithmProvider() const;
80 
82  mutable FixedSizeSecBlock<word16, 5> m_t;
83  };
84 
85  /// \brief Encryption transformation
86  /// \details Enc provides implementation for encryption transformation. All key and block
87  /// sizes are supported.
88  /// \since Crypto++ 8.0
89  class CRYPTOPP_NO_VTABLE Enc : public Base
90  {
91  public:
92  void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
93  };
94 
95  /// \brief Decryption transformation
96  /// \details Dec provides implementation for decryption transformation. All key and block
97  /// sizes are supported.
98  /// \since Crypto++ 8.0
99  class CRYPTOPP_NO_VTABLE Dec : public Base
100  {
101  public:
102  void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
103  };
104 
107 };
108 
111 
112 /// \brief SIMECK 64-bit block cipher
113 /// \details SIMECK64 provides 64-bit block size. The valid key size is 128-bit.
114 /// \note Crypto++ provides a byte oriented implementation
115 /// \sa SIMECK32, <a href="http://www.cryptopp.com/wiki/SIMECK">SIMECK</a>,
116 /// <a href= "https://eprint.iacr.org/2015/612.pdf">The Simeck Family of
117 /// Lightweight Block Ciphers</a>
118 /// \since Crypto++ 8.0
119 class CRYPTOPP_NO_VTABLE SIMECK64 : public SIMECK64_Info, public BlockCipherDocumentation
120 {
121 public:
122  /// \brief SIMECK block cipher transformation functions
123  /// \details Provides implementation common to encryption and decryption
124  /// \since Crypto++ 8.0
125  class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl<SIMECK64_Info>
126  {
127  protected:
128  void UncheckedSetKey(const byte *userKey, unsigned int keyLength, const NameValuePairs &params);
129  std::string AlgorithmProvider() const;
130 
132  mutable FixedSizeSecBlock<word32, 5> m_t;
133  };
134 
135  /// \brief Encryption transformation
136  /// \details Enc provides implementation for encryption transformation. All key and block
137  /// sizes are supported.
138  /// \since Crypto++ 8.0
139  class CRYPTOPP_NO_VTABLE Enc : public Base
140  {
141  public:
142  void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
143 
144 #if CRYPTOPP_SIMECK_ADVANCED_PROCESS_BLOCKS
145  size_t AdvancedProcessBlocks(const byte *inBlocks, const byte *xorBlocks, byte *outBlocks, size_t length, word32 flags) const;
146 #endif
147  };
148 
149  /// \brief Decryption transformation
150  /// \details Dec provides implementation for decryption transformation. All key and block
151  /// sizes are supported.
152  /// \since Crypto++ 8.0
153  class CRYPTOPP_NO_VTABLE Dec : public Base
154  {
155  public:
156  void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
157 
158 #if CRYPTOPP_SIMECK_ADVANCED_PROCESS_BLOCKS
159  size_t AdvancedProcessBlocks(const byte *inBlocks, const byte *xorBlocks, byte *outBlocks, size_t length, word32 flags) const;
160 #endif
161  };
162 
165 };
166 
169 
170 NAMESPACE_END
171 
172 #endif // CRYPTOPP_SIMECK_H
SIMECK block cipher information.
Definition: simeck.h:49
static const std::string StaticAlgorithmName()
The algorithm name.
Definition: simeck.h:55
Inherited by keyed algorithms with fixed key length.
Definition: seckey.h:124
Classes for working with NameValuePairs.
Provides Encryption and Decryption typedefs used by derived classes to implement a block cipher.
Definition: seckey.h:398
Decryption transformation.
Definition: simeck.h:153
SIMECK block cipher transformation functions.
Definition: simeck.h:125
Encryption transformation.
Definition: simeck.h:139
Library configuration file.
static const std::string StaticAlgorithmName()
The algorithm name.
Definition: simeck.h:40
Interface for one direction (encryption or decryption) of a block cipher.
Definition: cryptlib.h:1278
Decryption transformation.
Definition: simeck.h:99
Classes and functions for secure memory allocations.
Inherited by algorithms with fixed block size.
Definition: seckey.h:40
Classes and functions for implementing secret key algorithms.
Encryption transformation.
Definition: simeck.h:89
SIMECK block cipher transformation functions.
Definition: simeck.h:75
SIMECK 32-bit block cipher.
Definition: simeck.h:69
Inherited by algorithms with fixed number of rounds.
Definition: seckey.h:52
SIMECK 64-bit block cipher.
Definition: simeck.h:119
SIMECK block cipher information.
Definition: simeck.h:34
Provides a base implementation of Algorithm and SimpleKeyingInterface for block ciphers.
Definition: seckey.h:305
Crypto++ library namespace.
Interface for retrieving values given their names.
Definition: cryptlib.h:321