// MD5HashGeneratorDialog.cpp : implementation file
//
#include "stdafx.h"
#include "exile.h"
#include "MD5HashGeneratorDialog.h"
#include "Security.h"
#include "../MD5/MD5.h"
#include "Registry.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMD5HashGeneratorDialog dialog
CMD5HashGeneratorDialog::CMD5HashGeneratorDialog(CWnd* pParent /*=NULL*/)
: CDialog(CMD5HashGeneratorDialog::IDD, pParent)
{
//{{AFX_DATA_INIT(CMD5HashGeneratorDialog)
m_nHashOptions = 0;
m_strMd5Hash = _T("");
m_strFileName = _T("");
//}}AFX_DATA_INIT
}
void CMD5HashGeneratorDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMD5HashGeneratorDialog)
DDX_Radio(pDX, IDC_HASHFILE, m_nHashOptions);
DDX_Text(pDX, IDC_MD5HASH, m_strMd5Hash);
DDX_Text(pDX, IDC_FILENAME, m_strFileName);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMD5HashGeneratorDialog, CDialog)
//{{AFX_MSG_MAP(CMD5HashGeneratorDialog)
ON_BN_CLICKED(IDC_HASHFILE, OnHashfile)
ON_BN_CLICKED(IDC_HASHMESSAGE, OnHashmessage)
ON_BN_CLICKED(IDC_GENERATE, OnGenerate)
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_BROWSE, OnBrowse)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMD5HashGeneratorDialog message handlers
BOOL CMD5HashGeneratorDialog::OnInitDialog()
{
CDialog::OnInitDialog();
// Loading settings
CRegistry reg;
CString strKey;
reg.SetRootKey(HKEY_CURRENT_USER);
strKey.LoadString(IDS_REGKEY);
strKey += _T("\\MD5 Hash Generator");
BOOL bKey = reg.SetKey(strKey, FALSE);
m_nHashOptions = bKey ? reg.ReadInt("Hash Options") : 0;
m_gcControls.AddControl(FILEHASH, GetDlgItem(IDC_FILENAME)->GetSafeHwnd());
m_gcControls.AddControl(FILEHASH, GetDlgItem(IDC_BROWSE)->GetSafeHwnd());
m_gcControls.AddControl(MESSAGEHASH, GetDlgItem(IDC_MESSAGE)->GetSafeHwnd());
// TODO: Loading options
m_gcControls.SwitchControls(m_nHashOptions ? FILEHASH : MESSAGEHASH, CGroupedControls::SWS_DISABLE,
CGroupedControls::SWS_ENABLE);
m_ctrlGenerate.SubclassDlgItem(IDC_GENERATE, this);
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CMD5HashGeneratorDialog::OnHashfile()
{
UpdateData();
m_gcControls.SwitchControls(m_nHashOptions ? FILEHASH : MESSAGEHASH, CGroupedControls::SWS_DISABLE,
CGroupedControls::SWS_ENABLE);
}
void CMD5HashGeneratorDialog::OnHashmessage()
{
UpdateData();
m_gcControls.SwitchControls(m_nHashOptions ? FILEHASH : MESSAGEHASH, CGroupedControls::SWS_DISABLE,
CGroupedControls::SWS_ENABLE);
}
void CMD5HashGeneratorDialog::OnGenerate()
{
UpdateData();
BeginWaitCursor();
MD5HASH hsMd5;
// If we're hashing a file
if(0 == m_nHashOptions)
{
if(m_strFileName.IsEmpty())
{
EndWaitCursor();
return;
} // if
CFile fData;
CFileException eFe;
if(!fData.Open(m_strFileName, CFile::modeRead | CFile::shareExclusive, &eFe))
{
// TODO: Meaningful error message
EndWaitCursor();
return;
} // if
HMD5CONTEXT hMd5;
if(!::Md5AcquireContext(hMd5))
{
EndWaitCursor();
return;
} // if
BYTE *pBuffer = new BYTE[BUFFER_SIZE]; // IO buffer
UINT unSize = sizeof(BYTE) * BUFFER_SIZE;
UINT unBytes = fData.Read((void *)pBuffer, unSize);
while(unBytes)
{
if(!::Md5HashBuffer(hMd5, pBuffer, unBytes))
{
delete [] pBuffer;
EndWaitCursor();
return;
} // if
unBytes = fData.Read((void *)pBuffer, unSize);
} // while
delete [] pBuffer;
::Md5HashFinal(hMd5, hsMd5);
::Md5ReleaseContext(hMd5);
} // if
else
{
CEdit *pMsg = ((CEdit *)GetDlgItem(IDC_MESSAGE));
if(!pMsg)
{
EndWaitCursor();
return;
} // if
// To avoid input or something
pMsg->EnableWindow(FALSE);
int nLength = pMsg->GetWindowTextLength();
size_t sData = nLength * sizeof(TCHAR);
size_t sBuffer = ::Md5GetExpandedBufferSize(sData);
// Allocating required buffer
BYTE *pBuffer = new BYTE[sBuffer];
pMsg->GetWindowText((LPTSTR)pBuffer, sBuffer);
// Hashing
if(!::Md5ExpandData(pBuffer, sData, sBuffer))
TRACE("Md5ExpandData() failed\n");
if(!::Md5HashData((MD5_WORD *)pBuffer, sBuffer / 64, hsMd5))
TRACE("Md5HashData() failed\n");
FreeBuffer(pBuffer, sBuffer);
pMsg->EnableWindow(TRUE);
} // else
m_strMd5Hash.Format(IDS_MD5HASHFORMAT, hsMd5.wA, hsMd5.wB, hsMd5.wC, hsMd5.wD);
UpdateData(FALSE);
EndWaitCursor();
}
void CMD5HashGeneratorDialog::OnDestroy()
{
BeginWaitCursor();
UpdateData();
// Saving settings
BeginWaitCursor();
CRegistry reg;
CString strKey;
reg.SetRootKey(HKEY_CURRENT_USER);
strKey.LoadString(IDS_REGKEY);
strKey += _T("\\MD5 Hash Generator");
if(reg.CreateKey(strKey))
{
reg.WriteInt("Hash Options", m_nHashOptions);
} // if
EndWaitCursor();
CDialog::OnDestroy();
}
void CMD5HashGeneratorDialog::OnBrowse()
{
CString strFilter;
strFilter.LoadString(IDS_FILTER);
CFileDialog dlgOpen(TRUE, 0, 0, OFN_HIDEREADONLY | OFN_NONETWORKBUTTON, strFilter, this);
if(IDCANCEL == dlgOpen.DoModal())
{
EndWaitCursor();
return;
} // if
m_strFileName = dlgOpen.GetPathName();
UpdateData(FALSE);
}