Commit 25d5a587 authored by Tien Thinh NGUYEN's avatar Tien Thinh NGUYEN

Update Authentication Request

parent a78537c1
......@@ -89,10 +89,14 @@ constexpr uint8_t kIeiShortNameForNetwork = 0x45;
constexpr uint8_t kIeiPayloadContainerType = 0x08; // Should be verified
constexpr uint8_t kIeiNetworkSlicingIndication = 0x09; // 9-(4 higher bits)
constexpr uint8_t kIeiMicoIndication = 0x0B; // B-(4 higher bits)
constexpr uint8_t kIeiMicoIndication = 0x0B; // B-(4 higher bits)
constexpr uint8_t kIeiNasKeySetIdentifier = 0x0C; // C-(4 higher bits)
constexpr uint8_t kIei5gmmCapability = 0x10;
constexpr uint8_t kIeiUeUsageSetting = 0x18;
constexpr uint8_t kIeiAuthenticationParameterAutn = 0x20;
constexpr uint8_t kIeiAuthenticationParameterRand = 0x21;
constexpr uint8_t kIei5gmmCapability = 0x10;
constexpr uint8_t kIeiUeUsageSetting = 0x18;
constexpr uint8_t kIeiAllowedPduSessionStatus = 0x25;
constexpr uint8_t kIeiUeStatus = 0x2b;
......@@ -121,5 +125,5 @@ constexpr uint8_t kIei5gGuti = 0x77;
constexpr uint8_t kIeiImeisv = 0x77;
constexpr uint8_t kIeiNonImeisvPei = 0x78;
constexpr uint8_t kIeiEapMessage = 0x78; // TODO: to be verified
constexpr uint8_t kIeiEapMessage = 0x78;
constexpr uint8_t kIeiPayloadContainer = 0x7b;
......@@ -29,9 +29,9 @@ using namespace nas;
//------------------------------------------------------------------------------
AuthenticationRequest::AuthenticationRequest()
: NasMmPlainHeader(EPD_5GS_MM_MSG, AUTHENTICATION_REQUEST) {
ie_authentication_parameter_rand = NULL;
ie_authentication_parameter_autn = NULL;
ie_eap_message = NULL;
ie_authentication_parameter_rand = std::nullopt;
ie_authentication_parameter_autn = std::nullopt;
ie_eap_message = std::nullopt;
}
//------------------------------------------------------------------------------
......@@ -57,18 +57,20 @@ void AuthenticationRequest::setABBA(uint8_t length, uint8_t* value) {
//------------------------------------------------------------------------------
void AuthenticationRequest::setAuthentication_Parameter_RAND(uint8_t* value) {
ie_authentication_parameter_rand =
new Authentication_Parameter_RAND(0x21, value);
std::make_optional<Authentication_Parameter_RAND>(
kIeiAuthenticationParameterRand, value);
}
//------------------------------------------------------------------------------
void AuthenticationRequest::setAuthentication_Parameter_AUTN(uint8_t* value) {
ie_authentication_parameter_autn =
new Authentication_Parameter_AUTN(0x20, value);
std::make_optional<Authentication_Parameter_AUTN>(
kIeiAuthenticationParameterAutn, value);
}
//------------------------------------------------------------------------------
void AuthenticationRequest::setEAP_Message(bstring eap) {
ie_eap_message = new EAP_Message(0x78, eap);
ie_eap_message = std::make_optional<EAP_Message>(kIeiEapMessage, eap);
}
//------------------------------------------------------------------------------
......@@ -105,11 +107,11 @@ int AuthenticationRequest::Encode(uint8_t* buf, int len) {
}
// Authentication parameter RAND
if (!ie_authentication_parameter_rand) {
if (!ie_authentication_parameter_rand.has_value()) {
Logger::nas_mm().warn(
"IE ie_authentication_parameter_rand is not available");
} else {
int size = ie_authentication_parameter_rand->Encode(
int size = ie_authentication_parameter_rand.value().Encode(
buf + encoded_size, len - encoded_size);
if (size != 0) {
encoded_size += size;
......@@ -119,11 +121,11 @@ int AuthenticationRequest::Encode(uint8_t* buf, int len) {
}
}
// Authentication parameter AUTN
if (!ie_authentication_parameter_autn) {
if (!ie_authentication_parameter_autn.has_value()) {
Logger::nas_mm().warn(
"IE ie_authentication_parameter_autn is not available");
} else {
int size = ie_authentication_parameter_autn->Encode(
int size = ie_authentication_parameter_autn.value().Encode(
buf + encoded_size, len - encoded_size);
if (size != 0) {
encoded_size += size;
......@@ -133,10 +135,11 @@ int AuthenticationRequest::Encode(uint8_t* buf, int len) {
}
}
// EAP message
if (!ie_eap_message) {
if (!ie_eap_message.has_value()) {
Logger::nas_mm().warn("IE ie_eap_message is not available");
} else {
int size = ie_eap_message->Encode(buf + encoded_size, len - encoded_size);
int size =
ie_eap_message.value().Encode(buf + encoded_size, len - encoded_size);
if (size != 0) {
encoded_size += size;
} else {
......@@ -153,8 +156,9 @@ int AuthenticationRequest::Encode(uint8_t* buf, int len) {
//------------------------------------------------------------------------------
int AuthenticationRequest::Decode(uint8_t* buf, int len) {
Logger::nas_mm().debug("Decoding RegistrationReject message");
int decoded_size = 0;
decoded_size = NasMmPlainHeader::Decode(buf, len);
int decoded_size = 0;
int decoded_result = 0;
decoded_size = NasMmPlainHeader::Decode(buf, len);
decoded_size += ie_ngKSI.Decode(
buf + decoded_size, len - decoded_size, false,
......@@ -168,27 +172,45 @@ int AuthenticationRequest::Decode(uint8_t* buf, int len) {
Logger::nas_mm().debug("First option IEI 0x%x", octet);
while ((octet != 0x0)) {
switch (octet) {
case 0x21: {
Logger::nas_mm().debug("Decoding IEI(0x21)");
ie_authentication_parameter_rand = new Authentication_Parameter_RAND();
decoded_size += ie_authentication_parameter_rand->Decode(
buf + decoded_size, len - decoded_size, true);
case kIeiAuthenticationParameterRand: {
Logger::nas_mm().debug(
"Decoding IEI 0x%x", kIeiAuthenticationParameterRand);
Authentication_Parameter_RAND ie_authentication_parameter_rand_tmp = {};
if ((decoded_result = ie_authentication_parameter_rand_tmp.Decode(
buf + decoded_size, len - decoded_size, true)) ==
KEncodeDecodeError)
return decoded_result;
decoded_size += decoded_result;
ie_authentication_parameter_rand =
std::optional<Authentication_Parameter_RAND>(
ie_authentication_parameter_rand_tmp);
octet = *(buf + decoded_size);
Logger::nas_mm().debug("Next IEI 0x%x", octet);
} break;
case 0x20: {
ie_authentication_parameter_autn = new Authentication_Parameter_AUTN();
decoded_size += ie_authentication_parameter_autn->Decode(
buf + decoded_size, len - decoded_size, true);
case kIeiAuthenticationParameterAutn: {
Authentication_Parameter_AUTN ie_authentication_parameter_autn_tmp = {};
if ((decoded_result = ie_authentication_parameter_autn_tmp.Decode(
buf + decoded_size, len - decoded_size, true)) ==
KEncodeDecodeError)
return decoded_result;
decoded_size += decoded_result;
ie_authentication_parameter_autn =
std::optional<Authentication_Parameter_AUTN>(
ie_authentication_parameter_autn_tmp);
octet = *(buf + decoded_size);
Logger::nas_mm().debug("Next IEI 0x%x", octet);
} break;
case 0x78: {
Logger::nas_mm().debug("Decoding IEI 0x78");
ie_eap_message = new EAP_Message();
decoded_size += ie_eap_message->Decode(
buf + decoded_size, len - decoded_size, true);
octet = *(buf + decoded_size);
case kIeiEapMessage: {
Logger::nas_mm().debug("Decoding IEI 0x%x", kIeiEapMessage);
EAP_Message ie_eap_message_tmp = {};
if ((decoded_result = ie_eap_message_tmp.Decode(
buf + decoded_size, len - decoded_size, true)) ==
KEncodeDecodeError)
return decoded_result;
decoded_size += decoded_result;
ie_eap_message = std::optional<EAP_Message>(ie_eap_message_tmp);
octet = *(buf + decoded_size);
Logger::nas_mm().debug("Next IEI 0x%x", octet);
} break;
}
......
......@@ -43,11 +43,13 @@ class AuthenticationRequest : public NasMmPlainHeader {
void setAuthentication_Parameter_AUTN(uint8_t* value);
public:
NasKeySetIdentifier ie_ngKSI; // Mandatory
ABBA ie_abba; // Mandatory
Authentication_Parameter_RAND* ie_authentication_parameter_rand; // Optional
Authentication_Parameter_AUTN* ie_authentication_parameter_autn; // Optional
EAP_Message* ie_eap_message; // Optional
NasKeySetIdentifier ie_ngKSI; // Mandatory
ABBA ie_abba; // Mandatory
std::optional<Authentication_Parameter_RAND>
ie_authentication_parameter_rand; // Optional
std::optional<Authentication_Parameter_AUTN>
ie_authentication_parameter_autn; // Optional
std::optional<EAP_Message> ie_eap_message; // Optional
};
} // namespace nas
......
......@@ -174,7 +174,7 @@ void RegistrationRequest::Set5gSTmsi() {}
void RegistrationRequest::setNonCurrentNativeNasKSI(
uint8_t tsc, uint8_t key_set_id) {
ie_non_current_native_nas_ksi = std::make_optional<NasKeySetIdentifier>(
0xC, tsc, key_set_id); // TODO: remove hardcoded value
kIeiNasKeySetIdentifier, tsc, key_set_id);
}
//------------------------------------------------------------------------------
......
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