Cryptography Reference
In-Depth Information
int key_length,
const unsigned char *text,
int text_length,
void (*hash_block_operate)(const unsigned char *input, unsigned int hash[] ),
void (*hash_block_finalize)(const unsigned char *block, int length ),
int hash_block_length,
int hash_code_length,
unsigned int *hash_out )
{
unsigned char *ipad, *opad, *padded_block;
unsigned int *hash1;
int i;
// TODO if key_length > hash_block_length, should hash it using “hash_
// function” first and then use that as the key.
assert( key_length < hash_block_length );
hash1 = ( unsigned int * ) malloc( hash_code_length * sizeof( unsigned int )
);
ipad = ( unsigned char * ) malloc( hash_block_length );
padded_block = ( unsigned char * ) malloc( text_length + hash_block_length );
memset( ipad, 0x36, hash_block_length );
memset( padded_block, '\0', hash_block_length );
memcpy( padded_block, key, key_length );
for ( i = 0; i < hash_block_length; i++ )
{
padded_block[ i ] ^= ipad[ i ];
}
memcpy( padded_block + hash_block_length, text, text_length );
memcpy( hash1, hash_out, hash_code_length * sizeof( unsigned int ) );
digest_hash( padded_block, hash_block_length + text_length, hash1,
hash_code_length, hash_block_operate, hash_block_finalize );
opad = ( unsigned char * ) malloc( hash_block_length );
memset( opad, 0x5C, hash_block_length );
free( padded_block );
padded_block = ( unsigned char * ) malloc(
( hash_code_length * sizeof( int ) ) + hash_block_length );
memset( padded_block, '\0', hash_block_length );
memcpy( padded_block, key, key_length );
for ( i = 0; i < hash_block_length; i++ )
{
padded_block[ i ] ^= opad[ i ];
(Continued)
Search WWH ::




Custom Search