예제 #1
0
def setContextData(requestType, diameterMsg):
    global S6ACTXDATA
    global IMSI

    session_id = get(diameterMsg,"diameter","session-id")
    hbh = get(diameterMsg,"diameter","hop-by-hop-identifier")
    ete = get(diameterMsg,"diameter","end-to-end-identifier")
    user_name = get(diameterMsg,"diameter","user-name")
    if user_name != None:
        IMSI=user_name
        if S6ACTXDATA.get(IMSI,None)==None:
            S6ACTXDATA[user_name]={}
        
    if requestType == mt.authentication_info_response.name:
        autn,autn_present = icu.getKeyValueFromDict(diameterMsg,"autn")
        rand,rand_present = icu.getKeyValueFromDict(diameterMsg,"rand")
        S6ACTXDATA[IMSI][requestType]={"autn":int(autn,16),"rand":int(rand,16)}
    elif requestType == mt.update_location_response.name:
        msisdn,msisdn_present = icu.getKeyValueFromDict(diameterMsg,"msisdn")
        S6ACTXDATA[IMSI][requestType]={"msisdn":msisdn}
    elif requestType == mt.cancel_location_request.name:
        destination_host,destination_host_present = icu.getKeyValueFromDict(diameterMsg,"destination-host")
        destination_realm,destination_realm_present = icu.getKeyValueFromDict(diameterMsg,"destination-realm")
        S6ACTXDATA[IMSI][requestType]={"destination_host":destination_host,"destination_realm":destination_realm,"session_id":session_id}
    else:
        S6ACTXDATA[IMSI][requestType]={"user_name":user_name,"session_id":session_id,"hop_by_hop_identifier":hbh,"end_to_end_identifier":ete}
예제 #2
0
def setContextData(requestType, gtpMsg):
    global IMSI

    if requestType == mt.create_session_response.name:
        teid_gre_key, teid_gre_key_present = icu.getKeyValueFromDict(
            gtpMsg, "teid_gre_key")
        ipv4_address, ipv4_address_present = icu.getKeyValueFromDict(
            gtpMsg, "ipv4address")
        eps_bearer_id, eps_bearer_id_present = icu.getKeyValueFromDict(
            gtpMsg, "eps_bearer_id")
        S11CTXDATA[IMSI][requestType] = {
            "teid_gre_key": icu.formatHex(teid_gre_key),
            "ipv4_address": ipv4_address,
            "eps_bearer_id": eps_bearer_id
        }

    else:
        seq_number, seq_number_present = icu.getKeyValueFromDict(
            gtpMsg, "sequence_number")
        mme_teid, mme_teid_present = icu.getKeyValueFromDict(
            gtpMsg, "teid_gre_key")

        if requestType == mt.create_session_request.name:
            if S11CTXDATA.get(IMSI, None) == None:
                S11CTXDATA[IMSI] = {}

        if mme_teid_present == 'true':
            S11CTXDATA[IMSI][requestType] = {
                "sequence_number": seq_number,
                "teid_key": mme_teid
            }
        else:
            S11CTXDATA[IMSI][requestType] = {"sequence_number": seq_number}
    igniteLogger.logger.info(f"GTP context data  : {S11CTXDATA}")
예제 #3
0
def receiveS1ap(ResponseWaitTime=10):
    global SERFLAG
    global TIMEOUTFLAG
    service="_service"
    time_out="_time_out"
    received_msg={}
    received_response =requests.get(url=url["receive_url"],timeout=ResponseWaitTime)
    igniteLogger.logger.info(f"URL response for receive s1ap data : {str(received_response)}")
    igniteLogger.logger.info(f"S1AP Data Received : {received_response.json()}")
    received_msg=received_response.json()
    procedure_code=s1apMessageDict[icu.getKeyValueFromDict(received_msg,'procedureCode')[0]]
    
    if procedure_code == mt.downlink_nas_transport.name:
        mobility_mgmt_message_type,mobility_mgmt_message_type_present=icu.getKeyValueFromDict(received_msg, "mobility_mgmt_message_type")
        if mobility_mgmt_message_type_present=='true':
            if mobility_mgmt_message_type in s1ApCreateContextMessagesList:
                setContextData(received_msg,mobility_mgmt_message_type)
            if SERFLAG:
                mobility_mgmt_message_type+=service
            validateS1apIE(mobility_mgmt_message_type,received_msg)
    else:
        if procedure_code == mt.initial_context_setup_request.name:
            if icu.getKeyValueFromDict(received_msg, "mobility_mgmt_message_type")[0]==mt.attach_accept.name:
                setContextData(received_msg,mt.attach_accept.name)

        elif procedure_code == mt.ue_context_release_command.name:
            setContextData(received_msg,procedure_code)

        if TIMEOUTFLAG:
            procedure_code+=time_out
        if SERFLAG:
            procedure_code+=service            
        validateS1apIE(procedure_code,received_msg)

    return received_msg
