From: Alexander Couzens Date: Sun, 18 Aug 2024 22:48:30 +0000 (+0200) Subject: uqmid: add uqmi_sim_decode_imsi() to decode EF.IMSI from UIM X-Git-Url: http://git.openwrt.org/?a=commitdiff_plain;h=f1ad9c1cfba3c1467af2c289ee40de64aae09531;p=project%2Fuqmi.git uqmid: add uqmi_sim_decode_imsi() to decode EF.IMSI from UIM SIM or USIM based files are encoded in BCD format and QMI doesn't offer a direct method to get the IMSI when only the UIM service is available. Signed-off-by: Alexander Couzens --- diff --git a/uqmid/CMakeLists.txt b/uqmid/CMakeLists.txt index 3dd063a..b2e672e 100644 --- a/uqmid/CMakeLists.txt +++ b/uqmid/CMakeLists.txt @@ -17,3 +17,9 @@ INSTALL(TARGETS uqmid ADD_EXECUTABLE(testgsmtap gsmtap_util.c utils/test_gsmtap.c) TARGET_LINK_LIBRARIES(testgsmtap ${LIBS} ${UQMID_LIBS}) TARGET_INCLUDE_DIRECTORIES(testgsmtap PRIVATE ${ubus_include_dir} ${ubox_include_dir} ${blobmsg_json_include_dir} ${json_include_dir} ${talloc_include_dir} ${CMAKE_SOURCE_DIR}) + +ADD_EXECUTABLE(test_sim test_sim.c sim.c) +TARGET_LINK_LIBRARIES(test_sim osmofsm) +ADD_TEST(NAME TestInstantiator + COMMAND TestInstantiator) + diff --git a/uqmid/sim.c b/uqmid/sim.c index 92a0b21..afbabc4 100644 --- a/uqmid/sim.c +++ b/uqmid/sim.c @@ -21,6 +21,10 @@ #include "sim.h" #include "qmi-enums-uim.h" +#include "osmocom/utils.h" + +#include +#include enum uqmi_sim_state uim_card_application_state_to_uqmi_state(int app_state) { @@ -57,3 +61,28 @@ enum uqmi_sim_state uim_pin_to_uqmi_state(int upin_state) return UQMI_SIM_UNKNOWN; } } + +int uqmi_sim_decode_imsi(uint8_t *imsi_ef, uint8_t imsi_ef_size, char *imsi_str, uint8_t imsi_str_len) +{ + uint8_t imsi_len; + uint8_t imsi_enc_len; + uint8_t oe; + // int offset = 0, i; + if (imsi_ef_size < 9) + return -EINVAL; + + imsi_enc_len = imsi_ef[0]; + if (imsi_enc_len > 8 || imsi_enc_len == 0) + return -EINVAL; + + imsi_len = imsi_enc_len * 2 - 1; + oe = (imsi_ef[1] >> 3) & 0x1; + if (!oe) + imsi_len--; + + /* additional 0 byte */ + if (imsi_str_len < imsi_len + 1) + return -ENOMEM; + + return osmo_bcd2str(imsi_str, imsi_str_len, imsi_ef + 1, 1, imsi_len + 1, false); +} diff --git a/uqmid/sim.h b/uqmid/sim.h index 8b7bf65..1f26dc6 100644 --- a/uqmid/sim.h +++ b/uqmid/sim.h @@ -35,4 +35,6 @@ enum uqmi_sim_state { enum uqmi_sim_state uim_card_application_state_to_uqmi_state(int app_state); enum uqmi_sim_state uim_pin_to_uqmi_state(int upin_state); +int uqmi_sim_decode_imsi(uint8_t *imsi_ef, uint8_t imsi_ef_size, char *imsi_str, uint8_t imsi_str_len); + #endif /* __UTILS_H */ diff --git a/uqmid/test_sim.c b/uqmid/test_sim.c new file mode 100644 index 0000000..a1a23b3 --- /dev/null +++ b/uqmid/test_sim.c @@ -0,0 +1,17 @@ + +#include "sim.h" + +#include +#include +#include + +int main() { + int ret; + uint8_t imsi_ef[] = { 0x08, 0x29, 0x82, 0x60, 0x82, 0x00, 0x00, 0x20, 0x80 }; + char imsi_str[16]; + ret = uqmi_sim_decode_imsi(&imsi_ef[0], 9, &imsi_str[0], sizeof(imsi_str)); + if (ret >= 0) + fprintf(stderr, "Decoded imsi %s\n", imsi_str); + assert(ret >= 0); + assert(strncmp(&imsi_str[0], "228062800000208", sizeof(15)) == 0); +}