use aes128 engine for c1 calculation of master and slave

This commit is contained in:
matthias.ringwald@gmail.com 2013-11-11 23:11:16 +00:00
parent 42fe45bd0c
commit 70ddf9cf63

View File

@ -108,12 +108,18 @@ typedef enum {
SM_STATE_C1_W4_RANDOM_A, SM_STATE_C1_W4_RANDOM_A,
SM_STATE_C1_GET_RANDOM_B, SM_STATE_C1_GET_RANDOM_B,
SM_STATE_C1_W4_RANDOM_B, SM_STATE_C1_W4_RANDOM_B,
SM_STATE_C1_GET_ENC_A, SM_STATE_C1_GET_ENC_A,
SM_STATE_C1_W4_ENC_A, SM_STATE_C1_W4_ENC_A,
SM_STATE_C1_GET_ENC_B, SM_STATE_C1_GET_ENC_B,
SM_STATE_C1_W4_ENC_B, SM_STATE_C1_W4_ENC_B,
SM_STATE_C1_SEND, SM_STATE_C1_SEND,
SM_STATE_C1_GET_ENC_C,
SM_STATE_C1_W4_ENC_C,
SM_STATE_C1_GET_ENC_D,
SM_STATE_C1_W4_ENC_D,
SM_STATE_W4_LTK_REQUEST, SM_STATE_W4_LTK_REQUEST,
SM_STATE_W4_CONNECTION_ENCRYPTED, SM_STATE_W4_CONNECTION_ENCRYPTED,
@ -489,6 +495,8 @@ static void sm_run(void){
return; return;
case SM_STATE_C1_GET_ENC_A: case SM_STATE_C1_GET_ENC_A:
case SM_STATE_C1_GET_ENC_B: case SM_STATE_C1_GET_ENC_B:
case SM_STATE_C1_GET_ENC_C:
case SM_STATE_C1_GET_ENC_D:
{ {
key_t key_flipped, plaintext_flipped; key_t key_flipped, plaintext_flipped;
swap128(sm_aes128_key, key_flipped); swap128(sm_aes128_key, key_flipped);
@ -630,14 +638,20 @@ static void sm_packet_handler(uint8_t packet_type, uint16_t handle, uint8_t *pac
// received random value // received random value
swap128(&packet[1], sm_m_random); swap128(&packet[1], sm_m_random);
// validate m confirm // // validate m confirm
if (!sm_validate_m_confirm()){ // if (!sm_validate_m_confirm()){
sm_send_pairing_failed = 1; // sm_send_pairing_failed = 1;
sm_pairing_failed_reason = SM_REASON_CONFIRM_VALUE_FAILED; // sm_pairing_failed_reason = SM_REASON_CONFIRM_VALUE_FAILED;
break; // break;
} // }
// send s_random // // send s_random
sm_send_s_random = 1; // sm_send_s_random = 1;
// use aes128 engine
// calculate m_confirm using aes128 engine - step 1
memcpy(sm_aes128_key, sm_tk, 16);
sm_c1_t1(sm_m_random, sm_preq, sm_pres, sm_m_addr_type, sm_s_addr_type, sm_aes128_plaintext);
sm_state_responding = SM_STATE_C1_GET_ENC_C;
break; break;
case SM_CODE_ENCRYPTION_INFORMATION: case SM_CODE_ENCRYPTION_INFORMATION:
@ -826,6 +840,7 @@ static void packet_handler (void * connection, uint8_t packet_type, uint16_t cha
if (COMMAND_COMPLETE_EVENT(packet, hci_le_encrypt)){ if (COMMAND_COMPLETE_EVENT(packet, hci_le_encrypt)){
switch (sm_state_responding){ switch (sm_state_responding){
case SM_STATE_C1_W4_ENC_A: case SM_STATE_C1_W4_ENC_A:
case SM_STATE_C1_W4_ENC_C:
{ {
memcpy(sm_aes128_key, sm_tk, 16); memcpy(sm_aes128_key, sm_tk, 16);
key_t t2; key_t t2;
@ -835,15 +850,30 @@ static void packet_handler (void * connection, uint8_t packet_type, uint16_t cha
sm_state_responding++; sm_state_responding++;
break; break;
case SM_STATE_C1_W4_ENC_B: case SM_STATE_C1_W4_ENC_B:
{
swap128(&packet[6], sm_s_confirm); swap128(&packet[6], sm_s_confirm);
printf("c1! "); printf("c1! ");
hexdump(sm_s_confirm, 16); hexdump(sm_s_confirm, 16);
sm_state_responding++; sm_state_responding++;
// HACK to avoid successful pairing break;
// c1[0] = 023; case SM_STATE_C1_W4_ENC_D:
{
key_t m_confirm_test;
swap128(&packet[6], m_confirm_test);
printf("c1! ");
hexdump(m_confirm_test, 16);
if (memcmp(sm_m_confirm, m_confirm_test, 16) == 0){
// send s_random
sm_send_s_random = 1;
sm_state_responding = SM_STATE_W4_LTK_REQUEST;
break;
}
sm_send_pairing_failed = 1;
sm_pairing_failed_reason = SM_REASON_CONFIRM_VALUE_FAILED;
break;
} }
break; break;
default: default: