Botan 3.8.1
Crypto and TLS for C&
mode_pad.h
Go to the documentation of this file.
1/*
2* CBC Padding Methods
3* (C) 1999-2008,2013 Jack Lloyd
4* (C) 2016 René Korthaus, Rohde & Schwarz Cybersecurity
5*
6* Botan is released under the Simplified BSD License (see license.txt)
7*/
8
9#ifndef BOTAN_MODE_PADDING_H_
10#define BOTAN_MODE_PADDING_H_
11
12#include <botan/secmem.h>
13#include <memory>
14#include <string>
15
16namespace Botan {
17
18/**
19* Block Cipher Mode Padding Method
20* This class is pretty limited, it cannot deal well with
21* randomized padding methods, or any padding method that
22* wants to add more than one block. For instance, it should
23* be possible to define cipher text stealing mode as simply
24* a padding mode for CBC, which happens to consume the last
25* two block (and requires use of the block cipher).
26*/
28 public:
29 /**
30 * Get a block cipher padding mode by name (eg "NoPadding" or "PKCS7")
31 * @param algo_spec block cipher padding mode name
32 */
33 static std::unique_ptr<BlockCipherModePaddingMethod> create(std::string_view algo_spec);
34
35 /**
36 * Add padding bytes to buffer.
37 * @param buffer data to pad
38 * @param final_block_bytes size of the final block in bytes
39 * @param block_size size of each block in bytes
40 */
41 virtual void add_padding(secure_vector<uint8_t>& buffer, size_t final_block_bytes, size_t block_size) const = 0;
42
43 /**
44 * Remove padding bytes from block
45 * @param block the last block
46 * @param len the size of the block in bytes
47 * @return number of data bytes, or if the padding is invalid returns len
48 */
49 virtual size_t unpad(const uint8_t block[], size_t len) const = 0;
50
51 /**
52 * @param block_size of the cipher
53 * @return valid block size for this padding mode
54 */
55 virtual bool valid_blocksize(size_t block_size) const = 0;
56
57 /**
58 * @return name of the mode
59 */
60 virtual std::string name() const = 0;
61
62 /**
63 * virtual destructor
64 */
65 virtual ~BlockCipherModePaddingMethod() = default;
66};
67
68/**
69* PKCS#7 Padding
70*/
72 public:
73 void add_padding(secure_vector<uint8_t>& buffer, size_t final_block_bytes, size_t block_size) const override;
74
75 size_t unpad(const uint8_t[], size_t) const override;
76
77 bool valid_blocksize(size_t bs) const override { return (bs > 2 && bs < 256); }
78
79 std::string name() const override { return "PKCS7"; }
80};
81
82/**
83* ANSI X9.23 Padding
84*/
86 public:
87 void add_padding(secure_vector<uint8_t>& buffer, size_t final_block_bytes, size_t block_size) const override;
88
89 size_t unpad(const uint8_t[], size_t) const override;
90
91 bool valid_blocksize(size_t bs) const override { return (bs > 2 && bs < 256); }
92
93 std::string name() const override { return "X9.23"; }
94};
95
96/**
97* One And Zeros Padding (ISO/IEC 9797-1, padding method 2)
98*/
100 public:
101 void add_padding(secure_vector<uint8_t>& buffer, size_t final_block_bytes, size_t block_size) const override;
102
103 size_t unpad(const uint8_t[], size_t) const override;
104
105 bool valid_blocksize(size_t bs) const override { return (bs > 2); }
106
107 std::string name() const override { return "OneAndZeros"; }
108};
109
110/**
111* ESP Padding (RFC 4303)
112*/
114 public:
115 void add_padding(secure_vector<uint8_t>& buffer, size_t final_block_bytes, size_t block_size) const override;
116
117 size_t unpad(const uint8_t[], size_t) const override;
118
119 bool valid_blocksize(size_t bs) const override { return (bs > 2 && bs < 256); }
120
121 std::string name() const override { return "ESP"; }
122};
123
124/**
125* Null Padding
126*/
128 public:
129 void add_padding(secure_vector<uint8_t>&, size_t, size_t) const override { /* no padding */
130 }
131
132 size_t unpad(const uint8_t[], size_t size) const override { return size; }
133
134 bool valid_blocksize(size_t) const override { return true; }
135
136 std::string name() const override { return "NoPadding"; }
137};
138
139} // namespace Botan
140
141#endif
#define BOTAN_FUZZER_API
Definition api.h:51
#define BOTAN_TEST_API
Definition api.h:39
std::string name() const override
Definition mode_pad.h:93
void add_padding(secure_vector< uint8_t > &buffer, size_t final_block_bytes, size_t block_size) const override
Definition mode_pad.cpp:116
size_t unpad(const uint8_t[], size_t) const override
Definition mode_pad.cpp:153
bool valid_blocksize(size_t bs) const override
Definition mode_pad.h:91
virtual std::string name() const =0
static std::unique_ptr< BlockCipherModePaddingMethod > create(std::string_view algo_spec)
Definition mode_pad.cpp:19
virtual bool valid_blocksize(size_t block_size) const =0
virtual size_t unpad(const uint8_t block[], size_t len) const =0
virtual ~BlockCipherModePaddingMethod()=default
virtual void add_padding(secure_vector< uint8_t > &buffer, size_t final_block_bytes, size_t block_size) const =0
std::string name() const override
Definition mode_pad.h:121
bool valid_blocksize(size_t bs) const override
Definition mode_pad.h:119
size_t unpad(const uint8_t[], size_t) const override
Definition mode_pad.cpp:290
void add_padding(secure_vector< uint8_t > &buffer, size_t final_block_bytes, size_t block_size) const override
Definition mode_pad.cpp:251
size_t unpad(const uint8_t[], size_t size) const override
Definition mode_pad.h:132
std::string name() const override
Definition mode_pad.h:136
bool valid_blocksize(size_t) const override
Definition mode_pad.h:134
void add_padding(secure_vector< uint8_t > &, size_t, size_t) const override
Definition mode_pad.h:129
size_t unpad(const uint8_t[], size_t) const override
Definition mode_pad.cpp:219
std::string name() const override
Definition mode_pad.h:107
void add_padding(secure_vector< uint8_t > &buffer, size_t final_block_bytes, size_t block_size) const override
Definition mode_pad.cpp:181
bool valid_blocksize(size_t bs) const override
Definition mode_pad.h:105
void add_padding(secure_vector< uint8_t > &buffer, size_t final_block_bytes, size_t block_size) const override
Definition mode_pad.cpp:46
bool valid_blocksize(size_t bs) const override
Definition mode_pad.h:77
size_t unpad(const uint8_t[], size_t) const override
Definition mode_pad.cpp:82
std::string name() const override
Definition mode_pad.h:79
std::vector< T, secure_allocator< T > > secure_vector
Definition secmem.h:65