예제 #4
0
def validateS1apIE(requestType,s1apMsg):
    global SERFLAG
    global IMSI

    procedure_code=s1apMessageDict[icu.getKeyValueFromDict(s1apMsg,'procedureCode')[0]]
    if procedure_code == mt.downlink_nas_transport.name:
        validation_dict=nas_validation_file.get(requestType,None)
    else:
        validation_dict=s1ap_validation_file.get(requestType,None)

    if validation_dict !=None:
        response = requests.get(url["diameter_ctx_data_url"])
        if response.json() !={} and response.json().get(str(IMSI),None)!=None:
            diameter_data = response.json()[str(IMSI)]

        response = requests.get(url["gtp_ctx_data_url"])
        if response.json() !={} and response.json().get(str(IMSI),None)!=None:
            gtp_data = response.json()[str(IMSI)]

        for num in range(len(validation_dict["dataToBeVerified"])):
            val_flag=False
            ie_to_validate=validation_dict["dataToBeVerified"][num]
            data_to_compare_path=validation_dict["fromContextData"][num].split(':')

            ie_to_validate_value,ie_to_validate_value_present=icu.getKeyValueFromDict(s1apMsg,ie_to_validate)

            if data_to_compare_path[0] == "s1apContextData":
                if requestType == mt.identity_request.name:
                    data_to_compare=S1APCTXDATA[icu.getKeyValueFromDict(s1apMsg,"ENB-UE-S1AP-ID")[0]]
                else:
                    data_to_compare=S1APCTXDATA[IMSI]          
            elif data_to_compare_path[0] == "diameterContextData":
                data_to_compare = diameter_data

            elif data_to_compare_path[0] == "gtpContextData":
                data_to_compare = gtp_data
                
            data_to_compare_value,data_to_compare_value_present=icu.getKeyValueFromDict(data_to_compare[data_to_compare_path[1]],data_to_compare_path[2])

            if ie_to_validate == "transportLayerAddress":
                data_to_compare_value=convertIpaddressToHex(data_to_compare_value)
            elif ie_to_validate == "m-TMSI":
                data_to_compare_value=icu.formatHex(data_to_compare_value)

            if ie_to_validate_value == data_to_compare_value:
                val_flag = True
            elif type(ie_to_validate_value)==str and data_to_compare_value in ie_to_validate_value:
                val_flag = True

            if val_flag:
                igniteLogger.logger.info(f"request/response name:{requestType} ,IEname:{ie_to_validate} ,expected value:{data_to_compare_value} ,received value:{ie_to_validate_value}")
            else:
                igniteLogger.logger.error(f"request/response name:{requestType} ,IEname:{ie_to_validate} ,expected value:{data_to_compare_value} ,received value:{ie_to_validate_value}")
                raise icu.ValidationException(f"***** ***** *****\nERROR :: Validation fail \nrequest/response name:{requestType} ,IEname:{ie_to_validate} ,expected value:{data_to_compare_value} ,received value:{ie_to_validate_value}***** ***** *****")
예제 #5
0
def setContextData(s1apMsg,requestType):
    global IMSI
    enb_ue_s1ap_id, enb_ue_s1ap_id_present = icu.getKeyValueFromDict(s1apMsg, "ENB-UE-S1AP-ID")
    
    if requestType==mt.attach_request.name or requestType==mt.attach_request_guti.name:
        if S1APCTXDATA.get(enb_ue_s1ap_id,None)==None:
            key = IMSI
        else:
            key = enb_ue_s1ap_id
        plmn_identity, plmn_identity_present = icu.getKeyValueFromDict(s1apMsg, "pLMNidentity")
        if S1APCTXDATA[key].get(mt.attach_request.name,None)==None:
            S1APCTXDATA[key][mt.attach_request.name]={"enb_ue_s1ap_id":enb_ue_s1ap_id}
        else:
            S1APCTXDATA[key][mt.attach_request.name]["enb_ue_s1ap_id"]=enb_ue_s1ap_id
        S1APCTXDATA[key][mt.attach_request.name]["plmn_identity"] = plmn_identity


    elif requestType==mt.authentication_request.name:
        mme_ue_s1ap_id, mme_ue_s1ap_id_present = icu.getKeyValueFromDict(s1apMsg, "MME-UE-S1AP-ID")
        S1APCTXDATA[IMSI][requestType]={"mme_ue_s1ap_id":mme_ue_s1ap_id}

    elif  requestType==mt.identity_request.name:
        mme_ue_s1ap_id, mme_ue_s1ap_id_present = icu.getKeyValueFromDict(s1apMsg, "MME-UE-S1AP-ID")
        S1APCTXDATA[enb_ue_s1ap_id][requestType]={"mme_ue_s1ap_id":mme_ue_s1ap_id}       

    elif requestType==mt.attach_accept.name:
        guti_list=nu.getGuti(s1apMsg)
        m_tmsi, m_tmsi_present = icu.getKeyValueFromDict(s1apMsg, "m_tmsi")
        mme_code, mme_code_present = icu.getKeyValueFromDict(s1apMsg, "mme_code")
        S1APCTXDATA[IMSI][requestType]={"guti_list":guti_list,"m_tmsi":m_tmsi,"mme_code":mme_code}

    elif requestType == mt.initial_context_setup_response.name:
        transport_layer_address,transport_layer_address_present = icu.getKeyValueFromDict(s1apMsg,"transportLayerAddress")
        gtp_teid,gtp_teid_present = icu.getKeyValueFromDict(s1apMsg,"gTP-TEID")
        S1APCTXDATA[IMSI][requestType]={"transport_layer_address":transport_layer_address,"gtp_teid":int(gtp_teid,16)}

    elif requestType==mt.service_request.name:
        S1APCTXDATA[IMSI][requestType]={"enb_ue_s1ap_id":enb_ue_s1ap_id}

    elif requestType == mt.ue_context_release_command.name:
        mme_ue_s1ap_id, mme_ue_s1ap_id_present = icu.getKeyValueFromDict(s1apMsg, "mME-UE-S1AP-ID")
        if IMSI == None:
            S1APCTXDATA[enb_ue_s1ap_id][requestType]={"mme_ue_s1ap_id":mme_ue_s1ap_id}
        else:
            S1APCTXDATA[IMSI][requestType]={"mme_ue_s1ap_id":mme_ue_s1ap_id}
            
    elif requestType == mt.esm_information_response.name:
        apn , apn_present = icu.getKeyValueFromDict(s1apMsg, "apn_esm")
        S1APCTXDATA[IMSI][requestType]={"apn":apn}

    igniteLogger.logger.info(f"s1ap context data : {S1APCTXDATA}")
