diff --git a/Libraries/LibCrypto/BigInt/SignedBigInteger.cpp b/Libraries/LibCrypto/BigInt/SignedBigInteger.cpp index bda62f698c..005d148731 100644 --- a/Libraries/LibCrypto/BigInt/SignedBigInteger.cpp +++ b/Libraries/LibCrypto/BigInt/SignedBigInteger.cpp @@ -36,10 +36,10 @@ SignedBigInteger SignedBigInteger::import_data(const u8* ptr, size_t length) return { move(unsigned_data), sign }; } -size_t SignedBigInteger::export_data(AK::ByteBuffer& data) const +size_t SignedBigInteger::export_data(Bytes data) const { data[0] = m_sign; - auto bytes_view = data.slice_view(1, data.size() - 1); + auto bytes_view = data.slice(1, data.size() - 1); return m_unsigned_data.export_data(bytes_view) + 1; } diff --git a/Libraries/LibCrypto/BigInt/SignedBigInteger.h b/Libraries/LibCrypto/BigInt/SignedBigInteger.h index b76ed51c2d..81521fcff4 100644 --- a/Libraries/LibCrypto/BigInt/SignedBigInteger.h +++ b/Libraries/LibCrypto/BigInt/SignedBigInteger.h @@ -26,6 +26,7 @@ #pragma once +#include #include namespace Crypto { @@ -66,13 +67,7 @@ public: static SignedBigInteger import_data(const AK::StringView& data) { return import_data((const u8*)data.characters_without_null_termination(), data.length()); } static SignedBigInteger import_data(const u8* ptr, size_t length); - size_t export_data(AK::ByteBuffer& data) const; - size_t export_data(u8* ptr, size_t length) const - { - // Note: ByteBuffer::wrap() does a const_cast! - auto buffer = ByteBuffer::wrap(ptr, length); - return export_data(buffer); - } + size_t export_data(Bytes) const; static SignedBigInteger from_base10(StringView str); String to_base10() const; diff --git a/Libraries/LibCrypto/BigInt/UnsignedBigInteger.cpp b/Libraries/LibCrypto/BigInt/UnsignedBigInteger.cpp index 6cb11b74b3..64a603b48a 100644 --- a/Libraries/LibCrypto/BigInt/UnsignedBigInteger.cpp +++ b/Libraries/LibCrypto/BigInt/UnsignedBigInteger.cpp @@ -55,7 +55,7 @@ UnsignedBigInteger UnsignedBigInteger::create_invalid() return invalid; } -size_t UnsignedBigInteger::export_data(AK::ByteBuffer& data) const +size_t UnsignedBigInteger::export_data(Bytes data) const { size_t word_count = trimmed_length(); size_t out = 0; diff --git a/Libraries/LibCrypto/BigInt/UnsignedBigInteger.h b/Libraries/LibCrypto/BigInt/UnsignedBigInteger.h index b4e995e602..544fc68b2c 100644 --- a/Libraries/LibCrypto/BigInt/UnsignedBigInteger.h +++ b/Libraries/LibCrypto/BigInt/UnsignedBigInteger.h @@ -28,6 +28,7 @@ #include #include +#include #include #include #include @@ -58,13 +59,7 @@ public: return UnsignedBigInteger(ptr, length); } - size_t export_data(AK::ByteBuffer& data) const; - size_t export_data(u8* ptr, size_t length) const - { - // Note: ByteBuffer::wrap() does a const_cast! - auto buffer = ByteBuffer::wrap(ptr, length); - return export_data(buffer); - } + size_t export_data(Bytes) const; static UnsignedBigInteger from_base10(const String& str); String to_base10() const; diff --git a/Libraries/LibCrypto/PK/RSA.cpp b/Libraries/LibCrypto/PK/RSA.cpp index e7c8c26bfe..67a46c7e5d 100644 --- a/Libraries/LibCrypto/PK/RSA.cpp +++ b/Libraries/LibCrypto/PK/RSA.cpp @@ -125,7 +125,7 @@ void RSA::encrypt(const ByteBuffer& in, ByteBuffer& out) return; } auto exp = NumberTheory::ModularPower(in_integer, m_public_key.public_exponent(), m_public_key.modulus()); - auto size = exp.export_data(out); + auto size = exp.export_data(out.span()); // FIXME: We should probably not do this... if (size != out.size()) out = out.slice(out.size() - size, size); @@ -137,7 +137,7 @@ void RSA::decrypt(const ByteBuffer& in, ByteBuffer& out) auto in_integer = UnsignedBigInteger::import_data(in.data(), in.size()); auto exp = NumberTheory::ModularPower(in_integer, m_private_key.private_exponent(), m_private_key.modulus()); - auto size = exp.export_data(out); + auto size = exp.export_data(out.span()); auto align = m_private_key.length(); auto aligned_size = (size + align - 1) / align * align; @@ -151,7 +151,7 @@ void RSA::sign(const ByteBuffer& in, ByteBuffer& out) { auto in_integer = UnsignedBigInteger::import_data(in.data(), in.size()); auto exp = NumberTheory::ModularPower(in_integer, m_private_key.private_exponent(), m_private_key.modulus()); - auto size = exp.export_data(out); + auto size = exp.export_data(out.span()); out = out.slice(out.size() - size, size); } @@ -159,7 +159,7 @@ void RSA::verify(const ByteBuffer& in, ByteBuffer& out) { auto in_integer = UnsignedBigInteger::import_data(in.data(), in.size()); auto exp = NumberTheory::ModularPower(in_integer, m_public_key.public_exponent(), m_public_key.modulus()); - auto size = exp.export_data(out); + auto size = exp.export_data(out.span()); out = out.slice(out.size() - size, size); } diff --git a/Userland/test-crypto.cpp b/Userland/test-crypto.cpp index bc1532191e..629e09d4c6 100644 --- a/Userland/test-crypto.cpp +++ b/Userland/test-crypto.cpp @@ -1560,7 +1560,7 @@ void bigint_import_export() u8 target_buffer[128]; AK::fill_with_random(random_bytes, 128); auto encoded = Crypto::UnsignedBigInteger::import_data(random_bytes, 128); - encoded.export_data(target_buffer, 128); + encoded.export_data({ target_buffer, 128 }); if (memcmp(target_buffer, random_bytes, 128) != 0) FAIL(Could not roundtrip); else @@ -1570,7 +1570,7 @@ void bigint_import_export() I_TEST((BigInteger | BigEndian Encode / Decode roundtrip)); u8 target_buffer[128]; auto encoded = "12345678901234567890"_bigint; - auto size = encoded.export_data(target_buffer, 128); + auto size = encoded.export_data({ target_buffer, 128 }); auto decoded = Crypto::UnsignedBigInteger::import_data(target_buffer, size); if (encoded != decoded) FAIL(Could not roundtrip); @@ -1590,7 +1590,7 @@ void bigint_import_export() I_TEST((BigInteger | BigEndian Export)); auto number = "448378203247"_bigint; char exported[8] { 0 }; - auto exported_length = number.export_data((u8*)exported, 8); + auto exported_length = number.export_data({ exported, 8 }); if (exported_length == 5 && memcmp(exported + 3, "hello", 5) == 0) { PASS; } else { @@ -1877,7 +1877,7 @@ void bigint_signed_import_export() random_bytes[0] = 1; AK::fill_with_random(random_bytes + 1, 128); auto encoded = Crypto::SignedBigInteger::import_data(random_bytes, 129); - encoded.export_data(target_buffer, 129); + encoded.export_data({ target_buffer, 129 }); if (memcmp(target_buffer, random_bytes, 129) != 0) FAIL(Could not roundtrip); else @@ -1887,7 +1887,7 @@ void bigint_signed_import_export() I_TEST((Signed BigInteger | BigEndian Encode / Decode roundtrip)); u8 target_buffer[128]; auto encoded = "-12345678901234567890"_sbigint; - auto size = encoded.export_data(target_buffer, 128); + auto size = encoded.export_data({ target_buffer, 128 }); auto decoded = Crypto::SignedBigInteger::import_data(target_buffer, size); if (encoded != decoded) FAIL(Could not roundtrip);