sm.c (1046568c8fed82922390eaa81b0675f1224490aa) | sm.c (6857ad8fd242d15c19df7d0905dfff96795f95a2) |
---|---|
1/* 2 * Copyright (C) 2014 BlueKitchen GmbH 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright --- 46 unchanged lines hidden (view full) --- 55#include "hci.h" 56#include "hci_dump.h" 57#include "l2cap.h" 58 59#if !defined(ENABLE_LE_PERIPHERAL) && !defined(ENABLE_LE_CENTRAL) 60#error "LE Security Manager used, but neither ENABLE_LE_PERIPHERAL nor ENABLE_LE_CENTRAL defined. Please add at least one to btstack_config.h." 61#endif 62 | 1/* 2 * Copyright (C) 2014 BlueKitchen GmbH 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright --- 46 unchanged lines hidden (view full) --- 55#include "hci.h" 56#include "hci_dump.h" 57#include "l2cap.h" 58 59#if !defined(ENABLE_LE_PERIPHERAL) && !defined(ENABLE_LE_CENTRAL) 60#error "LE Security Manager used, but neither ENABLE_LE_PERIPHERAL nor ENABLE_LE_CENTRAL defined. Please add at least one to btstack_config.h." 61#endif 62 |
63#if defined(ENABLE_CROSS_TRANSPORT_KEY_DERIVATION) && !defined(ENABLE_CLASSIC) 64#error "Cross Transport Key Derivation requires BR/EDR (Classic) support" 65#endif 66 |
|
63// assert SM Public Key can be sent/received 64#ifdef ENABLE_LE_SECURE_CONNECTIONS 65#if HCI_ACL_PAYLOAD_SIZE < 69 66#error "HCI_ACL_PAYLOAD_SIZE must be at least 69 bytes when using LE Secure Conection. Please increase HCI_ACL_PAYLOAD_SIZE or disable ENABLE_LE_SECURE_CONNECTIONS" 67#endif 68#endif 69 70#if defined(ENABLE_LE_PERIPHERAL) && defined(ENABLE_LE_CENTRAL) --- 7 unchanged lines hidden (view full) --- 78#define IS_RESPONDER(role) (1 || role) 79#endif 80#endif 81 82#if defined(ENABLE_LE_SIGNED_WRITE) || defined(ENABLE_LE_SECURE_CONNECTIONS) 83#define USE_CMAC_ENGINE 84#endif 85 | 67// assert SM Public Key can be sent/received 68#ifdef ENABLE_LE_SECURE_CONNECTIONS 69#if HCI_ACL_PAYLOAD_SIZE < 69 70#error "HCI_ACL_PAYLOAD_SIZE must be at least 69 bytes when using LE Secure Conection. Please increase HCI_ACL_PAYLOAD_SIZE or disable ENABLE_LE_SECURE_CONNECTIONS" 71#endif 72#endif 73 74#if defined(ENABLE_LE_PERIPHERAL) && defined(ENABLE_LE_CENTRAL) --- 7 unchanged lines hidden (view full) --- 82#define IS_RESPONDER(role) (1 || role) 83#endif 84#endif 85 86#if defined(ENABLE_LE_SIGNED_WRITE) || defined(ENABLE_LE_SECURE_CONNECTIONS) 87#define USE_CMAC_ENGINE 88#endif 89 |
90 |
|
86#define BTSTACK_TAG32(A,B,C,D) (((A) << 24) | ((B) << 16) | ((C) << 8) | (D)) 87 88// 89// SM internal types and globals 90// 91 92typedef enum { 93 DKG_W4_WORKING, --- 1353 unchanged lines hidden (view full) --- 1447 if (sm_sc_oob_state == SM_SC_OOB_W4_CONFIRM){ 1448 sm_sc_oob_state = SM_SC_OOB_IDLE; 1449 (*sm_sc_oob_callback)(hash, sm_sc_oob_random); 1450 return; 1451 } 1452 1453 sm_connection_t * sm_conn = sm_cmac_connection; 1454 sm_cmac_connection = NULL; | 91#define BTSTACK_TAG32(A,B,C,D) (((A) << 24) | ((B) << 16) | ((C) << 8) | (D)) 92 93// 94// SM internal types and globals 95// 96 97typedef enum { 98 DKG_W4_WORKING, --- 1353 unchanged lines hidden (view full) --- 1452 if (sm_sc_oob_state == SM_SC_OOB_W4_CONFIRM){ 1453 sm_sc_oob_state = SM_SC_OOB_IDLE; 1454 (*sm_sc_oob_callback)(hash, sm_sc_oob_random); 1455 return; 1456 } 1457 1458 sm_connection_t * sm_conn = sm_cmac_connection; 1459 sm_cmac_connection = NULL; |
1455#ifdef ENABLE_CLASSIC | 1460#ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION |
1456 link_key_type_t link_key_type; 1457#endif 1458 1459 switch (sm_conn->sm_engine_state){ 1460 case SM_SC_W4_CMAC_FOR_CONFIRMATION: 1461 (void)memcpy(setup->sm_local_confirm, hash, 16); 1462 sm_conn->sm_engine_state = SM_SC_SEND_CONFIRMATION; 1463 break; --- 51 unchanged lines hidden (view full) --- 1515 if (IS_RESPONDER(sm_conn->sm_role)){ 1516 // responder 1517 sm_conn->sm_engine_state = SM_SC_SEND_DHKEY_CHECK_COMMAND; 1518 } else { 1519 // initiator 1520 sm_conn->sm_engine_state = SM_INITIATOR_PH3_SEND_START_ENCRYPTION; 1521 } 1522 break; | 1461 link_key_type_t link_key_type; 1462#endif 1463 1464 switch (sm_conn->sm_engine_state){ 1465 case SM_SC_W4_CMAC_FOR_CONFIRMATION: 1466 (void)memcpy(setup->sm_local_confirm, hash, 16); 1467 sm_conn->sm_engine_state = SM_SC_SEND_CONFIRMATION; 1468 break; --- 51 unchanged lines hidden (view full) --- 1520 if (IS_RESPONDER(sm_conn->sm_role)){ 1521 // responder 1522 sm_conn->sm_engine_state = SM_SC_SEND_DHKEY_CHECK_COMMAND; 1523 } else { 1524 // initiator 1525 sm_conn->sm_engine_state = SM_INITIATOR_PH3_SEND_START_ENCRYPTION; 1526 } 1527 break; |
1523#ifdef ENABLE_CLASSIC | 1528#ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION |
1524 case SM_SC_W4_CALCULATE_H6_ILK: 1525 (void)memcpy(setup->sm_t, hash, 16); 1526 sm_conn->sm_engine_state = SM_SC_W2_CALCULATE_H6_BR_EDR_LINK_KEY; 1527 break; 1528 case SM_SC_W4_CALCULATE_H6_BR_EDR_LINK_KEY: 1529 reverse_128(hash, setup->sm_t); 1530 link_key_type = sm_conn->sm_connection_authenticated ? 1531 AUTHENTICATED_COMBINATION_KEY_GENERATED_FROM_P256 : UNAUTHENTICATED_COMBINATION_KEY_GENERATED_FROM_P256; --- 808 unchanged lines hidden (view full) --- 2340 connection->sm_engine_state = SM_SC_W4_CALCULATE_F5_LTK; 2341 f5_calculate_ltk(connection); 2342 break; 2343 case SM_SC_W2_CALCULATE_G2: 2344 if (!sm_cmac_ready()) break; 2345 connection->sm_engine_state = SM_SC_W4_CALCULATE_G2; 2346 g2_calculate(connection); 2347 break; | 1529 case SM_SC_W4_CALCULATE_H6_ILK: 1530 (void)memcpy(setup->sm_t, hash, 16); 1531 sm_conn->sm_engine_state = SM_SC_W2_CALCULATE_H6_BR_EDR_LINK_KEY; 1532 break; 1533 case SM_SC_W4_CALCULATE_H6_BR_EDR_LINK_KEY: 1534 reverse_128(hash, setup->sm_t); 1535 link_key_type = sm_conn->sm_connection_authenticated ? 1536 AUTHENTICATED_COMBINATION_KEY_GENERATED_FROM_P256 : UNAUTHENTICATED_COMBINATION_KEY_GENERATED_FROM_P256; --- 808 unchanged lines hidden (view full) --- 2345 connection->sm_engine_state = SM_SC_W4_CALCULATE_F5_LTK; 2346 f5_calculate_ltk(connection); 2347 break; 2348 case SM_SC_W2_CALCULATE_G2: 2349 if (!sm_cmac_ready()) break; 2350 connection->sm_engine_state = SM_SC_W4_CALCULATE_G2; 2351 g2_calculate(connection); 2352 break; |
2348#ifdef ENABLE_CLASSIC | 2353#ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION |
2349 case SM_SC_W2_CALCULATE_H6_ILK: 2350 if (!sm_cmac_ready()) break; 2351 connection->sm_engine_state = SM_SC_W4_CALCULATE_H6_ILK; 2352 h6_calculate_ilk(connection); 2353 break; 2354 case SM_SC_W2_CALCULATE_H6_BR_EDR_LINK_KEY: 2355 if (!sm_cmac_ready()) break; 2356 connection->sm_engine_state = SM_SC_W4_CALCULATE_H6_BR_EDR_LINK_KEY; --- 582 unchanged lines hidden (view full) --- 2939 if (setup->sm_key_distribution_send_set){ 2940 connection->sm_engine_state = SM_PH3_DISTRIBUTE_KEYS; 2941 } else { 2942 // no keys to send, just continue 2943 if (IS_RESPONDER(connection->sm_role)){ 2944 // slave -> receive master keys 2945 connection->sm_engine_state = SM_PH3_RECEIVE_KEYS; 2946 } else { | 2354 case SM_SC_W2_CALCULATE_H6_ILK: 2355 if (!sm_cmac_ready()) break; 2356 connection->sm_engine_state = SM_SC_W4_CALCULATE_H6_ILK; 2357 h6_calculate_ilk(connection); 2358 break; 2359 case SM_SC_W2_CALCULATE_H6_BR_EDR_LINK_KEY: 2360 if (!sm_cmac_ready()) break; 2361 connection->sm_engine_state = SM_SC_W4_CALCULATE_H6_BR_EDR_LINK_KEY; --- 582 unchanged lines hidden (view full) --- 2944 if (setup->sm_key_distribution_send_set){ 2945 connection->sm_engine_state = SM_PH3_DISTRIBUTE_KEYS; 2946 } else { 2947 // no keys to send, just continue 2948 if (IS_RESPONDER(connection->sm_role)){ 2949 // slave -> receive master keys 2950 connection->sm_engine_state = SM_PH3_RECEIVE_KEYS; 2951 } else { |
2947#ifdef ENABLE_CLASSIC | 2952#ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION |
2948 if (sm_ctkd_from_le()){ 2949 connection->sm_engine_state = SM_SC_W2_CALCULATE_H6_ILK; 2950 } else 2951#endif 2952 { 2953 sm_master_pairing_success(connection); 2954 } 2955 } --- 1039 unchanged lines hidden (view full) --- 3995 break; 3996 } 3997 // done with key distribution? 3998 if (sm_key_distribution_all_received(sm_conn)){ 3999 4000 sm_key_distribution_handle_all_received(sm_conn); 4001 4002 if (IS_RESPONDER(sm_conn->sm_role)){ | 2953 if (sm_ctkd_from_le()){ 2954 connection->sm_engine_state = SM_SC_W2_CALCULATE_H6_ILK; 2955 } else 2956#endif 2957 { 2958 sm_master_pairing_success(connection); 2959 } 2960 } --- 1039 unchanged lines hidden (view full) --- 4000 break; 4001 } 4002 // done with key distribution? 4003 if (sm_key_distribution_all_received(sm_conn)){ 4004 4005 sm_key_distribution_handle_all_received(sm_conn); 4006 4007 if (IS_RESPONDER(sm_conn->sm_role)){ |
4003#ifdef ENABLE_CLASSIC | 4008#ifdef ENABLE_CROSS_TRANSPORT_KEY_DERIVATION |
4004 if (sm_ctkd_from_le()){ 4005 sm_conn->sm_engine_state = SM_SC_W2_CALCULATE_H6_ILK; 4006 } else 4007#endif 4008 { 4009 sm_conn->sm_engine_state = SM_RESPONDER_IDLE; 4010 sm_notify_client_status_reason(sm_conn, ERROR_CODE_SUCCESS, 0); 4011 sm_done_for_handle(sm_conn->sm_handle); --- 515 unchanged lines hidden --- | 4009 if (sm_ctkd_from_le()){ 4010 sm_conn->sm_engine_state = SM_SC_W2_CALCULATE_H6_ILK; 4011 } else 4012#endif 4013 { 4014 sm_conn->sm_engine_state = SM_RESPONDER_IDLE; 4015 sm_notify_client_status_reason(sm_conn, ERROR_CODE_SUCCESS, 0); 4016 sm_done_for_handle(sm_conn->sm_handle); --- 515 unchanged lines hidden --- |