SIM: several fixes

This commit is contained in:
Andreas Eversberg 2020-05-28 19:01:42 +02:00
parent 0cbabc39b1
commit a98b05beb0
4 changed files with 32 additions and 21 deletions

View File

@ -344,7 +344,7 @@ I prefer the mini SIM and use an adapter card for larger phones.
<p> <p>
The original ATTINY85 (1) is shown upside down. The original ATTINY85 (1) is shown upside down.
Bend the legs straight and shorten them, so they still fit into a programmer's socket. (2) Bend the legs straight and shorten them, so they still fit into a programmer's socket. (2)
The use P400 sand paper to sand off the bottom of the case until you reach copper plate. (3) Use P400 sand paper to sand off the bottom of the chip's case, until you reach the copper plate. (3)
Make a hole into the PBC and solder the chip upside down into that hole. Make a hole into the PBC and solder the chip upside down into that hole.
Pin 1 is marked on the PCB. Pin 1 is marked on the PCB.
</p> </p>
@ -416,7 +416,7 @@ You may want to use a PIN to select the card whenever you turn on the phone.
Use the phone to enable a PIN that does not start with "000". Use the phone to enable a PIN that does not start with "000".
When you restart your phone, you may enter that PIN, to select the first card. When you restart your phone, you may enter that PIN, to select the first card.
Alternatively you may enter the PIN 0000 or 0001, to select the first card, no matter what the PIN was. Alternatively you may enter the PIN 0000 or 0001, to select the first card, no matter what the PIN was.
Or you may enter the PIN 0002 .. 0008, to select second to eight card. Or you may enter the PIN 0002 .. 0008, to select second to eighth card.
</p> </p>
<p> <p>
@ -425,7 +425,7 @@ In order to do that, you need to set a PIN, so the phone will ask for a PIN when
Choose any PIN you like, but not a PIN stat starts with 000. Choose any PIN you like, but not a PIN stat starts with 000.
Turn on the phone and you will be asked for a PIN. Turn on the phone and you will be asked for a PIN.
Enter the PIN 9991 to alter the first subscriber data. Enter the PIN 9991 to alter the first subscriber data.
Enter the PIN 9992 .. 9998 to alter second to eigtht subscriber data. Enter the PIN 9992 .. 9998 to alter second to eighth subscriber data.
The subscriber data is shown in the telephone directory and can be altered by changing the numbers in that directory. The subscriber data is shown in the telephone directory and can be altered by changing the numbers in that directory.
</p> </p>
@ -458,10 +458,10 @@ To program one of the following service cards, change the subscriber data to the
<table class="sim"> <table class="sim">
<tr><th>Type</th><th>FUTLN =<br>Subscriber</th><th>Sicherungs-<br>code</th><th>Karten-<br>kennung</th><th>Sonderheiten-<br>schl&uuml;ssel</th><th>Wartungs-<br>schl&uuml;ssel</th></tr> <tr><th>Type</th><th>FUTLN =<br>Subscriber</th><th>Sicherungs-<br>code</th><th>Karten-<br>kennung</th><th>Sonderheiten-<br>schl&uuml;ssel</th><th>Wartungs-<br>schl&uuml;ssel</th></tr>
<tr><td>Siemens C5<br>service mode</td><td>-</td><td>-</td><td>-</td><td>900</td><td>1000</td></tr> <tr><td>Siemens C5<br>service mode</td><td>-</td><td>-</td><td>-</td><td>900</td><td>1000</td></tr>
<tr><td>Phillips Miniporty<br>service mode</td><td>-</td><td>-</td><td>-</td><td>900</td><td>1000</td></tr> <tr><td>Philips Miniporty<br>service mode</td><td>-</td><td>-</td><td>-</td><td>900</td><td>1000</td></tr>
<tr><td>Phillips Miniporty<br>cell monitor</td><td>-</td><td>-</td><td>-</td><td>900</td><td>1728 or<br>2729</td></tr> <tr><td>Philips Miniporty<br>cell monitor</td><td>-</td><td>-</td><td>-</td><td>900</td><td>1728 or<br>2729</td></tr>
<tr><td>Phillips Porty<br>service mode</td><td>0</td><td>0</td><td>0</td><td>2304</td><td>-</td></tr> <tr><td>Philips Porty<br>service mode</td><td>0</td><td>0</td><td>0</td><td>2304</td><td>-</td></tr>
<tr><td>Phillips Porty<br>cell monitor</td><td>-</td><td>-</td><td>-</td><td>898</td><td>-</td></tr> <tr><td>Philips Porty<br>cell monitor</td><td>-</td><td>-</td><td>-</td><td>898</td><td>-</td></tr>
</table> </table>
</p> </p>

