/*
 *  Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All rights reserved.
 *  
 *  License to copy and use this software is granted provided that it is identified 
 *  as the "RSA Data Security, Inc. MD5 Message-Digest Algorithm" in all material 
 *  mentioning or referencing this software or this function.
 *
 *  License is also granted to make and use derivative works provided that such 
 *  works are identified as "derived from the RSA Data Security, Inc. MD5 Message-
 *  Digest Algorithm" in all material mentioning or referencing the derived work.
 *  
 *  RSA Data Security, Inc. makes no representations concerning either the 
 *  merchantability of this software or the suitability of this software for any 
 *  particular purpose. It is provided "as is" without express or implied warranty 
 *  of any kind. These notices must be retained in any copies of any part of this
 *  documentation and/or software.
 */

#ifndef MD5SUM_MD5_H
#define MD5SUM_MD5_H

typedef unsigned int uint32_t;
typedef unsigned char uint8_t;

/*
 *  Define the MD5 context structure
 *  Please DO NOT change the order or contents of the structure as various assembler files depend on it !!
 */
 
typedef struct {
   uint32_t  state  [ 4];     /* state (ABCD) */
   uint32_t  count  [ 2];     /* number of bits, modulo 2^64 (least sig word first) */
   uint8_t   buffer [64];     /* input buffer for incomplete buffer data */
} MD5_CTX;

void   MD5Init   ( MD5_CTX* ctx );
void   MD5Update ( MD5_CTX* ctx, const uint8_t* buf, size_t len );
void   MD5Final  ( uint8_t digest [16], MD5_CTX* ctx );

class CMD5Helper
{
public:

	CMD5Helper(BOOL bInitialize = TRUE)
	{
		if (bInitialize)
			Initialize();
	}

	BOOL Initialize()
	{
		memset(&m_MD5Context, 0, sizeof(m_MD5Context));
		MD5Init(&m_MD5Context);
		m_nTotalBytes = 0;
		return TRUE;
	}

	inline void AddData(const void * pData, int nBytes)
	{
		MD5Update(&m_MD5Context, (const unsigned char *) pData, nBytes);
		m_nTotalBytes += nBytes;
	}

	BOOL GetResult(unsigned char cResult[16])
	{
		memset(cResult, 0, 16);
		MD5Final(cResult, &m_MD5Context);
		return TRUE;
	}

protected:

	MD5_CTX m_MD5Context;
	BOOL m_bStopped;
	int m_nTotalBytes;
};


#endif /* MD5SUM_MD5_H */
