Cryptography Reference
In-Depth Information
ProtectionParameters *parameters )
{
TLSPlaintext header;
unsigned char *send_buffer;
int send_buffer_size;
unsigned char *mac = NULL;
digest_ctx digest;
CipherSuite *active_suite;
active_suite = &suites[ parameters->suite ];
if ( active_suite->new_digest )
{
// Allocate enough space for the 8-byte sequence number, the 5-byte pseudo
// header, and the content.
unsigned char *mac_buffer = malloc( 13 + content_len );
int sequence_num;
mac = ( unsigned char * ) malloc( active_suite->hash_size );
active_suite->new_digest( &digest );
memset( mac_buffer, 0x0, 8 );
sequence_num = htonl( parameters->seq_num );
memcpy( mac_buffer + 4, &sequence_num, sizeof( int ) );
// These will be overwritten below
header.type = content_type;
header.version.major = 3;
header.version.minor = 1;
header.length = htons( content_len );
mac_buffer[ 8 ] = header.type;
mac_buffer[ 9 ] = header.version.major;
mac_buffer[ 10 ] = header.version.minor;
memcpy( mac_buffer + 11, &header.length, sizeof( short ) );
memcpy( mac_buffer + 13, content, content_len );
hmac( parameters->MAC_secret,
active_suite->hash_size,
mac_buffer, 13 + content_len,
&digest );
memcpy( mac, digest.hash, active_suite->hash_size );
free( mac_buffer );
}
send_buffer_size = content_len + active_suite->hash_size ;
parameters->seq_num++;
Search WWH ::




Custom Search