Add NAS Service Request enc/dec functions
* FGMM enc/dec library files * Plain message encoding + logic for security protected message * added fill_fgstmsi function * add checks on length in 5G-S-TMSI encoder function * encoding of NAS Service Request and relevant mandatory IEs
This commit is contained in:
@@ -38,6 +38,7 @@
|
||||
#include "FGSMobileIdentity.h"
|
||||
|
||||
#define MIN_LEN_FGS_MOBILE_ID_IE 3 // type of identity "No identity"
|
||||
#define LEN_5G_FGS_TMSI_IE 9
|
||||
|
||||
static int decode_guti_5gs_mobile_identity(Guti5GSMobileIdentity_t *guti, const uint8_t *buffer);
|
||||
|
||||
@@ -45,6 +46,56 @@ static int encode_guti_5gs_mobile_identity(Guti5GSMobileIdentity_t *guti, uint8_
|
||||
static int encode_suci_5gs_mobile_identity(Suci5GSMobileIdentity_t *suci, uint8_t *buffer);
|
||||
static int encode_imeisv_5gs_mobile_identity(Imeisv5GSMobileIdentity_t *imeisv, uint8_t *buffer);
|
||||
|
||||
int encode_stmsi_5gs_mobile_identity(uint8_t *buffer, Stmsi5GSMobileIdentity_t *stmsi, uint32_t len)
|
||||
{
|
||||
// Return if buffer is shorter than min length
|
||||
if (len < LEN_5G_FGS_TMSI_IE)
|
||||
return -1;
|
||||
|
||||
uint32_t encoded = 0;
|
||||
// octet 4
|
||||
*(buffer + encoded) = (DIGIT1 << 4) | ((stmsi->spare & 0x1) << 3) | (stmsi->typeofidentity & 0x7);
|
||||
encoded++;
|
||||
// octet 5-6
|
||||
uint16_t temp = 0x00 | ((stmsi->amfsetid) << 6) | (stmsi->amfpointer & 0x3f);
|
||||
IES_ENCODE_U16(buffer, encoded, temp);
|
||||
// octet 7
|
||||
IES_ENCODE_U32(buffer, encoded, stmsi->tmsi);
|
||||
return encoded;
|
||||
}
|
||||
|
||||
int decode_stmsi_5gs_mobile_identity(Stmsi5GSMobileIdentity_t *stmsi, const uint8_t *buffer, uint32_t len)
|
||||
{
|
||||
int decoded = 0;
|
||||
uint16_t temp;
|
||||
|
||||
// Return if buffer is shorter than min length
|
||||
if (len < LEN_5G_FGS_TMSI_IE)
|
||||
return -1;
|
||||
|
||||
// Octet 4: spare (bit 3) and type of identity (bits 0-2)
|
||||
stmsi->digit1 = DIGIT1;
|
||||
stmsi->spare = (*(buffer + decoded) >> 3) & 0x1;
|
||||
stmsi->typeofidentity = *(buffer + decoded) & 0x7;
|
||||
|
||||
// Validate type of identity
|
||||
if (stmsi->typeofidentity != FGS_MOBILE_IDENTITY_5GS_TMSI) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
decoded++;
|
||||
|
||||
// Octet 5-6: AMF Set ID (bits 6-15) and AMF Pointer (bits 0-5)
|
||||
IES_DECODE_U16(buffer, decoded, temp);
|
||||
stmsi->amfsetid = (temp >> 6) & 0x03ff;
|
||||
stmsi->amfpointer = temp & 0x3f;
|
||||
|
||||
// Octet 7-10: 32-bit TMSI
|
||||
IES_DECODE_U32(buffer, decoded, stmsi->tmsi);
|
||||
|
||||
return decoded;
|
||||
}
|
||||
|
||||
int decode_5gs_mobile_identity(FGSMobileIdentity *fgsmobileidentity, uint8_t iei, const uint8_t *buffer, uint32_t len)
|
||||
{
|
||||
int decoded_rc = TLV_DECODE_VALUE_DOESNT_MATCH;
|
||||
@@ -109,6 +160,10 @@ int encode_5gs_mobile_identity(FGSMobileIdentity *fgsmobileidentity, uint8_t iei
|
||||
buffer + encoded);
|
||||
}
|
||||
|
||||
if (fgsmobileidentity->stmsi.typeofidentity == FGS_MOBILE_IDENTITY_5GS_TMSI) {
|
||||
encoded_rc = encode_stmsi_5gs_mobile_identity(buffer + encoded, &fgsmobileidentity->stmsi, len);
|
||||
}
|
||||
|
||||
if (encoded_rc < 0) {
|
||||
return encoded_rc;
|
||||
}
|
||||
|
||||
@@ -37,6 +37,8 @@
|
||||
#ifndef FGS_MOBILE_IDENTITY_H_
|
||||
#define FGS_MOBILE_IDENTITY_H_
|
||||
|
||||
// 4x 1bit according to 9.11.3.4 5GS mobile identity (type 5G-S-TMSI)
|
||||
#define DIGIT1 0xF
|
||||
|
||||
typedef struct {
|
||||
uint8_t spare:5;
|
||||
@@ -151,5 +153,8 @@ int encode_5gs_mobile_identity(FGSMobileIdentity *fgsmobileidentity, uint8_t iei
|
||||
|
||||
int decode_5gs_mobile_identity(FGSMobileIdentity *fgsmobileidentity, uint8_t iei, const uint8_t *buffer, uint32_t len);
|
||||
|
||||
int encode_stmsi_5gs_mobile_identity(uint8_t *buffer, Stmsi5GSMobileIdentity_t *stmsi, uint32_t len);
|
||||
int decode_stmsi_5gs_mobile_identity(Stmsi5GSMobileIdentity_t *stmsi, const uint8_t *buffer, uint32_t len);
|
||||
|
||||
#endif /* FGS MOBILE IDENTITY_H_ */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user