Botan 3.13.0
Crypto and TLS for C&
Botan::Serpent Class Referencefinal

#include <serpent.h>

Inheritance diagram for Botan::Serpent:
Botan::Block_Cipher_Fixed_Params< 16, 16, 32, 8 > Botan::BlockCipher Botan::SymmetricAlgorithm

Public Types

enum  

Public Member Functions

size_t block_size () const final
void clear () override
BlockCipherclone () const
void decrypt (const uint8_t in[], uint8_t out[]) const
void decrypt (std::span< const uint8_t > in, std::span< uint8_t > out) const
void decrypt (std::span< uint8_t > block) const
void decrypt (uint8_t block[]) const
void decrypt_n (const uint8_t in[], uint8_t out[], size_t blocks) const override
void decrypt_n_xex (uint8_t data[], const uint8_t mask[], size_t blocks) const
void encrypt (const uint8_t in[], uint8_t out[]) const
void encrypt (std::span< const uint8_t > in, std::span< uint8_t > out) const
void encrypt (std::span< uint8_t > block) const
void encrypt (uint8_t block[]) const
void encrypt_n (const uint8_t in[], uint8_t out[], size_t blocks) const override
void encrypt_n_xex (uint8_t data[], const uint8_t mask[], size_t blocks) const
bool has_keying_material () const override
Key_Length_Specification key_spec () const final
size_t maximum_keylength () const
size_t minimum_keylength () const
std::string name () const override
std::unique_ptr< BlockCiphernew_object () const override
size_t parallel_bytes () const
size_t parallelism () const override
std::string provider () const override
void set_key (const OctetString &key)
void set_key (const uint8_t key[], size_t length)
void set_key (std::span< const uint8_t > key)
bool valid_keylength (size_t length) const

Static Public Member Functions

static std::unique_ptr< BlockCiphercreate (std::string_view algo_spec, std::string_view provider="")
static std::unique_ptr< BlockCiphercreate_or_throw (std::string_view algo_spec, std::string_view provider="")
static std::vector< std::string > providers (std::string_view algo_spec)

Static Public Attributes

static constexpr size_t ParallelismMult

Protected Member Functions

void assert_key_material_set () const
void assert_key_material_set (bool predicate) const

Detailed Description

Serpent is the most conservative of the AES finalists https://www.cl.cam.ac.uk/~rja14/serpent.html

Definition at line 20 of file serpent.h.

Member Enumeration Documentation

◆ anonymous enum

anonymous enum
inherited

Definition at line 234 of file block_cipher.h.

234{ BLOCK_SIZE = BS }; /* NOLINT(*-enum-size,*-use-enum-class) */

Member Function Documentation

◆ assert_key_material_set() [1/2]

◆ assert_key_material_set() [2/2]

void Botan::SymmetricAlgorithm::assert_key_material_set ( bool predicate) const
inlineprotectedinherited

Throw Key_Not_Set unless the predicate holds

Parameters
predicateif false, a Key_Not_Set exception is thrown

Definition at line 186 of file sym_algo.h.

186 {
187 if(!predicate) {
189 }
190 }

◆ block_size()

size_t Botan::Block_Cipher_Fixed_Params< BS, KMIN, KMAX, KMOD, BlockCipher >::block_size ( ) const
inlinefinalvirtualinherited

Return the block size of this cipher

Returns
the fixed block size BS

Implements Botan::BlockCipher.

Definition at line 240 of file block_cipher.h.

240{ return BS; }

◆ clear()

void Botan::Serpent::clear ( )
overridevirtual

Reset the internal state. This includes not just the key, but any partial message that may have been in process.

Implements Botan::SymmetricAlgorithm.

Definition at line 390 of file serpent.cpp.

390 {
391 zap(m_round_key);
392}
void zap(std::vector< T, Alloc > &vec)
Definition secmem.h:261

References Botan::zap().

◆ clone()

BlockCipher * Botan::BlockCipher::clone ( ) const
inlineinherited

Create a new uninitialized object of the same type

Returns
new object representing the same algorithm as *this

Definition at line 210 of file block_cipher.h.

210{ return this->new_object().release(); }
virtual std::unique_ptr< BlockCipher > new_object() const=0

◆ create()

std::unique_ptr< BlockCipher > Botan::BlockCipher::create ( std::string_view algo_spec,
std::string_view provider = "" )
staticinherited

Create an instance based on a name If provider is empty then best available is chosen.

Parameters
algo_specalgorithm name
providerprovider implementation to choose
Returns
a null pointer if the algo/provider combination cannot be found

Definition at line 31 of file block_cipher.cpp.

