Files
osmocom-analog/src/sim/sim.h
Andreas Eversberg 9d8c9d8986 C-Netz SIM: Improve and use PIN input to program card
Imrovements are less memeory usage.

Card data can be programmed by using PIN input.
2024-08-18 23:56:10 +02:00

168 lines
4.4 KiB
C

#define SIM_VERSION_NAME "TelecardVersion"
#define SIM_VERSION "4"
#define JOLLY_NAME "Jolly Zuhause"
#define JOLLY_PHONE "04644973171"
#define FUTLN_DEFAULT "2222001"
#define SICHERUNG_DEFAULT 3103
#define KARTEN_DEFAULT 3
#define SONDER_DEFAULT 0
#define WARTUNG_DEFAULT 65535
#define PIN_DEFAULT "0000"
#define AUTH_DEFAULT ((uint64_t)0x000000000badefee)
enum l1_state {
L1_STATE_RESET = 0, /* reset is held */
L1_STATE_ATR, /* answer to reset is sent */
L1_STATE_IDLE, /* waiting for message or reset */
L1_STATE_SEND, /* sending reply */
L1_STATE_RECEIVE, /* receiving message */
L1_STATE_COMPLETE, /* received message complete, waiting for card reader to release */
L1_STATE_GARBAGE, /* received garbage right after frame, waiting for timeout */
};
enum block_state {
BLOCK_STATE_ADDRESS = 0,
BLOCK_STATE_CONTROL,
BLOCK_STATE_LENGTH,
BLOCK_STATE_DATA,
};
enum sim_mode {
SIM_MODE_NONE = 0, /* SIM from EEPROM */
SIM_MODE_PHONEBOOK, /* SIM that contains the phonebook */
SIM_MODE_PIN, /* entering SIM via PIN */
SIM_MODE_ERROR, /* SIM via PIN failed */
};
#define MAX_PIN_TRY 3
#define MAX_CARDS 8 /* must also be defined at eeprom.h */
typedef struct sim_sim {
int card;
enum l1_state l1_state;
/* ATR states */
int atr_count;
/* layer 2 states */
enum block_state block_state;
uint8_t block_address;
uint8_t block_control;
uint8_t block_checksum;
uint8_t block_count;
uint8_t block_rx_data[64];
uint8_t block_rx_length;
uint8_t block_tx_data[64];
uint8_t block_tx_length;
uint8_t vs, vr;
int reject_count;
int resync_sent;
/* ICL layer states */
uint8_t icl_online;
uint8_t icl_master;
uint8_t icl_chaining;
uint8_t icl_error;
/* layer 7 states */
uint8_t addr_src;
uint8_t addr_dst;
uint8_t sh_appl_count; /* counts applications for SH_APPL */
/* CNETZ states */
uint8_t pin_required; /* pin required an not yet validated */
enum sim_mode sim_mode; /* sim mode active (programming mode) */
char pin_program_futln[9]; /* PIN program mode: FUTLN string with maximum of 8 characters */
int32_t pin_program_values[4]; /* PIN program mode: other 4 values */
uint8_t pin_program_index; /* PIN program mode: strin to be entered */
uint8_t pin_len; /* length of pin (4 .. 8) */
uint8_t pin_try; /* number of tries left (0 == card locked) */
uint8_t app; /* currently selected APP number */
uint8_t app_locked; /* application locked */
uint8_t gebz_locked; /* metering counter and phonebook locked */
uint8_t gebz_full; /* metering counter full (does this really happen?) */
} sim_sim_t;
/* layer 2 */
enum l2_cmd {
L2_I,
L2_REJ,
L2_RES,
};
/* ICL */
#define ICB1_ONLINE 0x01
#define ICB1_CONFIRM 0x02
#define ICB1_MASTER 0x04
#define ICB1_WT_EXT 0x08
#define ICB1_ABORT 0x10
#define ICB1_ERROR 0x20
#define ICB1_CHAINING 0x40
#define ICB2_BUFFER 0x0f
#define ICB2_DYNAMIC 0x10
#define ICB2_ISO_L2 0x20
#define ICB2_PRIVATE 0x40
#define ICB_EXT 0x80
/* command */
#define CLA_CNTR 0x02
#define SL_APPL 0xf1
#define CL_APPL 0xf2
#define SH_APPL 0xf3
#define CLA_STAT 0x03
#define CHK_KON 0xf1
#define CLA_WRTE 0x04
#define WT_RUFN 0x01
#define CLA_READ 0x05
#define RD_EBDT 0x01
#define RD_RUFN 0x02
#define RD_GEBZ 0x03
#define CLA_EXEC 0x06
#define CHK_PIN 0xf1
#define SET_PIN 0xf2
#define EH_GEBZ 0x01
#define CL_GEBZ 0x02
#define SP_GZRV 0x01
#define FR_GZRV 0x02
#define CLA_AUTO 0x07
#define AUT_1 0x01
/* response */
#define CCRC_PIN_NOK 0x01
#define CCRC_AFBZ_NULL 0x02
#define CCRC_APRC_VALID 0x04
#define CCRC_ERROR 0x40
#define CCRC_IDENT 0x80
#define APRC_PIN_REQ 0x02
#define APRC_APP_LOCKED 0x04
#define APRC_GEBZ_LOCK 0x10
#define APRC_GEBZ_FULL 0x20
/* apps */
#define APP_NETZ_C 3
#define APP_RUFN_GEBZ 4
/* defined for main.c */
size_t eeprom_length(void);
int encode_ebdt(uint8_t *data, const char *futln, int32_t sicherung, int32_t karten, int32_t sonder, int32_t wartung);
void decode_ebdt(uint8_t *data, char *futln, char *sicherung, char *karten, char *sonder, char *wartung);
int directory_size(void);
int save_directory(int location, uint8_t *data);
void load_directory(int location, uint8_t *data);
int encode_directory(uint8_t *data, const char *number, const char *name);
void decode_directory(uint8_t *data, char *number, char *name);
int sim_init_eeprom(void);
void sim_reset(sim_sim_t *sim, int reset);
int sim_rx(sim_sim_t *sim, uint8_t c);
int sim_tx(sim_sim_t *sim);
void sim_timeout(sim_sim_t *sim);