Crypto++ 8.2
Free C&
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
30NAMESPACE_BEGIN(CryptoPP)
31
32/// \brief SIMECK block cipher information
33/// \since Crypto++ 8.0
34struct 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
49struct 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
69class CRYPTOPP_NO_VTABLE SIMECK32 : public SIMECK32_Info, public BlockCipherDocumentation
70{
71public:
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
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 Encryption 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
119class CRYPTOPP_NO_VTABLE SIMECK64 : public SIMECK64_Info, public BlockCipherDocumentation
120{
121public:
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
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 Encryption 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
170NAMESPACE_END
171
172#endif // CRYPTOPP_SIMECK_H
Classes for working with NameValuePairs.
Provides class member functions to key a block cipher.
Definition: seckey.h:318
Provides a base implementation of Algorithm and SimpleKeyingInterface for block ciphers.
Definition: seckey.h:306
Inherited by algorithms with fixed block size.
Definition: seckey.h:41
Inherited by keyed algorithms with fixed key length.
Definition: seckey.h:125
Inherited by algorithms with fixed number of rounds.
Definition: seckey.h:53
Fixed size stack-based SecBlock.
Definition: secblock.h:1078
Interface for retrieving values given their names.
Definition: cryptlib.h:294
SIMECK block cipher transformation functions.
Definition: simeck.h:76
Encryption transformation.
Definition: simeck.h:100
Encryption transformation.
Definition: simeck.h:90
SIMECK 32-bit block cipher.
Definition: simeck.h:70
SIMECK block cipher transformation functions.
Definition: simeck.h:126
Encryption transformation.
Definition: simeck.h:154
Encryption transformation.
Definition: simeck.h:140
SIMECK 64-bit block cipher.
Definition: simeck.h:120
Library configuration file.
Crypto++ library namespace.
Classes and functions for secure memory allocations.
Classes and functions for implementing secret key algorithms.
Provides Encryption and Decryption typedefs used by derived classes to implement a block cipher.
Definition: seckey.h:399
BlockCipher Decryption
implements the BlockCipher interface
Definition: seckey.h:403
BlockCipher Encryption
implements the BlockCipher interface
Definition: seckey.h:401
SIMECK block cipher information.
Definition: simeck.h:35
static const std::string StaticAlgorithmName()
The algorithm name.
Definition: simeck.h:40
SIMECK block cipher information.
Definition: simeck.h:50
static const std::string StaticAlgorithmName()
The algorithm name.
Definition: simeck.h:55