예제 #6
0
def receiveGtp(ResponseWaitTime=10):
    global IMSI
    received_msg = {}
    receive_response = requests.get(url=url["receive_url"],
                                    timeout=ResponseWaitTime)
    igniteLogger.logger.info(
        f"URL response for receive gtp data  : {str(receive_response)}")
    igniteLogger.logger.info(f"Gtp data received : {receive_response.json()}")
    received_msg = receive_response.json()
    message_type, message_type_present = icu.getKeyValueFromDict(
        received_msg, "message_type")
    if gtpMessageDict[message_type] == mt.create_session_request.name:
        IMSI = icu.getKeyValueFromDict(received_msg, "imsi")[0]
    validateGtpIE(gtpMessageDict[message_type], received_msg)
    setContextData(gtpMessageDict[message_type], received_msg)
    return received_msg
예제 #7
0
def validateDiameterAvp(requestType,diameterMsg):
    global IMSI
    validation_dict=validation_file.get(requestType,None)

    response = requests.get(url["s1ap_ctx_data_url"])
    if response.json()!={} and response.json().get(IMSI,None)!=None:
        s1ap_data = response.json()[IMSI]

    response = requests.get(url["gtp_ctx_data_url"])
    if response.json() !={} and response.json().get(IMSI,None)!=None:
        gtp_data = response.json()[IMSI]

    if validation_dict !=None:
        for num in range(len(validation_dict["dataToBeVerified"])):
            val_flag=False
            ie_to_validate=validation_dict["dataToBeVerified"][num] 
            data_to_compare_path=validation_dict["fromContextData"][num].split(":") #collecting the path of expected data for AVP
            ie_to_validate_value,ie_to_validate_value_present=icu.getKeyValueFromDict(diameterMsg,ie_to_validate)
            if ie_to_validate == "rat-type":
                if ie_to_validate_value == rat_type_diameter_map["EUTRAN"]:
                    val_flag = True
            else:

                if data_to_compare_path[0] == "diameterContextData":
                    data_to_compare=S6ACTXDATA[IMSI]

                elif data_to_compare_path[0] == "s1apContextData":
                    data_to_compare = s1ap_data

                elif data_to_compare_path[0] == "gtpContextData":
                    data_to_compare = gtp_data

                data_to_compare_value,data_to_compare_value_present=icu.getKeyValueFromDict(data_to_compare[data_to_compare_path[1]],data_to_compare_path[2])

                if data_to_compare_value_present == "false":
                    if ie_to_validate =="user-name":
                        data_to_compare_value,data_to_compare_value_present=icu.getKeyValueFromDict(data_to_compare[mt.identity_response.name],data_to_compare_path[2])

                if ie_to_validate_value == data_to_compare_value:
                    val_flag=True

            if val_flag == True:
                igniteLogger.logger.info(f"request/response name:{requestType} ,IEname:{ie_to_validate} ,expected value:{data_to_compare_value} ,received value:{ie_to_validate_value}")
            else:
                igniteLogger.logger.error(f"request/response name:{requestType} ,IEname:{ie_to_validate} ,expected value:{data_to_compare_value} ,received value:{ie_to_validate_value}")
                raise icu.ValidationException(f"***** ***** *****\nERROR :: Validation fail \nrequest/response name:{requestType} ,IEname:{ie_to_validate} ,expected value:{data_to_compare_value} ,received value:{ie_to_validate_value}***** ***** *****")
예제 #8
0
def setGuti(guti_digits_list, nasMsg):
    epsGuti=None
    epsMobileIdentityGuti, epsMobileIdentityGutiDetachPresent = icu.getKeyValueFromDict(nasMsg, "eps_mobile_identity_guti_detach_request")
    if epsMobileIdentityGutiDetachPresent == 'true':
        epsGuti=epsMobileIdentityGuti
    epsMobileIdentityGuti, epsMobileIdentityGutiAttachPresent = icu.getKeyValueFromDict(nasMsg, "eps_mobile_identity_guti_attach_request")
    if epsMobileIdentityGutiAttachPresent == 'true':
        epsGuti=epsMobileIdentityGuti
    if epsMobileIdentityGutiDetachPresent == 'true' or epsMobileIdentityGutiAttachPresent == 'true':
        epsGuti["mcc_digit_1"] = guti_digits_list[0]
        epsGuti["mcc_digit_2"] = guti_digits_list[1]
        epsGuti["mcc_digit_3"] = guti_digits_list[2]
        epsGuti["mnc_digit_1"] = guti_digits_list[3]
        epsGuti["mnc_digit_2"] = guti_digits_list[4]
        epsGuti["mnc_digit_3"] = guti_digits_list[5]
        epsGuti["mme_group_id"] = guti_digits_list[6]
        epsGuti["mme_code"] = guti_digits_list[7]
        epsGuti["m_tmsi"] = guti_digits_list[8]
예제 #9
0
def setTai(mcc,mnc,tac, nasMsg):
    tai_identity, taiPresent = icu.getKeyValueFromDict(nasMsg, "tracking_area_identity")
    if taipresent == "true":
        tai_identity["mcc_digit_1"] = mcc[0]
        tai_identity["mcc_digit_2"] = mcc[1]
        tai_identity["mcc_digit_3"] = mcc[2]
        tai_identity["mnc_digit_1"] = mnc[0]
        tai_identity["mnc_digit_2"] = mnc[1]
        tai_identity["mnc_digit_3"] = mnc[2]
        tai_identity["tac"] = tac
