Cryptography Reference
In-Depth Information
// TODO support three-byte headers (when encrypting)
buf_len = data_len + 2;
buffer = malloc( buf_len );
header_len = htons( data_len );
memcpy( buffer, &header_len, 2 );
buffer[ 0 ] |= 0x80; // indicate two-byte length
memcpy( buffer + 2, data, data_len );
}
else
{
int padding = 0;
unsigned char *encrypted, *encrypt_buf, *mac_buf;
if ( parameters->active_cipher_spec->block_size )
{
padding = parameters->active_cipher_spec->block_size -
( data_len % parameters->active_cipher_spec->block_size );
}
buf_len = 3 + // sizeof header
parameters->active_cipher_spec->hash_size + // sizeof mac
data_len + // sizeof data
padding; // sizeof padding
buffer = malloc( buf_len );
header_len = htons( buf_len - 3 );
memcpy( buffer, &header_len, 2 );
buffer[ 2 ] = padding;
encrypt_buf = malloc( buf_len - 3 );
encrypted = malloc( buf_len - 3 );
memset( encrypt_buf, '\0', buf_len - 3 );
// Insert a MAC at the start of “encrypt_buf”
mac_buf = malloc( data_len + padding );
memset( mac_buf, '\0', data_len + padding );
memcpy( mac_buf, data, data_len );
add_mac( encrypt_buf, mac_buf, data_len + padding, parameters );
free( mac_buf );
// Add the data (padding was already set to zeros)
memcpy( encrypt_buf + parameters->active_cipher_spec->hash_size,
data, data_len );
// Finally encrypt the whole thing
parameters->active_cipher_spec->bulk_encrypt( encrypt_buf,
buf_len - 3, encrypted,
parameters->write_state ? parameters->write_state :
parameters->write_iv,
parameters->write_key );
memcpy( buffer + 3, encrypted, buf_len - 3 );
(Continued)
Search WWH ::




Custom Search