uint8_t *thread_meshcop_tlv_data_write_uint64(uint8_t *ptr, uint8_t type, uint64_t data) { *ptr++ = type; *ptr++ = 8; ptr = common_write_64_bit(data, ptr); return ptr; }
uint8_t *eapol_write_pdu_frame(uint8_t *ptr, eapol_pdu_t *eapol_pdu) { *ptr++ = EAPOL_PROTOCOL_VERSION; *ptr++ = eapol_pdu->packet_type; ptr = common_write_16_bit(eapol_pdu->packet_length, ptr); eapol_pdu->packet_body = ptr; if (eapol_pdu->packet_type == EAPOL_EAP_TYPE) { eap_header_t *eap_header = &eapol_pdu->msg.eap; ptr = eap_header_build(ptr, eap_header->length, eap_header->eap_code, eap_header->id_seq, eap_header->type); memcpy(ptr, eap_header->data_ptr, eap_header->length - (ptr - eapol_pdu->packet_body)); ptr += eap_header->length - (ptr - eapol_pdu->packet_body); } else if (eapol_pdu->packet_type == EAPOL_KEY_TYPE) { eapol_key_frame_t *key_frame = &eapol_pdu->msg.key; *ptr++ = key_frame->key_description; ptr = eapol_key_information_write(&key_frame->key_information, ptr); ptr = common_write_16_bit(key_frame->key_length, ptr); ptr = common_write_64_bit(key_frame->replay_counter, ptr); if (key_frame->key_nonce) { memcpy(ptr, key_frame->key_nonce, 32); } else { memset(ptr, 0, 32); } ptr += 32; if (key_frame->key_iv) { memcpy(ptr, key_frame->key_iv, 16); } else { memset(ptr, 0, 16); } ptr += 16; if (key_frame->key_rsc) { memcpy(ptr, key_frame->key_rsc, 8); } else { memset(ptr, 0, 8); } ptr += 8; //Reserved 8bytes memset(ptr, 0, 8); ptr += 8; if (key_frame->key_mic && key_frame->key_information.key_mic) { memcpy(ptr, key_frame->key_mic, 16); } else { memset(ptr, 0, 16); } ptr += 16; ptr = common_write_16_bit(key_frame->key_data_length, ptr); if (key_frame->key_data_length && key_frame->key_data) { memcpy(ptr, key_frame->key_data, key_frame->key_data_length); ptr += key_frame->key_data_length; } } return ptr; }