/* * Copyright (c) 2024 - Nathanne Isip * This file is part of QuickDigest5. * * N8 is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published * by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * * N8 is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with N8. If not, see . */ /** * @file QuickDigest5.hpp * @author [Nathanne Isip](https://github.com/nthnn) * @brief A header file for the QuickDigest5 class, a utility for MD5 hashing. * * This file defines the `QuickDigest5` class, which provides functionalities * for computing MD5 hashes of strings and files. The class also includes * static methods for converting the computed hash to a string representation. * * @note This class is designed as a final class and cannot be inherited. */ #ifndef QUICKDIGEST5_HPP #define QUICKDIGEST5_HPP #include #include #include #include #include #include /** * @class QuickDigest5 * @brief A utility class for MD5 hashing of strings and files. * * The `QuickDigest5` class provides methods to compute MD5 hashes * for input strings and files, as well as converting the hash * to a hexadecimal string representation. This class encapsulates * the internal MD5 computation logic and exposes static methods * for ease of use. * * @note This class is marked `final` and cannot be subclassed. */ class QuickDigest5 final { private: /** * @brief Size of the input in bytes. */ uint64_t size; /** * @brief Buffer for the MD5 computation. */ std::vector buffer; /** * @brief Input data to be processed for MD5 hashing. */ std::vector input; /** * @brief Stores the resulting MD5 hash. */ std::vector digest; /** * @brief Padding used during MD5 computation. * * A static array defining the padding values required * to align the input data to a 512-bit boundary. */ static uint8_t padding[64]; /** * @brief Shift values used during MD5 computation. * * A static array defining the shift amounts for each * step of the MD5 algorithm. */ static uint32_t shift[64]; /** * @brief Precomputed sine-derived constants. * * A static array of constants derived from the fractional part * of sine values, used in the MD5 algorithm. */ static uint32_t sineDerivation[64]; /** * @brief Finalizes the MD5 computation. * * This method performs any final transformations required * to complete the MD5 hash computation. */ void finalize(); /** * @brief Processes a single 512-bit block of input data. * * @param inputVec A vector containing the input data to process. */ void step(const std::vector& inputVec); /** * @brief Updates the internal state with input data. * * @param inputBuffer A pointer to the input data buffer. * @param inputLength The length of the input data in bytes. */ void update( const uint8_t* inputBuffer, size_t inputLength ); protected: /** * @brief Constructs a `QuickDigest5` object. * * The constructor is protected to prevent direct instantiation. * Users should rely on the static methods provided by the class. */ QuickDigest5(); public: /** * @brief Computes the MD5 hash of a string. * * @param input The input string to hash. * @return A vector of bytes representing the MD5 hash. */ static std::vector digestString(const std::string& input); /** * @brief Computes the MD5 hash of a file. * * @param filepath The path to the file to hash. * @return A vector of bytes representing the MD5 hash. */ static std::vector digestFile(const std::string& filepath); /** * @brief Computes the MD5 hash of a string and returns it as a hex string. * * @param input The input string to hash. * @return A string representing the MD5 hash in hexadecimal format. */ static std::string toHash(const std::string& input); /** * @brief Computes the MD5 hash of a file and returns it as a hex string. * * @param filepath The path to the file to hash. * @return A string representing the MD5 hash in hexadecimal format. */ static std::string fileToHash(const std::string& filepath); }; #endif