calculate local CSRK for key distribution

This commit is contained in:
matthias.ringwald 2014-06-15 10:26:41 +00:00
parent f20168b8c1
commit 937643c571
2 changed files with 48 additions and 8 deletions

View File

@ -115,12 +115,14 @@ typedef enum {
SM_STATE_PH3_Y_W4_ENC,
SM_STATE_PH3_LTK_GET_ENC,
SM_STATE_PH3_LTK_W4_ENC,
SM_STATE_PH3_CSRK_GET_ENC,
SM_STATE_PH3_CSRK_W4_ENC,
//
SM_STATE_DISTRIBUTE_KEYS,
SM_STATE_RECEIVE_KEYS,
// re establish previously distribued LTK
// Phase 4: re-establish previously distributed LTK
SM_STATE_PH4_Y_GET_ENC,
SM_STATE_PH4_Y_W4_ENC,
SM_STATE_PH4_LTK_GET_ENC,
@ -471,21 +473,31 @@ static void sm_aes128_start(sm_key_t key, sm_key_t plaintext){
hci_send_cmd(&hci_le_encrypt, key_flipped, plaintext_flipped);
}
static void sm_ah_r_prime(uint8_t r[3], sm_key_t d1_prime){
// ah(k,r) helper
// r = padding || r
// r - 24 bit value
static void sm_ah_r_prime(uint8_t r[3], sm_key_t r_prime){
// r'= padding || r
memset(d1_prime, 0, 16);
memcpy(&d1_prime[13], r, 3);
memset(r_prime, 0, 16);
memcpy(&r_prime[13], r, 3);
}
// d1 helper
// d' = padding || r || d
// d,r - 16 bit values
static void sm_d1_d_prime(uint16_t d, uint16_t r, sm_key_t d1_prime){
// d'= padding || r || d
printf("sm_d1_d_prime(0x%x, 0x%x) -> ", d, r);
memset(d1_prime, 0, 16);
net_store_16(d1_prime, 12, r);
net_store_16(d1_prime, 14, d);
hexdump(d1_prime, 16);
}
// dm helper
// r = padding || r
// r - 64 bit value
static void sm_dm_r_prime(uint8_t r[8], sm_key_t r_prime){
// r = padding || r
memset(r_prime, 0, 16);
memcpy(&r_prime[8], r, 8);
}
@ -1064,6 +1076,17 @@ static void sm_run(void){
sm_next_responding_state();
return;
case SM_STATE_PH3_CSRK_GET_ENC:
// already busy?
if (sm_aes128_state == SM_AES128_ACTIVE) break;
{
sm_key_t d_prime;
sm_d1_d_prime(setup->sm_local_div, 1, d_prime);
sm_aes128_start(sm_persistent_er, d_prime);
}
sm_next_responding_state();
return;
case SM_STATE_PH2_C1_GET_ENC_C:
// already busy?
if (sm_aes128_state == SM_AES128_ACTIVE) break;
@ -1343,6 +1366,7 @@ static void sm_handle_encryption_result(uint8_t * data){
swap128(data, y128);
setup->sm_local_y = READ_NET_16(y128, 14);
print_hex16("y", setup->sm_local_y);
// PH3B3 - calculate DIV
setup->sm_local_div = setup->sm_local_y ^ setup->sm_local_ediv;
print_hex16("ediv", setup->sm_local_ediv);
@ -1355,6 +1379,12 @@ static void sm_handle_encryption_result(uint8_t * data){
case SM_STATE_PH3_LTK_W4_ENC:
swap128(data, setup->sm_ltk);
print_key("ltk", setup->sm_ltk);
// calc CSRK next
connection->sm_state_responding = SM_STATE_PH3_CSRK_GET_ENC;
return;
case SM_STATE_PH3_CSRK_W4_ENC:
swap128(data, setup->sm_local_csrk);
print_key("csrk", setup->sm_local_csrk);
// distribute keys
connection->sm_state_responding = SM_STATE_DISTRIBUTE_KEYS;
return;

View File

@ -79,6 +79,10 @@ uint8_t test_command_packet_17[] = {
0x17, 0x20, 0x20, 0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x3a, 0x39, 0x38, 0x37, 0x36, 0x35, 0x34, 0x33,
0x32, 0x31, 0x30, 0xe2, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, };
uint8_t test_command_packet_18[] = {
0x17, 0x20, 0x20, 0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x3a, 0x39, 0x38, 0x37, 0x36, 0x35, 0x34, 0x33,
0x32, 0x31, 0x30, 0xe2, 0xf1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, };
uint8_t test_acl_packet_18[] = {
0x40, 0x00, 0x15, 0x00, 0x11, 0x00, 0x06, 0x00, 0x06, 0xef, 0x2f, 0xd9, 0x0b, 0x04, 0x7a, 0xe9,
@ -92,9 +96,8 @@ uint8_t test_acl_packet_20[] = {
uint8_t test_acl_packet_21[] = {
0x40, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x09, 0x00, 0xef, 0x32, 0x07, 0xdc, 0x1b, 0x00, };
uint8_t test_acl_packet_22[] = {
0x40, 0x00, 0x15, 0x00, 0x11, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
0x40, 0x00, 0x15, 0x00, 0x11, 0x00, 0x06, 0x00, 0x0a, 0x1d, 0x06, 0xba, 0xf4, 0x0c, 0x49, 0x55,
0x5b, 0x93, 0x93, 0xc1, 0x8b, 0x09, 0xd0, 0xb8, 0x80, };
bd_addr_t test_device_addr = {0x34, 0xb1, 0xf7, 0xd1, 0x77, 0x9b};
@ -105,6 +108,7 @@ void mock_simulate_sm_data_packet(uint8_t * packet, uint16_t size);
void mock_simulate_command_complete(const hci_cmd_t *cmd);
void mock_simulate_connected();
uint8_t * mock_packet_buffer(void);
uint16_t mock_packet_buffer_len(void);
void mock_clear_packet_buffer(void);
void hexdump2(void const *data, int size){
@ -241,6 +245,12 @@ TEST_GROUP(GATTClient){
aes128_report_result();
// expect le encrypt command
CHECK_HCI_COMMAND(test_command_packet_18);
aes128_report_result();
//
uint8_t num_completed_packets_event[] = { 0x13, 0x05, 0x01, 0x4a, 0x00, 0x01, 00 };
// expect send LE SMP Encryption Information Command