static void gzp_process_id_req(uint8_t* rx_payload) { uint8_t temp_host_id[GZP_HOST_ID_LENGTH]; if(gzp_pairing_enabled_f) { if(!gzp_id_req_received()) { gzp_crypt_set_session_token(&rx_payload[GZP_CMD_HOST_ID_REQ_SESSION_TOKEN]); gzp_id_req_stat = GZP_ID_REQ_PENDING; } // If host ID not generated yet if(!gzp_get_host_id(temp_host_id)) { // Generate new host ID from "session counter" and received "session token" gzp_get_session_counter(temp_host_id); if(GZP_HOST_ID_LENGTH > GZP_SESSION_TOKEN_LENGTH) { gzp_xor_cipher(temp_host_id, temp_host_id, &rx_payload[GZP_CMD_HOST_ID_REQ_SESSION_TOKEN], GZP_SESSION_TOKEN_LENGTH); } else { gzp_xor_cipher(temp_host_id, temp_host_id, &rx_payload[GZP_CMD_HOST_ID_REQ_SESSION_TOKEN], GZP_HOST_ID_LENGTH); } gzp_set_host_id(temp_host_id); } } }
static void gzp_process_id_req(uint8_t* rx_payload) { int i; uint8_t temp_host_id[GZP_HOST_ID_LENGTH]; if(gzp_pairing_enabled_f) { if(!gzp_id_req_received()) { gzp_crypt_set_session_token(&rx_payload[GZP_CMD_HOST_ID_REQ_SESSION_TOKEN]); gzp_id_req_stat = GZP_ID_REQ_PENDING; } gzp_get_host_id(temp_host_id); // Added: for(i = 0; i < GZP_HOST_ID_LENGTH; i++) { if(temp_host_id[i] != 0xFF) { break; } } if(i == GZP_HOST_ID_LENGTH) // If host not generated yet { gzp_get_session_counter(temp_host_id); //lint -save -e506 Constantvalue Boolean if(GZP_HOST_ID_LENGTH > GZP_SESSION_TOKEN_LENGTH) { //lint -restore gzp_xor_cipher(temp_host_id, temp_host_id, &rx_payload[GZP_CMD_HOST_ID_REQ_SESSION_TOKEN], GZP_SESSION_TOKEN_LENGTH); } else { gzp_xor_cipher(temp_host_id, temp_host_id, &rx_payload[GZP_CMD_HOST_ID_REQ_SESSION_TOKEN], GZP_HOST_ID_LENGTH); } gzp_set_host_id(temp_host_id); } } }
gzp_id_req_res_t gzp_id_req_send() { uint8_t tx_packet[GZP_CMD_HOST_ID_REQ_PAYLOAD_LENGTH]; uint8_t rx_packet[GZP_MAX_ACK_PAYLOAD_LENGTH]; gzp_tx_rx_trans_result_t trans_result; // If no ID request is pending, send new "ID request" if(!gzp_id_req_pending) { // Build "Host ID request packet" tx_packet[0] = (uint8_t)GZP_CMD_HOST_ID_REQ; // Generate new session token gzp_random_numbers_generate(&tx_packet[GZP_CMD_HOST_ID_REQ_SESSION_TOKEN], GZP_SESSION_TOKEN_LENGTH); // Send "Host ID request" if(gzp_tx_packet(tx_packet, GZP_CMD_HOST_ID_REQ_PAYLOAD_LENGTH, GZP_DATA_PIPE)) { // Update session token if "Host ID request" was successfully transmitted gzp_crypt_set_session_token(&tx_packet[GZP_CMD_HOST_ID_REQ_SESSION_TOKEN]); gzp_id_req_pending = true; return GZP_ID_RESP_PENDING; } } else // If "ID request is pending" send "fetch ID" packet { // Build "host ID fetch" packet tx_packet[0] = (uint8_t)GZP_CMD_HOST_ID_FETCH; gzp_add_validation_id(&tx_packet[GZP_CMD_HOST_ID_FETCH_VALIDATION_ID]); // Encrypt "host ID fetch" packet gzp_crypt_select_key(GZP_ID_EXCHANGE); gzp_crypt(&tx_packet[1], &tx_packet[1], GZP_CMD_HOST_ID_FETCH_PAYLOAD_LENGTH - 1); trans_result = gzp_tx_rx_transaction(tx_packet, GZP_CMD_HOST_ID_FETCH_PAYLOAD_LENGTH, rx_packet, NULL, GZP_DATA_PIPE); // If packet was successfully sent AND a response packet was received if(trans_result == GZP_TX_RX_SUCCESS) { // Validate response packet if(rx_packet[0] == (uint8_t)GZP_CMD_HOST_ID_FETCH_RESP) { gzp_crypt(&rx_packet[1], &rx_packet[1], GZP_CMD_HOST_ID_FETCH_RESP_PAYLOAD_LENGTH - 1); if(gzp_validate_id(&rx_packet[GZP_CMD_HOST_ID_FETCH_RESP_VALIDATION_ID])) { switch(rx_packet[GZP_CMD_HOST_ID_FETCH_RESP_STATUS]) { case GZP_ID_RESP_PENDING: break; case GZP_ID_RESP_REJECTED: gzp_id_req_pending = false; break; case GZP_ID_RESP_GRANTED: gzp_set_host_id(&rx_packet[GZP_CMD_HOST_ID_FETCH_RESP_HOST_ID]); gzp_random_numbers_generate(dyn_key, GZP_DYN_KEY_LENGTH); gzp_crypt_set_dyn_key(dyn_key); #ifndef GZP_NV_STORAGE_DISABLE (void)gzp_params_store(true); #endif gzp_id_req_pending = false; break; default: break; } return (gzp_id_req_res_t)rx_packet[GZP_CMD_HOST_ID_FETCH_RESP_STATUS]; } else { gzp_id_req_pending = false; return GZP_ID_RESP_REJECTED; } } } } gzp_id_req_pending = false; return GZP_ID_RESP_FAILED; }