96 {
97#if defined(BOTAN_HAS_COMMONCRYPTO)
98 if(provider.empty() || provider == "commoncrypto") {
100 return bc;
101
102 if(!provider.empty())
103 return nullptr;
104 }
105#endif
106
107 // TODO: CryptoAPI
108 // TODO: /dev/crypto
109
110 // Only base providers from here on out
111 if(provider.empty() == false && provider != "base") {
112 return nullptr;
113 }
114
115#if defined(BOTAN_HAS_AES)
116 if(algo == "AES-128") {
118 }
119
120 if(algo == "AES-192") {
122 }
123
124 if(algo == "AES-256") {
126 }
127#endif
128
129#if defined(BOTAN_HAS_ARIA)
130 if(algo == "ARIA-128") {
132 }
133
134 if(algo == "ARIA-192") {
136 }
137
138 if(algo == "ARIA-256") {
140 }
141#endif
142
143#if defined(BOTAN_HAS_SERPENT)
144 if(algo == "Serpent") {
146 }
147#endif
148
149#if defined(BOTAN_HAS_SHACAL2)
150 if(algo == "SHACAL2") {
152 }
153#endif
154
155#if defined(BOTAN_HAS_TWOFISH)
156 if(algo == "Twofish") {
158 }
159#endif
160
161#if defined(BOTAN_HAS_THREEFISH_512)
162 if(algo == "Threefish-512") {
164 }
165#endif
166
167#if defined(BOTAN_HAS_BLOWFISH)
168 if(algo == "Blowfish") {
170 }
171#endif
172
173#if defined(BOTAN_HAS_CAMELLIA)
174 if(algo == "Camellia-128") {
176 }
177
178 if(algo == "Camellia-192") {
180 }
181
182 if(algo == "Camellia-256") {
184 }
185#endif
186
187#if defined(BOTAN_HAS_DES)
188 if(algo == "DES") {
189 return std::make_unique<DES>();
190 }
191
192 if(algo == "TripleDES" || algo == "3DES" || algo == "DES-EDE") {
194 }
195#endif
196
197#if defined(BOTAN_HAS_NOEKEON)
198 if(algo == "Noekeon") {
200 }
201#endif
202
203#if defined(BOTAN_HAS_CAST_128)
204 if(algo == "CAST-128" || algo == "CAST5") {
206 }
207#endif
208
209#if defined(BOTAN_HAS_IDEA)
210 if(algo == "IDEA") {
211 return std::make_unique<IDEA>();
212 }
213#endif
214
215#if defined(BOTAN_HAS_KUZNYECHIK)
216 if(algo == "Kuznyechik") {
218 }
219#endif
220
221#if defined(BOTAN_HAS_SEED)
222 if(algo == "SEED") {
223 return std::make_unique<SEED>();
224 }
225#endif
226
227#if defined(BOTAN_HAS_SM4)
228 if(algo == "SM4") {
229 return std::make_unique<SM4>();
230 }
231#endif
232
233 const SCAN_Name req(algo);
234
235#if defined(BOTAN_HAS_GOST_28147_89)
236 if(req.algo_name() == "GOST-28147-89") {
237 return std::make_unique<GOST_28147_89>(req.arg(0, "R3411_94_TestParam"));
238 }
239#endif
240
241#if defined(BOTAN_HAS_CASCADE)
242 if(req.algo_name() == "Cascade" && req.arg_count() == 2) {
243 auto c1 = BlockCipher::create(req.arg(0));
244 auto c2 = BlockCipher::create(req.arg(1));
245
246 if(c1 && c2) {
248 }
249 }
250#endif
251
252#if defined(BOTAN_HAS_LION)
253 if(req.algo_name() == "Lion" && req.arg_count_between(2, 3)) {
254 auto hash = HashFunction::create(req.arg(0));
255 auto stream = StreamCipher::create(req.arg(1));
256
257 if(hash && stream) {
258 const size_t block_size = req.arg_as_integer(2, 1024);
260 }
261 }
262#endif
263
266
267 return nullptr;
268}
#define BOTAN_UNUSED
Definition assert.h:144
static std::unique_ptr< BlockCipher > create(std::string_view algo_spec, std::string_view provider="")
static std::unique_ptr< HashFunction > create(std::string_view algo_spec, std::string_view provider="")
Definition hash.cpp:111
static std::unique_ptr< StreamCipher > create(std::string_view algo_spec, std::string_view provider="")
std::unique_ptr< BlockCipher > make_commoncrypto_block_cipher(std::string_view name)

◆ create_or_throw()

std::unique_ptr< BlockCipher > Botan::BlockCipher::create_or_throw ( std::string_view algo_spec,
std::string_view provider = "" )
staticinherited

