Skip to content

Commit 9b2e92a

Browse files
committed
FIX: review comments
1 parent 19c722f commit 9b2e92a

File tree

6 files changed

+19
-10
lines changed

6 files changed

+19
-10
lines changed

src/lib/modes/aead/siv/siv.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ class BOTAN_TEST_API SIV_Decryption final : public SIV_Mode {
125125
}
126126

127127
size_t bytes_needed_for_finalization(size_t final_input_length) const override {
128+
BOTAN_ARG_CHECK(final_input_length >= tag_size(), "Sufficient input");
128129
return msg_buf().size() + final_input_length;
129130
}
130131

src/lib/modes/cbc/cbc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class CBC_Mode : public Cipher_Mode {
2828
size_t ideal_granularity() const final;
2929

3030
size_t bytes_needed_for_finalization(size_t final_input_length) const final {
31+
BOTAN_ARG_CHECK(final_input_length >= minimum_final_size(), "Sufficient input");
3132
return output_length(final_input_length);
3233
}
3334

src/lib/modes/cipher_mode.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include <botan/cipher_mode.h>
99

10+
#include <botan/internal/fmt.h>
1011
#include <botan/internal/parsing.h>
1112
#include <botan/internal/scan_name.h>
1213
#include <botan/internal/stream_mode.h>
@@ -177,4 +178,14 @@ std::vector<std::string> Cipher_Mode::providers(std::string_view algo_spec) {
177178
return providers;
178179
}
179180

181+
size_t Cipher_Mode::calculate_final_input_bytes(size_t final_block_length, size_t offset) const {
182+
if(offset > final_block_length) {
183+
throw Invalid_Argument(Botan::fmt("invalid offset in finalization of {}", name()));
184+
}
185+
186+
const size_t final_input_bytes = final_block_length - offset;
187+
BOTAN_DEBUG_ASSERT(final_input_bytes >= minimum_final_size());
188+
return final_input_bytes;
189+
}
190+
180191
} // namespace Botan

src/lib/modes/cipher_mode.h

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -203,15 +203,7 @@ class BOTAN_PUBLIC_API(2, 0) Cipher_Mode : public SymmetricAlgorithm {
203203
*/
204204
template <concepts::resizable_byte_buffer T>
205205
void finish(T& final_block, size_t offset = 0) {
206-
if(offset > final_block.size()) {
207-
throw Invalid_Argument("invalid offset");
208-
}
209-
210-
const auto final_input_bytes = final_block.size() - offset;
211-
if(final_input_bytes < minimum_final_size()) {
212-
throw Invalid_Argument("final input message is too small");
213-
}
214-
206+
const auto final_input_bytes = calculate_final_input_bytes(final_block.size(), offset);
215207
const auto final_buffer_bytes = bytes_needed_for_finalization(final_input_bytes);
216208

217209
// Make room for additional overhead to be produced during finalization
@@ -303,6 +295,9 @@ class BOTAN_PUBLIC_API(2, 0) Cipher_Mode : public SymmetricAlgorithm {
303295
* might also return "sse2", "avx2", "openssl", or some other arbitrary string.
304296
*/
305297
virtual std::string provider() const { return "base"; }
298+
299+
private:
300+
size_t calculate_final_input_bytes(size_t final_block_length, size_t offset) const;
306301
};
307302

308303
/**

src/lib/modes/xts/xts.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ size_t XTS_Mode::output_length(size_t input_length) const {
7777
}
7878

7979
size_t XTS_Mode::bytes_needed_for_finalization(size_t final_input_length) const {
80-
BOTAN_ASSERT_NOMSG(final_input_length >= minimum_final_size());
80+
BOTAN_ARG_CHECK(final_input_length >= minimum_final_size(), "Sufficient input");
8181
return final_input_length;
8282
}
8383

src/lib/prov/commoncrypto/commoncrypto_mode.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ size_t CommonCrypto_Cipher_Mode::minimum_final_size() const {
157157

158158
size_t CommonCrypto_Cipher_Mode::bytes_needed_for_finalization(size_t final_input_length) const {
159159
assert_key_material_set();
160+
BOTAN_ARG_CHECK(final_input_length >= minimum_final_size(), "Sufficient input");
160161
const auto expected_output_length = CCCryptorGetOutputLength(m_cipher, final_input_length, true);
161162

162163
// Ensure that the finalization sees all input bytes or is large enough to

0 commit comments

Comments
 (0)