LibTLS+LibCrypto: More ByteBuffer -> Span conversion

This commit is contained in:
Andreas Kling 2020-12-19 15:56:15 +01:00
parent 8e20208dd6
commit f82b0a78ef
13 changed files with 45 additions and 40 deletions

View file

@ -156,6 +156,13 @@ public:
return this->m_values + start;
}
ALWAYS_INLINE constexpr void overwrite(size_t offset, const void* data, size_t data_size)
{
// make sure we're not told to write past the end
ASSERT(offset + data_size <= size());
__builtin_memcpy(this->data() + offset, data, data_size);
}
ALWAYS_INLINE constexpr size_t copy_to(Span<typename RemoveConst<T>::Type> other) const
{
ASSERT(other.size() >= size());

View file

@ -68,12 +68,10 @@ public:
m_inner_hasher.update(message, length);
}
TagType process(const ReadonlyBytes& span) { return process(span.data(), span.size()); }
TagType process(const ByteBuffer& buffer) { return process(buffer.data(), buffer.size()); }
TagType process(ReadonlyBytes span) { return process(span.data(), span.size()); }
TagType process(const StringView& string) { return process((const u8*)string.characters_without_null_termination(), string.length()); }
void update(const ReadonlyBytes& span) { return update(span.data(), span.size()); }
void update(const ByteBuffer& buffer) { return update(buffer.data(), buffer.size()); }
void update(ReadonlyBytes span) { return update(span.data(), span.size()); }
void update(const StringView& string) { return update((const u8*)string.characters_without_null_termination(), string.length()); }
TagType digest()
@ -106,7 +104,7 @@ private:
auto block_size = m_inner_hasher.block_size();
u8 v_key[block_size];
__builtin_memset(v_key, 0, block_size);
ByteBuffer key_buffer = ByteBuffer::wrap(v_key, block_size);
auto key_buffer = Bytes { v_key, block_size };
// m_key_data is zero'd, so copying the data in
// the first few bytes leaves the rest zero, which
// is exactly what we want (zero padding)
@ -129,8 +127,8 @@ private:
}
}
void derive_key(const ByteBuffer& key) { derive_key(key.data(), key.size()); }
void derive_key(const StringView& key) { derive_key((const u8*)key.characters_without_null_termination(), key.length()); }
void derive_key(ReadonlyBytes key) { derive_key(key.data(), key.size()); }
void derive_key(const StringView& key) { derive_key(key.bytes()); }
HashType m_inner_hasher, m_outer_hasher;
u8 m_key_data[2048];

View file

@ -45,8 +45,11 @@ public:
static size_t digest_size() { return DigestSize; };
virtual void update(const u8*, size_t) = 0;
virtual void update(const ByteBuffer& buffer) { update(buffer.data(), buffer.size()); };
virtual void update(const StringView& string) { update((const u8*)string.characters_without_null_termination(), string.length()); };
void update(const Bytes& buffer) { update(buffer.data(), buffer.size()); };
void update(const ReadonlyBytes& buffer) { update(buffer.data(), buffer.size()); };
void update(const ByteBuffer& buffer) { update(buffer.data(), buffer.size()); };
void update(const StringView& string) { update((const u8*)string.characters_without_null_termination(), string.length()); };
virtual DigestType peek() = 0;
virtual DigestType digest() = 0;

View file