Create an instance based on a name, or throw if the algo/provider combination cannot be found. If provider is empty then best available is chosen.

Definition at line 38 of file block_cipher.cpp.

271 {
272 if(auto bc = BlockCipher::create(algo, provider)) {
273 return bc;
274 }
275 throw Lookup_Error("Block cipher", algo, provider);
276}

◆ decrypt() [1/4]

void Botan::BlockCipher::decrypt ( const uint8_t in[],
uint8_t out[] ) const
inlineinherited

Decrypt a block.

Parameters
inThe ciphertext block to be decrypted as a byte array. Must be of length block_size().
outThe byte array designated to hold the decrypted block. Must be of length block_size().

Definition at line 96 of file block_cipher.h.

96{ decrypt_n(in, out, 1); }
virtual void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const=0

◆ decrypt() [2/4]

void Botan::BlockCipher::decrypt ( std::span< const uint8_t > in,
std::span< uint8_t > out ) const
inlineinherited

Decrypt one or more blocks

Parameters
inthe input buffer (multiple of block_size())
outthe output buffer (same size as in)

Definition at line 144 of file block_cipher.h.

144 {
145 return decrypt_n(in.data(), out.data(), in.size() / block_size());
146 }

◆ decrypt() [3/4]

void Botan::BlockCipher::decrypt ( std::span< uint8_t > block) const
inlineinherited

Decrypt one or more blocks

Parameters
Block Ciphersthe input/output buffer (multiple of block_size())

Definition at line 126 of file block_cipher.h.

126 {
127 return decrypt_n(block.data(), block.data(), block.size() / block_size());
128 }

◆ decrypt() [4/4]

void Botan::BlockCipher::decrypt ( uint8_t block[]) const
inlineinherited

Decrypt a block.

Parameters
Block Ciphersthe ciphertext block to be decrypted Must be of length block_size(). Will hold the result when the function has finished.

Definition at line 112 of file block_cipher.h.

112{ decrypt_n(block, block, 1); }

◆ decrypt_n()

void Botan::Serpent::decrypt_n ( const uint8_t in[],
uint8_t out[],
size_t blocks ) const
overridevirtual

Decrypt one or more blocks

Parameters
inthe input buffer (multiple of block_size())
outthe output buffer (same size as in)
blocksthe number of blocks to process

Implements Botan::BlockCipher.

Definition at line 174 of file serpent.cpp.

