예제 #1
0
bool mle_tlv_read_64_bit_tlv(mle_tlv_type_t reqType, uint8_t *ptr, uint16_t data_len, uint64_t *buffer)
{
    mle_tlv_info_t tlv_info;
    if (mle_tlv_option_discover(ptr, data_len, reqType, &tlv_info) >= 8) {
        *buffer = common_read_64_bit(tlv_info.dataPtr);
        return true;
    }

    return false;
}
예제 #2
0
uint8_t thread_meshcop_tlv_data_get_uint64(const uint8_t *ptr, uint16_t length, uint8_t type, uint64_t *data_ptr)
{
    uint8_t result_len;
    uint8_t *result_ptr;

    result_len = thread_meshcop_tlv_find(ptr, length, type, &result_ptr);
    if (result_len >= 8 && data_ptr) {
        *data_ptr = common_read_64_bit(result_ptr);
    }
    return result_len;
}
예제 #3
0
static bool eapol_parse_key_packet(eapol_pdu_t *eapol_pdu)
{
    if (eapol_pdu->packet_length < EAPOL_KEY_FRAME_BASE_SIZE) {
        return false;
    }
    uint8_t *ptr = eapol_pdu->packet_body;
    eapol_key_frame_t *key_frame = &eapol_pdu->msg.key;
    key_frame->key_description = *ptr++;
    if (key_frame->key_description != EAPOL_RSN_KEY_DESCRIPTION) {
        return false;
    }
    ptr = eapol_key_information_read(&key_frame->key_information, ptr);
    if (key_frame->key_information.description_version != KEY_DESCRIPTION_HMAC_SHA1_MIC_AES_ENC) {
        return false;
    }
    key_frame->key_length = common_read_16_bit(ptr);
    ptr += 2;

    key_frame->replay_counter = common_read_64_bit(ptr);
    ptr += 8;

    key_frame->key_nonce = ptr;
    ptr += 32;

    key_frame->key_iv = ptr;
    ptr += 16;

    key_frame->key_rsc = ptr;
    ptr += 16; //Skip 8 byte RSC + RESERVED 8

    key_frame->key_mic = ptr;
    ptr += 16;

    key_frame->key_data_length = common_read_16_bit(ptr);
    ptr += 2;
    key_frame->key_data = ptr;
    if (key_frame->key_data_length > (eapol_pdu->packet_length - EAPOL_KEY_FRAME_BASE_SIZE)) {
        return false;
    }

    return true;

}