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

Update Authentication Request

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