Cryptography Reference
In-Depth Information
update_digest( &md5_digest, parameters->master_key,
parameters->proposed_cipher_spec->key_size );
if ( counter )
{
update_digest( &md5_digest, &counter, 1 );
counter++;
}
update_digest( &md5_digest, parameters->challenge, CHALLENGE_LEN );
update_digest( &md5_digest, parameters->connection_id,
parameters->connection_id_len );
finalize_digest( &md5_digest );
memcpy( key_material_ptr, md5_digest.hash, MD5_BYTE_SIZE );
key_material_ptr += MD5_BYTE_SIZE;
key_material_len -= MD5_BYTE_SIZE;
}
parameters->read_key = malloc(
parameters->proposed_cipher_spec->key_size );
parameters->write_key = malloc(
parameters->proposed_cipher_spec->key_size );
memcpy( parameters->read_key, key_material,
parameters->proposed_cipher_spec->key_size );
memcpy( parameters->write_key, key_material +
parameters->proposed_cipher_spec->key_size,
parameters->proposed_cipher_spec->key_size );
parameters->read_iv = malloc(
parameters->proposed_cipher_spec->IV_size );
parameters->write_iv = malloc(
parameters->proposed_cipher_spec->IV_size );
for ( i = 0; i < parameters->proposed_cipher_spec->IV_size; i++ )
{
// XXX these should be random
parameters->read_iv[ i ] = i;
parameters->write_iv[ i ] = i;
}
free( key_material );
}
First, fi gure out how much keying material you need: twice as much as
the length of the key as specifi ed in the cipher spec. Generate the master key, the
same length as one key:
key_material_len = parameters->proposed_cipher_spec->key_size * 2;
key_material_ptr = key_material = malloc( key_material_len );
parameters->master_key = malloc(
Search WWH ::




Custom Search