void ble_sm_public_key_log(struct ble_sm_public_key *cmd) { BLE_HS_LOG(DEBUG, "x="); ble_hs_log_flat_buf(cmd->x, sizeof cmd->x); BLE_HS_LOG(DEBUG, "y="); ble_hs_log_flat_buf(cmd->y, sizeof cmd->y); }
static int ble_sm_sc_ensure_keys_generated(void) { int rc; if (!ble_sm_sc_keys_generated) { rc = ble_sm_gen_pub_priv(ble_sm_sc_pub_key.u32, ble_sm_sc_priv_key.u32); if (rc != 0) { return rc; } ble_sm_sc_keys_generated = 1; } BLE_HS_LOG(DEBUG, "our pubkey="); ble_hs_log_flat_buf(&ble_sm_sc_pub_key, 64); BLE_HS_LOG(DEBUG, "\n"); BLE_HS_LOG(DEBUG, "our privkey="); ble_hs_log_flat_buf(&ble_sm_sc_priv_key, 32); BLE_HS_LOG(DEBUG, "\n"); return 0; }
static int ble_sm_sc_ensure_keys_generated(void) { int rc; if (!ble_sm_sc_keys_generated) { rc = ble_sm_gen_pub_priv(ble_sm_sc_pub_key.u32, ble_sm_sc_priv_key.u32); if (rc != BLE_HS_ENONE) { return rc; } ble_sm_sc_keys_generated = TRUE; } BLE_HS_LOG(DEBUG, "our pubkey="); ble_hs_log_flat_buf(&ble_sm_sc_pub_key, sizeof ble_sm_sc_pub_key); BLE_HS_LOG(DEBUG, "\n"); BLE_HS_LOG(DEBUG, "our privkey="); ble_hs_log_flat_buf(&ble_sm_sc_priv_key, sizeof ble_sm_sc_priv_key); BLE_HS_LOG(DEBUG, "\n"); return BLE_HS_ENONE; }
static void ble_sm_dhkey_check_process(struct ble_sm_proc *proc, struct ble_sm_dhkey_check *cmd, struct ble_sm_result *res) { uint8_t exp_value[16]; const uint8_t *peer_ota_addr; const uint8_t *our_ota_addr; uint8_t peer_id_addr_type; uint8_t our_id_addr_type; uint8_t iocap[3]; uint8_t ioact; if (proc->flags & BLE_SM_PROC_F_INITIATOR) { ble_sm_sc_dhkey_check_iocap(&proc->pair_rsp, iocap); } else { ble_sm_sc_dhkey_check_iocap(&proc->pair_req, iocap); } ble_sm_sc_dhkey_addrs(proc, &our_id_addr_type, &our_ota_addr, &peer_id_addr_type, &peer_ota_addr); BLE_HS_LOG(DEBUG, "tk="); ble_hs_log_flat_buf(proc->tk, 32); BLE_HS_LOG(DEBUG, "\n"); res->app_status = ble_sm_alg_f6(proc->mackey, ble_sm_peer_pair_rand(proc), ble_sm_our_pair_rand(proc), proc->tk, iocap, peer_id_addr_type, peer_ota_addr, our_id_addr_type, our_ota_addr, exp_value); if (res->app_status != 0) { res->sm_err = BLE_SM_ERR_UNSPECIFIED; res->enc_cb = 1; return; } if (memcmp(cmd->value, exp_value, 16) != 0) { /* Random number mismatch. */ res->sm_err = BLE_SM_ERR_DHKEY; res->app_status = BLE_HS_SM_US_ERR(BLE_SM_ERR_DHKEY); res->enc_cb = 1; return; } ioact = ble_sm_sc_io_action(proc); if (ble_sm_ioact_state(ioact) == proc->state) { proc->flags |= BLE_SM_PROC_F_ADVANCE_ON_IO; } if (ble_sm_proc_can_advance(proc)) { if (proc->flags & BLE_SM_PROC_F_INITIATOR) { proc->state = BLE_SM_PROC_STATE_ENC_START; } res->execute = 1; } }
void ble_sm_sc_random_rx(struct ble_sm_proc *proc, struct ble_sm_result *res) { uint8_t confirm_val[16]; uint8_t ia[6]; uint8_t ra[6]; uint8_t ioact; uint8_t iat; uint8_t rat; int rc; if (proc->flags & BLE_SM_PROC_F_INITIATOR || ble_sm_sc_responder_verifies_random(proc)) { BLE_HS_LOG(DEBUG, "tk="); ble_hs_log_flat_buf(proc->tk, 32); BLE_HS_LOG(DEBUG, "\n"); rc = ble_sm_alg_f4(proc->pub_key_peer.x, ble_sm_sc_pub_key.u8, ble_sm_peer_pair_rand(proc), proc->ri, confirm_val); if (rc != 0) { res->app_status = rc; res->sm_err = BLE_SM_ERR_UNSPECIFIED; res->enc_cb = 1; return; } if (memcmp(proc->confirm_peer, confirm_val, 16) != 0) { /* Random number mismatch. */ res->app_status = BLE_HS_SM_US_ERR(BLE_SM_ERR_CONFIRM_MISMATCH); res->sm_err = BLE_SM_ERR_CONFIRM_MISMATCH; res->enc_cb = 1; return; } } /* Calculate the mac key and ltk. */ ble_sm_ia_ra(proc, &iat, ia, &rat, ra); rc = ble_sm_alg_f5(proc->dhkey, proc->randm, proc->rands, iat, ia, rat, ra, proc->mackey, proc->ltk); if (rc != 0) { res->app_status = rc; res->sm_err = BLE_SM_ERR_UNSPECIFIED; res->enc_cb = 1; return; } /* Ensure the ltk gets persisted when the pairing procedure succeeds. */ memcpy(proc->our_keys.ltk, proc->ltk, sizeof proc->our_keys.ltk); proc->our_keys.ltk_valid = 1; proc->our_keys.ediv = 0; proc->our_keys.rand_val = 0; proc->our_keys.ediv_rand_valid = 1; memcpy(proc->peer_keys.ltk, proc->ltk, sizeof proc->peer_keys.ltk); proc->peer_keys.ltk_valid = 1; proc->peer_keys.ediv = 0; proc->peer_keys.rand_val = 0; proc->peer_keys.ediv_rand_valid = 1; if (proc->flags & BLE_SM_PROC_F_INITIATOR) { ble_sm_sc_random_advance(proc); ioact = ble_sm_sc_io_action(proc); if (ble_sm_ioact_state(ioact) == proc->state && !(proc->flags & BLE_SM_PROC_F_IO_INJECTED)) { res->passkey_params.action = ioact; BLE_HS_DBG_ASSERT(ioact == BLE_SM_IOACT_NUMCMP); ble_sm_sc_gen_numcmp(proc, res); } else { res->execute = 1; } } else { res->execute = 1; } }
void ble_sm_dhkey_check_log(struct ble_sm_dhkey_check *cmd) { BLE_HS_LOG(DEBUG, "value="); ble_hs_log_flat_buf(cmd->value, sizeof cmd->value); }
void ble_sm_sign_info_log(struct ble_sm_sign_info *cmd) { BLE_HS_LOG(DEBUG, "sig_key="); ble_hs_log_flat_buf(cmd->sig_key, sizeof cmd->sig_key); }
void ble_sm_id_info_log(struct ble_sm_id_info *cmd) { BLE_HS_LOG(DEBUG, "irk="); ble_hs_log_flat_buf(cmd->irk, sizeof cmd->irk); }
void ble_sm_enc_info_log(struct ble_sm_enc_info *cmd) { BLE_HS_LOG(DEBUG, "ltk="); ble_hs_log_flat_buf(cmd->ltk, sizeof cmd->ltk); }
void ble_sm_pair_random_log(struct ble_sm_pair_random *cmd) { BLE_HS_LOG(DEBUG, "value="); ble_hs_log_flat_buf(cmd->value, sizeof cmd->value); }