예제 #10
0
def updateMessageFromSecurityContext(s1apMsg, requestType):
    global IMSI
    nasMsgKeys = s1apMsg['NAS-MESSAGE'].keys()

    procedure_code, matched = icu.getKeyValueFromDict(s1apMsg, 'procedureCode')
    if matched and procedure_code == 13:  # uplink nas
        if s1apMsg.get('NAS-MESSAGE', None) != None:
            if 'message_authentication_code' in nasMsgKeys:
                s1apMsg['NAS-MESSAGE']['message_authentication_code'] = 0
            if 'sequence_number' in nasMsgKeys:
                s1apMsg['NAS-MESSAGE']['sequence_number'] = S1APCTXDATA[IMSI][
                    'SEC_CXT']['UPLINK_COUNT']
            if 'nas_key_set_identifier_detach_request' in nasMsgKeys:
                if 'nas_key_set_identifier_detach_request_value' in s1apMsg[
                        'NAS-MESSAGE'][
                            'nas_key_set_identifier_detach_request'].keys():
                    s1apMsg['NAS-MESSAGE'][
                        'nas_key_set_identifier_detach_request'][
                            'nas_key_set_identifier_detach_request_value'] = S1APCTXDATA[
                                IMSI]['SEC_CXT']['KSI']

    elif matched and procedure_code == 12:  #Init ue - detach and service req
        if s1apMsg.get('NAS-MESSAGE', None) != None:
            if 'message_authentication_code' in nasMsgKeys:
                s1apMsg['NAS-MESSAGE']['message_authentication_code'] = 0
            elif 'message_authentication_code_short' in nasMsgKeys:
                s1apMsg['NAS-MESSAGE']['message_authentication_code_short'] = 0
            if 'sequence_number' in nasMsgKeys:
                s1apMsg['NAS-MESSAGE']['sequence_number'] = S1APCTXDATA[IMSI][
                    'SEC_CXT']['UPLINK_COUNT']
            elif 'ksi_sequence_number' in nasMsgKeys:
                if 'nas_key_set_identifier_service_req' in s1apMsg[
                        'NAS-MESSAGE']['ksi_sequence_number'].keys():
                    s1apMsg['NAS-MESSAGE']['ksi_sequence_number'][
                        'nas_key_set_identifier_service_req'] = S1APCTXDATA[
                            IMSI]['SEC_CXT']['KSI']
                if 'sequence_number_service_req' in s1apMsg['NAS-MESSAGE'][
                        'ksi_sequence_number'].keys():
                    s1apMsg['NAS-MESSAGE']['ksi_sequence_number'][
                        'sequence_number_service_req'] = S1APCTXDATA[IMSI][
                            'SEC_CXT']['UPLINK_COUNT']
            if 'nas_key_set_identifier_detach_request' in nasMsgKeys:
                if 'nas_key_set_identifier_detach_request_value' in s1apMsg[
                        'NAS-MESSAGE'][
                            'nas_key_set_identifier_detach_request'].keys():
                    s1apMsg['NAS-MESSAGE'][
                        'nas_key_set_identifier_detach_request'][
                            'nas_key_set_identifier_detach_request_value'] = S1APCTXDATA[
                                IMSI]['SEC_CXT']['KSI']

    if requestType == mt.tau_request.name:
        icu.updateKeyValueInDict(
            s1apMsg, "nas_key_set_identifier", S1APCTXDATA[IMSI][
                mt.attach_request.name]['nas_key_set_identifier'])
예제 #11
0
def updateMessageFromContextData(requestType,diameterMsg):
    global S6ACTXDATA
    global IMSI
    
    if icu.getKeyValueFromDict(diameterMsg,"origin-host")[1]=="true":
        replace(diameterMsg,"diameter","origin-host",config_file["diameter"]["ignite_host"])
    if icu.getKeyValueFromDict(diameterMsg,"origin-realm")[1]=="true":
                replace(diameterMsg,"diameter","origin-realm",config_file["diameter"]["ignite_realm"])
    if icu.getKeyValueFromDict(diameterMsg,"destination-host")[1]=="true":
                replace(diameterMsg,"diameter","destination-host",config_file["diameter"]["mme_host"])
    if icu.getKeyValueFromDict(diameterMsg,"destination-realm")[1]=="true":
                replace(diameterMsg,"diameter","destination-realm",config_file["diameter"]["mme_realm"])


    if requestType == mt.cancel_location_request.name:
        diameterMsg = replace(diameterMsg,"diameter","user-name",S6ACTXDATA[IMSI][diameterRespReqDict[mt.update_location_response.name]]["user_name"])
    else:
        diameterMsg = replace(diameterMsg,"diameter","session-id",S6ACTXDATA[IMSI][diameterRespReqDict[requestType]]["session_id"])
        diameterMsg = replace(diameterMsg,"diameter","hop-by-hop-identifier",S6ACTXDATA[IMSI][diameterRespReqDict[requestType]]["hop_by_hop_identifier"])
        diameterMsg = replace(diameterMsg,"diameter","end-to-end-identifier",S6ACTXDATA[IMSI][diameterRespReqDict[requestType]]["end_to_end_identifier"])
