From 73f585ceb4c3b111ca041bf403a75ab86cbae5e4 Mon Sep 17 00:00:00 2001 From: DexesTTP Date: Tue, 18 May 2021 20:15:20 +0200 Subject: [PATCH] LibCrypto: Use AK::Variant in MultiHashDigestVariant --- .../Libraries/LibCrypto/Hash/HashManager.h | 75 ++++++------------- Userland/Libraries/LibCrypto/Hash/MD5.h | 2 +- Userland/Libraries/LibCrypto/Hash/SHA1.h | 2 +- Userland/Libraries/LibCrypto/Hash/SHA2.h | 2 +- 4 files changed, 25 insertions(+), 56 deletions(-) diff --git a/Userland/Libraries/LibCrypto/Hash/HashManager.h b/Userland/Libraries/LibCrypto/Hash/HashManager.h index d018b661b5..37d95eefc9 100644 --- a/Userland/Libraries/LibCrypto/Hash/HashManager.h +++ b/Userland/Libraries/LibCrypto/Hash/HashManager.h @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -26,85 +27,53 @@ enum class HashKind { }; struct MultiHashDigestVariant { - constexpr static size_t Size = 0; + MultiHashDigestVariant(MD5::DigestType digest) + : m_digest(move(digest)) + { + } + MultiHashDigestVariant(SHA1::DigestType digest) - : sha1(digest) - , kind(HashKind::SHA1) + : m_digest(move(digest)) { } MultiHashDigestVariant(SHA256::DigestType digest) - : sha256(digest) - , kind(HashKind::SHA256) + : m_digest(move(digest)) { } MultiHashDigestVariant(SHA384::DigestType digest) - : sha384(digest) - , kind(HashKind::SHA384) + : m_digest(move(digest)) { } MultiHashDigestVariant(SHA512::DigestType digest) - : sha512(digest) - , kind(HashKind::SHA512) - { - } - - MultiHashDigestVariant(MD5::DigestType digest) - : md5(digest) - , kind(HashKind::MD5) + : m_digest(move(digest)) { } const u8* immutable_data() const { - switch (kind) { - case HashKind::MD5: - return md5.value().immutable_data(); - case HashKind::SHA1: - return sha1.value().immutable_data(); - case HashKind::SHA256: - return sha256.value().immutable_data(); - case HashKind::SHA384: - return sha384.value().immutable_data(); - case HashKind::SHA512: - return sha512.value().immutable_data(); - default: - case HashKind::None: - VERIFY_NOT_REACHED(); - break; - } + const u8* data = nullptr; + m_digest.visit( + [&](const Empty&) { VERIFY_NOT_REACHED(); }, + [&](const auto& value) { data = value.immutable_data(); }); + return data; } size_t data_length() { - switch (kind) { - case HashKind::MD5: - return md5.value().data_length(); - case HashKind::SHA1: - return sha1.value().data_length(); - case HashKind::SHA256: - return sha256.value().data_length(); - case HashKind::SHA384: - return sha384.value().data_length(); - case HashKind::SHA512: - return sha512.value().data_length(); - default: - case HashKind::None: - VERIFY_NOT_REACHED(); - break; - } + size_t length = 0; + m_digest.visit( + [&](const Empty&) { VERIFY_NOT_REACHED(); }, + [&](const auto& value) { length = value.data_length(); }); + return length; } - Optional sha1; - Optional sha256; - Optional sha384; - Optional sha512; - Optional md5; - HashKind kind { HashKind::None }; + using DigestVariant = Variant; + DigestVariant m_digest { Empty {} }; }; class Manager final : public HashFunction<0, MultiHashDigestVariant> { diff --git a/Userland/Libraries/LibCrypto/Hash/MD5.h b/Userland/Libraries/LibCrypto/Hash/MD5.h index 8e1e2b5595..d1cf9b3f54 100644 --- a/Userland/Libraries/LibCrypto/Hash/MD5.h +++ b/Userland/Libraries/LibCrypto/Hash/MD5.h @@ -18,7 +18,7 @@ struct MD5Digest { u8 data[Size]; const u8* immutable_data() const { return data; } - size_t data_length() { return Size; } + size_t data_length() const { return Size; } }; namespace MD5Constants { diff --git a/Userland/Libraries/LibCrypto/Hash/SHA1.h b/Userland/Libraries/LibCrypto/Hash/SHA1.h index fd7da1ea14..5e70b6606d 100644 --- a/Userland/Libraries/LibCrypto/Hash/SHA1.h +++ b/Userland/Libraries/LibCrypto/Hash/SHA1.h @@ -31,7 +31,7 @@ struct SHA1Digest { constexpr static size_t Size = Bytes; const u8* immutable_data() const { return data; } - size_t data_length() { return Bytes; } + size_t data_length() const { return Bytes; } }; class SHA1 final : public HashFunction<512, SHA1Digest<160 / 8>> { diff --git a/Userland/Libraries/LibCrypto/Hash/SHA2.h b/Userland/Libraries/LibCrypto/Hash/SHA2.h index c49b5dae71..a72f926171 100644 --- a/Userland/Libraries/LibCrypto/Hash/SHA2.h +++ b/Userland/Libraries/LibCrypto/Hash/SHA2.h @@ -77,7 +77,7 @@ struct SHA2Digest { u8 data[Bytes]; constexpr static size_t Size = Bytes; const u8* immutable_data() const { return data; } - size_t data_length() { return Bytes; } + size_t data_length() const { return Bytes; } }; // FIXME: I want template but the compiler gets confused