From db5bbbd6cf340fd8e77244ad452089fae0ff33ae Mon Sep 17 00:00:00 2001 From: Jordan Woyak Date: Sun, 4 Oct 2026 16:04:21 -0500 Subject: [PATCH] Common: Create MD5Context class and ComputeMD5 function to minimize exposure to mbedtls throughout the project. --- Source/Core/Common/Hash.cpp | 32 ++++++++++++++++++++++++++++++++ Source/Core/Common/Hash.h | 22 ++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/Source/Core/Common/Hash.cpp b/Source/Core/Common/Hash.cpp index f5b9da1b20..6e2ee8fb2b 100644 --- a/Source/Core/Common/Hash.cpp +++ b/Source/Core/Common/Hash.cpp @@ -9,6 +9,8 @@ #include +#include + #include "Common/CPUDetect.h" #include "Common/Intrinsics.h" @@ -457,4 +459,34 @@ u32 ComputeCRC32(std::string_view data) { return ComputeCRC32(reinterpret_cast(data.data()), data.size()); } + +struct MD5Context::Impl +{ + mbedtls_md5_context context; +}; + +MD5Context::MD5Context() : m_impl{std::make_unique()} +{ + mbedtls_md5_init(&m_impl->context); + mbedtls_md5_starts_ret(&m_impl->context); +} + +// FYI: mbedtls_md5_free is unnecessary. It just zeroes the struct. +MD5Context::~MD5Context() = default; + +void MD5Context::Update(std::span data) +{ + mbedtls_md5_update_ret(&m_impl->context, data.data(), data.size()); +} + +void MD5Context::Finish(u8* output) +{ + mbedtls_md5_finish_ret(&m_impl->context, output); +} + +void ComputeMD5(std::span input, u8* output) +{ + mbedtls_md5_ret(input.data(), input.size(), output); +} + } // namespace Common diff --git a/Source/Core/Common/Hash.h b/Source/Core/Common/Hash.h index 6166b74bd9..531dcd94e1 100644 --- a/Source/Core/Common/Hash.h +++ b/Source/Core/Common/Hash.h @@ -4,6 +4,8 @@ #pragma once #include +#include +#include #include #include "Common/CommonTypes.h" @@ -21,4 +23,24 @@ u32 StartCRC32(); u32 UpdateCRC32(u32 crc, const u8* data, size_t len); u32 ComputeCRC32(const u8* data, size_t len); u32 ComputeCRC32(std::string_view data); + +class MD5Context +{ +public: + MD5Context(); + ~MD5Context(); + + void Update(std::span data); + + // output should point to 16 bytes. + void Finish(u8* output); + +private: + struct Impl; + std::unique_ptr m_impl; +}; + +// output should point to 16 bytes. +void ComputeMD5(std::span input, u8* output); + } // namespace Common