// MD5/IDEA Cipher Block Chaining
// Adapted from Andy Brown files to Win32 by Immortalware JTHZ

#ifndef __IDEA_H
#define __IDEA_H

#include <windows.h>

typedef struct{
	DWORD i[2]; // number of _bits_ handled mod 2^64
	DWORD buf[4]; // scratch buffer
	BYTE in[64]; // input buffer
	BYTE digest[16]; // actual digest after MD5Final call
}MD5_CTX;

typedef MD5_CTX* LPMD5_CTX;

// interface
void Encrypt(BYTE*,DWORD,LPBYTE);
void Decrypt(BYTE*,DWORD,LPBYTE);

// implementation
void generate_keys(LPBYTE);
void MD5(LPBYTE,int,LPBYTE);
void MD5Init(LPMD5_CTX);
void MD5Update(LPMD5_CTX,LPBYTE,WORD);
void MD5Final(LPMD5_CTX);
void Transform(LPDWORD,LPDWORD);
void encrypt_buffer(BYTE*,DWORD);
void decrypt_buffer(BYTE*,DWORD);
DWORD Mul(DWORD,DWORD);
WORD MulInv(WORD);
void Idea(LPWORD,LPWORD,LPWORD);
void InvertIdeaKey(LPWORD,LPWORD);
void ExpandUserKey(LPWORD,LPWORD);
void xor(LPBYTE,LPBYTE,DWORD);
void zero_vars();

#endif