174 {
175 using namespace Botan::Serpent_F;
176
178
179#if defined(BOTAN_HAS_SERPENT_AVX512)
181 while(blocks >= 16) {
182 avx512_decrypt_16(in, out);
183 in += 16 * BLOCK_SIZE;
184 out += 16 * BLOCK_SIZE;
185 blocks -= 16;
186 }
187 }
188#endif
189
190#if defined(BOTAN_HAS_SERPENT_AVX2)
192 while(blocks >= 8) {
193 avx2_decrypt_8(in, out);
194 in += 8 * BLOCK_SIZE;
195 out += 8 * BLOCK_SIZE;
196 blocks -= 8;
197 }
198 }
199#endif
200
201#if defined(BOTAN_HAS_SERPENT_SIMD)
203 while(blocks >= 4) {
204 simd_decrypt_4(in, out);
205 in += 4 * BLOCK_SIZE;
206 out += 4 * BLOCK_SIZE;
207 blocks -= 4;
208 }
209 }
210#endif
211
212 const Key_Inserter key_xor(m_round_key.data());
213
214 for(size_t i = 0; i < blocks; ++i) {
215 uint32_t B0 = 0;
216 uint32_t B1 = 0;
217 uint32_t B2 = 0;
218 uint32_t B3 = 0;
219 load_le(in + 16 * i, B0, B1, B2, B3);
220
221 key_xor(32, B0, B1, B2, B3);
222 SBoxD7(B0, B1, B2, B3);
223 key_xor(31, B0, B1, B2, B3);
224 i_transform(B0, B1, B2, B3);
225 SBoxD6(B0, B1, B2, B3);
226 key_xor(30, B0, B1, B2, B3);
227 i_transform(B0, B1, B2, B3);
228 SBoxD5(B0, B1, B2, B3);
229 key_xor(29, B0, B1, B2, B3);
230 i_transform(B0, B1, B2, B3);
231 SBoxD4(B0, B1, B2, B3);
232 key_xor(28, B0, B1, B2, B3);
233 i_transform(B0, B1, B2, B3);
234 SBoxD3(B0, B1, B2, B3);
235 key_xor(27, B0, B1, B2, B3);
236 i_transform(B0, B1, B2, B3);
237 SBoxD2(B0, B1, B2, B3);
238 key_xor(26, B0, B1, B2, B3);
239 i_transform(B0, B1, B2, B3);
240 SBoxD1(B0, B1, B2, B3);
241 key_xor(25, B0, B1, B2, B3);
242 i_transform(B0, B1, B2, B3);
243 SBoxD0(B0, B1, B2, B3);
244 key_xor(24, B0, B1, B2, B3);
245 i_transform(B0, B1, B2, B3);
246 SBoxD7(B0, B1, B2, B3);
247 key_xor(23, B0, B1, B2, B3);
248 i_transform(B0, B1, B2, B3);
249 SBoxD6(B0, B1, B2, B3);
250 key_xor(22, B0, B1, B2, B3);
251 i_transform(B0, B1, B2, B3);
252 SBoxD5(B0, B1, B2, B3);
253 key_xor(21, B0, B1, B2, B3);
254 i_transform(B0, B1, B2, B3);
255 SBoxD4(B0, B1, B2, B3);
256 key_xor(20, B0, B1, B2, B3);
257 i_transform(B0, B1, B2, B3);
258 SBoxD3(B0, B1, B2, B3);
259 key_xor(19, B0, B1, B2, B3);
260 i_transform(B0, B1, B2, B3);
261 SBoxD2(B0, B1, B2, B3);
262 key_xor(18, B0, B1, B2, B3);
263 i_transform(B0, B1, B2, B3);
264 SBoxD1(B0, B1, B2, B3);
265 key_xor(17, B0, B1, B2, B3);
266 i_transform(B0, B1, B2, B3);
267 SBoxD0(B0, B1, B2, B3);
268 key_xor(16, B0, B1, B2, B3);
269 i_transform(B0, B1, B2, B3);
270 SBoxD7(B0, B1, B2, B3);
271 key_xor(15, B0, B1, B2, B3);
272 i_transform(B0, B1, B2, B3);
273 SBoxD6(B0, B1, B2, B3);
274 key_xor(14, B0, B1, B2, B3);
275 i_transform(B0, B1, B2, B3);
276 SBoxD5(B0, B1, B2, B3);
277 key_xor(13, B0, B1, B2, B3);
278 i_transform(B0, B1, B2, B3);
279 SBoxD4(B0, B1, B2, B3);
280 key_xor(12, B0, B1, B2, B3);
281 i_transform(B0, B1, B2, B3);
282 SBoxD3(B0, B1, B2, B3);
283 key_xor(11, B0, B1, B2, B3);
284 i_transform(B0, B1, B2, B3);
285 SBoxD2(B0, B1, B2, B3);
286 key_xor(10, B0, B1, B2, B3);
287 i_transform(B0, B1, B2, B3);
288 SBoxD1(B0, B1, B2, B3);
289 key_xor(9, B0, B1, B2, B3);
290 i_transform(B0, B1, B2, B3);
291 SBoxD0(B0, B1, B2, B3);
292 key_xor(8, B0, B1, B2, B3);
293 i_transform(B0, B1, B2, B3);
294 SBoxD7(B0, B1, B2, B3);
295 key_xor(7, B0, B1, B2, B3);
296 i_transform(B0, B1, B2, B3);
297 SBoxD6(B0, B1, B2, B3);
298 key_xor(6, B0, B1, B2, B3);
299 i_transform(B0, B1, B2, B3);
300 SBoxD5(B0, B1, B2, B3);
301 key_xor(5, B0, B1, B2, B3);
302 i_transform(B0, B1, B2, B3);
303 SBoxD4(B0, B1, B2, B3);
304 key_xor(4, B0, B1, B2, B3);
305 i_transform(B0, B1, B2, B3);
306 SBoxD3(B0, B1, B2, B3);
307 key_xor(3, B0, B1, B2, B3);
308 i_transform(B0, B1, B2, B3);
309 SBoxD2(B0, B1, B2, B3);
310 key_xor(2, B0, B1, B2, B3);
311 i_transform(B0, B1, B2, B3);
312 SBoxD1(B0, B1, B2, B3);
313 key_xor(1, B0, B1, B2, B3);
314 i_transform(B0, B1, B2, B3);
315 SBoxD0(B0, B1, B2, B3);
316 key_xor(0, B0, B1, B2, B3);
317
318 store_le(out + 16 * i, B0, B1, B2, B3);
319 }
320}
static bool has(CPUID::Feature feat)
Definition cpuid.h:94
BOTAN_FORCE_INLINE void SBoxD5(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void SBoxD4(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void SBoxD0(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void SBoxD6(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void SBoxD3(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void i_transform(T &B0, T &B1, T &B2, T &B3)
Definition serpent_fn.h:52
BOTAN_FORCE_INLINE void SBoxD2(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void SBoxD1(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void SBoxD7(T &a, T &b, T &c, T &d)
constexpr auto store_le(ParamTs &&... params)
Definition loadstor.h:736
constexpr auto load_le(ParamTs &&... params)
Definition loadstor.h:495

References Botan::Block_Cipher_Fixed_Params< 16, 16, 32, 8 >::assert_key_material_set(), Botan::CPUFeature::AVX2, Botan::CPUFeature::AVX512, Botan::Block_Cipher_Fixed_Params< 16, 16, 32, 8 >::BLOCK_SIZE, Botan::CPUID::has(), Botan::Serpent_F::i_transform(), Botan::load_le(), Botan::Serpent_F::SBoxD0(), Botan::Serpent_F::SBoxD1(), Botan::Serpent_F::SBoxD2(), Botan::Serpent_F::SBoxD3(), Botan::Serpent_F::SBoxD4(), Botan::Serpent_F::SBoxD5(), Botan::Serpent_F::SBoxD6(), Botan::Serpent_F::SBoxD7(), Botan::CPUFeature::SIMD_4X32, and Botan::store_le().

◆ decrypt_n_xex()

void Botan::BlockCipher::decrypt_n_xex ( uint8_t data[],
const uint8_t mask[],
size_t blocks ) const
inlineinherited

Decrypt blocks in XEX mode: XOR with the mask, decrypt, then XOR again

Parameters
datathe input/output buffer of blocks*block_size() bytes
maskthe mask to XOR with, same size as data
blocksthe number of blocks to process

Definition at line 189 of file block_cipher.h.

189 {
190 const size_t BS = block_size();
191 for(size_t i = 0; i != blocks * BS; ++i) {
192 data[i] ^= mask[i];
193 }
195 for(size_t i = 0; i != blocks * BS; ++i) {
196 data[i] ^= mask[i];
197 }
198 }

◆ encrypt() [1/4]

void Botan::BlockCipher::encrypt ( const uint8_t in[],
uint8_t out[] ) const
inlineinherited

Encrypt a block.

Parameters
inThe plaintext block to be encrypted as a byte array. Must be of length block_size().
outThe byte array designated to hold the encrypted block. Must be of length block_size().

Definition at line 87 of file block_cipher.h.

87{ encrypt_n(in, out, 1); }
virtual void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const=0

◆ encrypt() [2/4]

void Botan::BlockCipher::encrypt ( std::span< const uint8_t > in,
std::span< uint8_t > out ) const
inlineinherited

Encrypt one or more blocks

Parameters
inthe input buffer (multiple of block_size())
outthe output buffer (same size as in)

Definition at line 135 of file block_cipher.h.

135 {
136 return encrypt_n(in.data(), out.data(), in.size() / block_size());
137 }

◆ encrypt() [3/4]

void Botan::BlockCipher::encrypt ( std::span< uint8_t > block) const
inlineinherited

Encrypt one or more blocks

Parameters
Block Ciphersthe input/output buffer (multiple of block_size())

Definition at line 118 of file block_cipher.h.

118 {
119 return encrypt_n(block.data(), block.data(), block.size() / block_size());
120 }

◆ encrypt() [4/4]

void Botan::BlockCipher::encrypt ( uint8_t block[]) const
inlineinherited

Encrypt a block.

Parameters
Block Ciphersthe plaintext block to be encrypted Must be of length block_size(). Will hold the result when the function has finished.

Definition at line 104 of file block_cipher.h.

104{ encrypt_n(block, block, 1); }

◆ encrypt_n()

void Botan::Serpent::encrypt_n ( const uint8_t in[],
uint8_t out[],
size_t blocks ) const
overridevirtual

Encrypt one or more blocks

Parameters
inthe input buffer (multiple of block_size())
outthe output buffer (same size as in)
blocksthe number of blocks to process

Implements Botan::BlockCipher.

Definition at line 23 of file serpent.cpp.

23 {
24 using namespace Botan::Serpent_F;
25
27
28#if defined(BOTAN_HAS_SERPENT_AVX512)
30 while(blocks >= 16) {
31 avx512_encrypt_16(in, out);
32 in += 16 * BLOCK_SIZE;
33 out += 16 * BLOCK_SIZE;
34 blocks -= 16;
35 }
36 }
37#endif
38
39#if defined(BOTAN_HAS_SERPENT_AVX2)
41 while(blocks >= 8) {
42 avx2_encrypt_8(in, out);
43 in += 8 * BLOCK_SIZE;
44 out += 8 * BLOCK_SIZE;
45 blocks -= 8;
46 }
47 }
48#endif
49
50#if defined(BOTAN_HAS_SERPENT_SIMD)
52 while(blocks >= 4) {
53 simd_encrypt_4(in, out);
54 in += 4 * BLOCK_SIZE;
55 out += 4 * BLOCK_SIZE;
56 blocks -= 4;
57 }
58 }
59#endif
60
61 const Key_Inserter key_xor(m_round_key.data());
62
63 for(size_t i = 0; i < blocks; ++i) {
64 uint32_t B0 = 0;
65 uint32_t B1 = 0;
66 uint32_t B2 = 0;
67 uint32_t B3 = 0;
68 load_le(in + 16 * i, B0, B1, B2, B3);
69
70 key_xor(0, B0, B1, B2, B3);
71 SBoxE0(B0, B1, B2, B3);
72 transform(B0, B1, B2, B3);
73 key_xor(1, B0, B1, B2, B3);
74 SBoxE1(B0, B1, B2, B3);
75 transform(B0, B1, B2, B3);
76 key_xor(2, B0, B1, B2, B3);
77 SBoxE2(B0, B1, B2, B3);
78 transform(B0, B1, B2, B3);
79 key_xor(3, B0, B1, B2, B3);
80 SBoxE3(B0, B1, B2, B3);
81 transform(B0, B1, B2, B3);
82 key_xor(4, B0, B1, B2, B3);
83 SBoxE4(B0, B1, B2, B3);
84 transform(B0, B1, B2, B3);
85 key_xor(5, B0, B1, B2, B3);
86 SBoxE5(B0, B1, B2, B3);
87 transform(B0, B1, B2, B3);
88 key_xor(6, B0, B1, B2, B3);
89 SBoxE6(B0, B1, B2, B3);
90 transform(B0, B1, B2, B3);
91 key_xor(7, B0, B1, B2, B3);
92 SBoxE7(B0, B1, B2, B3);
93 transform(B0, B1, B2, B3);
94 key_xor(8, B0, B1, B2, B3);
95 SBoxE0(B0, B1, B2, B3);
96 transform(B0, B1, B2, B3);
97 key_xor(9, B0, B1, B2, B3);
98 SBoxE1(B0, B1, B2, B3);
99 transform(B0, B1, B2, B3);
100 key_xor(10, B0, B1, B2, B3);
101 SBoxE2(B0, B1, B2, B3);
102 transform(B0, B1, B2, B3);
103 key_xor(11, B0, B1, B2, B3);
104 SBoxE3(B0, B1, B2, B3);
105 transform(B0, B1, B2, B3);
106 key_xor(12, B0, B1, B2, B3);
107 SBoxE4(B0, B1, B2, B3);
108 transform(B0, B1, B2, B3);
109 key_xor(13, B0, B1, B2, B3);
110 SBoxE5(B0, B1, B2, B3);
111 transform(B0, B1, B2, B3);
112 key_xor(14, B0, B1, B2, B3);
113 SBoxE6(B0, B1, B2, B3);
114 transform(B0, B1, B2, B3);
115 key_xor(15, B0, B1, B2, B3);
116 SBoxE7(B0, B1, B2, B3);
117 transform(B0, B1, B2, B3);
118 key_xor(16, B0, B1, B2, B3);
119 SBoxE0(B0, B1, B2, B3);
120 transform(B0, B1, B2, B3);
121 key_xor(17, B0, B1, B2, B3);
122 SBoxE1(B0, B1, B2, B3);
123 transform(B0, B1, B2, B3);
124 key_xor(18, B0, B1, B2, B3);
125 SBoxE2(B0, B1, B2, B3);
126 transform(B0, B1, B2, B3);
127 key_xor(19, B0, B1, B2, B3);
128 SBoxE3(B0, B1, B2, B3);
129 transform(B0, B1, B2, B3);
130 key_xor(20, B0, B1, B2, B3);
131 SBoxE4(B0, B1, B2, B3);
132 transform(B0, B1, B2, B3);
133 key_xor(21, B0, B1, B2, B3);
134 SBoxE5(B0, B1, B2, B3);
135 transform(B0, B1, B2, B3);
136 key_xor(22, B0, B1, B2, B3);
137 SBoxE6(B0, B1, B2, B3);
138 transform(B0, B1, B2, B3);
139 key_xor(23, B0, B1, B2, B3);
140 SBoxE7(B0, B1, B2, B3);
141 transform(B0, B1, B2, B3);
142 key_xor(24, B0, B1, B2, B3);
143 SBoxE0(B0, B1, B2, B3);
144 transform(B0, B1, B2, B3);
145 key_xor(25, B0, B1, B2, B3);
146 SBoxE1(B0, B1, B2, B3);
147 transform(B0, B1, B2, B3);
148 key_xor(26, B0, B1, B2, B3);
149 SBoxE2(B0, B1, B2, B3);
150 transform(B0, B1, B2, B3);
151 key_xor(27, B0, B1, B2, B3);
152 SBoxE3(B0, B1, B2, B3);
153 transform(B0, B1, B2, B3);
154 key_xor(28, B0, B1, B2, B3);
155 SBoxE4(B0, B1, B2, B3);
156 transform(B0, B1, B2, B3);
157 key_xor(29, B0, B1, B2, B3);
158 SBoxE5(B0, B1, B2, B3);
159 transform(B0, B1, B2, B3);
160 key_xor(30, B0, B1, B2, B3);
161 SBoxE6(B0, B1, B2, B3);
162 transform(B0, B1, B2, B3);
163 key_xor(31, B0, B1, B2, B3);
164 SBoxE7(B0, B1, B2, B3);
165 key_xor(32, B0, B1, B2, B3);
166
167 store_le(out + 16 * i, B0, B1, B2, B3);
168 }
169}
BOTAN_FORCE_INLINE void transform(T &B0, T &B1, T &B2, T &B3)
Definition serpent_fn.h:35
BOTAN_FORCE_INLINE void SBoxE0(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void SBoxE1(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void SBoxE3(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void SBoxE5(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void SBoxE6(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void SBoxE2(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void SBoxE4(T &a, T &b, T &c, T &d)
BOTAN_FORCE_INLINE void SBoxE7(T &a, T &b, T &c, T &d)

References Botan::Block_Cipher_Fixed_Params< 16, 16, 32, 8 >::assert_key_material_set(), Botan::CPUFeature::AVX2, Botan::CPUFeature::AVX512, Botan::Block_Cipher_Fixed_Params< 16, 16, 32, 8 >::BLOCK_SIZE, Botan::CPUID::has(), Botan::load_le(), Botan::Serpent_F::SBoxE0(), Botan::Serpent_F::SBoxE1(), Botan::Serpent_F::SBoxE2(), Botan::Serpent_F::SBoxE3(), Botan::Serpent_F::SBoxE4(), Botan::Serpent_F::SBoxE5(), Botan::Serpent_F::SBoxE6(), Botan::Serpent_F::SBoxE7(), Botan::CPUFeature::SIMD_4X32, Botan::store_le(), and Botan::Serpent_F::transform().

◆ encrypt_n_xex()

void Botan::BlockCipher::encrypt_n_xex ( uint8_t data[],
const uint8_t mask[],
size_t blocks ) const
inlineinherited

Encrypt blocks in XEX mode: XOR with the mask, encrypt, then XOR again

Parameters
datathe input/output buffer of blocks*block_size() bytes
maskthe mask to XOR with, same size as data
blocksthe number of blocks to process

Definition at line 171 of file block_cipher.h.

171 {
172 const size_t BS = block_size();
173 for(size_t i = 0; i != blocks * BS; ++i) {
174 data[i] ^= mask[i];
175 }
177 for(size_t i = 0; i != blocks * BS; ++i) {
178 data[i] ^= mask[i];
179 }
180 }

◆ has_keying_material()

bool Botan::Serpent::has_keying_material ( ) const
overridevirtual

Test whether a key has been set on this object

Returns
true if a key has been set on this object

Implements Botan::SymmetricAlgorithm.

Definition at line 322 of file serpent.cpp.

322 {
323 return !m_round_key.empty();
324}

◆ key_spec()

Key_Length_Specification Botan::Block_Cipher_Fixed_Params< BS, KMIN, KMAX, KMOD, BlockCipher >::key_spec ( ) const
inlinefinalvirtualinherited

Return the key lengths supported by this cipher

Returns
the fixed key length specification

Implements Botan::SymmetricAlgorithm.

Definition at line 246 of file block_cipher.h.

◆ maximum_keylength()

size_t Botan::SymmetricAlgorithm::maximum_keylength ( ) const
inlineinherited

Return the largest acceptable key length

Returns
maximum allowed key length

Definition at line 130 of file sym_algo.h.

130{ return key_spec().maximum_keylength(); }
Key_Length_Specification key_spec() const final
size_t maximum_keylength() const
Definition sym_algo.h:58

◆ minimum_keylength()

size_t Botan::SymmetricAlgorithm::minimum_keylength ( ) const
inlineinherited

Return the smallest acceptable key length

Returns
minimum allowed key length

Definition at line 136 of file sym_algo.h.

136{ return key_spec().minimum_keylength(); }
size_t minimum_keylength() const
Definition sym_algo.h:52

◆ name()

std::string Botan::Serpent::name ( ) const
inlineoverridevirtual

Return the name of this algorithm

Returns
the algorithm name

Implements Botan::SymmetricAlgorithm.

Definition at line 28 of file serpent.h.

28{ return "Serpent"; }

◆ new_object()

std::unique_ptr< BlockCipher > Botan::Serpent::new_object ( ) const
inlineoverridevirtual

Create a new uninitialized object of the same type

Returns
new object representing the same algorithm as *this

Implements Botan::BlockCipher.

Definition at line 30 of file serpent.h.

30{ return std::make_unique<Serpent>(); }

◆ parallel_bytes()

size_t Botan::BlockCipher::parallel_bytes ( ) const
inlineinherited

Return the preferred input size for bulk processing

Returns
preferred parallelism of this cipher in bytes

Definition at line 71 of file block_cipher.h.

◆ parallelism()

size_t Botan::Serpent::parallelism ( ) const
inlineoverridevirtual

Return how many blocks this cipher processes in parallel

Returns
native parallelism of this cipher in blocks

Reimplemented from Botan::BlockCipher.

Definition at line 32 of file serpent.h.

32{ return 4; }

◆ provider()

std::string Botan::Serpent::provider ( ) const
overridevirtual

Return the name of the provider implementing this object

Returns
provider information about this implementation. Default is "base", might also return "sse2", "avx2", "openssl", or some other arbitrary string.

Reimplemented from Botan::BlockCipher.

Definition at line 394 of file serpent.cpp.

394 {
395#if defined(BOTAN_HAS_SERPENT_AVX512)
396 if(auto feat = CPUID::check(CPUID::Feature::AVX512)) {
397 return *feat;
398 }
399#endif
400
401#if defined(BOTAN_HAS_SERPENT_AVX2)
402 if(auto feat = CPUID::check(CPUID::Feature::AVX2)) {
403 return *feat;
404 }
405#endif
406
407#if defined(BOTAN_HAS_SERPENT_SIMD)
408 if(auto feat = CPUID::check(CPUID::Feature::SIMD_4X32)) {
409 return *feat;
410 }
411#endif
412
413 return "base";
414}
static std::optional< std::string > check(CPUID::Feature feat)
Definition cpuid.h:67

References Botan::CPUFeature::AVX2, Botan::CPUFeature::AVX512, Botan::CPUID::check(), and Botan::CPUFeature::SIMD_4X32.

◆ providers()

std::vector< std::string > Botan::BlockCipher::providers ( std::string_view algo_spec)
staticinherited

List the providers available for a given block cipher

Returns
list of available providers for this algorithm, empty if not available
Parameters
algo_specalgorithm name

Definition at line 45 of file block_cipher.cpp.

278 {
279 return probe_providers_of<BlockCipher>(algo, {"base", "commoncrypto"});
280}
std::vector< std::string > probe_providers_of(std::string_view algo_spec, const std::vector< std::string > &possible={"base"})
Definition scan_name.h:99

◆ set_key() [1/3]

void Botan::SymmetricAlgorithm::set_key ( const OctetString & key)
inherited

Set the symmetric key of this object.

Parameters
keythe SymmetricKey to be set.

Definition at line 149 of file sym_algo.cpp.

14 {
15 set_key(std::span{key.begin(), key.length()});
16}

◆ set_key() [2/3]

void Botan::SymmetricAlgorithm::set_key ( const uint8_t key[],
size_t length )
inlineinherited

Set the symmetric key of this object.

Parameters
keythe to be set as a byte array.
lengthin bytes of key param

Definition at line 162 of file sym_algo.h.

◆ set_key() [3/3]

void Botan::SymmetricAlgorithm::set_key ( std::span< const uint8_t > key)
inherited

Set the symmetric key of this object.

Parameters
keythe contiguous byte range to be set.

Definition at line 155 of file sym_algo.cpp.

22 {
23 if(!valid_keylength(key.size())) {
24 throw Invalid_Key_Length(name(), key.size());
25 }
27}

◆ valid_keylength()

bool Botan::SymmetricAlgorithm::valid_keylength ( size_t length) const
inlineinherited

Check whether a given key length is valid for this algorithm.

Parameters
lengththe key length to be checked.
Returns
true if the key length is valid.

Definition at line 143 of file sym_algo.h.

143{ return key_spec().valid_keylength(length); }
bool valid_keylength(size_t length) const
Definition sym_algo.h:44

Member Data Documentation

◆ ParallelismMult

size_t Botan::BlockCipher::ParallelismMult
staticconstexprinherited

Multiplier on a block cipher's native parallelism

Usually notable performance gains come from further loop blocking, at least for 2 or 4x

Definition at line 53 of file block_cipher.h.


The documentation for this class was generated from the following files: