mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-03-14 01:27:41 +00:00
calculate local CSRK for key distribution
This commit is contained in:
parent
f20168b8c1
commit
937643c571
40
ble/sm.c
40
ble/sm.c
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user