예제 #12
0
def totalUplinkDownlink(nasMsg):
	
	total_ambr_uplink =0
	total_ambr_downlink =0
	
	apn_ambr,apn_ambr_present = icu.getKeyValueFromDict(nasMsg, "apn_aggregate_maximum_bit_rate")
	
	if apn_ambr_present == "true":
		total_ambr_uplink+=apn_ambr["apn_ambr_for_uplink"]+apn_ambr["apn_ambr_for_uplink_extended"]+apn_ambr["apn_ambr_for_uplink_extended-2"]
		
		total_ambr_downlink+=apn_ambr["apn_ambr_for_downlink"]+apn_ambr["apn_ambr_for_downlink_extended"]+apn_ambr["apn_ambr_for_downlink_extended-2"]
	
	print("TotalUplink :" + total_ambr_uplink +" and TotalDownlink : "+total_ambr_uplink,total_ambr_downlink)
예제 #13
0
def getGuti(nasMsg):
	epsMobileIdentityGuti, epsMobileIdentityGutiPresent = icu.getKeyValueFromDict(nasMsg, "eps_mobile_identity_guti")
	if epsMobileIdentityGutiPresent:
		guti_digits_list = []
		guti_digits_list.append(epsMobileIdentityGuti["mcc_digit_1"])
		guti_digits_list.append(epsMobileIdentityGuti["mcc_digit_2"])
		guti_digits_list.append(epsMobileIdentityGuti["mcc_digit_3"])
		guti_digits_list.append(epsMobileIdentityGuti["mnc_digit_1"])
		guti_digits_list.append(epsMobileIdentityGuti["mnc_digit_2"])
		guti_digits_list.append(epsMobileIdentityGuti["mnc_digit_3"])
		guti_digits_list.append(epsMobileIdentityGuti["mme_group_id"])
		guti_digits_list.append(epsMobileIdentityGuti["mme_code"])
		guti_digits_list.append(epsMobileIdentityGuti["m_tmsi"])
		return guti_digits_list
예제 #14
0
def updateMessageFromContextData(requestType, gtpMsg):
    global IMSI
    seq_count = 0

    message_type, message_type_present = icu.getKeyValueFromDict(
        gtpMsg, "message_type")

    if gtpMessageDict[message_type] in gtpInitialMessagesList:
        seq_count += 1
        icu.updateKeyValueInDict(gtpMsg, "sequence_number", seq_count)
    else:
        message_type = gtpRespReqDict[requestType]
        icu.updateKeyValueInDict(
            gtpMsg, "sequence_number",
            S11CTXDATA[IMSI][message_type]["sequence_number"])
    icu.updateKeyValueInDict(
        gtpMsg, "teid",
        S11CTXDATA[IMSI][mt.create_session_request.name]["teid_key"])
예제 #15
0
def setImsi(imsi, nasMsg):
    epsmobile_identity, epsmobile_identity_present = icu.getKeyValueFromDict(nasMsg, "eps_mobile_identity")
    if epsmobile_identity_present == "true":
        imsi_digits_list = [int(x) for x in str(imsi)]
        epsmobile_identity["mcc_digit_1_eps"] = imsi_digits_list[0]
        epsmobile_identity["mcc_digit_2_eps"] = imsi_digits_list[1]
        epsmobile_identity["mcc_digit_3_eps"] = imsi_digits_list[2]
        epsmobile_identity["mnc_digit_1_eps"] = imsi_digits_list[3]
        epsmobile_identity["mnc_digit_2_eps"] = imsi_digits_list[4]
        epsmobile_identity["mnc_digit_3_eps"] = imsi_digits_list[5]
        epsmobile_identity["msin_1"] = imsi_digits_list[6]
        epsmobile_identity["msin_2"] = imsi_digits_list[7]
        epsmobile_identity["msin_3"] = imsi_digits_list[8]
        epsmobile_identity["msin_4"] = imsi_digits_list[9]
        epsmobile_identity["msin_5"] = imsi_digits_list[10]
        epsmobile_identity["msin_6"] = imsi_digits_list[11]
        epsmobile_identity["msin_7"] = imsi_digits_list[12]
        epsmobile_identity["msin_8"] = imsi_digits_list[13]
        epsmobile_identity["msin_9"] = imsi_digits_list[14]
예제 #16
0
def validateGtpIE(requestType, gtpMsg):
    global SEQNUM
    global IMSI

    response = requests.get(url["s1ap_ctx_data_url"])
    s1ap_data = response.json()
    if response.json() != {} and response.json().get(IMSI, None) != None:
        s1ap_data = s1ap_data[IMSI]

    response = requests.get(url["diameter_ctx_data_url"])
    if response.json() != {} and response.json().get(IMSI, None) != None:
        diameter_data = response.json()[IMSI]

    validation_dict = validation_file.get(requestType, None)
    if validation_dict != None:
        for num in range(len(validation_dict["dataToBeVerified"])):
            val_flag = False
            ie_to_validate = validation_dict["dataToBeVerified"][num]
            data_to_compare_path = validation_dict["fromContextData"][
                num].split(':')
            if ie_to_validate == "tai" or ie_to_validate == "ecgi":
                ie_to_validate_value = taiEcgiTohex(
                    icu.getKeyValueFromDict(gtpMsg, ie_to_validate)[0])
            elif ie_to_validate == "ipv4address":
                ie_to_validate_value = ipadressToHex(
                    icu.getKeyValueFromDict(gtpMsg, ie_to_validate)[0])
            else:
                ie_to_validate_value, ie_to_validate_value_present = icu.getKeyValueFromDict(
                    gtpMsg, ie_to_validate)

            if ie_to_validate == "rat_type":
                val_flag, data_to_compare_value = validateRatType(
                    ie_to_validate_value)
            elif ie_to_validate == "interface_type":
                val_flag, data_to_compare_value = validateInterfaceType(
                    ie_to_validate_value)
            else:
                if data_to_compare_path[0] == "gtpContextData":
                    data_to_compare = S11CTXDATA[IMSI]

                elif data_to_compare_path[0] == "s1apContextData":
                    data_to_compare = s1ap_data

                elif data_to_compare_path[0] == "diameterContextData":
                    data_to_compare = diameter_data

                data_to_compare_value, data_to_compare_value_present = icu.getKeyValueFromDict(
                    data_to_compare[data_to_compare_path[1]],
                    data_to_compare_path[2])

                if data_to_compare_value_present == "false":
                    if ie_to_validate == "imsi":
                        data_to_compare_value, data_to_compare_value_present = icu.getKeyValueFromDict(
                            data_to_compare[mt.identity_response.name],
                            data_to_compare_path[2])

            if ie_to_validate_value == data_to_compare_value:
                val_flag = True

            if val_flag:
                igniteLogger.logger.info(
                    f"request/response name:{requestType} ,IEname:{ie_to_validate} ,expected value:{data_to_compare_value} ,received value:{ie_to_validate_value}"
                )
            else:
                igniteLogger.logger.error(
                    f"request/response name:{requestType} ,IEname:{ie_to_validate} ,expected value:{data_to_compare_value} ,received value:{ie_to_validate_value}"
                )
                raise icu.ValidationException(
                    f"***** ***** *****\nERROR :: Validation fail \nrequest/response name:{requestType} ,IEname:{ie_to_validate} ,expected value:{data_to_compare_value} ,received value:{ie_to_validate_value}***** ***** *****"
                )
