mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-01-31 09:32:57 +00:00
sm: sm_cmac_start -> sm_cmac_signed_write
This commit is contained in:
parent
9d585a824f
commit
4dfd504ad1
@ -326,7 +326,7 @@ static void att_run(void){
|
||||
log_info("Orig Signature: ");
|
||||
log_info_hexdump( &att_request_buffer[att_request_size-8], 8);
|
||||
uint16_t attribute_handle = little_endian_read_16(att_request_buffer, 1);
|
||||
sm_cmac_start(csrk, att_request_buffer[0], attribute_handle, att_request_size - 15, &att_request_buffer[3], counter_packet, att_signed_write_handle_cmac_result);
|
||||
sm_cmac_signed_write_start(csrk, att_request_buffer[0], attribute_handle, att_request_size - 15, &att_request_buffer[3], counter_packet, att_signed_write_handle_cmac_result);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -965,7 +965,7 @@ static void gatt_client_run(void){
|
||||
le_device_db_local_csrk_get(peripheral->le_device_index, csrk);
|
||||
uint32_t sign_counter = le_device_db_local_counter_get(peripheral->le_device_index);
|
||||
peripheral->gatt_client_state = P_W4_CMAC_RESULT;
|
||||
sm_cmac_start(csrk, ATT_SIGNED_WRITE_COMMAND, peripheral->attribute_handle, peripheral->attribute_length, peripheral->attribute_value, sign_counter, att_signed_write_handle_cmac_result);
|
||||
sm_cmac_signed_write_start(csrk, ATT_SIGNED_WRITE_COMMAND, peripheral->attribute_handle, peripheral->attribute_length, peripheral->attribute_value, sign_counter, att_signed_write_handle_cmac_result);
|
||||
}
|
||||
return;
|
||||
|
||||
|
45
src/ble/sm.c
45
src/ble/sm.c
@ -867,23 +867,8 @@ static int sm_cmac_last_block_complete(void){
|
||||
return (sm_cmac_message_len & 0x0f) == 0;
|
||||
}
|
||||
|
||||
static inline uint8_t sm_cmac_message_get_byte(uint16_t offset){
|
||||
if (offset >= sm_cmac_message_len) {
|
||||
log_error("sm_cmac_message_get_byte. out of bounds, access %u, len %u", offset, sm_cmac_message_len);
|
||||
return 0;
|
||||
}
|
||||
|
||||
offset = sm_cmac_message_len - 1 - offset;
|
||||
|
||||
// sm_cmac_header[3] | message[] | sm_cmac_sign_counter[4]
|
||||
if (offset < 3){
|
||||
return sm_cmac_header[offset];
|
||||
}
|
||||
int actual_message_len_incl_header = sm_cmac_message_len - 4;
|
||||
if (offset < actual_message_len_incl_header){
|
||||
return sm_cmac_message[offset - 3];
|
||||
}
|
||||
return sm_cmac_sign_counter[offset - actual_message_len_incl_header];
|
||||
int sm_cmac_ready(void){
|
||||
return sm_cmac_state == CMAC_IDLE;
|
||||
}
|
||||
|
||||
// generic cmac calculation
|
||||
@ -913,19 +898,35 @@ void sm_cmac_general_start(const sm_key_t key, uint16_t message_len, uint8_t (*g
|
||||
}
|
||||
|
||||
// cmac for ATT Message signing
|
||||
void sm_cmac_start(const sm_key_t k, uint8_t opcode, hci_con_handle_t con_handle, uint16_t message_len, const uint8_t * message, uint32_t sign_counter, void (*done_handler)(uint8_t * hash)){
|
||||
static uint8_t sm_cmac_signed_write_message_get_byte(uint16_t offset){
|
||||
if (offset >= sm_cmac_message_len) {
|
||||
log_error("sm_cmac_signed_write_message_get_byte. out of bounds, access %u, len %u", offset, sm_cmac_message_len);
|
||||
return 0;
|
||||
}
|
||||
|
||||
offset = sm_cmac_message_len - 1 - offset;
|
||||
|
||||
// sm_cmac_header[3] | message[] | sm_cmac_sign_counter[4]
|
||||
if (offset < 3){
|
||||
return sm_cmac_header[offset];
|
||||
}
|
||||
int actual_message_len_incl_header = sm_cmac_message_len - 4;
|
||||
if (offset < actual_message_len_incl_header){
|
||||
return sm_cmac_message[offset - 3];
|
||||
}
|
||||
return sm_cmac_sign_counter[offset - actual_message_len_incl_header];
|
||||
}
|
||||
|
||||
void sm_cmac_signed_write_start(const sm_key_t k, uint8_t opcode, hci_con_handle_t con_handle, uint16_t message_len, const uint8_t * message, uint32_t sign_counter, void (*done_handler)(uint8_t * hash)){
|
||||
// ATT Message Signing
|
||||
sm_cmac_header[0] = opcode;
|
||||
little_endian_store_16(sm_cmac_header, 1, con_handle);
|
||||
little_endian_store_32(sm_cmac_sign_counter, 0, sign_counter);
|
||||
uint16_t total_message_len = 3 + message_len + 4; // incl. virtually prepended att opcode, handle and appended sign_counter in LE
|
||||
sm_cmac_message = message;
|
||||
sm_cmac_general_start(k, total_message_len, &sm_cmac_message_get_byte, done_handler);
|
||||
sm_cmac_general_start(k, total_message_len, &sm_cmac_signed_write_message_get_byte, done_handler);
|
||||
}
|
||||
|
||||
int sm_cmac_ready(void){
|
||||
return sm_cmac_state == CMAC_IDLE;
|
||||
}
|
||||
|
||||
static void sm_cmac_handle_aes_engine_ready(void){
|
||||
switch (sm_cmac_state){
|
||||
|
30
src/ble/sm.h
30
src/ble/sm.h
@ -236,6 +236,23 @@ void sm_authorization_decline(hci_con_handle_t con_handle);
|
||||
*/
|
||||
void sm_authorization_grant(hci_con_handle_t con_handle);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Check if CMAC AES engine is ready
|
||||
* @return ready
|
||||
*/
|
||||
int sm_cmac_ready(void);
|
||||
|
||||
/*
|
||||
* @brief Generic CMAC AES
|
||||
* @param key
|
||||
* @param message_len
|
||||
* @param get_byte_callback
|
||||
* @param done_callback
|
||||
* @note hash is 16 bytes in big endian
|
||||
*/
|
||||
void sm_cmac_general_start(const sm_key_t key, uint16_t message_len, uint8_t (*get_byte_callback)(uint16_t offset), void (*done_callback)(uint8_t * hash));
|
||||
|
||||
/**
|
||||
* @brief Support for signed writes, used by att_server.
|
||||
* @note Message is in little endian to allows passing in ATT PDU without flipping.
|
||||
@ -248,18 +265,7 @@ void sm_authorization_grant(hci_con_handle_t con_handle);
|
||||
* @param message
|
||||
* @param sign_counter
|
||||
*/
|
||||
int sm_cmac_ready(void);
|
||||
void sm_cmac_start(const sm_key_t key, uint8_t opcode, uint16_t attribute_handle, uint16_t message_len, const uint8_t * message, uint32_t sign_counter, void (*done_callback)(uint8_t * hash));
|
||||
|
||||
/*
|
||||
* @brief Generic CMAC AES
|
||||
* @param key
|
||||
* @param message_len
|
||||
* @param get_byte_callback
|
||||
* @param done_callback
|
||||
* @note hash is 16 bytes in big endian
|
||||
*/
|
||||
void sm_cmac_general_start(const sm_key_t key, uint16_t message_len, uint8_t (*get_byte_callback)(uint16_t offset), void (*done_callback)(uint8_t * hash));
|
||||
void sm_cmac_signed_write_start(const sm_key_t key, uint8_t opcode, uint16_t attribute_handle, uint16_t message_len, const uint8_t * message, uint32_t sign_counter, void (*done_callback)(uint8_t * hash));
|
||||
|
||||
/*
|
||||
* @brief Match address against bonded devices
|
||||
|
@ -121,7 +121,7 @@ int l2cap_send_prepared_connectionless(uint16_t handle, uint16_t cid, uint16_t l
|
||||
int sm_cmac_ready(void){
|
||||
return 1;
|
||||
}
|
||||
void sm_cmac_start(const sm_key_t key, uint8_t opcode, uint16_t attribute_handle, uint16_t message_len, const uint8_t * message, uint32_t sign_counter, void (*done_callback)(uint8_t * hash)){
|
||||
void sm_cmac_signed_write_start(const sm_key_t key, uint8_t opcode, uint16_t attribute_handle, uint16_t message_len, const uint8_t * message, uint32_t sign_counter, void (*done_callback)(uint8_t * hash)){
|
||||
//sm_notify_client(SM_EVENT_IDENTITY_RESOLVING_SUCCEEDED, sm_central_device_addr_type, sm_central_device_address, 0, sm_central_device_matched);
|
||||
}
|
||||
int sm_le_device_index(uint16_t handle ){
|
||||
|
@ -1457,7 +1457,7 @@ static void ui_process_command(char buffer){
|
||||
// fetch csrk
|
||||
le_device_db_local_csrk_get(le_device_db_index, signing_csrk);
|
||||
// calc signature
|
||||
sm_cmac_start(signing_csrk, ATT_SIGNED_WRITE_COMMAND, pts_signed_write_characteristic_handle, sizeof(signed_write_value), signed_write_value, 0, att_signed_write_handle_cmac_result);
|
||||
sm_cmac_signed_write_start(signing_csrk, ATT_SIGNED_WRITE_COMMAND, pts_signed_write_characteristic_handle, sizeof(signed_write_value), signed_write_value, 0, att_signed_write_handle_cmac_result);
|
||||
break;
|
||||
case 'x':
|
||||
sm_min_key_size = 7;
|
||||
|
@ -275,7 +275,7 @@ TEST(SecurityManager, CMACTest){
|
||||
parse_hex(key, key_string);
|
||||
uint8_t message [] = "hallo";
|
||||
cmac_hash_received = 0;
|
||||
sm_cmac_start(key, 0x11, 0x1234, sizeof(message), message, 1, &cmac_done);
|
||||
sm_cmac_signed_write_start(key, 0x11, 0x1234, sizeof(message), message, 1, &cmac_done);
|
||||
while (!cmac_hash_received){
|
||||
aes128_report_result();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user