Loading NAS_ETSI.code-workspace +6 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,12 @@ }, { "path": "../free5gc.util" }, { "path": "../5G_ciphered_NAS_decipher_tool" }, { "path": "../../frameworks/CryptoMobile/CryptoMobile" } ], "settings": { Loading ccsrc/Externals/NG_security_ext.cc +127 −44 Original line number Diff line number Diff line Loading @@ -3,6 +3,9 @@ #include <iomanip> #include <random> #include <cstring> #include <openssl/evp.h> //#include "NG_SecurityDefinitionsAndExternalFunctions.hh" #include "NG_NAS_SecurityFunctions.hh" //#include "NR_RRC_ASN1_Definitions.hh" Loading @@ -13,8 +16,7 @@ #include "loggers.hh" //namespace NG__SecurityDefinitionsAndExternalFunctions { namespace NG__NAS__SecurityFunctions { namespace NG__SecurityDefinitionsAndExternalFunctions { /** * @desc This external function ... Loading @@ -25,16 +27,97 @@ namespace NG__NAS__SecurityFunctions { //BITSTRING fx__NR__AsIntegrityAlgorithm(const OCTETSTRING &a, const NR__RRC__ASN1__Definitions::IntegrityProtAlgorithm& b, const BITSTRING &c, const OCTETSTRING &d, const BITSTRING &e, const INTEGER &f){ //return int2bit(0, 0); //} OCTETSTRING fx__NG__NasIntegrityAlgorithm(const OCTETSTRING& p_EncodedNasPdu, const BITSTRING& p_IntegrityAlgorithm, const BITSTRING& p_KNASint, const OCTETSTRING& p_NasCount, const BITSTRING& p_BearerId, const INTEGER& p_Direction){ return int2oct(0, 0); } OCTETSTRING fx__NG__NasCiphering(const OCTETSTRING& p_EncodedNasPdu,const BITSTRING& p_CipheringAlgorithm, const BITSTRING& p_KNASenc, const OCTETSTRING& p_NasCount, const BITSTRING& p_BearerId){ OCTETSTRING fx__NG__NasCiphering(const OCTETSTRING& p_EncodedNasPdu,const BITSTRING& p_CipheringAlgorithm, const BITSTRING& p_KNASenc, const OCTETSTRING& p_NasCount, const BITSTRING& p_BearerId, const INTEGER& p_Direction){ loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_EncodedNasPdu: ", p_EncodedNasPdu); loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_CipheringAlgorithm: ", bit2oct(p_CipheringAlgorithm)); loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_KNASenc: ", bit2oct(p_KNASenc)); loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_NasCount: ", p_NasCount); loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_BearerId: ", bit2oct(p_BearerId)); loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_Direction: ", p_Direction); // sanity checks if (p_CipheringAlgorithm.lengthof() != 4)/* || (p_CipheringAlgorithm.get_value() != 0b0001)*/ { /// 0b0001 = EEA2 (AES-128) loggers::get_instance().error("fx__NG__NasCiphering: p_CipheringAlgorithm: Wrong length"); return int2oct(0, 0); } else if (p_KNASenc.lengthof() != 128) { loggers::get_instance().error("fx__NG__NasCiphering: p_KNASenc: Wrong length"); return int2oct(0, 0); } else if ((p_NasCount.lengthof() != 4) || (p_BearerId.lengthof() != 5)) { loggers::get_instance().error("fx__NG__NasCiphering: p_NasCount/p_BearerId: Wrong length"); return int2oct(0, 0); } OCTETSTRING fx__NG__NasDeciphering(const OCTETSTRING& p_CipheredNasMsg, const BITSTRING& p_CipheringAlgorithm, const BITSTRING& p_KNASenc, const OCTETSTRING& p_NasCount, const BITSTRING& p_BearerId){ // Cypher key const unsigned char* key = (const unsigned char*)bit2oct(p_KNASenc); // Construct IV (counter block) as per 3GPP TS 33.501 Annex C.3 const unsigned char iv_length = 16; unsigned char iv[iv_length] = {0}; const unsigned char* nas_count = (const unsigned char*)p_NasCount; iv[0] = nas_count[0]; iv[1] = nas_count[1]; iv[2] = nas_count[2]; iv[3] = nas_count[3]; // BearerId: 5 bits, Direction: 1 bit (LSB) unsigned char bearer_dir = ((*((const unsigned char*)bit2oct(p_BearerId)) & 0x1F) << 3) | (((unsigned char)p_Direction.get_long_long_val() & 0x01) << 2); loggers::get_instance().log("fx__NG__NasCiphering: bearer_dir=0x%02x", bearer_dir); iv[4] = bearer_dir; unsigned int u = p_EncodedNasPdu.lengthof(); loggers::get_instance().log_to_hexa("fx__NG__NasCiphering: p_EncodedNasPdu.lengthof()=", (unsigned char*)&u, 4); loggers::get_instance().log("fx__NG__NasCiphering: >> 8 %02x=", u >> 8); loggers::get_instance().log("fx__NG__NasCiphering: >> 16 %02x=", u >> 16); loggers::get_instance().log("fx__NG__NasCiphering: >> 24 %02x=", u >> 24); loggers::get_instance().log("fx__NG__NasCiphering: << 8 %02x=", u << 8); OCTETSTRING data_len = int2oct(p_EncodedNasPdu.lengthof(), 4); const unsigned char* data_len_ = (const unsigned char*)data_len; iv[5] = data_len_[0]; iv[6] = data_len_[1]; iv[7] = data_len_[2]; iv[8] = data_len_[3]; // Remaining bytes are zero (already set) loggers::get_instance().log_to_hexa("fx__NG__NasCiphering: iv=", iv, iv_length); // Prepare input/output const unsigned char* plaintext = (const unsigned char*)p_EncodedNasPdu; int plaintext_len = p_EncodedNasPdu.lengthof(); std::vector<unsigned char> ciphertext(plaintext_len); loggers::get_instance().log_to_hexa("fx__NG__NasCiphering: plaintext=", plaintext, plaintext_len); // OpenSSL AES-CTR encryption EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new(); int outlen1 = 0, outlen2 = 0; if (!ctx) { loggers::get_instance().error("fx__NG__NasCiphering: EVP_CIPHER_CTX_new failed"); return int2oct(0, 0); } if (EVP_EncryptInit_ex(ctx, EVP_aes_128_ctr(), NULL, key, iv) != 1) { loggers::get_instance().error("fx__NG__NasCiphering: EVP_EncryptInit_ex failed"); EVP_CIPHER_CTX_free(ctx); return int2oct(0, 0); } if (EVP_EncryptUpdate(ctx, ciphertext.data(), &outlen1, plaintext, plaintext_len) != 1) { loggers::get_instance().error("fx__NG__NasCiphering: EVP_EncryptUpdate failed"); EVP_CIPHER_CTX_free(ctx); return int2oct(0, 0); } if (EVP_EncryptFinal_ex(ctx, ciphertext.data() + outlen1, &outlen2) != 1) { loggers::get_instance().error("fx__NG__NasCiphering: EVP_EncryptFinal_ex failed"); EVP_CIPHER_CTX_free(ctx); return int2oct(0, 0); } EVP_CIPHER_CTX_free(ctx); OCTETSTRING result = OCTETSTRING(outlen1 + outlen2, (const unsigned char*)ciphertext.data()); loggers::get_instance().log_msg("<<< fx__NG__NasCiphering: result: ", result); return result; } OCTETSTRING fx__NG__NasDeciphering(const OCTETSTRING& p_CipheredNasMsg, const BITSTRING& p_CipheringAlgorithm, const BITSTRING& p_KNASenc, const OCTETSTRING& p_NasCount, const BITSTRING& p_BearerId, const INTEGER& p_Direction){ return int2oct(0, 0); } Loading etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ +6 −4 Original line number Diff line number Diff line Loading @@ -12,6 +12,7 @@ LibNGAP_Pixits.PX_AMF_UE_NGAP_ID := 22 LibNGAP_Pixits.PX_PLMN_IDENTITY := '00f110'O LibNGAP_Pixits.PX_GNB_ID := '0000000000000001001110'B Lib_NG_NAS_Pixits.PX_CHECK_SECURITY := false Lib_NG_NAS_Pixits.PX_SUPI_FORMAT := '0000'B Lib_NG_NAS_Pixits.PX_SUPI_DIGITS := '00f110214300014444330302'O Lib_NG_NAS_Pixits.PX_USIM_OPERATOR_VARIANT_ALGORITHM_CONFIGURATION := '00000000000000000000000000000000'O Loading Loading @@ -67,14 +68,14 @@ system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0 #AtsImsIot_TestControl.control #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_01 ###########################NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_02 NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_02 #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_03 #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_04 #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_05 #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_ABN_01 #NG_NAS_TestCases.TC_NGNAS_AMF_AUT_SEQ_01 #NG_NAS_TestCases.TC_5GNAS_AMF_SEC_ACC_01 #NG_NAS_TestCases.TC_5GNAS_AMF_SEC_REJ_01 NG_NAS_TestCases.TC_5GNAS_AMF_SEC_REJ_01 #NG_NAS_TestCases.TC_5GNAS_AMF_DLN_ACC_01 #NG_NAS_TestCases.TC_5GNAS_AMF_REG_ACC_01 #NG_NAS_TestCases.TC_5GNAS_AMF_REG_ACC_02 Loading Loading @@ -129,10 +130,11 @@ system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_18_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_19_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_20_01 NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_21_01 NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_22_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_21_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_22_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_23_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_24_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_01 [GROUPS] # In this section you can specify groups of hosts. These groups can be used inside the Loading ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn +92 −40 Original line number Diff line number Diff line Loading @@ -90,11 +90,11 @@ module NG_NAS_TCFunctions { ), v_message ) == false) { setverdict(fail); log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST ***"); setverdict(fail); } else { setverdict(pass); log("*** " & __SCOPE__ & ": PASS: Expected NG_AUTHENTICATION_REQUEST ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); Loading Loading @@ -132,11 +132,11 @@ module NG_NAS_TCFunctions { f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_SECURITY_MODE_COMMAND, v_message) == false) { setverdict(fail); log("*** " & __SCOPE__ & ": FAIL: NG_SECURITY_MODE_COMMAND mismatch. ***"); setverdict(fail); } else { setverdict(pass); log("*** " & __SCOPE__ & ": PASS: Expected NG_SECURITY_MODE_COMMAND ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); Loading Loading @@ -197,8 +197,8 @@ module NG_NAS_TCFunctions { f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_AUTHENTICATION_REQUEST, v_message) == true) { f_selfOrClientSyncAndVerdict(c_tbDone, e_error); log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST after T3560 timer expiry ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); } } [] tc_noac.timeout { Loading Loading @@ -262,8 +262,11 @@ module NG_NAS_TCFunctions { ), v_message ) == false) { setverdict(fail); log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_IDENTITY_REQUEST ***"); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: Expected NG_IDENTITY_REQUEST ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); Loading Loading @@ -328,8 +331,11 @@ module NG_NAS_TCFunctions { complement(ngKSI) ), v_message) == false) { setverdict(fail); log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_IDENTITY_REQUEST ***"); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: Expected NG_IDENTITY_REQUEST ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); Loading Loading @@ -391,8 +397,11 @@ module NG_NAS_TCFunctions { ), v_message ) == false) { setverdict(fail); log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_IDENTITY_REQUEST ***"); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: Expected NG_IDENTITY_REQUEST ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); Loading Loading @@ -438,8 +447,11 @@ module NG_NAS_TCFunctions { mw_NG_SECURITY_MODE_COMMAND, v_message ) == false) { setverdict(fail); log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_SECURITY_MODE_COMMAND ***"); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: Expected NG_SECURITY_MODE_COMMAND ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); Loading Loading @@ -478,8 +490,11 @@ module NG_NAS_TCFunctions { ))); f_NASPDU_Get(vc_recvNGAP_PDU); if (f_Check_5GAKA_NAS_UL_Message_is_encrypted(vc_recvNAS_PDU) == false) { setverdict(fail); log("*** " & __SCOPE__ & ": FAIL: Message is not encrypted ***"); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: Message is encrypted ***"); setverdict(pass); } // FIXME FSCOM Add NAS_PDU message check f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); Loading Loading @@ -593,6 +608,8 @@ module NG_NAS_TCFunctions { ) == false) { setverdict(fail); return; } else { setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); Loading Loading @@ -715,6 +732,8 @@ module NG_NAS_TCFunctions { ), v_message) == false) { setverdict(fail); } else { setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); Loading Loading @@ -834,8 +853,10 @@ module NG_NAS_TCFunctions { ), v_message) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch. ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: NG_REGISTRATION_ACCEPT match. ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); Loading Loading @@ -956,11 +977,12 @@ module NG_NAS_TCFunctions { ), v_message) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch. ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: NG_REGISTRATION_ACCEPT match. ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); Loading Loading @@ -1075,8 +1097,10 @@ module NG_NAS_TCFunctions { ), v_message) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch. ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: NG_REGISTRATION_ACCEPT match. ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); Loading Loading @@ -1193,8 +1217,10 @@ module NG_NAS_TCFunctions { ), v_message) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch. ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: NG_REGISTRATION_ACCEPT match. ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); Loading Loading @@ -1317,8 +1343,12 @@ module NG_NAS_TCFunctions { )) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_REJECT mismatch. ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: NG_REGISTRATION_REJECT match. ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log(vc_recvNGAP_PDU); f_NASPDU_Get(vc_recvNGAP_PDU); Loading Loading @@ -1469,7 +1499,10 @@ module NG_NAS_TCFunctions { )) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_REJECT mismatch. ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: NG_REGISTRATION_REJECT match. ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); Loading Loading @@ -1535,7 +1568,10 @@ module NG_NAS_TCFunctions { ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_ACCEPT mismatch. ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: NG_DEREGISTRATION_ACCEPT match. ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); Loading Loading @@ -1597,7 +1633,10 @@ module NG_NAS_TCFunctions { ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_ACCEPT mismatch. ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: NG_DEREGISTRATION_ACCEPT match. ***"); setverdict(pass) } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); Loading Loading @@ -1656,8 +1695,12 @@ module NG_NAS_TCFunctions { )) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_REQUEST_MT mismatch. ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: NG_DEREGISTRATION_REQUEST_MT match. ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); Loading Loading @@ -1706,9 +1749,12 @@ module NG_NAS_TCFunctions { )) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_REQUEST_MT mismatch. ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: NG_DEREGISTRATION_REQUEST_MT match. ***"); setverdict(pass); } //Not sent sesponse and again wait for deregistration_request //Not sent response and again wait for deregistration_request f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( Loading Loading @@ -1738,7 +1784,10 @@ module NG_NAS_TCFunctions { )) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_REQUEST_MT mismatch. ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: NG_DEREGISTRATION_REQUEST_MT match. ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); Loading Loading @@ -1791,7 +1840,10 @@ module NG_NAS_TCFunctions { )) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_REQUEST_MT mismatch. ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: NG_DEREGISTRATION_REQUEST_MT match. ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); Loading ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn +134 −32 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
NAS_ETSI.code-workspace +6 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,12 @@ }, { "path": "../free5gc.util" }, { "path": "../5G_ciphered_NAS_decipher_tool" }, { "path": "../../frameworks/CryptoMobile/CryptoMobile" } ], "settings": { Loading
ccsrc/Externals/NG_security_ext.cc +127 −44 Original line number Diff line number Diff line Loading @@ -3,6 +3,9 @@ #include <iomanip> #include <random> #include <cstring> #include <openssl/evp.h> //#include "NG_SecurityDefinitionsAndExternalFunctions.hh" #include "NG_NAS_SecurityFunctions.hh" //#include "NR_RRC_ASN1_Definitions.hh" Loading @@ -13,8 +16,7 @@ #include "loggers.hh" //namespace NG__SecurityDefinitionsAndExternalFunctions { namespace NG__NAS__SecurityFunctions { namespace NG__SecurityDefinitionsAndExternalFunctions { /** * @desc This external function ... Loading @@ -25,16 +27,97 @@ namespace NG__NAS__SecurityFunctions { //BITSTRING fx__NR__AsIntegrityAlgorithm(const OCTETSTRING &a, const NR__RRC__ASN1__Definitions::IntegrityProtAlgorithm& b, const BITSTRING &c, const OCTETSTRING &d, const BITSTRING &e, const INTEGER &f){ //return int2bit(0, 0); //} OCTETSTRING fx__NG__NasIntegrityAlgorithm(const OCTETSTRING& p_EncodedNasPdu, const BITSTRING& p_IntegrityAlgorithm, const BITSTRING& p_KNASint, const OCTETSTRING& p_NasCount, const BITSTRING& p_BearerId, const INTEGER& p_Direction){ return int2oct(0, 0); } OCTETSTRING fx__NG__NasCiphering(const OCTETSTRING& p_EncodedNasPdu,const BITSTRING& p_CipheringAlgorithm, const BITSTRING& p_KNASenc, const OCTETSTRING& p_NasCount, const BITSTRING& p_BearerId){ OCTETSTRING fx__NG__NasCiphering(const OCTETSTRING& p_EncodedNasPdu,const BITSTRING& p_CipheringAlgorithm, const BITSTRING& p_KNASenc, const OCTETSTRING& p_NasCount, const BITSTRING& p_BearerId, const INTEGER& p_Direction){ loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_EncodedNasPdu: ", p_EncodedNasPdu); loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_CipheringAlgorithm: ", bit2oct(p_CipheringAlgorithm)); loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_KNASenc: ", bit2oct(p_KNASenc)); loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_NasCount: ", p_NasCount); loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_BearerId: ", bit2oct(p_BearerId)); loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_Direction: ", p_Direction); // sanity checks if (p_CipheringAlgorithm.lengthof() != 4)/* || (p_CipheringAlgorithm.get_value() != 0b0001)*/ { /// 0b0001 = EEA2 (AES-128) loggers::get_instance().error("fx__NG__NasCiphering: p_CipheringAlgorithm: Wrong length"); return int2oct(0, 0); } else if (p_KNASenc.lengthof() != 128) { loggers::get_instance().error("fx__NG__NasCiphering: p_KNASenc: Wrong length"); return int2oct(0, 0); } else if ((p_NasCount.lengthof() != 4) || (p_BearerId.lengthof() != 5)) { loggers::get_instance().error("fx__NG__NasCiphering: p_NasCount/p_BearerId: Wrong length"); return int2oct(0, 0); } OCTETSTRING fx__NG__NasDeciphering(const OCTETSTRING& p_CipheredNasMsg, const BITSTRING& p_CipheringAlgorithm, const BITSTRING& p_KNASenc, const OCTETSTRING& p_NasCount, const BITSTRING& p_BearerId){ // Cypher key const unsigned char* key = (const unsigned char*)bit2oct(p_KNASenc); // Construct IV (counter block) as per 3GPP TS 33.501 Annex C.3 const unsigned char iv_length = 16; unsigned char iv[iv_length] = {0}; const unsigned char* nas_count = (const unsigned char*)p_NasCount; iv[0] = nas_count[0]; iv[1] = nas_count[1]; iv[2] = nas_count[2]; iv[3] = nas_count[3]; // BearerId: 5 bits, Direction: 1 bit (LSB) unsigned char bearer_dir = ((*((const unsigned char*)bit2oct(p_BearerId)) & 0x1F) << 3) | (((unsigned char)p_Direction.get_long_long_val() & 0x01) << 2); loggers::get_instance().log("fx__NG__NasCiphering: bearer_dir=0x%02x", bearer_dir); iv[4] = bearer_dir; unsigned int u = p_EncodedNasPdu.lengthof(); loggers::get_instance().log_to_hexa("fx__NG__NasCiphering: p_EncodedNasPdu.lengthof()=", (unsigned char*)&u, 4); loggers::get_instance().log("fx__NG__NasCiphering: >> 8 %02x=", u >> 8); loggers::get_instance().log("fx__NG__NasCiphering: >> 16 %02x=", u >> 16); loggers::get_instance().log("fx__NG__NasCiphering: >> 24 %02x=", u >> 24); loggers::get_instance().log("fx__NG__NasCiphering: << 8 %02x=", u << 8); OCTETSTRING data_len = int2oct(p_EncodedNasPdu.lengthof(), 4); const unsigned char* data_len_ = (const unsigned char*)data_len; iv[5] = data_len_[0]; iv[6] = data_len_[1]; iv[7] = data_len_[2]; iv[8] = data_len_[3]; // Remaining bytes are zero (already set) loggers::get_instance().log_to_hexa("fx__NG__NasCiphering: iv=", iv, iv_length); // Prepare input/output const unsigned char* plaintext = (const unsigned char*)p_EncodedNasPdu; int plaintext_len = p_EncodedNasPdu.lengthof(); std::vector<unsigned char> ciphertext(plaintext_len); loggers::get_instance().log_to_hexa("fx__NG__NasCiphering: plaintext=", plaintext, plaintext_len); // OpenSSL AES-CTR encryption EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new(); int outlen1 = 0, outlen2 = 0; if (!ctx) { loggers::get_instance().error("fx__NG__NasCiphering: EVP_CIPHER_CTX_new failed"); return int2oct(0, 0); } if (EVP_EncryptInit_ex(ctx, EVP_aes_128_ctr(), NULL, key, iv) != 1) { loggers::get_instance().error("fx__NG__NasCiphering: EVP_EncryptInit_ex failed"); EVP_CIPHER_CTX_free(ctx); return int2oct(0, 0); } if (EVP_EncryptUpdate(ctx, ciphertext.data(), &outlen1, plaintext, plaintext_len) != 1) { loggers::get_instance().error("fx__NG__NasCiphering: EVP_EncryptUpdate failed"); EVP_CIPHER_CTX_free(ctx); return int2oct(0, 0); } if (EVP_EncryptFinal_ex(ctx, ciphertext.data() + outlen1, &outlen2) != 1) { loggers::get_instance().error("fx__NG__NasCiphering: EVP_EncryptFinal_ex failed"); EVP_CIPHER_CTX_free(ctx); return int2oct(0, 0); } EVP_CIPHER_CTX_free(ctx); OCTETSTRING result = OCTETSTRING(outlen1 + outlen2, (const unsigned char*)ciphertext.data()); loggers::get_instance().log_msg("<<< fx__NG__NasCiphering: result: ", result); return result; } OCTETSTRING fx__NG__NasDeciphering(const OCTETSTRING& p_CipheredNasMsg, const BITSTRING& p_CipheringAlgorithm, const BITSTRING& p_KNASenc, const OCTETSTRING& p_NasCount, const BITSTRING& p_BearerId, const INTEGER& p_Direction){ return int2oct(0, 0); } Loading
etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ +6 −4 Original line number Diff line number Diff line Loading @@ -12,6 +12,7 @@ LibNGAP_Pixits.PX_AMF_UE_NGAP_ID := 22 LibNGAP_Pixits.PX_PLMN_IDENTITY := '00f110'O LibNGAP_Pixits.PX_GNB_ID := '0000000000000001001110'B Lib_NG_NAS_Pixits.PX_CHECK_SECURITY := false Lib_NG_NAS_Pixits.PX_SUPI_FORMAT := '0000'B Lib_NG_NAS_Pixits.PX_SUPI_DIGITS := '00f110214300014444330302'O Lib_NG_NAS_Pixits.PX_USIM_OPERATOR_VARIANT_ALGORITHM_CONFIGURATION := '00000000000000000000000000000000'O Loading Loading @@ -67,14 +68,14 @@ system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0 #AtsImsIot_TestControl.control #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_01 ###########################NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_02 NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_02 #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_03 #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_04 #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_05 #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_ABN_01 #NG_NAS_TestCases.TC_NGNAS_AMF_AUT_SEQ_01 #NG_NAS_TestCases.TC_5GNAS_AMF_SEC_ACC_01 #NG_NAS_TestCases.TC_5GNAS_AMF_SEC_REJ_01 NG_NAS_TestCases.TC_5GNAS_AMF_SEC_REJ_01 #NG_NAS_TestCases.TC_5GNAS_AMF_DLN_ACC_01 #NG_NAS_TestCases.TC_5GNAS_AMF_REG_ACC_01 #NG_NAS_TestCases.TC_5GNAS_AMF_REG_ACC_02 Loading Loading @@ -129,10 +130,11 @@ system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_18_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_19_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_20_01 NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_21_01 NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_22_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_21_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_22_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_23_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_24_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_01 [GROUPS] # In this section you can specify groups of hosts. These groups can be used inside the Loading
ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn +92 −40 Original line number Diff line number Diff line Loading @@ -90,11 +90,11 @@ module NG_NAS_TCFunctions { ), v_message ) == false) { setverdict(fail); log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST ***"); setverdict(fail); } else { setverdict(pass); log("*** " & __SCOPE__ & ": PASS: Expected NG_AUTHENTICATION_REQUEST ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); Loading Loading @@ -132,11 +132,11 @@ module NG_NAS_TCFunctions { f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_SECURITY_MODE_COMMAND, v_message) == false) { setverdict(fail); log("*** " & __SCOPE__ & ": FAIL: NG_SECURITY_MODE_COMMAND mismatch. ***"); setverdict(fail); } else { setverdict(pass); log("*** " & __SCOPE__ & ": PASS: Expected NG_SECURITY_MODE_COMMAND ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); Loading Loading @@ -197,8 +197,8 @@ module NG_NAS_TCFunctions { f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_AUTHENTICATION_REQUEST, v_message) == true) { f_selfOrClientSyncAndVerdict(c_tbDone, e_error); log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST after T3560 timer expiry ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); } } [] tc_noac.timeout { Loading Loading @@ -262,8 +262,11 @@ module NG_NAS_TCFunctions { ), v_message ) == false) { setverdict(fail); log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_IDENTITY_REQUEST ***"); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: Expected NG_IDENTITY_REQUEST ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); Loading Loading @@ -328,8 +331,11 @@ module NG_NAS_TCFunctions { complement(ngKSI) ), v_message) == false) { setverdict(fail); log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_IDENTITY_REQUEST ***"); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: Expected NG_IDENTITY_REQUEST ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); Loading Loading @@ -391,8 +397,11 @@ module NG_NAS_TCFunctions { ), v_message ) == false) { setverdict(fail); log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_IDENTITY_REQUEST ***"); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: Expected NG_IDENTITY_REQUEST ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); Loading Loading @@ -438,8 +447,11 @@ module NG_NAS_TCFunctions { mw_NG_SECURITY_MODE_COMMAND, v_message ) == false) { setverdict(fail); log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_SECURITY_MODE_COMMAND ***"); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: Expected NG_SECURITY_MODE_COMMAND ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); Loading Loading @@ -478,8 +490,11 @@ module NG_NAS_TCFunctions { ))); f_NASPDU_Get(vc_recvNGAP_PDU); if (f_Check_5GAKA_NAS_UL_Message_is_encrypted(vc_recvNAS_PDU) == false) { setverdict(fail); log("*** " & __SCOPE__ & ": FAIL: Message is not encrypted ***"); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: Message is encrypted ***"); setverdict(pass); } // FIXME FSCOM Add NAS_PDU message check f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); Loading Loading @@ -593,6 +608,8 @@ module NG_NAS_TCFunctions { ) == false) { setverdict(fail); return; } else { setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); Loading Loading @@ -715,6 +732,8 @@ module NG_NAS_TCFunctions { ), v_message) == false) { setverdict(fail); } else { setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); Loading Loading @@ -834,8 +853,10 @@ module NG_NAS_TCFunctions { ), v_message) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch. ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: NG_REGISTRATION_ACCEPT match. ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); Loading Loading @@ -956,11 +977,12 @@ module NG_NAS_TCFunctions { ), v_message) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch. ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: NG_REGISTRATION_ACCEPT match. ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); Loading Loading @@ -1075,8 +1097,10 @@ module NG_NAS_TCFunctions { ), v_message) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch. ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: NG_REGISTRATION_ACCEPT match. ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); Loading Loading @@ -1193,8 +1217,10 @@ module NG_NAS_TCFunctions { ), v_message) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch. ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: NG_REGISTRATION_ACCEPT match. ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); Loading Loading @@ -1317,8 +1343,12 @@ module NG_NAS_TCFunctions { )) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_REJECT mismatch. ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: NG_REGISTRATION_REJECT match. ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log(vc_recvNGAP_PDU); f_NASPDU_Get(vc_recvNGAP_PDU); Loading Loading @@ -1469,7 +1499,10 @@ module NG_NAS_TCFunctions { )) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_REJECT mismatch. ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: NG_REGISTRATION_REJECT match. ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); Loading Loading @@ -1535,7 +1568,10 @@ module NG_NAS_TCFunctions { ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_ACCEPT mismatch. ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: NG_DEREGISTRATION_ACCEPT match. ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); Loading Loading @@ -1597,7 +1633,10 @@ module NG_NAS_TCFunctions { ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_ACCEPT mismatch. ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: NG_DEREGISTRATION_ACCEPT match. ***"); setverdict(pass) } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); Loading Loading @@ -1656,8 +1695,12 @@ module NG_NAS_TCFunctions { )) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_REQUEST_MT mismatch. ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: NG_DEREGISTRATION_REQUEST_MT match. ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); Loading Loading @@ -1706,9 +1749,12 @@ module NG_NAS_TCFunctions { )) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_REQUEST_MT mismatch. ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: NG_DEREGISTRATION_REQUEST_MT match. ***"); setverdict(pass); } //Not sent sesponse and again wait for deregistration_request //Not sent response and again wait for deregistration_request f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( Loading Loading @@ -1738,7 +1784,10 @@ module NG_NAS_TCFunctions { )) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_REQUEST_MT mismatch. ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: NG_DEREGISTRATION_REQUEST_MT match. ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); Loading Loading @@ -1791,7 +1840,10 @@ module NG_NAS_TCFunctions { )) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_REQUEST_MT mismatch. ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); setverdict(fail); } else { log("*** " & __SCOPE__ & ": PASS: NG_DEREGISTRATION_REQUEST_MT match. ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); Loading
ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn +134 −32 File changed.Preview size limit exceeded, changes collapsed. Show changes