Crypto++  8.6
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 NAMESPACE_BEGIN(CryptoPP)
21 
22 /// \brief SIMECK block cipher information
23 /// \since Crypto++ 8.0
24 struct SIMECK32_Info : public FixedBlockSize<4>, public FixedKeyLength<8>, public FixedRounds<32>
25 {
26  /// \brief The algorithm name
27  /// \return the algorithm name
28  /// \details StaticAlgorithmName returns the algorithm's name as a static
29  /// member function.
30  static const std::string StaticAlgorithmName()
31  {
32  // Format is Cipher-Blocksize
33  return "SIMECK-32";
34  }
35 };
36 
37 /// \brief SIMECK block cipher information
38 /// \since Crypto++ 8.0
39 struct SIMECK64_Info : public FixedBlockSize<8>, public FixedKeyLength<16>, public FixedRounds<44>
40 {
41  /// \brief The algorithm name
42  /// \return the algorithm name
43  /// \details StaticAlgorithmName returns the algorithm's name as a static
44  /// member function.
45  static const std::string StaticAlgorithmName()
46  {
47  // Format is Cipher-Blocksize
48  return "SIMECK-64";
49  }
50 };
51 
52 /// \brief SIMECK 32-bit block cipher
53 /// \details SIMECK32 provides 32-bit block size. The valid key size is 64-bit.
54 /// \note Crypto++ provides a byte oriented implementation
55 /// \sa SIMECK64, <a href="http://www.cryptopp.com/wiki/SIMECK">SIMECK</a>,
56 /// <a href="https://eprint.iacr.org/2015/612.pdf">The Simeck Family of
57 /// Lightweight Block Ciphers</a>
58 /// \since Crypto++ 8.0
59 class CRYPTOPP_NO_VTABLE SIMECK32 : public SIMECK32_Info, public BlockCipherDocumentation
60 {
61 public:
62  /// \brief SIMECK block cipher transformation functions
63  /// \details Provides implementation common to encryption and decryption
64  /// \since Crypto++ 8.0
65  class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl<SIMECK32_Info>
66  {
67  protected:
68  void UncheckedSetKey(const byte *userKey, unsigned int keyLength, const NameValuePairs &params);
69  std::string AlgorithmProvider() const;
70 
72  mutable FixedSizeSecBlock<word16, 5> m_t;
73  };
74 
75  /// \brief Encryption transformation
76  /// \details Enc provides implementation for encryption transformation. All key and block
77  /// sizes are supported.
78  /// \since Crypto++ 8.0
79  class CRYPTOPP_NO_VTABLE Enc : public Base
80  {
81  public:
82  void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
83  };
84 
85  /// \brief Decryption transformation
86  /// \details Dec provides implementation for decryption transformation. All key and block
87  /// sizes are supported.
88  /// \since Crypto++ 8.0
89  class CRYPTOPP_NO_VTABLE Dec : public Base
90  {
91  public:
92  void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
93  };
94 
97 };
98 
101 
102 /// \brief SIMECK 64-bit block cipher
103 /// \details SIMECK64 provides 64-bit block size. The valid key size is 128-bit.
104 /// \note Crypto++ provides a byte oriented implementation
105 /// \sa SIMECK32, <a href="http://www.cryptopp.com/wiki/SIMECK">SIMECK</a>,
106 /// <a href= "https://eprint.iacr.org/2015/612.pdf">The Simeck Family of
107 /// Lightweight Block Ciphers</a>
108 /// \since Crypto++ 8.0
109 class CRYPTOPP_NO_VTABLE SIMECK64 : public SIMECK64_Info, public BlockCipherDocumentation
110 {
111 public:
112  /// \brief SIMECK block cipher transformation functions
113  /// \details Provides implementation common to encryption and decryption
114  /// \since Crypto++ 8.0
115  class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl<SIMECK64_Info>
116  {
117  protected:
118  void UncheckedSetKey(const byte *userKey, unsigned int keyLength, const NameValuePairs &params);
119  std::string AlgorithmProvider() const;
120 
122  mutable FixedSizeSecBlock<word32, 5> m_t;
123  };
124 
125  /// \brief Encryption transformation
126  /// \details Enc provides implementation for encryption transformation. All key and block
127  /// sizes are supported.
128  /// \since Crypto++ 8.0
129  class CRYPTOPP_NO_VTABLE Enc : public Base
130  {
131  public:
132  void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
133 
134 #if CRYPTOPP_SIMECK_ADVANCED_PROCESS_BLOCKS
135  size_t AdvancedProcessBlocks(const byte *inBlocks, const byte *xorBlocks, byte *outBlocks, size_t length, word32 flags) const;
136 #endif
137  };
138 
139  /// \brief Decryption transformation
140  /// \details Dec provides implementation for decryption transformation. All key and block
141  /// sizes are supported.
142  /// \since Crypto++ 8.0
143  class CRYPTOPP_NO_VTABLE Dec : public Base
144  {
145  public:
146  void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
147 
148 #if CRYPTOPP_SIMECK_ADVANCED_PROCESS_BLOCKS
149  size_t AdvancedProcessBlocks(const byte *inBlocks, const byte *xorBlocks, byte *outBlocks, size_t length, word32 flags) const;
150 #endif
151  };
152 
155 };
156 
159 
160 NAMESPACE_END
161 
162 #endif // CRYPTOPP_SIMECK_H
SIMECK32
SIMECK 32-bit block cipher.
Definition: simeck.h:59
secblock.h
Classes and functions for secure memory allocations.
SIMECK32_Info
SIMECK block cipher information.
Definition: simeck.h:24
SIMECK64
SIMECK 64-bit block cipher.
Definition: simeck.h:109
SIMECK32::Base
SIMECK block cipher transformation functions.
Definition: simeck.h:65
SIMECK32_Info::StaticAlgorithmName
static const std::string StaticAlgorithmName()
The algorithm name.
Definition: simeck.h:30
SIMECK64::Dec
Decryption transformation.
Definition: simeck.h:143
word32
unsigned int word32
32-bit unsigned datatype
Definition: config_int.h:62
FixedBlockSize
Inherited by algorithms with fixed block size.
Definition: seckey.h:40
BlockCipherImpl
Provides a base implementation of Algorithm and SimpleKeyingInterface for block ciphers.
Definition: seckey.h:305
FixedKeyLength
Inherited by keyed algorithms with fixed key length.
Definition: seckey.h:124
SIMECK64::Enc
Encryption transformation.
Definition: simeck.h:129
SIMECK64_Info
SIMECK block cipher information.
Definition: simeck.h:39
SIMECK64_Info::StaticAlgorithmName
static const std::string StaticAlgorithmName()
The algorithm name.
Definition: simeck.h:45
SIMECK32::Dec
Decryption transformation.
Definition: simeck.h:89
BlockCipherDocumentation
Provides Encryption and Decryption typedefs used by derived classes to implement a block cipher.
Definition: seckey.h:398
seckey.h
Classes and functions for implementing secret key algorithms.
BlockCipherFinal< ENCRYPTION, Enc >
FixedSizeSecBlock< word16, ROUNDS >
SIMECK64::Base
SIMECK block cipher transformation functions.
Definition: simeck.h:115
SIMECK32::Enc
Encryption transformation.
Definition: simeck.h:79
CryptoPP
Crypto++ library namespace.
config.h
Library configuration file.
BlockCipher
Interface for one direction (encryption or decryption) of a block cipher.
Definition: cryptlib.h:1282
NameValuePairs
Interface for retrieving values given their names.
Definition: cryptlib.h:321
FixedRounds
Inherited by algorithms with fixed number of rounds.
Definition: seckey.h:52
algparam.h
Classes for working with NameValuePairs.