예제 #17
0
    igniteLogger.logger.info("\n---------------------------------------\nSecurity Mode Command received from MME\n---------------------------------------")
    s1.receiveS1ap()

    igniteLogger.logger.info("\n---------------------------------------\nSend Security Mode Complete to MME\n---------------------------------------")
    s1.sendS1ap('securitymode_complete', uplinknastransport_securitymode_complete, enbues1ap_id, nas_securitymode_complete)

    igniteLogger.logger.info("\n---------------------------------------\nESM Information Request from MME\n---------------------------------------")
    s1.receiveS1ap()

    igniteLogger.logger.info("\n---------------------------------------\nESM Information Response to MME\n---------------------------------------")
    s1.sendS1ap('esm_information_response', uplinknastransport_esm_information_response, enbues1ap_id, nas_esm_information_response)

    igniteLogger.logger.info("\n---------------------------------------\nHSS receives ULR from MME\n---------------------------------------")
    ulr=ds.receiveS6aMsg()
    hop_to_hop_identifier=icu.getKeyValueFromDict(ulr,"hop-by-hop-identifier")[0]

    igniteLogger.logger.info("\n---------------------------------------\nHSS sends ULA to MME\n---------------------------------------")
    icu.updateKeyValueInDict(msg_data_ula,"hop-by-hop-identifier",hop_to_hop_identifier)
    ds.sendS6aMsg('update_location_response', msg_data_ula, imsi)

    clr_flag=True

    igniteLogger.logger.info("\n---------------------------------------\nCreate Session Request received from MME\n---------------------------------------")
    cs_req=gs.receiveGtp()
    icu.validateProtocolIE(cs_req,'apn','apn1')
    icu.validateProtocolIE(cs_req,'pdn_type',1)

    igniteLogger.logger.info("\n---------------------------------------\nSend Create Session Response to MME\n---------------------------------------")
    gs.sendGtp('create_session_response', create_session_response, msg_hierarchy)