@ -117,6 +117,8 @@ struct MultiHashDigestVariant {
class Manager final : public HashFunction<0, MultiHashDigestVariant> {
public:
using HashFunction::update;
Manager()
{
m_pre_init_buffer = ByteBuffer::create_zeroed(0);
@ -142,8 +144,6 @@ public:
m_md5 = nullptr;
}
virtual void update(const ByteBuffer& buffer) override { update(buffer.data(), buffer.size()); };
virtual void update(const StringView& string) override { update((const u8*)string.characters_without_null_termination(), string.length()); };
inline size_t digest_size() const
{
switch (m_kind) {

View file

@ -75,14 +75,14 @@ constexpr u8 PADDING[] = {
class MD5 final : public HashFunction<512, MD5Digest> {
public:
using HashFunction::update;
MD5()
{
m_buffer = ByteBuffer::wrap(m_data_buffer, sizeof(m_data_buffer));
m_buffer = Bytes { m_data_buffer, sizeof(m_data_buffer) };
}
virtual void update(const u8*, size_t) override;
virtual void update(const ByteBuffer& buffer) override { update(buffer.data(), buffer.size()); };
virtual void update(const StringView& string) override { update((const u8*)string.characters_without_null_termination(), string.length()); };
virtual DigestType digest() override;
virtual DigestType peek() override;
@ -118,7 +118,7 @@ private:
u32 m_A { MD5Constants::init_A }, m_B { MD5Constants::init_B }, m_C { MD5Constants::init_C }, m_D { MD5Constants::init_D };
u32 m_count[2] { 0, 0 };
ByteBuffer m_buffer;
Bytes m_buffer;
u8 m_data_buffer[64];
};

View file

@ -56,6 +56,8 @@ struct SHA1Digest {
class SHA1 final : public HashFunction<512, SHA1Digest<160 / 8>> {
public:
using HashFunction::update;
SHA1()
{
reset();
@ -63,9 +65,6 @@ public:
virtual void update(const u8*, size_t) override;
virtual void update(const ByteBuffer& buffer) override { update(buffer.data(), buffer.size()); };
virtual void update(const StringView& string) override { update((const u8*)string.characters_without_null_termination(), string.length()); };
virtual DigestType digest() override;
virtual DigestType peek() override;

View file

@ -96,6 +96,8 @@ struct SHA2Digest {
// FIXME: I want template<size_t BlockSize> but the compiler gets confused
class SHA256 final : public HashFunction<512, SHA2Digest<256 / 8>> {
public:
using HashFunction::update;
SHA256()
{
reset();
@ -103,9 +105,6 @@ public:
virtual void update(const u8*, size_t) override;
virtual void update(const ByteBuffer& buffer) override { update(buffer.data(), buffer.size()); };
virtual void update(const StringView& string) override { update((const u8*)string.characters_without_null_termination(), string.length()); };
virtual DigestType digest() override;
virtual DigestType peek() override;
@ -149,6 +148,8 @@ private:
class SHA512 final : public HashFunction<1024, SHA2Digest<512 / 8>> {
public:
using HashFunction::update;
SHA512()
{
reset();
@ -156,9 +157,6 @@ public:
virtual void update(const u8*, size_t) override;
virtual void update(const ByteBuffer& buffer) override { update(buffer.data(), buffer.size()); };
virtual void update(const StringView& string) override { update((const u8*)string.characters_without_null_termination(), string.length()); };
virtual DigestType digest() override;
virtual DigestType peek() override;

View file

@ -41,7 +41,7 @@ public:
EMSA_PSS(Args... args)
: Code<HashFunction>(args...)
{
m_buffer = ByteBuffer::wrap(m_data_buffer, sizeof(m_data_buffer));
m_buffer = Bytes { m_data_buffer, sizeof(m_data_buffer) };
}
static constexpr auto SaltLength = SaltSize;
@ -72,7 +72,7 @@ public:
auto hash = hash_fn.digest();
u8 DB_data[em_length - HashFunction::DigestSize - 1];
auto DB = ByteBuffer::wrap(DB_data, em_length - HashFunction::DigestSize - 1);
auto DB = Bytes { DB_data, em_length - HashFunction::DigestSize - 1 };
auto DB_offset = 0;
for (size_t i = 0; i < em_length - SaltLength - HashFunction::DigestSize - 2; ++i)
@ -85,7 +85,7 @@ public:
auto mask_length = em_length - HashFunction::DigestSize - 1;
u8 DB_mask[mask_length];
auto DB_mask_buffer = ByteBuffer::wrap(DB_mask, mask_length);
auto DB_mask_buffer = Bytes { DB_mask, mask_length };
// FIXME: we should probably allow reading from u8*
MGF1(ReadonlyBytes { hash.data, HashFunction::DigestSize }, mask_length, DB_mask_buffer);
@ -123,7 +123,7 @@ public:
return VerificationConsistency::Inconsistent;
u8 DB_mask[mask_length];
auto DB_mask_buffer = ByteBuffer::wrap(DB_mask, mask_length);
auto DB_mask_buffer = Bytes { DB_mask, mask_length };
MGF1(H, mask_length, DB_mask_buffer);
u8 DB[mask_length];
@ -145,7 +145,7 @@ public:
auto* salt = DB + mask_length - SaltLength;
u8 m_prime[8 + HashFunction::DigestSize + SaltLength] { 0, 0, 0, 0, 0, 0, 0, 0 };
auto m_prime_buffer = ByteBuffer::wrap(m_prime, sizeof(m_prime));
auto m_prime_buffer = Bytes { m_prime, sizeof(m_prime) };
m_prime_buffer.overwrite(8, message_hash.data, HashFunction::DigestSize);
m_prime_buffer.overwrite(8 + HashFunction::DigestSize, salt, SaltLength);
@ -159,7 +159,7 @@ public:
return VerificationConsistency::Consistent;
}
void MGF1(ReadonlyBytes seed, size_t length, ByteBuffer& out)
void MGF1(ReadonlyBytes seed, size_t length, Bytes out)
{
auto& hash_fn = this->hasher();
ByteBuffer T = ByteBuffer::create_zeroed(0);
@ -173,7 +173,7 @@ public:
private:
u8 m_data_buffer[8 + HashFunction::DigestSize + SaltLength];
ByteBuffer m_buffer;
Bytes m_buffer;
};
}

View file

@ -204,7 +204,7 @@ void RSA_EMSA_PSS<HashFunction>::sign(ReadonlyBytes in, ByteBuffer& out)
auto mod_bits = m_rsa.private_key().modulus().trimmed_length() * sizeof(u32) * 8;
u8 EM[mod_bits];
auto EM_buf = ByteBuffer::wrap(EM, mod_bits);
auto EM_buf = Bytes { EM, mod_bits };
m_emsa_pss.encode(in, EM_buf, mod_bits - 1);
// -- sign via RSA

View file

@ -33,7 +33,7 @@ namespace TLS {
bool TLSv12::expand_key()
{
u8 key[192]; // soooooooo many constants
auto key_buffer = ByteBuffer::wrap(key, 192);
auto key_buffer = Bytes { key, sizeof(key) };
auto is_aead = this->is_aead();
@ -108,7 +108,7 @@ bool TLSv12::expand_key()
return true;
}
void TLSv12::pseudorandom_function(ByteBuffer& output, ReadonlyBytes secret, const u8* label, size_t label_length, ReadonlyBytes seed, ReadonlyBytes seed_b)
void TLSv12::pseudorandom_function(Bytes output, ReadonlyBytes secret, const u8* label, size_t label_length, ReadonlyBytes seed, ReadonlyBytes seed_b)
{
if (!secret.size()) {
dbg() << "null secret";
@ -124,7 +124,7 @@ void TLSv12::pseudorandom_function(ByteBuffer& output, ReadonlyBytes secret, con
auto l_seed_size = label_length + seed.size() + seed_b.size();
u8 l_seed[l_seed_size];
auto label_seed_buffer = ByteBuffer::wrap(l_seed, l_seed_size);
auto label_seed_buffer = Bytes { l_seed, l_seed_size };
label_seed_buffer.overwrite(0, label, label_length);
label_seed_buffer.overwrite(label_length, seed.data(), seed.size());
label_seed_buffer.overwrite(label_length + seed.size(), seed_b.data(), seed_b.size());
@ -133,7 +133,7 @@ void TLSv12::pseudorandom_function(ByteBuffer& output, ReadonlyBytes secret, con
u8 digest[digest_size];
auto digest_0 = ByteBuffer::wrap(digest, digest_size);
auto digest_0 = Bytes { digest, digest_size };
digest_0.overwrite(0, hmac.process(label_seed_buffer).immutable_data(), digest_size);

View file

@ -644,7 +644,7 @@ void TLSv12::ensure_hmac(size_t digest_size, bool local)
break;
}
auto hmac = make<Crypto::Authentication::HMAC<Crypto::Hash::Manager>>(ByteBuffer::wrap(local ? m_context.crypto.local_mac : m_context.crypto.remote_mac, digest_size), hash_kind);
auto hmac = make<Crypto::Authentication::HMAC<Crypto::Hash::Manager>>(ReadonlyBytes { local ? m_context.crypto.local_mac : m_context.crypto.remote_mac, digest_size }, hash_kind);
if (local)
m_hmac_local = move(hmac);
else

View file

@ -375,7 +375,7 @@ private:
size_t asn1_length(ReadonlyBytes, size_t* octets);
void pseudorandom_function(ByteBuffer& output, ReadonlyBytes secret, const u8* label, size_t label_length, ReadonlyBytes seed, ReadonlyBytes seed_b);
void pseudorandom_function(Bytes output, ReadonlyBytes secret, const u8* label, size_t label_length, ReadonlyBytes seed, ReadonlyBytes seed_b);
size_t key_length() const
{

View file

@ -1449,7 +1449,7 @@ static void hmac_sha1_test_process()
{
I_TEST((HMAC - SHA1 | Basic));
u8 key[] { 0xc8, 0x52, 0xe5, 0x4a, 0x2c, 0x03, 0x2b, 0xc9, 0x63, 0xd3, 0xc2, 0x79, 0x0f, 0x76, 0x43, 0xef, 0x36, 0xc3, 0x7a, 0xca };
Crypto::Authentication::HMAC<Crypto::Hash::SHA1> hmac(ByteBuffer::wrap(key, 20));
Crypto::Authentication::HMAC<Crypto::Hash::SHA1> hmac(ReadonlyBytes { key, sizeof(key) });
u8 result[] {
0x2c, 0x57, 0x32, 0x61, 0x3b, 0xa7, 0x84, 0x87, 0x0e, 0x4f, 0x42, 0x07, 0x2f, 0xf0, 0xe7, 0x41, 0xd7, 0x15, 0xf4, 0x56
};
@ -1466,7 +1466,7 @@ static void hmac_sha1_test_process()
{
I_TEST((HMAC - SHA1 | Reuse));
u8 key[] { 0xc8, 0x52, 0xe5, 0x4a, 0x2c, 0x03, 0x2b, 0xc9, 0x63, 0xd3, 0xc2, 0x79, 0x0f, 0x76, 0x43, 0xef, 0x36, 0xc3, 0x7a, 0xca };
Crypto::Authentication::HMAC<Crypto::Hash::SHA1> hmac(ByteBuffer::wrap(key, 20));
Crypto::Authentication::HMAC<Crypto::Hash::SHA1> hmac(ReadonlyBytes { key, sizeof(key) });
u8 result[] {
0x2c, 0x57, 0x32, 0x61, 0x3b, 0xa7, 0x84, 0x87, 0x0e, 0x4f, 0x42, 0x07, 0x2f, 0xf0, 0xe7, 0x41, 0xd7, 0x15, 0xf4, 0x56
};