#include <stdio.h>
#include <string.h>
#include <QuickHash.h>
#define BUFF_SIZE 1024
int CalculateFileHMAC_MD5( const char* filename, const char* key, char* hmachex )
{
FILE* file;
unsigned char buff[ BUFF_SIZE ];
unsigned char context[ SLC_HMAC_CONTEXTSIZE( SLC_MD5_CONTEXTSIZE, SLC_MD5_BLOCKSIZE ) ];
file = fopen( filename, "rb" );
if( file == NULL )
{
printf( "\nCould not open file: %s", filename );
return 0;
}
/*****Initialize the context before calling Update, Final, or FinalHex****/
SL_HMAC_Init( context, SLC_MD5_ALGID, key, strlen( key ) );
/*****Calculate the HMAC by calling Update for each block of the file*****/
while( !feof( file ) )
{
unsigned int nCount = fread( buff, sizeof( char ), BUFF_SIZE, file );
if( ferror( file ) )
{
printf( "\nAn error occurred when accessing the file: %s", filename );
fclose( file );
return 0;
}
SL_HMAC_Update( context, buff, nCount );
}
/*****Do final changes and get the HMAC in hex format*********************/
SL_HMAC_FinalHex( context, hmachex, 0 ); /* SL_HMAC_FinalHex reinitializes the context */
fclose( file );
return 1;
}
int main()
{
char buff[ 256 ];
char key[ 256 ];
char hmachex[ SLC_MD5_HEXDIGESTSIZE ]; /*0 terminated*/
do
{
/*****Get the file name and the key from the user*************************/
printf( "\nEnter a file name:\n" );
gets( buff );
printf( "\nEnter a key:\n" );
gets( key );
/*****Calculate the HMAC**************************************************/
if( CalculateFileHMAC_MD5( buff, key, hmachex ) != 0 )
printf( "\nMD5 HMAC: %s", hmachex );
/*****Continue?***********************************************************/
printf( "\nContinue (Y/N)?" );
gets( buff );
} while ( *buff == 'y' || *buff == 'Y' );
return 0;
}
|