예제 #18
0
    )
    ds.sendS6aMsg('authentication_info_response', msg_data_aia, imsi)

    igniteLogger.logger.info(
        "\n---------------------------------------\nAuth Request received from MME\n---------------------------------------"
    )
    auth_req = s1.receiveS1ap()
    icu.validateProtocolIE(auth_req, 'mobility_mgmt_message_type',
                           'authentication_request')

    igniteLogger.logger.info(
        "\n---------------------------------------\nSend Auth Failure to MME\n---------------------------------------"
    )
    s1.sendS1ap('authentication_failure', uplinknastransport_auth_failure,
                enbues1ap_id, nas_authentication_failure)
    auts_value = icu.getKeyValueFromDict(nas_authentication_failure, "auts")[0]

    igniteLogger.logger.info(
        "\n---------------------------------------\nHSS receives AIR from MME\n---------------------------------------"
    )
    air = ds.receiveS6aMsg()
    icu.validateProtocolIE(air, 'visited-plmn-id', '02f829')
    icu.validateProtocolIE(air, 're-synchronization-info', hex(auts_value)[2:])

    igniteLogger.logger.info(
        "\n---------------------------------------\nHSS sends AIA to MME\n---------------------------------------"
    )
    ds.sendS6aMsg('authentication_info_response', msg_data_aia, imsi)

    igniteLogger.logger.info(
        "\n---------------------------------------\nAuth Request received from MME\n---------------------------------------"
예제 #19
0
        "\n---------------------------------------\nESM Information Request from MME\n---------------------------------------"
    )
    s1.receiveS1ap()

    igniteLogger.logger.info(
        "\n---------------------------------------\nESM Information Response to MME\n---------------------------------------"
    )
    s1.sendS1ap('esm_information_response',
                uplinknastransport_esm_information_response, enbues1ap_id,
                nas_esm_information_response)

    igniteLogger.logger.info(
        "\n---------------------------------------\nHSS receives ULR from MME\n---------------------------------------"
    )
    ulr = ds.receiveS6aMsg()
    hop_to_hop_identifier = icu.getKeyValueFromDict(ulr,
                                                    "hop-by-hop-identifier")[0]

    igniteLogger.logger.info(
        "\n---------------------------------------\nHSS sends ULA to MME\n---------------------------------------"
    )
    icu.updateKeyValueInDict(msg_data_ula, "hop-by-hop-identifier",
                             hop_to_hop_identifier)
    ds.sendS6aMsg('update_location_response', msg_data_ula, imsi)
    served_party_ip_address = icu.getKeyValueFromDict(
        msg_data_ula, "served-party-ip-address")[0]

    clr_flag = True

    igniteLogger.logger.info(
        "\n---------------------------------------\nCreate Session Request received from MME\n---------------------------------------"
    )
        "\n---------------------------------------\nSend Modify Bearer Response to MME\n---------------------------------------"
    )
    gs.sendGtp('modify_bearer_response', modify_bearer_response, msg_hierarchy)

    igniteLogger.logger.info(
        "\n---------------------------------------\nEMM Information received from MME\n---------------------------------------"
    )
    s1.receiveS1ap()

    igniteLogger.logger.info(
        "\n---------------------------------------\nUE is Attached\n---------------------------------------"
    )

    time.sleep(2)

    mme_ue_S1AP_id, mme_ue_S1AP_id_present = icu.getKeyValueFromDict(
        init_ctxt_setup_req, "MME-UE-S1AP-ID")
    mob_ctxt_command = "export LD_LIBRARY_PATH=" + mme_lib_path + " && " + mme_grpc_client_path + "/mme-grpc-client mme-app show mobile-context " + str(
        mme_ue_S1AP_id)
    mob_ctxt_af_attach = su.executeCommand(mob_ctxt_command, ssh_client)
    icu.mobileContextValidation(str(imsi), mob_ctxt_af_attach)

    proc_stat_af_attach = su.executeCommand(command, ssh_client)

    ue_count_after_attach = int(
        do.splitProcStats(proc_stat_af_attach, stats_type["subs_attached"]))
    icu.grpcValidation(ue_count_before_attach + 1, ue_count_after_attach,
                       "Number of Subs Attached")

    num_of_processed_aia_afattach = int(
        do.splitProcStats(proc_stat_af_attach, stats_type["processed_aia"]))
    icu.grpcValidation(num_of_processed_aia + 1, num_of_processed_aia_afattach,
예제 #21
0
def setNetCap(capbl, nasMsg):	
	ue_ntcap, ue_ntcap_present = icu.getKeyValueFromDict(nasMsg, "ue_network_capability")
	if ue_ntcap_present == "true":
		ue_ntcap[capbl]="supported"
예제 #22
0
        "\n---------------------------------------\nESM Information Request from MME\n---------------------------------------"
    )
    s1.receiveS1ap()

    igniteLogger.logger.info(
        "\n---------------------------------------\nESM Information Response to MME\n---------------------------------------"
    )
    s1.sendS1ap('esm_information_response',
                uplinknastransport_esm_information_response, enbues1ap_id,
                nas_esm_information_response)

    igniteLogger.logger.info(
        "\n---------------------------------------\nHSS receives ULR from MME\n---------------------------------------"
    )
    ulr = ds.receiveS6aMsg()
    hop_to_hop_identifier = icu.getKeyValueFromDict(ulr,
                                                    "hop-by-hop-identifier")[0]

    igniteLogger.logger.info(
        "\n---------------------------------------\nHSS sends ULA to MME\n---------------------------------------"
    )
    icu.updateKeyValueInDict(msg_data_ula, "hop-by-hop-identifier",
                             hop_to_hop_identifier)
    ds.sendS6aMsg('update_location_response', msg_data_ula, imsi)

    clr_flag = True

    igniteLogger.logger.info(
        "\n---------------------------------------\nCreate Session Request received from MME\n---------------------------------------"
    )
    cs_req = gs.receiveGtp()
    icu.validateProtocolIE(cs_req, 'apn', 'apn1')
