Skip to content

Commit

Permalink
Refactor: AEAD_Mode::set_associated_data() uses std::span
Browse files Browse the repository at this point in the history
  • Loading branch information
reneme committed Feb 22, 2023
1 parent 8c3db3d commit 024ba23
Show file tree
Hide file tree
Showing 19 changed files with 46 additions and 43 deletions.
4 changes: 2 additions & 2 deletions src/lib/modes/aead/aead.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,10 @@

namespace Botan {

void AEAD_Mode::set_associated_data_n(size_t i, const uint8_t ad[], size_t ad_len)
void AEAD_Mode::set_associated_data_n(size_t i, std::span<const uint8_t> ad)
{
if(i == 0)
this->set_associated_data(ad, ad_len);
this->set_associated_data(ad);
else
throw Invalid_Argument("AEAD '" + name() + "' does not support multiple associated data");
}
Expand Down
14 changes: 9 additions & 5 deletions src/lib/modes/aead/aead.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@

#include <botan/cipher_mode.h>

#include <span>

namespace Botan {

/**
Expand Down Expand Up @@ -54,9 +56,10 @@ class BOTAN_PUBLIC_API(2,0) AEAD_Mode : public Cipher_Mode
* once (after set_key) is the optimum.
*
* @param ad the associated data
* @param ad_len length of add in bytes
*/
virtual void set_associated_data(const uint8_t ad[], size_t ad_len) = 0;
virtual void set_associated_data(std::span<const uint8_t> ad) = 0;
void set_associated_data(const uint8_t ad[], size_t ad_len)
{ set_associated_data(std::span(ad, ad_len)); }

/**
* Set associated data that is not included in the ciphertext but
Expand All @@ -75,7 +78,9 @@ class BOTAN_PUBLIC_API(2,0) AEAD_Mode : public Cipher_Mode
* @param ad the associated data
* @param ad_len length of add in bytes
*/
virtual void set_associated_data_n(size_t idx, const uint8_t ad[], size_t ad_len);
virtual void set_associated_data_n(size_t idx, std::span<const uint8_t> ad);
void set_associated_data_n(size_t idx, const uint8_t ad[], size_t ad_len)
{ set_associated_data_n(idx, std::span(ad, ad_len)); }

/**
* Returns the maximum supported number of associated data inputs which
Expand Down Expand Up @@ -116,8 +121,7 @@ class BOTAN_PUBLIC_API(2,0) AEAD_Mode : public Cipher_Mode
*
* @param ad the associated data
*/
template<typename Alloc>
void set_ad(const std::vector<uint8_t, Alloc>& ad)
void set_ad(std::span<const uint8_t> ad)
{
set_associated_data(ad.data(), ad.size());
}
Expand Down
12 changes: 6 additions & 6 deletions src/lib/modes/aead/ccm/ccm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,18 +91,18 @@ void CCM_Mode::key_schedule(const uint8_t key[], size_t length)
m_cipher->set_key(key, length);
}

void CCM_Mode::set_associated_data(const uint8_t ad[], size_t length)
void CCM_Mode::set_associated_data(std::span<const uint8_t> ad)
{
m_ad_buf.clear();

if(length)
if(!ad.empty())
{
// FIXME: support larger AD using length encoding rules
BOTAN_ARG_CHECK(length < (0xFFFF - 0xFF), "Supported CCM AD length");
BOTAN_ARG_CHECK(ad.size() < (0xFFFF - 0xFF), "Supported CCM AD length");

m_ad_buf.push_back(get_byte<0>(static_cast<uint16_t>(length)));
m_ad_buf.push_back(get_byte<1>(static_cast<uint16_t>(length)));
m_ad_buf += std::make_pair(ad, length);
m_ad_buf.push_back(get_byte<0>(static_cast<uint16_t>(ad.size())));
m_ad_buf.push_back(get_byte<1>(static_cast<uint16_t>(ad.size())));
m_ad_buf += ad;
while(m_ad_buf.size() % CCM_BS)
m_ad_buf.push_back(0); // pad with zeros to full block size
}
Expand Down
2 changes: 1 addition & 1 deletion src/lib/modes/aead/ccm/ccm.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class CCM_Mode : public AEAD_Mode
public:
size_t process(uint8_t buf[], size_t sz) override final;

void set_associated_data(const uint8_t ad[], size_t ad_len) override final;
void set_associated_data(std::span<const uint8_t> ad) override final;

bool associated_data_requires_key() const override final { return false; }

Expand Down
4 changes: 2 additions & 2 deletions src/lib/modes/aead/chacha20poly1305/chacha20poly1305.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,11 +58,11 @@ void ChaCha20Poly1305_Mode::key_schedule(const uint8_t key[], size_t length)
m_chacha->set_key(key, length);
}

void ChaCha20Poly1305_Mode::set_associated_data(const uint8_t ad[], size_t length)
void ChaCha20Poly1305_Mode::set_associated_data(std::span<const uint8_t> ad)
{
if(m_ctext_len > 0 || m_nonce_len > 0)
throw Invalid_State("Cannot set AD for ChaCha20Poly1305 while processing a message");
m_ad.assign(ad, ad + length);
m_ad.assign(ad.begin(), ad.end());
}

void ChaCha20Poly1305_Mode::update_len(size_t len)
Expand Down
2 changes: 1 addition & 1 deletion src/lib/modes/aead/chacha20poly1305/chacha20poly1305.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ namespace Botan {
class ChaCha20Poly1305_Mode : public AEAD_Mode
{
public:
void set_associated_data(const uint8_t ad[], size_t ad_len) override;
void set_associated_data(std::span<const uint8_t> ad) override final;

bool associated_data_requires_key() const override { return false; }

Expand Down
4 changes: 2 additions & 2 deletions src/lib/modes/aead/eax/eax.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,11 +107,11 @@ void EAX_Mode::key_schedule(const uint8_t key[], size_t length)
/*
* Set the EAX associated data
*/
void EAX_Mode::set_associated_data(const uint8_t ad[], size_t length)
void EAX_Mode::set_associated_data(std::span<const uint8_t> ad)
{
if(m_nonce_mac.empty() == false)
throw Invalid_State("Cannot set AD for EAX while processing a message");
m_ad_mac = eax_prf(1, block_size(), *m_cmac, ad, length);
m_ad_mac = eax_prf(1, block_size(), *m_cmac, ad.data(), ad.size());
}

void EAX_Mode::start_msg(const uint8_t nonce[], size_t nonce_len)
Expand Down
2 changes: 1 addition & 1 deletion src/lib/modes/aead/eax/eax.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ namespace Botan {
class EAX_Mode : public AEAD_Mode
{
public:
void set_associated_data(const uint8_t ad[], size_t ad_len) override final;
void set_associated_data(std::span<const uint8_t> ad) override final;

std::string name() const override final;

Expand Down
4 changes: 2 additions & 2 deletions src/lib/modes/aead/gcm/gcm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,9 +94,9 @@ void GCM_Mode::key_schedule(const uint8_t key[], size_t keylen)
m_ghash->set_key(H);
}

void GCM_Mode::set_associated_data(const uint8_t ad[], size_t ad_len)
void GCM_Mode::set_associated_data(std::span<const uint8_t> ad)
{
m_ghash->set_associated_data(ad, ad_len);
m_ghash->set_associated_data(ad.data(), ad.size());
}

void GCM_Mode::start_msg(const uint8_t nonce[], size_t nonce_len)
Expand Down
2 changes: 1 addition & 1 deletion src/lib/modes/aead/gcm/gcm.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class GHASH;
class GCM_Mode : public AEAD_Mode
{
public:
void set_associated_data(const uint8_t ad[], size_t ad_len) override final;
void set_associated_data(std::span<const uint8_t> ad) override final;

std::string name() const override final;

Expand Down
4 changes: 2 additions & 2 deletions src/lib/modes/aead/ocb/ocb.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -241,10 +241,10 @@ void OCB_Mode::key_schedule(const uint8_t key[], size_t length)
m_L = std::make_unique<L_computer>(*m_cipher);
}

void OCB_Mode::set_associated_data(const uint8_t ad[], size_t ad_len)
void OCB_Mode::set_associated_data(std::span<const uint8_t> ad)
{
assert_key_material_set();
m_ad_hash = ocb_hash(*m_L, *m_cipher, ad, ad_len);
m_ad_hash = ocb_hash(*m_L, *m_cipher, ad.data(), ad.size());
}

const secure_vector<uint8_t>&
Expand Down
2 changes: 1 addition & 1 deletion src/lib/modes/aead/ocb/ocb.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class L_computer;
class BOTAN_TEST_API OCB_Mode : public AEAD_Mode
{
public:
void set_associated_data(const uint8_t ad[], size_t ad_len) override final;
void set_associated_data(std::span<const uint8_t> ad) override final;

std::string name() const override final;

Expand Down
4 changes: 2 additions & 2 deletions src/lib/modes/aead/siv/siv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ size_t SIV_Mode::maximum_associated_data_inputs() const
return block_size() * 8 - 2;
}

void SIV_Mode::set_associated_data_n(size_t n, const uint8_t ad[], size_t length)
void SIV_Mode::set_associated_data_n(size_t n, std::span<const uint8_t> ad)
{
const size_t max_ads = maximum_associated_data_inputs();
if(n > max_ads)
Expand All @@ -100,7 +100,7 @@ void SIV_Mode::set_associated_data_n(size_t n, const uint8_t ad[], size_t length
if(n >= m_ad_macs.size())
m_ad_macs.resize(n+1);

m_ad_macs[n] = m_mac->process(ad, length);
m_ad_macs[n] = m_mac->process(ad.data(), ad.size()); // TODO: fix once GH #3294 is merged
}

void SIV_Mode::start_msg(const uint8_t nonce[], size_t nonce_len)
Expand Down
7 changes: 3 additions & 4 deletions src/lib/modes/aead/siv/siv.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,14 @@ class BOTAN_TEST_API SIV_Mode : public AEAD_Mode
* Sets the nth element of the vector of associated data
* @param n index into the AD vector
* @param ad associated data
* @param ad_len length of associated data in bytes
*/
void set_associated_data_n(size_t n, const uint8_t ad[], size_t ad_len) override final;
void set_associated_data_n(size_t n, std::span<const uint8_t> ad) override final;

size_t maximum_associated_data_inputs() const override final;

void set_associated_data(const uint8_t ad[], size_t ad_len) override final
void set_associated_data(std::span<const uint8_t> ad) override final
{
set_associated_data_n(0, ad, ad_len);
set_associated_data_n(0, ad);
}

std::string name() const override final;
Expand Down
10 changes: 5 additions & 5 deletions src/lib/tls/tls12/tls_cbc/tls_cbc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -138,16 +138,16 @@ std::vector<uint8_t> TLS_CBC_HMAC_AEAD_Mode::assoc_data_with_len(uint16_t len)
return ad;
}

void TLS_CBC_HMAC_AEAD_Mode::set_associated_data(const uint8_t ad[], size_t ad_len)
void TLS_CBC_HMAC_AEAD_Mode::set_associated_data(std::span<const uint8_t> ad)
{
if(ad_len != 13)
if(ad.size() != 13)
throw Invalid_Argument("Invalid TLS AEAD associated data length");
m_ad.assign(ad, ad + ad_len);
m_ad.assign(ad.begin(), ad.end());
}

void TLS_CBC_HMAC_AEAD_Encryption::set_associated_data(const uint8_t ad[], size_t ad_len)
void TLS_CBC_HMAC_AEAD_Encryption::set_associated_data(std::span<const uint8_t> ad)
{
TLS_CBC_HMAC_AEAD_Mode::set_associated_data(ad, ad_len);
TLS_CBC_HMAC_AEAD_Mode::set_associated_data(ad);

if(use_encrypt_then_mac())
{
Expand Down
4 changes: 2 additions & 2 deletions src/lib/tls/tls12/tls_cbc/tls_cbc.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class BOTAN_TEST_API TLS_CBC_HMAC_AEAD_Mode : public AEAD_Mode

std::string name() const override final;

void set_associated_data(const uint8_t ad[], size_t ad_len) override;
void set_associated_data(std::span<const uint8_t> ad) override;

size_t update_granularity() const override final;

Expand Down Expand Up @@ -127,7 +127,7 @@ class BOTAN_TEST_API TLS_CBC_HMAC_AEAD_Encryption final : public TLS_CBC_HMAC_AE
use_encrypt_then_mac)
{}

void set_associated_data(const uint8_t ad[], size_t ad_len) override;
void set_associated_data(std::span<const uint8_t> ad) override;

size_t output_length(size_t input_length) const override;

Expand Down
4 changes: 2 additions & 2 deletions src/lib/tls/tls13/tls_cipher_state.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ uint64_t Cipher_State::encrypt_record_fragment(const std::vector<uint8_t>& heade
BOTAN_ASSERT_NONNULL(m_encrypt);

m_encrypt->set_key(m_write_key);
m_encrypt->set_associated_data_vec(header);
m_encrypt->set_associated_data(header);
m_encrypt->start(current_nonce(m_write_seq_no, m_write_iv));
m_encrypt->finish(fragment);

Expand All @@ -253,7 +253,7 @@ uint64_t Cipher_State::decrypt_record_fragment(const std::vector<uint8_t>& heade
"fragment too short to decrypt");

m_decrypt->set_key(m_read_key);
m_decrypt->set_associated_data_vec(header);
m_decrypt->set_associated_data(header);
m_decrypt->start(current_nonce(m_read_seq_no, m_read_iv));

m_decrypt->finish(encrypted_fragment);
Expand Down
2 changes: 1 addition & 1 deletion src/tests/test_ocb.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ class OCB_Wide_Long_KAT_Tests final : public Text_Based_Test
const std::vector<uint8_t>& pt,
const std::vector<uint8_t>& ad)
{
enc.set_associated_data(ad.data(), ad.size());
enc.set_associated_data(ad);
enc.start(nonce.data(), nonce.size());
Botan::secure_vector<uint8_t> buf(pt.begin(), pt.end());
enc.finish(buf, 0);
Expand Down
2 changes: 1 addition & 1 deletion src/tests/test_tls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ class TLS_CBC_Tests final : public Text_Based_Test

tls_cbc.set_key(std::vector<uint8_t>(0));
std::vector<uint8_t> ad(13);
tls_cbc.set_associated_data(ad.data(), ad.size());
tls_cbc.set_associated_data(ad);

Botan::secure_vector<uint8_t> vec(record.begin(), record.end());

Expand Down

0 comments on commit 024ba23

Please sign in to comment.