View File

@ -28,6 +28,7 @@
#include <errno.h> #include <errno.h>
#include <math.h> #include <math.h>
#include <unistd.h> #include <unistd.h>
#include <inttypes.h>
#include <sys/time.h> #include <sys/time.h>
#include "../libdebug/debug.h" #include "../libdebug/debug.h"
#include "../liboptions/options.h" #include "../liboptions/options.h"
@ -101,7 +102,7 @@ void print_help(const char *arg0)
printf(" -A --authenticate 0x...\n"); printf(" -A --authenticate 0x...\n");
printf(" Give 64 Bit value for authentication response. (default = all bits 1)\n"); printf(" Give 64 Bit value for authentication response. (default = all bits 1)\n");
printf("\nCommands are:\n"); printf("\nCommands are:\n");
printf(" sniff - To passively sniff ATR and message\n"); printf(" sniff - To passively sniff SIM card communication\n");
printf(" sim - To simulate a SIM card\n"); printf(" sim - To simulate a SIM card\n");
} }
@ -225,7 +226,7 @@ size_t eeprom_length(void)
int main_loop(serial_t *serial, int sniffer) int main_loop(serial_t *serial, int sniffer)
{ {
int rc, cts, last_cts = 0; int rc, cts = 0, last_cts = 0;
uint8_t byte; uint8_t byte;
int skip_bytes = 0; int skip_bytes = 0;
int work = 0; int work = 0;
@ -333,7 +334,7 @@ int main(int argc, char *argv[])
debuglevel = DEBUG_INFO; debuglevel = DEBUG_INFO;
add_options(); add_options();
rc = options_config_file("~/.osmocom/analog/simsim.conf", handle_options); rc = options_config_file("~/.osmocom/analog/sim.conf", handle_options);
if (rc < 0) if (rc < 0)
return 0; return 0;
@ -423,7 +424,7 @@ int main(int argc, char *argv[])
} else if (!strcmp(argv[argi], "sim")) { } else if (!strcmp(argv[argi], "sim")) {
sniffer = 0; sniffer = 0;
} else { } else {
fprintf(stderr, "Unknown command '%s', use '-h' for help!\n", argv[argi]); print_help(argv[0]);
return -EINVAL; return -EINVAL;
} }
@ -441,6 +442,13 @@ int main(int argc, char *argv[])
print_image(); print_image();
decode_ebdt(ebdt_data, temp[0], temp[1], temp[2], temp[3], temp[4]); decode_ebdt(ebdt_data, temp[0], temp[1], temp[2], temp[3], temp[4]);
printf("FUTLN=%s, Sicherungscode=%s, Kartekennung=%s, Sonderheitenschluessel=%s, Wartungsschluessel=%s\n", temp[0], temp[1], temp[2], temp[3], temp[4]); printf("FUTLN=%s, Sicherungscode=%s, Kartekennung=%s, Sonderheitenschluessel=%s, Wartungsschluessel=%s\n", temp[0], temp[1], temp[2], temp[3], temp[4]);
for (i = 0; i < 8; i++)
temp[0][i] = eeprom_read(EEPROM_PIN_DATA + i);
temp[0][(eeprom_read(EEPROM_FLAGS) >> EEPROM_FLAG_PIN_LEN) & 0xf] = '\0';
uint64_t auth_value = 0;
for (i = 0; i < 8; i++)
auth_value |= eeprom_read(EEPROM_AUTH_DATA + i) << (8 * (7 - i));
printf("PIN=%s, auth response=0x%016" PRIx64 "\n", temp[0], auth_value);
printf("Telephone directory has %d entries.\n", directory_size() - 1); printf("Telephone directory has %d entries.\n", directory_size() - 1);
for (i = 0; i < directory_size() - 1; i++) { for (i = 0; i < directory_size() - 1; i++) {
uint8_t data[24]; uint8_t data[24];

View File

@ -472,21 +472,21 @@ static void sl_appl(sim_sim_t *sim, uint8_t *data, int length)
PDEBUG(DSIM7, DEBUG_INFO, " SL-APPL app %d\n", app); PDEBUG(DSIM7, DEBUG_INFO, " SL-APPL app %d\n", app);
/* if PIN is required */ /* check and set application */
if (sim->pin_required) {
return_pin_not_ok(sim);
return;
}
/* check application */
if (app != APP_NETZ_C && app != APP_RUFN_GEBZ) { if (app != APP_NETZ_C && app != APP_RUFN_GEBZ) {
PDEBUG(DSIM7, DEBUG_NOTICE, "SL-APPL invalid app %d\n", sim->app); PDEBUG(DSIM7, DEBUG_NOTICE, "SL-APPL invalid app %d\n", sim->app);
return_error(sim); return_error(sim);
return; return;
} }
sim->app = app;
/* if PIN is required, we request it, but we've already selected the app */
if (sim->pin_required) {
return_pin_not_ok(sim);
return;
}
/* respond */ /* respond */
sim->app = app;
data = alloc_msg(sim, 0); data = alloc_msg(sim, 0);
tx_sdu(sim, 0, data, 0); tx_sdu(sim, 0, data, 0);
} }
@ -913,7 +913,7 @@ static void aut_1(sim_sim_t *sim)
uint8_t *data; uint8_t *data;
int i; int i;
PDEBUG(DSIM7, DEBUG_INFO, " RD-EBDT\n"); PDEBUG(DSIM7, DEBUG_INFO, " AUTH-1\n");
/* respond */ /* respond */
data = alloc_msg(sim, 1); data = alloc_msg(sim, 1);
@ -1337,7 +1337,10 @@ int sim_init_eeprom(void)
eeprom_write(EEPROM_FLAGS, (strlen(PIN_DEFAULT) << EEPROM_FLAG_PIN_LEN) | (MAX_PIN_TRY << EEPROM_FLAG_PIN_TRY)); eeprom_write(EEPROM_FLAGS, (strlen(PIN_DEFAULT) << EEPROM_FLAG_PIN_LEN) | (MAX_PIN_TRY << EEPROM_FLAG_PIN_TRY));
for (i = 0; i < (int)strlen(PIN_DEFAULT); i++) for (i = 0; i < (int)strlen(PIN_DEFAULT); i++)
eeprom_write(EEPROM_PIN_DATA + i, PIN_DEFAULT[i]); eeprom_write(EEPROM_PIN_DATA + i, PIN_DEFAULT[i]);
for (i = 0; i < 8; i++)
eeprom_write(EEPROM_AUTH_DATA + i, AUTH_DEFAULT >> ((7 - i) * 8));
/* now write magic characters to identify virgin or initialized EEPROM */
eeprom_write(EEPROM_MAGIC + 0, 'C'); eeprom_write(EEPROM_MAGIC + 0, 'C');
eeprom_write(EEPROM_MAGIC + 1, '0' + EEPROM_VERSION); eeprom_write(EEPROM_MAGIC + 1, '0' + EEPROM_VERSION);

View File

@ -5,7 +5,7 @@
#define SONDER_DEFAULT "0" #define SONDER_DEFAULT "0"
#define WARTUNG_DEFAULT "65535" #define WARTUNG_DEFAULT "65535"
#define PIN_DEFAULT "0000" #define PIN_DEFAULT "0000"
#define AUTH_DEFAULT "0xffffffffffffffff" #define AUTH_DEFAULT ((uint64_t)0x000000000badefee)
enum l1_state { enum l1_state {
L1_STATE_RESET = 0, /* reset is held */ L1_STATE_RESET = 0, /* reset is held */