You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

86 lines
1.7 KiB

/**
* @file md5.h
* A simple class for MD5 calculation
*
* @author Ben Gardner
* @license GPL v2+
*/
#ifndef MD5_H_INCLUDED
#define MD5_H_INCLUDED
#include "base_types.h"
class MD5
{
public:
MD5();
~MD5()
{
}
/**
* Start MD5 accumulation. Set bit count to 0 and buffer to mysterious
* initialization constants.
*/
void Init();
/**
* Update context to reflect the concatenation of another buffer full
* of bytes.
*/
void Update(const void *data, UINT32 len);
/**
* Final wrapup - pad to 64-byte boundary with the bit pattern
* 1 0* (64-bit count of bits processed, MSB-first)
*
* @param[out] digest calculated MD5 checksum
*/
void Final(UINT8 digest[16]);
/**
* The core of the MD5 algorithm, this alters an existing MD5 hash to
* reflect the addition of 16 longwords of new data. MD5::Update blocks
* the data and converts bytes into longwords for this routine.
*/
static void Transform(UINT32 buf[4], UINT32 in_data[16]);
/**
* Calculates MD5 for a block of data
*
* @param data data to calculate MD5 for
* @param length number of bytes in data
* @param[out] digest calculated MD5 checksum
*/
static void Calc(const void *data, UINT32 length, UINT8 digest[16]);
private:
UINT32 m_buf[4];
UINT32 m_bits[2];
UINT32 m_in32[16];
// Alternate view of m_in32
UINT8 *m_in8;
bool m_need_byteswap;
bool m_big_endian;
/**
* Reverse the bytes in 32-bit chunks.
* 'buf' might not be word-aligned.
*
* @param buf The byte array to reverse
* @param n_u32 The number of UINT32's in the data
*/
void reverse_u32(UINT8 *buf, int n_u32);
};
#endif /* MD5_H_INCLUDED */