Patch level : 10.0
Files correlati : authoriz.exe Ricompilazione Demo : [ ] Commento : Aggiunto supporto per chiavi MD5 git-svn-id: svn://10.65.10.50/trunk@20001 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
f0505681cb
commit
01639dcf9f
536
server/MD5Checksum.cpp
Executable file
536
server/MD5Checksum.cpp
Executable file
@ -0,0 +1,536 @@
|
||||
/*****************************************************************************************
|
||||
|
||||
*** MD5Checksum.cpp: implementation of the MD5Checksum class.
|
||||
|
||||
*** Developed by Langfine Ltd.
|
||||
*** Released to the public domain 12/Nov/2001.
|
||||
*** Please visit our website www.langfine.com
|
||||
|
||||
*** Any modifications must be clearly commented to distinguish them from Langfine's
|
||||
*** original source code. Please advise Langfine of useful modifications so that we
|
||||
*** can make them generally available.
|
||||
|
||||
*****************************************************************************************/
|
||||
|
||||
|
||||
/****************************************************************************************
|
||||
This software is derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm.
|
||||
Incorporation of this statement is a condition of use; please see the RSA
|
||||
Data Security Inc copyright notice below:-
|
||||
|
||||
Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All
|
||||
rights reserved.
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
*****************************************************************************************/
|
||||
|
||||
/****************************************************************************************
|
||||
This implementation of the RSA MD5 Algorithm was written by Langfine Ltd
|
||||
(www.langfine.com).
|
||||
|
||||
Langfine Ltd 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.
|
||||
|
||||
In addition to the above, Langfine make no warrant or assurances regarding the
|
||||
accuracy of this implementation of the MD5 checksum algorithm nor any assurances regarding
|
||||
its suitability for any purposes.
|
||||
|
||||
This implementation may be used freely provided that Langfine is credited
|
||||
in a copyright or similar notices (eg, RSA MD5 Algorithm implemented by Langfine
|
||||
Ltd.) and provided that the RSA Data Security notices are complied with.
|
||||
*/
|
||||
|
||||
|
||||
#include <wx/wx.h>
|
||||
|
||||
#include "MD5Checksum.h"
|
||||
#include "MD5ChecksumDefines.h"
|
||||
|
||||
#include <wx/file.h>
|
||||
#include "wx/filename.h"
|
||||
|
||||
|
||||
/*****************************************************************************************
|
||||
FUNCTION: wxMD5Checksum::GetMD5
|
||||
DETAILS: static, public
|
||||
DESCRIPTION: Gets the MD5 checksum for a specified file
|
||||
RETURNS: wxString : the hexadecimal MD5 checksum for the specified file
|
||||
ARGUMENTS: wxString& strFilePath : the full pathname of the specified file
|
||||
NOTES: Provides an interface to the wxMD5Checksum class. 'strFilePath' name should
|
||||
hold the full pathname of the file, eg C:\My Documents\Arcticle.txt.
|
||||
NB. If any problems occur with opening or reading this file, a CFileException
|
||||
will be thrown; callers of this function should be ready to catch this
|
||||
exception.
|
||||
*****************************************************************************************/
|
||||
wxString wxMD5Checksum::GetMD5(const wxString& strFilePath)
|
||||
{
|
||||
if(!wxFileName::FileExists(strFilePath))
|
||||
return wxEmptyString;
|
||||
|
||||
//open the file as a binary file in readonly mode, denying write access
|
||||
wxFile File(strFilePath, wxFile::read);
|
||||
//the file has been successfully opened, so now get and return its checksum
|
||||
return GetMD5(File);
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************************
|
||||
FUNCTION: wxMD5Checksum::GetMD5
|
||||
DETAILS: static, public
|
||||
DESCRIPTION: Gets the MD5 checksum for a specified file
|
||||
RETURNS: wxString : the hexadecimal MD5 checksum for the specified file
|
||||
ARGUMENTS: wxFile& File : the specified file
|
||||
NOTES: Provides an interface to the wxMD5Checksum class. 'File' should be open in
|
||||
binary readonly mode before calling this function.
|
||||
NB. Callers of this function should be ready to catch any CFileException
|
||||
thrown by the wxFile functions
|
||||
*****************************************************************************************/
|
||||
wxString wxMD5Checksum::GetMD5(wxFile& File)
|
||||
{
|
||||
wxMD5Checksum MD5Checksum; //checksum object
|
||||
int nLength = 0; //number of bytes read from the file
|
||||
const int nBufferSize = 1024; //checksum the file in blocks of 1024 bytes
|
||||
unsigned char Buffer[nBufferSize]; //buffer for data read from the file
|
||||
|
||||
//checksum the file in blocks of 1024 bytes
|
||||
while ((nLength = File.Read( Buffer, nBufferSize )) > 0 )
|
||||
{
|
||||
MD5Checksum.Update( Buffer, nLength );
|
||||
}
|
||||
|
||||
//finalise the checksum and return it
|
||||
return MD5Checksum.Final();
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************************
|
||||
FUNCTION: wxMD5Checksum::GetMD5
|
||||
DETAILS: static, public
|
||||
DESCRIPTION: Gets the MD5 checksum for data in a unsigned char array
|
||||
RETURNS: wxString : the hexadecimal MD5 checksum for the specified data
|
||||
ARGUMENTS: unsigned char* pBuf : pointer to the unsigned char array
|
||||
unsigned int nLength : number of BYTEs of data to be checksumed
|
||||
NOTES: Provides an interface to the wxMD5Checksum class. Any data that can
|
||||
be cast to a unsigned char array of known length can be checksummed by this
|
||||
function. Typically, wxString and char arrays will be checksumed,
|
||||
although this function can be used to check the integrity of any unsigned char array.
|
||||
A buffer of zero length can be checksummed; all buffers of zero length
|
||||
will return the same checksum.
|
||||
*****************************************************************************************/
|
||||
wxString wxMD5Checksum::GetMD5(unsigned char* pBuf, unsigned int nLength)
|
||||
{
|
||||
//calculate and return the checksum
|
||||
wxMD5Checksum MD5Checksum;
|
||||
MD5Checksum.Update( pBuf, nLength );
|
||||
return MD5Checksum.Final();
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************************
|
||||
FUNCTION: wxMD5Checksum::RotateLeft
|
||||
DETAILS: private
|
||||
DESCRIPTION: Rotates the bits in a 32 bit unsigned long left by a specified amount
|
||||
RETURNS: The rotated unsigned long
|
||||
ARGUMENTS: unsigned long x : the value to be rotated
|
||||
int n : the number of bits to rotate by
|
||||
*****************************************************************************************/
|
||||
unsigned long wxMD5Checksum::RotateLeft(unsigned long x, int n)
|
||||
{
|
||||
//check that unsigned long is 4 bytes long - true in Visual C++ 6 and 32 bit Windows
|
||||
wxASSERT( sizeof(x) == 4 );
|
||||
|
||||
//rotate and return x
|
||||
return (x << n) | (x >> (32-n));
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************************
|
||||
FUNCTION: wxMD5Checksum::FF
|
||||
DETAILS: protected
|
||||
DESCRIPTION: Implementation of basic MD5 transformation algorithm
|
||||
RETURNS: none
|
||||
ARGUMENTS: unsigned long &A, B, C, D : Current (partial) checksum
|
||||
unsigned long X : Input data
|
||||
unsigned long S : MD5_SXX Transformation constant
|
||||
unsigned long T : MD5_TXX Transformation constant
|
||||
NOTES: None
|
||||
*****************************************************************************************/
|
||||
void wxMD5Checksum::FF( unsigned long& A, unsigned long B, unsigned long C, unsigned long D, unsigned long X, unsigned long S, unsigned long T)
|
||||
{
|
||||
unsigned long F = (B & C) | (~B & D);
|
||||
A += F + X + T;
|
||||
A = RotateLeft(A, S);
|
||||
A += B;
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************************
|
||||
FUNCTION: wxMD5Checksum::GG
|
||||
DETAILS: protected
|
||||
DESCRIPTION: Implementation of basic MD5 transformation algorithm
|
||||
RETURNS: none
|
||||
ARGUMENTS: unsigned long &A, B, C, D : Current (partial) checksum
|
||||
unsigned long X : Input data
|
||||
unsigned long S : MD5_SXX Transformation constant
|
||||
unsigned long T : MD5_TXX Transformation constant
|
||||
NOTES: None
|
||||
*****************************************************************************************/
|
||||
void wxMD5Checksum::GG( unsigned long& A, unsigned long B, unsigned long C, unsigned long D, unsigned long X, unsigned long S, unsigned long T)
|
||||
{
|
||||
unsigned long G = (B & D) | (C & ~D);
|
||||
A += G + X + T;
|
||||
A = RotateLeft(A, S);
|
||||
A += B;
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************************
|
||||
FUNCTION: wxMD5Checksum::HH
|
||||
DETAILS: protected
|
||||
DESCRIPTION: Implementation of basic MD5 transformation algorithm
|
||||
RETURNS: none
|
||||
ARGUMENTS: unsigned long &A, B, C, D : Current (partial) checksum
|
||||
unsigned long X : Input data
|
||||
unsigned long S : MD5_SXX Transformation constant
|
||||
unsigned long T : MD5_TXX Transformation constant
|
||||
NOTES: None
|
||||
*****************************************************************************************/
|
||||
void wxMD5Checksum::HH( unsigned long& A, unsigned long B, unsigned long C, unsigned long D, unsigned long X, unsigned long S, unsigned long T)
|
||||
{
|
||||
unsigned long H = (B ^ C ^ D);
|
||||
A += H + X + T;
|
||||
A = RotateLeft(A, S);
|
||||
A += B;
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************************
|
||||
FUNCTION: wxMD5Checksum::II
|
||||
DETAILS: protected
|
||||
DESCRIPTION: Implementation of basic MD5 transformation algorithm
|
||||
RETURNS: none
|
||||
ARGUMENTS: unsigned long &A, B, C, D : Current (partial) checksum
|
||||
unsigned long X : Input data
|
||||
unsigned long S : MD5_SXX Transformation constant
|
||||
unsigned long T : MD5_TXX Transformation constant
|
||||
NOTES: None
|
||||
*****************************************************************************************/
|
||||
void wxMD5Checksum::II( unsigned long& A, unsigned long B, unsigned long C, unsigned long D, unsigned long X, unsigned long S, unsigned long T)
|
||||
{
|
||||
unsigned long I = (C ^ (B | ~D));
|
||||
A += I + X + T;
|
||||
A = RotateLeft(A, S);
|
||||
A += B;
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************************
|
||||
FUNCTION: wxMD5Checksum::ByteToDWord
|
||||
DETAILS: private
|
||||
DESCRIPTION: Transfers the data in an 8 bit array to a 32 bit array
|
||||
RETURNS: void
|
||||
ARGUMENTS: unsigned long* Output : the 32 bit (unsigned long) destination array
|
||||
unsigned char* Input : the 8 bit (unsigned char) source array
|
||||
unsigned int nLength : the number of 8 bit data items in the source array
|
||||
NOTES: Four BYTES from the input array are transferred to each unsigned long entry
|
||||
of the output array. The first unsigned char is transferred to the bits (0-7)
|
||||
of the output unsigned long, the second unsigned char to bits 8-15 etc.
|
||||
The algorithm assumes that the input array is a multiple of 4 bytes long
|
||||
so that there is a perfect fit into the array of 32 bit words.
|
||||
*****************************************************************************************/
|
||||
void wxMD5Checksum::ByteToDWord(unsigned long* Output, unsigned char* Input, unsigned int nLength)
|
||||
{
|
||||
//entry invariants
|
||||
wxASSERT( nLength % 4 == 0 );
|
||||
|
||||
//initialisations
|
||||
unsigned int i=0; //index to Output array
|
||||
unsigned int j=0; //index to Input array
|
||||
|
||||
//transfer the data by shifting and copying
|
||||
for ( ; j < nLength; i++, j += 4)
|
||||
{
|
||||
Output[i] = (unsigned long)Input[j] |
|
||||
(unsigned long)Input[j+1] << 8 |
|
||||
(unsigned long)Input[j+2] << 16 |
|
||||
(unsigned long)Input[j+3] << 24;
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************************
|
||||
FUNCTION: wxMD5Checksum::Transform
|
||||
DETAILS: protected
|
||||
DESCRIPTION: MD5 basic transformation algorithm; transforms 'm_lMD5'
|
||||
RETURNS: void
|
||||
ARGUMENTS: unsigned char Block[64]
|
||||
NOTES: An MD5 checksum is calculated by four rounds of 'Transformation'.
|
||||
The MD5 checksum currently held in m_lMD5 is merged by the
|
||||
transformation process with data passed in 'Block'.
|
||||
*****************************************************************************************/
|
||||
void wxMD5Checksum::Transform(unsigned char Block[64])
|
||||
{
|
||||
//initialise local data with current checksum
|
||||
unsigned long a = m_lMD5[0];
|
||||
unsigned long b = m_lMD5[1];
|
||||
unsigned long c = m_lMD5[2];
|
||||
unsigned long d = m_lMD5[3];
|
||||
|
||||
//copy BYTES from input 'Block' to an array of ULONGS 'X'
|
||||
unsigned long X[16];
|
||||
ByteToDWord( X, Block, 64 );
|
||||
|
||||
//Perform Round 1 of the transformation
|
||||
FF (a, b, c, d, X[ 0], MD5_S11, MD5_T01);
|
||||
FF (d, a, b, c, X[ 1], MD5_S12, MD5_T02);
|
||||
FF (c, d, a, b, X[ 2], MD5_S13, MD5_T03);
|
||||
FF (b, c, d, a, X[ 3], MD5_S14, MD5_T04);
|
||||
FF (a, b, c, d, X[ 4], MD5_S11, MD5_T05);
|
||||
FF (d, a, b, c, X[ 5], MD5_S12, MD5_T06);
|
||||
FF (c, d, a, b, X[ 6], MD5_S13, MD5_T07);
|
||||
FF (b, c, d, a, X[ 7], MD5_S14, MD5_T08);
|
||||
FF (a, b, c, d, X[ 8], MD5_S11, MD5_T09);
|
||||
FF (d, a, b, c, X[ 9], MD5_S12, MD5_T10);
|
||||
FF (c, d, a, b, X[10], MD5_S13, MD5_T11);
|
||||
FF (b, c, d, a, X[11], MD5_S14, MD5_T12);
|
||||
FF (a, b, c, d, X[12], MD5_S11, MD5_T13);
|
||||
FF (d, a, b, c, X[13], MD5_S12, MD5_T14);
|
||||
FF (c, d, a, b, X[14], MD5_S13, MD5_T15);
|
||||
FF (b, c, d, a, X[15], MD5_S14, MD5_T16);
|
||||
|
||||
//Perform Round 2 of the transformation
|
||||
GG (a, b, c, d, X[ 1], MD5_S21, MD5_T17);
|
||||
GG (d, a, b, c, X[ 6], MD5_S22, MD5_T18);
|
||||
GG (c, d, a, b, X[11], MD5_S23, MD5_T19);
|
||||
GG (b, c, d, a, X[ 0], MD5_S24, MD5_T20);
|
||||
GG (a, b, c, d, X[ 5], MD5_S21, MD5_T21);
|
||||
GG (d, a, b, c, X[10], MD5_S22, MD5_T22);
|
||||
GG (c, d, a, b, X[15], MD5_S23, MD5_T23);
|
||||
GG (b, c, d, a, X[ 4], MD5_S24, MD5_T24);
|
||||
GG (a, b, c, d, X[ 9], MD5_S21, MD5_T25);
|
||||
GG (d, a, b, c, X[14], MD5_S22, MD5_T26);
|
||||
GG (c, d, a, b, X[ 3], MD5_S23, MD5_T27);
|
||||
GG (b, c, d, a, X[ 8], MD5_S24, MD5_T28);
|
||||
GG (a, b, c, d, X[13], MD5_S21, MD5_T29);
|
||||
GG (d, a, b, c, X[ 2], MD5_S22, MD5_T30);
|
||||
GG (c, d, a, b, X[ 7], MD5_S23, MD5_T31);
|
||||
GG (b, c, d, a, X[12], MD5_S24, MD5_T32);
|
||||
|
||||
//Perform Round 3 of the transformation
|
||||
HH (a, b, c, d, X[ 5], MD5_S31, MD5_T33);
|
||||
HH (d, a, b, c, X[ 8], MD5_S32, MD5_T34);
|
||||
HH (c, d, a, b, X[11], MD5_S33, MD5_T35);
|
||||
HH (b, c, d, a, X[14], MD5_S34, MD5_T36);
|
||||
HH (a, b, c, d, X[ 1], MD5_S31, MD5_T37);
|
||||
HH (d, a, b, c, X[ 4], MD5_S32, MD5_T38);
|
||||
HH (c, d, a, b, X[ 7], MD5_S33, MD5_T39);
|
||||
HH (b, c, d, a, X[10], MD5_S34, MD5_T40);
|
||||
HH (a, b, c, d, X[13], MD5_S31, MD5_T41);
|
||||
HH (d, a, b, c, X[ 0], MD5_S32, MD5_T42);
|
||||
HH (c, d, a, b, X[ 3], MD5_S33, MD5_T43);
|
||||
HH (b, c, d, a, X[ 6], MD5_S34, MD5_T44);
|
||||
HH (a, b, c, d, X[ 9], MD5_S31, MD5_T45);
|
||||
HH (d, a, b, c, X[12], MD5_S32, MD5_T46);
|
||||
HH (c, d, a, b, X[15], MD5_S33, MD5_T47);
|
||||
HH (b, c, d, a, X[ 2], MD5_S34, MD5_T48);
|
||||
|
||||
//Perform Round 4 of the transformation
|
||||
II (a, b, c, d, X[ 0], MD5_S41, MD5_T49);
|
||||
II (d, a, b, c, X[ 7], MD5_S42, MD5_T50);
|
||||
II (c, d, a, b, X[14], MD5_S43, MD5_T51);
|
||||
II (b, c, d, a, X[ 5], MD5_S44, MD5_T52);
|
||||
II (a, b, c, d, X[12], MD5_S41, MD5_T53);
|
||||
II (d, a, b, c, X[ 3], MD5_S42, MD5_T54);
|
||||
II (c, d, a, b, X[10], MD5_S43, MD5_T55);
|
||||
II (b, c, d, a, X[ 1], MD5_S44, MD5_T56);
|
||||
II (a, b, c, d, X[ 8], MD5_S41, MD5_T57);
|
||||
II (d, a, b, c, X[15], MD5_S42, MD5_T58);
|
||||
II (c, d, a, b, X[ 6], MD5_S43, MD5_T59);
|
||||
II (b, c, d, a, X[13], MD5_S44, MD5_T60);
|
||||
II (a, b, c, d, X[ 4], MD5_S41, MD5_T61);
|
||||
II (d, a, b, c, X[11], MD5_S42, MD5_T62);
|
||||
II (c, d, a, b, X[ 2], MD5_S43, MD5_T63);
|
||||
II (b, c, d, a, X[ 9], MD5_S44, MD5_T64);
|
||||
|
||||
//add the transformed values to the current checksum
|
||||
m_lMD5[0] += a;
|
||||
m_lMD5[1] += b;
|
||||
m_lMD5[2] += c;
|
||||
m_lMD5[3] += d;
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************************
|
||||
CONSTRUCTOR: wxMD5Checksum
|
||||
DESCRIPTION: Initialises member data
|
||||
ARGUMENTS: None
|
||||
NOTES: None
|
||||
*****************************************************************************************/
|
||||
wxMD5Checksum::wxMD5Checksum()
|
||||
{
|
||||
// zero members
|
||||
memset( m_lpszBuffer, 0, 64 );
|
||||
m_nCount[0] = m_nCount[1] = 0;
|
||||
|
||||
// Load magic state initialization constants
|
||||
m_lMD5[0] = MD5_INIT_STATE_0;
|
||||
m_lMD5[1] = MD5_INIT_STATE_1;
|
||||
m_lMD5[2] = MD5_INIT_STATE_2;
|
||||
m_lMD5[3] = MD5_INIT_STATE_3;
|
||||
}
|
||||
|
||||
/*****************************************************************************************
|
||||
FUNCTION: wxMD5Checksum::DWordToByte
|
||||
DETAILS: private
|
||||
DESCRIPTION: Transfers the data in an 32 bit array to a 8 bit array
|
||||
RETURNS: void
|
||||
ARGUMENTS: unsigned char* Output : the 8 bit destination array
|
||||
unsigned long* Input : the 32 bit source array
|
||||
unsigned int nLength : the number of 8 bit data items in the source array
|
||||
NOTES: One unsigned long from the input array is transferred into four BYTES
|
||||
in the output array. The first (0-7) bits of the first unsigned long are
|
||||
transferred to the first output unsigned char, bits bits 8-15 are transferred from
|
||||
the second unsigned char etc.
|
||||
|
||||
The algorithm assumes that the output array is a multiple of 4 bytes long
|
||||
so that there is a perfect fit of 8 bit BYTES into the 32 bit DWORDs.
|
||||
*****************************************************************************************/
|
||||
void wxMD5Checksum::DWordToByte(unsigned char* Output, unsigned long* Input, unsigned int nLength )
|
||||
{
|
||||
//entry invariants
|
||||
wxASSERT( nLength % 4 == 0 );
|
||||
|
||||
//transfer the data by shifting and copying
|
||||
unsigned int i = 0;
|
||||
unsigned int j = 0;
|
||||
for ( ; j < nLength; i++, j += 4)
|
||||
{
|
||||
Output[j] = (UCHAR)(Input[i] & 0xff);
|
||||
Output[j+1] = (UCHAR)((Input[i] >> 8) & 0xff);
|
||||
Output[j+2] = (UCHAR)((Input[i] >> 16) & 0xff);
|
||||
Output[j+3] = (UCHAR)((Input[i] >> 24) & 0xff);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************************
|
||||
FUNCTION: wxMD5Checksum::Final
|
||||
DETAILS: protected
|
||||
DESCRIPTION: Implementation of main MD5 checksum algorithm; ends the checksum calculation.
|
||||
RETURNS: wxString : the final hexadecimal MD5 checksum result
|
||||
ARGUMENTS: None
|
||||
NOTES: Performs the final MD5 checksum calculation ('Update' does most of the work,
|
||||
this function just finishes the calculation.)
|
||||
*****************************************************************************************/
|
||||
wxString wxMD5Checksum::Final()
|
||||
{
|
||||
//Save number of bits
|
||||
unsigned char Bits[8];
|
||||
DWordToByte( Bits, m_nCount, 8 );
|
||||
|
||||
//Pad out to 56 mod 64.
|
||||
unsigned int nIndex = (unsigned int)((m_nCount[0] >> 3) & 0x3f);
|
||||
unsigned int nPadLen = (nIndex < 56) ? (56 - nIndex) : (120 - nIndex);
|
||||
Update( PADDING, nPadLen );
|
||||
|
||||
//Append length (before padding)
|
||||
Update( Bits, 8 );
|
||||
|
||||
//Store final state in 'lpszMD5'
|
||||
const int nMD5Size = 16;
|
||||
unsigned char lpszMD5[ nMD5Size ];
|
||||
DWordToByte( lpszMD5, m_lMD5, nMD5Size );
|
||||
|
||||
//Convert the hexadecimal checksum to a wxString
|
||||
wxString strMD5;
|
||||
for ( int i=0; i < nMD5Size; i++)
|
||||
{
|
||||
wxString Str;
|
||||
if (lpszMD5[i] == 0) {
|
||||
Str = wxT("00");
|
||||
}
|
||||
else if (lpszMD5[i] <= 15) {
|
||||
Str.Printf(wxT("0%x"),lpszMD5[i]);
|
||||
}
|
||||
else {
|
||||
Str.Printf(wxT("%x"),lpszMD5[i]);
|
||||
}
|
||||
|
||||
wxASSERT( Str.Length() == 2 );
|
||||
strMD5 += Str;
|
||||
}
|
||||
wxASSERT( strMD5.Length() == 32 );
|
||||
return strMD5;
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************************
|
||||
FUNCTION: wxMD5Checksum::Update
|
||||
DETAILS: protected
|
||||
DESCRIPTION: Implementation of main MD5 checksum algorithm
|
||||
RETURNS: void
|
||||
ARGUMENTS: unsigned char* Input : input block
|
||||
unsigned int nInputLen : length of input block
|
||||
NOTES: Computes the partial MD5 checksum for 'nInputLen' bytes of data in 'Input'
|
||||
*****************************************************************************************/
|
||||
void wxMD5Checksum::Update( unsigned char* Input, unsigned long nInputLen )
|
||||
{
|
||||
//Compute number of bytes mod 64
|
||||
unsigned int nIndex = (unsigned int)((m_nCount[0] >> 3) & 0x3F);
|
||||
|
||||
//Update number of bits
|
||||
if ( ( m_nCount[0] += nInputLen << 3 ) < ( nInputLen << 3) )
|
||||
{
|
||||
m_nCount[1]++;
|
||||
}
|
||||
m_nCount[1] += (nInputLen >> 29);
|
||||
|
||||
//Transform as many times as possible.
|
||||
unsigned int i=0;
|
||||
unsigned int nPartLen = 64 - nIndex;
|
||||
if (nInputLen >= nPartLen)
|
||||
{
|
||||
memcpy( &m_lpszBuffer[nIndex], Input, nPartLen );
|
||||
Transform( m_lpszBuffer );
|
||||
for (i = nPartLen; i + 63 < nInputLen; i += 64)
|
||||
{
|
||||
Transform( &Input[i] );
|
||||
}
|
||||
nIndex = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
i = 0;
|
||||
}
|
||||
|
||||
// Buffer remaining input
|
||||
memcpy( &m_lpszBuffer[nIndex], &Input[i], nInputLen-i);
|
||||
}
|
||||
|
||||
|
342
server/MD5Checksum.h
Executable file
342
server/MD5Checksum.h
Executable file
@ -0,0 +1,342 @@
|
||||
/*****************************************************************************************
|
||||
|
||||
*** MD5Checksum.h: interface for the MD5Checksum class.
|
||||
|
||||
*** Developed by Langfine Ltd.
|
||||
*** Released to the public domain 12/Nov/2001.
|
||||
*** Please visit our website www.langfine.com
|
||||
|
||||
*** Any modifications must be clearly commented to distinguish them from Langfine's
|
||||
*** original source code. Please advise Langfine of useful modifications so that we
|
||||
*** can make them generally available.
|
||||
|
||||
*****************************************************************************************/
|
||||
|
||||
|
||||
#ifndef __MD5CHECKSUM_H__
|
||||
#define __MD5CHECKSUM_H__
|
||||
|
||||
/****************************************************************************************
|
||||
This software is derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm.
|
||||
Incorporation of this statement is a condition of use; please see the RSA
|
||||
Data Security Inc copyright notice below:-
|
||||
|
||||
Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All
|
||||
rights reserved.
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
*****************************************************************************************/
|
||||
|
||||
/****************************************************************************************
|
||||
This implementation of the RSA MD5 Algorithm was written by Langfine Ltd.
|
||||
|
||||
Langfine Ltd 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.
|
||||
|
||||
In addition to the above, Langfine make no warrant or assurances regarding the
|
||||
accuracy of this implementation of the MD5 checksum algorithm nor any assurances regarding
|
||||
its suitability for any purposes.
|
||||
|
||||
This implementation may be used freely provided that Langfine is credited
|
||||
in a copyright or similar notices (eg, RSA MD5 Algorithm implemented by Langfine
|
||||
Ltd.) and provided that the RSA Data Security notices are complied with.
|
||||
|
||||
Langfine may be contacted at mail@langfine.com
|
||||
*/
|
||||
|
||||
/*****************************************************************************************
|
||||
CLASS: wxMD5Checksum
|
||||
DESCRIPTION: Implements the "RSA Data Security, Inc. MD5 Message-Digest Algorithm".
|
||||
NOTES: Calculates the RSA MD5 checksum for a file or congiguous array of data.
|
||||
|
||||
Below are extracts from a memo on The MD5 Message-Digest Algorithm by R. Rivest of MIT
|
||||
Laboratory for Computer Science and RSA Data Security, Inc., April 1992.
|
||||
|
||||
1. Executive Summary
|
||||
This document describes the MD5 message-digest algorithm. The
|
||||
algorithm takes as input a message of arbitrary length and produces
|
||||
as output a 128-bit "fingerprint" or "message digest" of the input.
|
||||
It is conjectured that it is computationally infeasible to produce
|
||||
two messages having the same message digest, or to produce any
|
||||
message having a given prespecified target message digest. The MD5
|
||||
algorithm is intended for digital signature applications, where a
|
||||
large file must be "compressed" in a secure manner before being
|
||||
encrypted with a private (secret) key under a public-key cryptosystem
|
||||
such as RSA.
|
||||
|
||||
The MD5 algorithm is designed to be quite fast on 32-bit machines. In
|
||||
addition, the MD5 algorithm does not require any large substitution
|
||||
tables; the algorithm can be coded quite compactly.
|
||||
The MD5 algorithm is an extension of the MD4 message-digest algorithm
|
||||
1,2]. MD5 is slightly slower than MD4, but is more "conservative" in
|
||||
design. MD5 was designed because it was felt that MD4 was perhaps
|
||||
being adopted for use more quickly than justified by the existing
|
||||
critical review; because MD4 was designed to be exceptionally fast,
|
||||
it is "at the edge" in terms of risking successful cryptanalytic
|
||||
attack. MD5 backs off a bit, giving up a little in speed for a much
|
||||
greater likelihood of ultimate security. It incorporates some
|
||||
suggestions made by various reviewers, and contains additional
|
||||
optimizations. The MD5 algorithm is being placed in the public domain
|
||||
for review and possible adoption as a standard.
|
||||
|
||||
|
||||
2. Terminology and Notation
|
||||
In this document a "word" is a 32-bit quantity and a "byte" is an
|
||||
eight-bit quantity. A sequence of bits can be interpreted in a
|
||||
natural manner as a sequence of bytes, where each consecutive group
|
||||
of eight bits is interpreted as a byte with the high-order (most
|
||||
significant) bit of each byte listed first. Similarly, a sequence of
|
||||
bytes can be interpreted as a sequence of 32-bit words, where each
|
||||
consecutive group of four bytes is interpreted as a word with the
|
||||
low-order (least significant) byte given first.
|
||||
Let x_i denote "x sub i". If the subscript is an expression, we
|
||||
surround it in braces, as in x_{i+1}. Similarly, we use ^ for
|
||||
superscripts (exponentiation), so that x^i denotes x to the i-th power.
|
||||
Let the symbol "+" denote addition of words (i.e., modulo-2^32
|
||||
addition). Let X <<< s denote the 32-bit value obtained by circularly
|
||||
shifting (rotating) X left by s bit positions. Let not(X) denote the
|
||||
bit-wise complement of X, and let X v Y denote the bit-wise OR of X
|
||||
and Y. Let X xor Y denote the bit-wise XOR of X and Y, and let XY
|
||||
denote the bit-wise AND of X and Y.
|
||||
|
||||
|
||||
3. MD5 Algorithm Description
|
||||
We begin by supposing that we have a b-bit message as input, and that
|
||||
we wish to find its message digest. Here b is an arbitrary
|
||||
nonnegative integer; b may be zero, it need not be a multiple of
|
||||
eight, and it may be arbitrarily large. We imagine the bits of the
|
||||
message written down as follows: m_0 m_1 ... m_{b-1}
|
||||
The following five steps are performed to compute the message digest
|
||||
of the message.
|
||||
|
||||
3.1 Step 1. Append Padding Bits
|
||||
The message is "padded" (extended) so that its length (in bits) is
|
||||
congruent to 448, modulo 512. That is, the message is extended so
|
||||
that it is just 64 bits shy of being a multiple of 512 bits long.
|
||||
Padding is always performed, even if the length of the message is
|
||||
already congruent to 448, modulo 512.
|
||||
Padding is performed as follows: a single "1" bit is appended to the
|
||||
message, and then "0" bits are appended so that the length in bits of
|
||||
the padded message becomes congruent to 448, modulo 512. In all, at
|
||||
least one bit and at most 512 bits are appended.
|
||||
|
||||
3.2 Step 2. Append Length
|
||||
A 64-bit representation of b (the length of the message before the
|
||||
padding bits were added) is appended to the result of the previous
|
||||
step. In the unlikely event that b is greater than 2^64, then only
|
||||
the low-order 64 bits of b are used. (These bits are appended as two
|
||||
32-bit words and appended low-order word first in accordance with the
|
||||
previous conventions.)
|
||||
At this point the resulting message (after padding with bits and with
|
||||
b) has a length that is an exact multiple of 512 bits. Equivalently,
|
||||
this message has a length that is an exact multiple of 16 (32-bit)
|
||||
words. Let M[0 ... N-1] denote the words of the resulting message,
|
||||
where N is a multiple of 16.
|
||||
|
||||
3.3 Step 3. Initialize MD Buffer
|
||||
A four-word buffer (A,B,C,D) is used to compute the message digest.
|
||||
Here each of A, B, C, D is a 32-bit register. These registers are
|
||||
initialized to the following values in hexadecimal, low-order bytes first):
|
||||
word A: 01 23 45 67 word B: 89 ab cd ef
|
||||
word C: fe dc ba 98 word D: 76 54 32 10
|
||||
|
||||
3.4 Step 4. Process Message in 16-Word Blocks
|
||||
We first define four auxiliary functions that each take as input
|
||||
three 32-bit words and produce as output one 32-bit word.
|
||||
F(X,Y,Z) = XY v not(X) Z G(X,Y,Z) = XZ v Y not(Z)
|
||||
H(X,Y,Z) = X xor Y xor Z I(X,Y,Z) = Y xor (X v not(Z))
|
||||
In each bit position F acts as a conditional: if X then Y else Z.
|
||||
The function F could have been defined using + instead of v since XY
|
||||
and not(X)Z will never have 1's in the same bit position.) It is
|
||||
interesting to note that if the bits of X, Y, and Z are independent
|
||||
and unbiased, the each bit of F(X,Y,Z) will be independent and unbiased.
|
||||
The functions G, H, and I are similar to the function F, in that they
|
||||
act in "bitwise parallel" to produce their output from the bits of X,
|
||||
Y, and Z, in such a manner that if the corresponding bits of X, Y,
|
||||
and Z are independent and unbiased, then each bit of G(X,Y,Z),
|
||||
H(X,Y,Z), and I(X,Y,Z) will be independent and unbiased. Note that
|
||||
the function H is the bit-wise "xor" or "parity" function of its inputs.
|
||||
This step uses a 64-element table T[1 ... 64] constructed from the
|
||||
sine function. Let T[i] denote the i-th element of the table, which
|
||||
is equal to the integer part of 4294967296 times abs(sin(i)), where i
|
||||
is in radians. The elements of the table are given in the appendix.
|
||||
Do the following:
|
||||
|
||||
//Process each 16-word block.
|
||||
For i = 0 to N/16-1 do // Copy block i into X.
|
||||
For j = 0 to 15 do
|
||||
Set X[j] to M[i*16+j].
|
||||
end //of loop on j
|
||||
|
||||
// Save A as AA, B as BB, C as CC, and D as DD.
|
||||
AA = A BB = B
|
||||
CC = C DD = D
|
||||
|
||||
// Round 1.
|
||||
// Let [abcd k s i] denote the operation
|
||||
// a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s).
|
||||
// Do the following 16 operations.
|
||||
[ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4]
|
||||
[ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8]
|
||||
[ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12]
|
||||
[ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16]
|
||||
|
||||
// Round 2.
|
||||
// Let [abcd k s i] denote the operation
|
||||
// a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s).
|
||||
// Do the following 16 operations.
|
||||
[ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20]
|
||||
[ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24]
|
||||
[ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28]
|
||||
[ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32]
|
||||
|
||||
// Round 3.
|
||||
// Let [abcd k s t] denote the operation
|
||||
// a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s).
|
||||
// Do the following 16 operations.
|
||||
[ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36]
|
||||
[ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40]
|
||||
[ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44]
|
||||
[ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48]
|
||||
|
||||
// Round 4.
|
||||
// Let [abcd k s t] denote the operation
|
||||
// a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s).
|
||||
// Do the following 16 operations.
|
||||
[ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52]
|
||||
[ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55] [BCDA 1 21 56]
|
||||
[ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60]
|
||||
[ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64]
|
||||
|
||||
// Then perform the following additions. (That is increment each
|
||||
// of the four registers by the value it had before this block
|
||||
// was started.)
|
||||
A = A + AA B = B + BB C = C + CC D = D + DD
|
||||
|
||||
end // of loop on i
|
||||
|
||||
3.5 Step 5. Output
|
||||
The message digest produced as output is A, B, C, D. That is, we
|
||||
begin with the low-order byte of A, and end with the high-order byte of D.
|
||||
This completes the description of MD5.
|
||||
|
||||
Summary
|
||||
The MD5 message-digest algorithm is simple to implement, and provides
|
||||
a "fingerprint" or message digest of a message of arbitrary length.
|
||||
It is conjectured that the difficulty of coming up with two messages
|
||||
having the same message digest is on the order of 2^64 operations,
|
||||
and that the difficulty of coming up with any message having a given
|
||||
message digest is on the order of 2^128 operations. The MD5 algorithm
|
||||
has been carefully scrutinized for weaknesses. It is, however, a
|
||||
relatively new algorithm and further security analysis is of course
|
||||
justified, as is the case with any new proposal of this sort.
|
||||
|
||||
|
||||
5. Differences Between MD4 and MD5
|
||||
The following are the differences between MD4 and MD5:
|
||||
1. A fourth round has been added.
|
||||
2. Each step now has a unique additive constant.
|
||||
3. The function g in round 2 was changed from (XY v XZ v YZ) to
|
||||
(XZ v Y not(Z)) to make g less symmetric.
|
||||
4. Each step now adds in the result of the previous step. This
|
||||
promotes a faster "avalanche effect".
|
||||
5. The order in which input words are accessed in rounds 2 and
|
||||
3 is changed, to make these patterns less like each other.
|
||||
6. The shift amounts in each round have been approximately
|
||||
optimized, to yield a faster "avalanche effect." The shifts in
|
||||
different rounds are distinct.
|
||||
|
||||
References
|
||||
[1] Rivest, R., "The MD4 Message Digest Algorithm", RFC 1320, MIT and
|
||||
RSA Data Security, Inc., April 1992.
|
||||
[2] Rivest, R., "The MD4 message digest algorithm", in A.J. Menezes
|
||||
and S.A. Vanstone, editors, Advances in Cryptology - CRYPTO '90
|
||||
Proceedings, pages 303-311, Springer-Verlag, 1991.
|
||||
[3] CCITT Recommendation X.509 (1988), "The Directory -
|
||||
Authentication Framework."APPENDIX A - Reference Implementation
|
||||
|
||||
|
||||
The level of security discussed in this memo is considered to be
|
||||
sufficient for implementing very high security hybrid digital-
|
||||
signature schemes based on MD5 and a public-key cryptosystem.
|
||||
Author's Address
|
||||
Ronald L. Rivest Massachusetts Institute of Technology
|
||||
Laboratory for Computer Science NE43-324 545 Technology Square
|
||||
Cambridge, MA 02139-1986 Phone: (617) 253-5880
|
||||
EMail: rivest@theory.lcs.mit.edu
|
||||
|
||||
|
||||
*****************************************************************************************/
|
||||
|
||||
#ifndef _WX_FILEH__
|
||||
class wxFile;
|
||||
#endif
|
||||
|
||||
class wxMD5Checksum
|
||||
{
|
||||
public:
|
||||
// interface functions for the RSA MD5 calculation
|
||||
static wxString GetMD5(unsigned char* pBuf, unsigned int nLength);
|
||||
static wxString GetMD5(wxFile& File);
|
||||
static wxString GetMD5(const wxString& strFilePath);
|
||||
|
||||
protected:
|
||||
// constructor/destructor
|
||||
wxMD5Checksum();
|
||||
virtual ~wxMD5Checksum() {};
|
||||
|
||||
// RSA MD5 implementation
|
||||
void Transform(unsigned char Block[64]);
|
||||
void Update(unsigned char* Input, unsigned long nInputLen);
|
||||
wxString Final();
|
||||
inline unsigned long RotateLeft(unsigned long x, int n);
|
||||
inline void FF( unsigned long& A, unsigned long B, unsigned long C, unsigned long D, unsigned long X, unsigned long S, unsigned long T);
|
||||
inline void GG( unsigned long& A, unsigned long B, unsigned long C, unsigned long D, unsigned long X, unsigned long S, unsigned long T);
|
||||
inline void HH( unsigned long& A, unsigned long B, unsigned long C, unsigned long D, unsigned long X, unsigned long S, unsigned long T);
|
||||
inline void II( unsigned long& A, unsigned long B, unsigned long C, unsigned long D, unsigned long X, unsigned long S, unsigned long T);
|
||||
|
||||
// utility functions
|
||||
inline void DWordToByte(unsigned char* Output, unsigned long* Input, unsigned int nLength);
|
||||
inline void ByteToDWord(unsigned long* Output, unsigned char* Input, unsigned int nLength);
|
||||
|
||||
private:
|
||||
unsigned char m_lpszBuffer[64]; // input buffer
|
||||
unsigned long m_nCount[2]; // number of bits, modulo 2^64 (lsb first)
|
||||
unsigned long m_lMD5[4]; // MD5 checksum
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
119
server/MD5ChecksumDefines.h
Executable file
119
server/MD5ChecksumDefines.h
Executable file
@ -0,0 +1,119 @@
|
||||
/*****************************************************************************************
|
||||
|
||||
*** MD5ChecksumDefines.h : MD5 Checksum constants
|
||||
|
||||
*** Developed by Langfine Ltd.
|
||||
*** Released to the public domain 12/Nov/2001.
|
||||
*** Please visit our website www.langfine.com
|
||||
|
||||
*** Any modifications must be clearly commented to distinguish them from Langfine's
|
||||
*** original source code. Please advise Langfine of useful modifications so that we
|
||||
*** can make them generally available.
|
||||
|
||||
*****************************************************************************************/
|
||||
|
||||
|
||||
//Magic initialization constants
|
||||
#define MD5_INIT_STATE_0 0x67452301
|
||||
#define MD5_INIT_STATE_1 0xefcdab89
|
||||
#define MD5_INIT_STATE_2 0x98badcfe
|
||||
#define MD5_INIT_STATE_3 0x10325476
|
||||
|
||||
//Constants for Transform routine.
|
||||
#define MD5_S11 7
|
||||
#define MD5_S12 12
|
||||
#define MD5_S13 17
|
||||
#define MD5_S14 22
|
||||
#define MD5_S21 5
|
||||
#define MD5_S22 9
|
||||
#define MD5_S23 14
|
||||
#define MD5_S24 20
|
||||
#define MD5_S31 4
|
||||
#define MD5_S32 11
|
||||
#define MD5_S33 16
|
||||
#define MD5_S34 23
|
||||
#define MD5_S41 6
|
||||
#define MD5_S42 10
|
||||
#define MD5_S43 15
|
||||
#define MD5_S44 21
|
||||
|
||||
//Transformation Constants - Round 1
|
||||
#define MD5_T01 0xd76aa478 //Transformation Constant 1
|
||||
#define MD5_T02 0xe8c7b756 //Transformation Constant 2
|
||||
#define MD5_T03 0x242070db //Transformation Constant 3
|
||||
#define MD5_T04 0xc1bdceee //Transformation Constant 4
|
||||
#define MD5_T05 0xf57c0faf //Transformation Constant 5
|
||||
#define MD5_T06 0x4787c62a //Transformation Constant 6
|
||||
#define MD5_T07 0xa8304613 //Transformation Constant 7
|
||||
#define MD5_T08 0xfd469501 //Transformation Constant 8
|
||||
#define MD5_T09 0x698098d8 //Transformation Constant 9
|
||||
#define MD5_T10 0x8b44f7af //Transformation Constant 10
|
||||
#define MD5_T11 0xffff5bb1 //Transformation Constant 11
|
||||
#define MD5_T12 0x895cd7be //Transformation Constant 12
|
||||
#define MD5_T13 0x6b901122 //Transformation Constant 13
|
||||
#define MD5_T14 0xfd987193 //Transformation Constant 14
|
||||
#define MD5_T15 0xa679438e //Transformation Constant 15
|
||||
#define MD5_T16 0x49b40821 //Transformation Constant 16
|
||||
|
||||
//Transformation Constants - Round 2
|
||||
#define MD5_T17 0xf61e2562 //Transformation Constant 17
|
||||
#define MD5_T18 0xc040b340 //Transformation Constant 18
|
||||
#define MD5_T19 0x265e5a51 //Transformation Constant 19
|
||||
#define MD5_T20 0xe9b6c7aa //Transformation Constant 20
|
||||
#define MD5_T21 0xd62f105d //Transformation Constant 21
|
||||
#define MD5_T22 0x02441453 //Transformation Constant 22
|
||||
#define MD5_T23 0xd8a1e681 //Transformation Constant 23
|
||||
#define MD5_T24 0xe7d3fbc8 //Transformation Constant 24
|
||||
#define MD5_T25 0x21e1cde6 //Transformation Constant 25
|
||||
#define MD5_T26 0xc33707d6 //Transformation Constant 26
|
||||
#define MD5_T27 0xf4d50d87 //Transformation Constant 27
|
||||
#define MD5_T28 0x455a14ed //Transformation Constant 28
|
||||
#define MD5_T29 0xa9e3e905 //Transformation Constant 29
|
||||
#define MD5_T30 0xfcefa3f8 //Transformation Constant 30
|
||||
#define MD5_T31 0x676f02d9 //Transformation Constant 31
|
||||
#define MD5_T32 0x8d2a4c8a //Transformation Constant 32
|
||||
|
||||
//Transformation Constants - Round 3
|
||||
#define MD5_T33 0xfffa3942 //Transformation Constant 33
|
||||
#define MD5_T34 0x8771f681 //Transformation Constant 34
|
||||
#define MD5_T35 0x6d9d6122 //Transformation Constant 35
|
||||
#define MD5_T36 0xfde5380c //Transformation Constant 36
|
||||
#define MD5_T37 0xa4beea44 //Transformation Constant 37
|
||||
#define MD5_T38 0x4bdecfa9 //Transformation Constant 38
|
||||
#define MD5_T39 0xf6bb4b60 //Transformation Constant 39
|
||||
#define MD5_T40 0xbebfbc70 //Transformation Constant 40
|
||||
#define MD5_T41 0x289b7ec6 //Transformation Constant 41
|
||||
#define MD5_T42 0xeaa127fa //Transformation Constant 42
|
||||
#define MD5_T43 0xd4ef3085 //Transformation Constant 43
|
||||
#define MD5_T44 0x04881d05 //Transformation Constant 44
|
||||
#define MD5_T45 0xd9d4d039 //Transformation Constant 45
|
||||
#define MD5_T46 0xe6db99e5 //Transformation Constant 46
|
||||
#define MD5_T47 0x1fa27cf8 //Transformation Constant 47
|
||||
#define MD5_T48 0xc4ac5665 //Transformation Constant 48
|
||||
|
||||
//Transformation Constants - Round 4
|
||||
#define MD5_T49 0xf4292244 //Transformation Constant 49
|
||||
#define MD5_T50 0x432aff97 //Transformation Constant 50
|
||||
#define MD5_T51 0xab9423a7 //Transformation Constant 51
|
||||
#define MD5_T52 0xfc93a039 //Transformation Constant 52
|
||||
#define MD5_T53 0x655b59c3 //Transformation Constant 53
|
||||
#define MD5_T54 0x8f0ccc92 //Transformation Constant 54
|
||||
#define MD5_T55 0xffeff47d //Transformation Constant 55
|
||||
#define MD5_T56 0x85845dd1 //Transformation Constant 56
|
||||
#define MD5_T57 0x6fa87e4f //Transformation Constant 57
|
||||
#define MD5_T58 0xfe2ce6e0 //Transformation Constant 58
|
||||
#define MD5_T59 0xa3014314 //Transformation Constant 59
|
||||
#define MD5_T60 0x4e0811a1 //Transformation Constant 60
|
||||
#define MD5_T61 0xf7537e82 //Transformation Constant 61
|
||||
#define MD5_T62 0xbd3af235 //Transformation Constant 62
|
||||
#define MD5_T63 0x2ad7d2bb //Transformation Constant 63
|
||||
#define MD5_T64 0xeb86d391 //Transformation Constant 64
|
||||
|
||||
|
||||
//Null data (except for first unsigned char) used to finalise the checksum calculation
|
||||
static unsigned char PADDING[64] = {
|
||||
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
|
@ -1,10 +1,12 @@
|
||||
#include "baseserv.h"
|
||||
|
||||
#include "dongle.h"
|
||||
#include "MD5Checksum.h"
|
||||
|
||||
#include <wx/hashset.h>
|
||||
#include <wx/textfile.h>
|
||||
|
||||
#ifdef WIN32
|
||||
#ifdef __WXMSW__
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#endif
|
||||
@ -168,6 +170,7 @@ protected:
|
||||
void InitModules();
|
||||
wxString GetModulesFilename() const;
|
||||
wxString Garble(unsigned short n, const wxDateTime& date) const;
|
||||
wxString GarbleMD5(unsigned short n, const wxDateTime& date) const;
|
||||
|
||||
public:
|
||||
bool IsMagicName(wxString& strFilename) const;
|
||||
@ -223,6 +226,22 @@ wxString TAuthorizationServer::Garble(unsigned short n, const wxDateTime& date)
|
||||
return wxString::Format("%04X%04X", data[0], data[1]);
|
||||
}
|
||||
|
||||
wxString TAuthorizationServer::GarbleMD5(unsigned short n, const wxDateTime& date) const
|
||||
{
|
||||
const long nANSIdate = date.GetYear()*10000 + (date.GetMonth()+1)*100 + date.GetDay();
|
||||
|
||||
wxString strModule;
|
||||
wxTextFile txt(GetModulesFilename());
|
||||
if (txt.Open())
|
||||
strModule = txt.GetLine(n).Left(2).Upper();
|
||||
|
||||
wxString chiaro; chiaro.Printf("%8ld%d%s", nANSIdate, m_Dongle.Number(), strModule);
|
||||
|
||||
unsigned char* buffer = (unsigned char*)chiaro.c_str();
|
||||
const wxString cifrato = wxMD5Checksum::GetMD5(buffer, chiaro.Len());
|
||||
return cifrato.Right(8);
|
||||
}
|
||||
|
||||
// Implementare almeno queste due funzioni pure virtuali
|
||||
|
||||
const wxChar* TAuthorizationServer::GetAppName() const
|
||||
@ -258,9 +277,7 @@ bool TAuthorizationServer::IsMagicName(wxString& strFilename) const
|
||||
}
|
||||
|
||||
wxString TAuthorizationServer::GetModulesFilename() const
|
||||
{
|
||||
return "../campo.aut";
|
||||
}
|
||||
{ return wxT("../campo.aut"); }
|
||||
|
||||
wxString TAuthorizationServer::DescribeModule(int m) const
|
||||
{
|
||||
@ -554,7 +571,6 @@ void TAuthorizationServer::GenerateFile(wxString& strFilename)
|
||||
} else
|
||||
if (strName == "year")
|
||||
{
|
||||
// const int nModule = atoi(strArgs);
|
||||
TXmlItem html;
|
||||
TXmlItem& body = CreatePageBody(html);
|
||||
TXmlItem& form = body.AddChild("form");
|
||||
@ -664,11 +680,7 @@ void TAuthorizationServer::ProcessActivation(int nModule, bool act, wxSocketBase
|
||||
|
||||
bool TAuthorizationServer::KeyIsGood(const wxString& key, const wxString& gar) const
|
||||
{
|
||||
#ifdef NDEBUG
|
||||
return key.IsSameAs(gar, false);
|
||||
#else
|
||||
return key.Length() == 8;
|
||||
#endif
|
||||
}
|
||||
|
||||
void TAuthorizationServer::ProcessFormCommand(wxString cmd, wxSocketBase& outs)
|
||||
@ -692,8 +704,9 @@ void TAuthorizationServer::ProcessFormCommand(wxString cmd, wxSocketBase& outs)
|
||||
const int nModule = hashArgs.GetInt("module");
|
||||
const wxDateTime date = hashArgs.GetDate("date");
|
||||
const wxString key = hashArgs.Get("key");
|
||||
const wxString gar = Garble(nModule, date);
|
||||
if (KeyIsGood(key, gar))
|
||||
const wxString gar1 = Garble(nModule, date);
|
||||
const wxString gar2 = GarbleMD5(nModule, date);
|
||||
if (KeyIsGood(key, gar1) || KeyIsGood(key, gar2))
|
||||
ProcessActivation(nModule, true, outs);
|
||||
else
|
||||
MessageBox("ERROR!", "You supplied the wrong activation code", outs);
|
||||
@ -959,3 +972,4 @@ bool TAuthorizationServer::Deinitialization()
|
||||
// Istanziare l'applicazione principale
|
||||
|
||||
IMPLEMENT_APP(TAuthorizationServer)
|
||||
|
||||
|
@ -459,44 +459,30 @@ void TBaseServerApp::ProcessCommand(wxString cmd, wxSocketBase& outs)
|
||||
outs << "PONG\n";
|
||||
}
|
||||
|
||||
void TBaseServerApp::OnServerEvent(wxSocketEvent& e)
|
||||
void TBaseServerApp::OnServerEvent(wxSocketEvent& WXUNUSED(e))
|
||||
{
|
||||
wxString s = "--- OnServerEvent: ";
|
||||
|
||||
switch(e.GetSocketEvent())
|
||||
{
|
||||
case wxSOCKET_CONNECTION : s.Append("wxSOCKET_CONNECTION"); break;
|
||||
default : s.Append("Unexpected event!"); break;
|
||||
}
|
||||
|
||||
if (m_bLogVerbose)
|
||||
WriteLog(s);
|
||||
|
||||
// Accept new connection if there is one in the pending
|
||||
// connections queue, else exit. We use Accept(FALSE) for
|
||||
// non-blocking accept (although if we got here, there
|
||||
// should ALWAYS be a pending connection).
|
||||
|
||||
wxSocketBase* sock = m_server->Accept(FALSE);
|
||||
if (sock)
|
||||
wxSocketBase* sock = m_server->Accept(false);
|
||||
if (sock != NULL)
|
||||
{
|
||||
sock->SetEventHandler(*this, SOCKET_ID);
|
||||
sock->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG);
|
||||
sock->Notify(true);
|
||||
if (m_bLogVerbose)
|
||||
WriteLog("--- New client connection accepted");
|
||||
WriteLog(_("Connection accepted."));
|
||||
}
|
||||
else
|
||||
{
|
||||
WriteLog("### Error: couldn't accept a new connection");
|
||||
return;
|
||||
}
|
||||
sock->SetEventHandler(*this, SOCKET_ID);
|
||||
sock->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG);
|
||||
sock->Notify(TRUE);
|
||||
WriteLog(_("Connection REFUSED!"));
|
||||
}
|
||||
|
||||
struct TCommand : public wxObject
|
||||
{
|
||||
wxSocketBase * m_Sock;
|
||||
wxString m_Command;
|
||||
wxSocketBase* m_Sock;
|
||||
wxString m_Command;
|
||||
};
|
||||
|
||||
void TBaseServerApp::OnSocketEvent(wxSocketEvent& e)
|
||||
@ -539,7 +525,7 @@ void TBaseServerApp::OnIdle(wxIdleEvent& evt)
|
||||
{
|
||||
if (m_Sockets.GetCount() > 0)
|
||||
{
|
||||
wxSocketBase& sock = *(((TCommand *) m_Sockets[0])->m_Sock);
|
||||
wxSocketBase& sock = *(((TCommand*)m_Sockets[0])->m_Sock);
|
||||
const bool valid_socket = sock.IsOk();
|
||||
if (valid_socket)
|
||||
sock.SetNotify(wxSOCKET_LOST_FLAG);
|
||||
@ -564,7 +550,7 @@ void TBaseServerApp::OnIdle(wxIdleEvent& evt)
|
||||
if (valid_socket)
|
||||
{
|
||||
sock.SetNotify(wxSOCKET_LOST_FLAG | wxSOCKET_INPUT_FLAG);
|
||||
sock.Notify(TRUE);
|
||||
sock.Notify(true);
|
||||
}
|
||||
|
||||
m_Sockets.RemoveAt(0);
|
||||
@ -580,6 +566,7 @@ const wxString& TBaseServerApp::GetConfigName() const
|
||||
wxFileName name(argv[0]); // Prendo il persorso completo del server in esecuzione
|
||||
name.SetName("servers"); // Trasformo il nome in servers ...
|
||||
name.SetExt("ini"); // ... e l'esetensione in .ini
|
||||
name.MakeAbsolute();
|
||||
(wxString&)m_strIni = name.GetFullPath();
|
||||
}
|
||||
return m_strIni;
|
||||
|
@ -71,9 +71,7 @@ protected:
|
||||
|
||||
public:
|
||||
bool Ok() const
|
||||
{ return _hardware != _dongle_unknown &&
|
||||
_type != _no_dongle &&
|
||||
_serno != 0xFFFF; }
|
||||
{ return _hardware != _dongle_unknown && _type != _no_dongle && _serno != 0xFFFF; }
|
||||
|
||||
public:
|
||||
bool Login(bool test_all_dongles = false);
|
||||
@ -93,10 +91,10 @@ public:
|
||||
TDongleType type() const { return _type; }
|
||||
|
||||
bool Active(size_t module) const { return _module[module]; }
|
||||
void Activate(size_t module, bool on = TRUE) { _module.set(module, on); _dirty = TRUE; }
|
||||
void Deactivate(size_t module) { Activate(module, FALSE); }
|
||||
void set_max_users(unsigned short u) { _max_users = u; _dirty = TRUE; }
|
||||
void set_year_assist(unsigned short y) { _year_assist = y; _dirty = TRUE; }
|
||||
void Activate(size_t module, bool on = true) { _module.set(module, on); _dirty = true; }
|
||||
void Deactivate(size_t module) { Activate(module, false); }
|
||||
void set_max_users(unsigned short u) { _max_users = u; _dirty = true; }
|
||||
void set_year_assist(unsigned short y) { _year_assist = y; _dirty = true; }
|
||||
const wxDateTime& last_update() const { return _last_update; }
|
||||
|
||||
bool dirty() const { return _dirty; }
|
||||
|
Loading…
x
Reference in New Issue
Block a user