예제 #23
0
def setContextData(s1apMsg, requestType):
    global IMSI
    enb_ue_s1ap_id, enb_ue_s1ap_id_present = icu.getKeyValueFromDict(
        s1apMsg, "ENB-UE-S1AP-ID")

    if requestType == mt.attach_request.name or requestType == mt.attach_request_guti.name:
        if S1APCTXDATA.get(enb_ue_s1ap_id, None) == None:
            key = IMSI
        else:
            key = enb_ue_s1ap_id
        plmn_identity, plmn_identity_present = icu.getKeyValueFromDict(
            s1apMsg, "pLMNidentity")
        nas_ksi_attach, nas_ksi_attach_present = icu.getKeyValueFromDict(
            s1apMsg, "nas_key_set_identifier")
        if S1APCTXDATA[key].get(mt.attach_request.name, None) == None:
            S1APCTXDATA[key][mt.attach_request.name] = {
                "enb_ue_s1ap_id": enb_ue_s1ap_id
            }
        else:
            S1APCTXDATA[key][
                mt.attach_request.name]["enb_ue_s1ap_id"] = enb_ue_s1ap_id
        S1APCTXDATA[key][
            mt.attach_request.name]["plmn_identity"] = plmn_identity
        S1APCTXDATA[key][
            mt.attach_request.name]["nas_key_set_identifier"] = nas_ksi_attach

    elif requestType == mt.authentication_request.name:
        mme_ue_s1ap_id, mme_ue_s1ap_id_present = icu.getKeyValueFromDict(
            s1apMsg, "MME-UE-S1AP-ID")
        S1APCTXDATA[IMSI][requestType] = {"mme_ue_s1ap_id": mme_ue_s1ap_id}
        nas_ksi, nas_ksi_present = icu.getKeyValueFromDict(
            s1apMsg, "nas_key_set_identifier_auth_req")
        response = requests.get(url["diameter_ctx_data_url"])
        imsiKey = str(IMSI)
        if response.json() != {} and response.json().get(imsiKey,
                                                         None) != None:
            S1APCTXDATA[IMSI]['SEC_CXT'] = {}
            S1APCTXDATA[IMSI]['SEC_CXT']['KSI'] = nas_ksi
            #TODO: Fetch KASME based on KSI
            S1APCTXDATA[IMSI]['SEC_CXT']['KASME'] = response.json(
            )[imsiKey]["authentication_info_response"]["kasme"]
            S1APCTXDATA[IMSI]['SEC_CXT']['UPLINK_COUNT'] = 0
            #TODO: Support DL NAS Count && MAC validation

    elif requestType == mt.security_mode_command.name:
        # MME is trying to establish/re-establish
        # integrity protection. Reset counts to 0
        S1APCTXDATA[IMSI]['SEC_CXT']['UPLINK_COUNT'] = 0

    elif requestType == mt.identity_request.name:
        mme_ue_s1ap_id, mme_ue_s1ap_id_present = icu.getKeyValueFromDict(
            s1apMsg, "MME-UE-S1AP-ID")
        S1APCTXDATA[enb_ue_s1ap_id][requestType] = {
            "mme_ue_s1ap_id": mme_ue_s1ap_id
        }

    elif requestType == mt.attach_accept.name:
        guti_list = nu.getGuti(s1apMsg)
        m_tmsi, m_tmsi_present = icu.getKeyValueFromDict(s1apMsg, "m_tmsi")
        mme_code, mme_code_present = icu.getKeyValueFromDict(
            s1apMsg, "mme_code")
        tai_list, tai_list_present = icu.getKeyValueFromDict(
            s1apMsg, "tracking_area_identity_list")
        selected_tai = taiEcgiTohex(tai_list)
        S1APCTXDATA[IMSI][requestType] = {
            "guti_list": guti_list,
            "m_tmsi": m_tmsi,
            "mme_code": mme_code,
            "tai_dict": selected_tai
        }

    elif requestType == mt.initial_context_setup_response.name:
        transport_layer_address, transport_layer_address_present = icu.getKeyValueFromDict(
            s1apMsg, "transportLayerAddress")
        gtp_teid, gtp_teid_present = icu.getKeyValueFromDict(
            s1apMsg, "gTP-TEID")
        S1APCTXDATA[IMSI][requestType] = {
            "transport_layer_address": transport_layer_address,
            "gtp_teid": int(gtp_teid, 16)
        }

    elif requestType == mt.handover_request_acknowledge.name:
        transport_layer_address, transport_layer_address_present = icu.getKeyValueFromDict(
            s1apMsg, "transportLayerAddress")
        gtp_teid, gtp_teid_present = icu.getKeyValueFromDict(
            s1apMsg, "gTP-TEID")
        S1APCTXDATA[IMSI][mt.initial_context_setup_response.name] = {
            "transport_layer_address": transport_layer_address,
            "gtp_teid": int(gtp_teid, 16)
        }

    elif requestType == mt.erab_modification_indication.name:
        transport_layer_address, transport_layer_address_present = icu.getKeyValueFromDict(
            s1apMsg, "transportLayerAddress")
        gtp_teid, gtp_teid_present = icu.getKeyValueFromDict(
            s1apMsg, "dL-GTP-TEID")
        S1APCTXDATA[IMSI][mt.initial_context_setup_response.name] = {
            "transport_layer_address": transport_layer_address,
            "gtp_teid": int(gtp_teid, 16)
        }

    elif requestType == mt.service_request.name:
        S1APCTXDATA[IMSI][requestType] = {"enb_ue_s1ap_id": enb_ue_s1ap_id}

    elif requestType == mt.ue_context_release_command.name:
        mme_ue_s1ap_id, mme_ue_s1ap_id_present = icu.getKeyValueFromDict(
            s1apMsg, "mME-UE-S1AP-ID")
        if IMSI == None:
            S1APCTXDATA[enb_ue_s1ap_id][requestType] = {
                "mme_ue_s1ap_id": mme_ue_s1ap_id
            }
        else:
            S1APCTXDATA[IMSI][requestType] = {"mme_ue_s1ap_id": mme_ue_s1ap_id}

    elif requestType == mt.esm_information_response.name:
        apn, apn_present = icu.getKeyValueFromDict(s1apMsg, "apn_esm")
        S1APCTXDATA[IMSI][requestType] = {"apn": apn}

    elif requestType == mt.securitymode_complete.name:
        S1APCTXDATA[IMSI]['SEC_CXT']['INTEGRITY_KEY'] = su.createIntegrityKey(
            2, str(S1APCTXDATA[IMSI]["SEC_CXT"]["KASME"]))

    procedure_code, matched = icu.getKeyValueFromDict(s1apMsg, 'procedureCode')
    if matched and procedure_code == 13:  #uplink nas
        if s1apMsg.get(
                'NAS-MESSAGE', None
        ) != None and 'sequence_number' in s1apMsg['NAS-MESSAGE'].keys():
            S1APCTXDATA[IMSI]['SEC_CXT']['UPLINK_COUNT'] += 1
    elif matched and procedure_code == 12:  #Init ue - detach and service request
        if s1apMsg.get('NAS-MESSAGE', None) != None:
            if 'ksi_sequence_number' in s1apMsg['NAS-MESSAGE'].keys():
                S1APCTXDATA[IMSI]['SEC_CXT']['UPLINK_COUNT'] += 1
            elif 'sequence_number' in s1apMsg['NAS-MESSAGE'].keys():
                S1APCTXDATA[IMSI]['SEC_CXT']['UPLINK_COUNT'] += 1

    igniteLogger.logger.info(f"s1ap context data : {S1APCTXDATA}")