From 1028d87a9ce641170c51f3a81b2456e88af68319 Mon Sep 17 00:00:00 2001 From: Andreas Schultz Date: Fri, 6 Sep 2024 08:45:44 +0200 Subject: [PATCH] handle IMEIs shorter than 15 digits IMEIs are 15 digits and IMEI-SVs are 16 digits (3GPP TS 23.003, clause 6.2), anything else is not a valid IMEI. However, somehow 14 digit values are observed in the wild. Make sure that encoder/decoder handles them, so that higher levels can deal with the values. (cherry picked from commit f69e2ff90b61b4cb1ac63d4359a886320cbe50f2) --- priv/ie_gen_v1.erl | 2 +- src/gtp_packet.erl | 11 +++++++++-- test/gtp_SUITE.erl | 11 +++++++++++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/priv/ie_gen_v1.erl b/priv/ie_gen_v1.erl index 9ed38e2..8840036 100755 --- a/priv/ie_gen_v1.erl +++ b/priv/ie_gen_v1.erl @@ -283,7 +283,7 @@ ies() -> {"DST", 2, integer}, {'_', 0}]}, {154, "IMEI", '_', - [{"IMEI", 64, {type, tbcd}}, + [{"IMEI", 64, {type, imei}}, {'_', 0}]}, {155, "CAMEL Charging Information Container", '_', []}, diff --git a/src/gtp_packet.erl b/src/gtp_packet.erl index 1416273..783571e 100644 --- a/src/gtp_packet.erl +++ b/src/gtp_packet.erl @@ -735,6 +735,13 @@ encode_imsi(IMSI) -> << B:64/bits, _/binary>> = << (encode_tbcd(IMSI))/binary, -1:64 >>, B. +decode_imei(Bin) -> + decode_tbcd(Bin). + +encode_imei(IMEI) -> + << B:64/bits, _/binary>> = << (encode_tbcd(IMEI))/binary, -1:64 >>, + B. + encode_v1_rai(#routeing_area_identity{ identity = #rai{plmn_id = {MCC, MNC}, lac = LAC, rac = RAC}}) -> <<(encode_mccmnc(MCC, MNC))/binary, LAC:16, (RAC bsr 8):8>>. @@ -1677,7 +1684,7 @@ decode_v1_element(<>, 154, Instance) -> #imei{instance = Instance, - imei = decode_tbcd(M_imei)}; + imei = decode_imei(M_imei)}; decode_v1_element(<<>>, 155, Instance) -> #camel_charging_information_container{instance = Instance}; @@ -2441,7 +2448,7 @@ encode_v1_element(#ms_time_zone{ encode_v1_element(#imei{ instance = Instance, imei = M_imei}) -> - encode_v1_element(154, Instance, <<(encode_tbcd(M_imei)):64/bits>>); + encode_v1_element(154, Instance, <<(encode_imei(M_imei)):64/bits>>); encode_v1_element(#camel_charging_information_container{ instance = Instance}) -> diff --git a/test/gtp_SUITE.erl b/test/gtp_SUITE.erl index 6bfa799..0f919a6 100644 --- a/test/gtp_SUITE.erl +++ b/test/gtp_SUITE.erl @@ -58,6 +58,7 @@ all() -> test_v1_ignore_spare_bits, test_g_pdu, test_v2_pco_vendor_ext, + v1_invalid_imei, v2_list, partial_decode, partial_encode, @@ -282,6 +283,16 @@ test_v2_pco_vendor_ext(_Config) -> ?match(Data when is_binary(Data), (catch gtp_packet:encode(Msg))), ok. +v1_invalid_imei() -> + [{doc, "Try to encode an IMEI shorter that 15 digits"}]. +v1_invalid_imei(_Config) -> + %% IMEIs are 15 digits and IMEI-SVs are 16 digits, anything else is not a valid + %% IMEI. However, somehow 14 digit values are observed in the wild. Make sure that + %% encoder/decoder handles them, so that higher levels can deal with the values. + Msg = #gtp{version = v1, type = create_pdp_context_request, seq_no = 1, tei = 0, + ie = #{{imei, 0} => #imei{imei = <<"1234567890">>}}}, + ?equal(Msg, gtp_packet:decode(gtp_packet:encode(Msg))). + v2_list(_Config) -> IEs = [