diff --git a/srsue/src/upper/pcsc_usim.cc b/srsue/src/upper/pcsc_usim.cc index 86eb6f2c3..7bbaf0f01 100644 --- a/srsue/src/upper/pcsc_usim.cc +++ b/srsue/src/upper/pcsc_usim.cc @@ -47,23 +47,25 @@ pcsc_usim::~pcsc_usim() int pcsc_usim::init(usim_args_t *args, srslte::log *log_) { + int ret = SRSLTE_ERROR; log = log_; if (sc.init(args, log_) != SRSLTE_SUCCESS) { - return SRSLTE_ERROR; + return ret; } // Read IMSI from SIM card - char tmp[100]; - size_t tmp_len; + char tmp[15]; + size_t tmp_len = 15; // set to max IMSI length if (sc.get_imsi(tmp, &tmp_len)) { - log->error("Error reading IMSI from SIM\n"); + log->error("Error reading IMSI from SIM.\n"); + return ret; } imsi_str = tmp; // Check extracted IMSI and convert - const char *imsi_c = imsi_str.c_str(); - if(15 == args->imsi.length()) { + if(15 == imsi_str.length()) { + const char *imsi_c = imsi_str.c_str(); imsi = 0; for(int i = 0; i < 15; i++) { @@ -71,13 +73,14 @@ int pcsc_usim::init(usim_args_t *args, srslte::log *log_) imsi += imsi_c[i] - '0'; } } else { - log->error("Invalid length for ISMI: %zu should be %d\n", imsi_str.length(), 15); + log->error("Invalid length for IMSI: %zu should be %d\n", imsi_str.length(), 15); log->console("Invalid length for IMSI: %zu should be %d\n", imsi_str.length(), 15); + return ret; } // Check IMEI - const char *imei_c = args->imei.c_str(); if(15 == args->imei.length()) { + const char *imei_c = args->imei.c_str(); imei = 0; for(int i = 0; i < 15; i++) { @@ -87,6 +90,7 @@ int pcsc_usim::init(usim_args_t *args, srslte::log *log_) } else { log->error("Invalid length for IMEI: %zu should be %d\n", args->imei.length(), 15); log->console("Invalid length for IMEI: %zu should be %d\n", args->imei.length(), 15); + return ret; } // Get MNC length @@ -94,8 +98,9 @@ int pcsc_usim::init(usim_args_t *args, srslte::log *log_) log->debug("MNC length %d\n", mnc_length); initiated = true; + ret = SRSLTE_SUCCESS; - return SRSLTE_SUCCESS; + return ret; } void pcsc_usim::stop() @@ -415,7 +420,7 @@ int pcsc_usim::scard::init(usim_args_t *args, srslte::log *log_) ret = SCardListReaders(scard_context, NULL, readers, &len); if (ret != SCARD_S_SUCCESS) { - log->error("%s\n", pcsc_stringify_error(ret)); + log->error("SCardListReaders() 2: %s\n", pcsc_stringify_error(ret)); goto clean_exit; } if (len < 3) { @@ -510,6 +515,12 @@ int pcsc_usim::scard::init(usim_args_t *args, srslte::log *log_) pin1_needed = false; } + // stop before pin retry counter reaches zero + if (pin1_needed && get_pin_retry_counter() <= 1) { + log->error("PIN1 needed for SIM access (retry counter=%d), emergency stop.\n", get_pin_retry_counter()); + goto clean_exit; + } + // Set pin if (pin1_needed) { // verify PIN diff --git a/srsue/test/upper/pcsc_usim_test.cc b/srsue/test/upper/pcsc_usim_test.cc index 12dfcd3c1..b28b5e749 100644 --- a/srsue/test/upper/pcsc_usim_test.cc +++ b/srsue/test/upper/pcsc_usim_test.cc @@ -53,9 +53,14 @@ int main(int argc, char **argv) args.imei = "353490069873319"; srsue::pcsc_usim usim; - usim.init(&args, &usim_log); + if (usim.init(&args, &usim_log)) { + printf("Error initializing PC/SC USIM.\n"); + return SRSLTE_ERROR; + }; std::string imsi = usim.get_imsi_str(); cout << "IMSI: " << imsi << endl; auth_result_t result = usim.generate_authentication_response(rand_enb, autn_enb, mcc, mnc, res, &res_len, k_asme); + + return SRSLTE_SUCCESS; }