Commit 2e651ed2 authored by Guido Casati's avatar Guido Casati

Add NAS 5GS header decoding functions

parent b07ddb1e
......@@ -301,5 +301,8 @@ typedef struct {
int mm_msg_encode(const fgmm_nas_message_plain_t *mm_msg, uint8_t *buffer, uint32_t len);
int nas_protected_security_header_encode(uint8_t *buffer, const fgs_nas_message_security_header_t *header, int length);
int _nas_mm_msg_encode_header(const fgmm_msg_header_t *header, uint8_t *buffer, uint32_t len);
uint8_t decode_5gmm_msg_header(fgmm_msg_header_t *mm_header, const uint8_t *buffer, uint32_t len);
uint8_t decode_5gsm_msg_header(fgsm_msg_header_t *sm_header, const uint8_t *buffer, uint32_t len);
int decode_5gs_security_protected_header(fgs_nas_message_security_header_t *header, const uint8_t *buf, uint32_t len);
#endif // NR_NAS_DEFS_H
......@@ -132,3 +132,57 @@ int nas_protected_security_header_encode(uint8_t *buffer, const fgs_nas_message_
LOG_FUNC_RETURN(size);
}
/**
* @brief Decode plain 5GMM header from buffer and return fgmm_msg_header_t instance
*/
uint8_t decode_5gmm_msg_header(fgmm_msg_header_t *mm_header, const uint8_t *buffer, uint32_t len)
{
if (len < sizeof(fgmm_msg_header_t)) {
PRINT_NAS_ERROR("Failed to decode plain 5GMM header: buffer length too short\n");
return -1;
}
mm_header->ex_protocol_discriminator = *buffer++;
mm_header->security_header_type = *buffer++;
mm_header->message_type = *buffer++;
return sizeof(*mm_header);
}
/**
* @brief Decode plain 5GSM header from buffer and return fgsm_msg_header_t instance
*/
uint8_t decode_5gsm_msg_header(fgsm_msg_header_t *sm_header, const uint8_t *buffer, uint32_t len)
{
if (len < sizeof(fgsm_msg_header_t)) {
PRINT_NAS_ERROR("Failed to decode plain 5GSM header: buffer length too short\n");
return -1;
}
sm_header->ex_protocol_discriminator = *buffer++;
sm_header->pdu_session_id = *buffer++;
sm_header->pti = *buffer++;
sm_header->message_type = *buffer++;
return sizeof(*sm_header);
}
/**
* @brief Decode security protected 5GS header from buffer and return fgs_nas_message_security_header_t instance
*/
int decode_5gs_security_protected_header(fgs_nas_message_security_header_t *header, const uint8_t *buf, uint32_t len)
{
int decoded = 0;
if (len < sizeof(fgs_nas_message_security_header_t)) {
PRINT_NAS_ERROR("Failed to decode security protected 5GS header: buffer length too short\n");
return -1;
}
header->protocol_discriminator = *buf++;
decoded++;
header->security_header_type = *buf++;
decoded++;
uint32_t tmp;
memcpy(&tmp, buf, sizeof(tmp));
decoded += sizeof(tmp);
header->message_authentication_code = htonl(tmp);
header->sequence_number = *buf++;
decoded++;
return decoded;
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment