17 #ifndef __SM_COMMON_H__ 18 #define __SM_COMMON_H__ 33 #define SM_PRINT(x) printf x 38 #ifndef TO_MCU_ENDIAN_U16 39 #define TO_MCU_ENDIAN_U16(xx) ((xx<<8)|((xx>>8)&0X00FF)) 42 #ifndef TO_LITTLE_ENDIAN_U16 43 #define TO_LITTLE_ENDIAN_U16(xx) ((xx<<8)|((xx>>8)&0X00FF)) 46 #define UNUSED(x) { do { if(x){}; } while (0); } 48 #define SM_ROLE_MASTER 0 49 #define SM_ROLE_SLAVE 1 50 #define SM_NUMBER_OF_ROLES 2 52 #define SM_MIN_ENCRYPTION_KEY_SIZE 7 53 #define SM_MAX_ENCRYPTION_KEY_SIZE 16 55 #define SM_RAND_NUMBER_LEN 8 57 #define SM_MASTER_ID_LEN 10 //RAND:8 bytes, EDIV:2 bytes 59 #define SM_PASSKEY_LEN 3 61 #define SM_FEATURE_AUTHREQ_IDX 3 62 #define SM_FEATURE_INITKEYDISTR_IDX 5 63 #define SM_FEATURE_RESPKEYDISTR_IDX 6 65 #define SM_ENC_KEY_DISTRIBUTION 0x01 66 #define SM_ID_KEY_DISTRIBUTION 0x02 67 #define SM_SIGN_KEY_DISTRIBUTION 0x04 70 #define SM_BD_ADDR_TYPE_PUBLIC 0x00 71 #define SM_BD_ADDR_TYPE_RANDOM 0x01 74 #define SM_RAND_ADDR_STATIC 0x00 75 #define SM_RAND_ADDR_NON_RESOLV 0x01 76 #define SM_RAND_ADDR_RESOLV 0x02 79 #define SM_STATUS_OK 0 80 #define SM_STATUS_BUSY 1 // verify or generate signature 81 #define SM_STATUS_PROCESSING 2 // authentication procedure 82 #define SM_STATUS_FAIL 3 83 #define SM_STATUS_NOT_SUPPORT 4 84 #define SM_STATUS_INVALID_PARA 5 85 #define SM_STATUS_INPUT_CANCEL 6 86 #define SM_STATUS_KEY_NOT_EXIST 7 87 #define SM_STATUS_INSUFFICIENT_ENC 8 88 #define SM_STATUS_INSUFFICIENT_AUTH 9 91 #define SM_STATIC_RANDOM_ADDR_MSB 0x3 92 #define SM_PRIVATE_NONRESOLVABLE_ADDR_MSB 0x00 93 #define SM_PRIVATE_RESOLVABLE_ADDR_MSB 0x01 94 #define SM_ADDR_PRAND_LEN 3 95 #define SM_ADDR_HASH_LEN 3 96 #define SM_ADDR_LAST_BYTE 5 99 #define SM_P1_PREQ_IDX 2 100 #define SM_P1_PRES_IDX 9 101 #define SM_P1_PRES_INIT_KEY_IDX 14 102 #define SM_P1_PRES_RESP_KEY_IDX 15 105 #define SM_STATE_IDLE 0x00 106 #define SM_SLAVE_STATE_PHASE2_WAIT_PASSKEY 0x01 107 #define SM_SLAVE_STATE_PHASE2_GEN_SCONFIRM 0x02 108 #define SM_SLAVE_STATE_PHASE2_WAIT_MCONFIRM 0x03 109 #define SM_SLAVE_STATE_PHASE2_READY_TO_SEND_SCONFIRM 0x03 110 #define SM_SLAVE_STATE_PHASE2_WAIT_MRANDOM 0x04 111 #define SM_SLAVE_STATE_PHASE2_GEN_MCONFIRM 0x05 112 #define SM_SLAVE_STATE_PHASE2_SC_WAIT_PUCLIC_KEY 0x06 113 #define SM_SLAVE_STATE_PHASE2_SC_WAIT_NUMERIC_COMPARISON_VALUE 0x07 114 #define SM_SLAVE_STATE_PHASE2_SC_WAIT_USER_CONFIRM 0x08 115 #define SM_SLAVE_STATE_PHASE2_SC_GEN_EB 0x09 116 #define SM_SLAVE_STATE_PHASE2_SC_WAIT_EA 0x0A 117 #define SM_SLAVE_STATE_PHASE2_SC_READY_TO_CHECK_EA 0x0B //Got Ea, wait for EB 118 #define SM_SLAVE_STATE_PHASE2_SC_CHECKING_EA 0x0C //Checking Ea 119 #define SM_SLAVE_STATE_PHASE2_WAIT_STK_REQ_EVENT 0x0D 120 #define SM_MASTER_STATE_PHASE2_GEN_MCONFIRM 0x13 121 #define SM_MASTER_STATE_PHASE2_WAIT_SCONFIRM 0x14 122 #define SM_MASTER_STATE_PHASE2_WAIT_SRANDOM 0x15 123 #define SM_MASTER_STATE_PHASE2_GEN_SCONFIRM 0x16 124 #define SM_MASTER_STATE_PHASE2_WAIT_HCI_ENCRY_CHANGE_EVENT 0x17 125 #define SM_MASTER_STATE_PHASE2_READY_TO_SEND_MRANDOM 0x18 126 #define SM_MASTER_STATE_PHASE2_SC_GEN_EA 0x19 128 #define SM_STATE_PHASE3 0x30 129 #define SM_STATE_PHASE3_WAIT_ENC_INFO 0x31 130 #define SM_STATE_PHASE3_WAIT_ID_INFO 0x32 131 #define SM_STATE_PHASE3_WAIT_SIGNING_INFO 0x33 149 #define SM_SMPFLAG_ROLE_MASTER 0x00 150 #define SM_SMPFLAG_ROLE_SLAVE 0x80 154 uint32_t signCounter;
155 uint32_t peerSignCounter;
159 uint8_t peerAddrType;
164 uint8_t respKeyDistr;
166 uint8_t LTK[SM_MAX_ENCRYPTION_KEY_SIZE];
167 uint8_t peerLTK[SM_MAX_ENCRYPTION_KEY_SIZE];
169 uint8_t CSRK[SM_MAX_ENCRYPTION_KEY_SIZE];
170 uint8_t peerCSRK[SM_MAX_ENCRYPTION_KEY_SIZE];
172 uint8_t IRK[SM_MAX_ENCRYPTION_KEY_SIZE];
173 uint8_t peerIRK[SM_MAX_ENCRYPTION_KEY_SIZE];
175 uint8_t MasterInfo[SM_MASTER_ID_LEN];
176 uint8_t peerMasterInfo[SM_MASTER_ID_LEN];
177 }SM_PAIRING_RECORD_TYPE;
181 uint8_t pke[SM_PASSKEY_LEN];
183 }SM_PASSKEY_RECORD_TYPE;
190 uint8_t pairingMethod;
192 uint8_t peerRand[SM_MAX_ENCRYPTION_KEY_SIZE];
193 uint8_t rand[SM_MAX_ENCRYPTION_KEY_SIZE];
195 uint8_t confirm[SM_MAX_ENCRYPTION_KEY_SIZE];
199 uint8_t macKey[SM_MAX_ENCRYPTION_KEY_SIZE];
201 SM_PAIRING_RECORD_TYPE pairingData;
212 typedef void (*SM_TKVALUE_TABLE)(uint8_t idx);
213 typedef void(*SM_CommandHandler)(uint8_t, uint8_t*, SM_PAIRING_DATA *);
215 bool SM_Common_ValueCompare(uint8_t *ptr1, uint8_t *ptr2, uint8_t len);
216 bool SM_Common_IsSecureConnection(uint8_t idx);
217 SM_PAIRING_DATA *SM_Common_AllocPairingData(uint8_t idx);
218 uint8_t SM_Common_GetRi(uint8_t n, uint8_t *PK);
219 bool sm_hal_flash_load_data(uint8_t *addr, SM_PAIRING_RECORD_TYPE *record);