Crypto++ 8.9
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
20NAMESPACE_BEGIN(CryptoPP)
21
22/// \brief SIMECK block cipher information
23/// \since Crypto++ 8.0
24struct 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
39struct 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
59class CRYPTOPP_NO_VTABLE SIMECK32 : public SIMECK32_Info, public BlockCipherDocumentation
60{
61public:
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
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
109class CRYPTOPP_NO_VTABLE SIMECK64 : public SIMECK64_Info, public BlockCipherDocumentation
110{
111public:
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
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
160NAMESPACE_END
161
162#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:1246
Interface for retrieving values given their names.
Definition cryptlib.h:327
SIMECK block cipher transformation functions.
Definition simeck.h:66
Decryption transformation.
Definition simeck.h:90
Encryption transformation.
Definition simeck.h:80
SIMECK 32-bit block cipher.
Definition simeck.h:60
SIMECK block cipher transformation functions.
Definition simeck.h:116
Decryption transformation.
Definition simeck.h:144
Encryption transformation.
Definition simeck.h:130
SIMECK 64-bit block cipher.
Definition simeck.h:110
Library configuration file.
unsigned int word32
32-bit unsigned datatype
Definition config_int.h:72
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:25
static const std::string StaticAlgorithmName()
The algorithm name.
Definition simeck.h:30
SIMECK block cipher information.
Definition simeck.h:40
static const std::string StaticAlgorithmName()
The algorithm name.
Definition simeck.h:45