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 ---