00001 /* 00002 * This file is part of ccid-utils 00003 * Copyright (c) 2008 Gianni Tedesco <gianni@scaramanga.co.uk> 00004 * Released under the terms of the GNU GPL version 3 00005 */ 00006 #ifndef _SIM_INTERNAL_H 00007 #define _SIM_INTERNAL_H 00008 00009 #define SIM_CLA 0xa0 00010 00011 #define SIM_INS_SELECT 0xa4 00012 #define SIM_INS_READ_BINARY 0xb0 00013 #define SIM_INS_READ_RECORD 0xb2 00014 #define SIM_INS_GET_RESPONSE 0xc0 00015 00016 #define SIM_MF 0x3f00 00017 #define SIM_EF_ICCID 0x2fe2 00018 00019 #define SIM_DF_TELECOM 0x7f10 00020 00021 #define SIM_DF_GSM 0x7f20 00022 #define SIM_EF_SMS 0x6f3c 00023 #define SIM_EF_IMSI 0x6f07 00024 00025 #define SIM_SW1_SUCCESS 0x90 00026 #define SIM_SW1_SHORT 0x9f 00027 #define SIM_SW1_MEM_ERR 0x92 00028 #define SIM_SW1_REF_ERR 0x94 00029 #define SIM_SW1_SEC_ERR 0x98 00030 00031 #define SIM_TYPE_MASK 0xff00 00032 #define SIM_MF 0x3f00 00033 #define SIM_TYPE_DF 0x7f00 00034 #define SIM_TYPE_EF 0x6f00 00035 #define SIM_TYPE_ROOT_EF 0x2f00 00036 #define SIM_FILE_INVALID 0xffff 00037 #define SIM_IS_MF(x) ((x & SIM_TYPE_MASK) == SIM_MF) 00038 #define SIM_IS_DF(x) ((x & SIM_TYPE_MASK) == SIM_TYPE_DF) 00039 #define SIM_IS_EF(x) ((x & SIM_TYPE_MASK) == SIM_TYPE_EF) 00040 #define SIM_IS_RoOT_EF(x) ((x & SIM_TYPE_MASK) == SIM_TYPE_ROOT_EF) 00041 00042 #define EF_TRANSPARENT 0x0 00043 #define EF_LINEAR 0x1 00044 #define EF_CYCLIC 0x3 00045 00046 /* SMS record status codes */ 00047 #define SIM_SMS_STATUS_FREE 0 00048 #define SIM_SMS_STATUS_READ 1 00049 #define SIM_SMS_STATUS_UNREAD 3 00050 #define SIM_SMS_STATUS_SENT 5 00051 #define SIM_SMS_STATUS_UNSENT 7 00052 00053 /* SMS-DELIVER octet codes */ 00054 #define SMS_TP_MTI ((1<<0)|(1<<1)) /* message type indicator */ 00055 #define SMS_TP_MMS (1<<2) /* more messages */ 00056 #define SMS_TP_SRI (1<<5) /* status report indicator */ 00057 #define SMS_TP_UDHI (1<<6) /* user data header included */ 00058 #define SMS_TP_RP (1<<7) /* return path included */ 00059 00060 /* Type of phone number */ 00061 #define GSM_NUMBER_TYPE_MASK (7 << 4) 00062 #define GSM_NUMBER_UNKNOWN (0 << 4) 00063 #define GSM_NUMBER_INTL (1 << 4) 00064 #define GSM_NUMBER_NATIONAL (2 << 4) 00065 #define GSM_NUMBER_NET_SPEC (3 << 4) 00066 #define GSM_NUMBER_SUBSCR (4 << 4) 00067 #define GSM_NUMBER_ABBREV (5 << 4) 00068 #define GSM_NUMBER_ALNUM (6 << 4) 00069 #define GSM_NUMBER_RESERVED (7 << 4) 00070 00071 /* Phone numbering plan */ 00072 #define GSM_PLAN_MASK 0xf 00073 #define GSM_PLAN_UNKNOWN 0 00074 #define GSM_PLAN_ISDN 1 00075 #define GSM_PLAN_X121 3 00076 #define GSM_PLAN_TELEX 4 00077 #define GSM_PLAN_NATIONAL 8 00078 #define GSM_PLAN_PRIVATE 9 00079 #define GSM_PLAN_ERMES 10 00080 00081 struct fci { 00082 uint16_t f_rfu; 00083 uint16_t f_size; 00084 uint16_t f_id; 00085 uint8_t f_type; 00086 } _packed; 00087 00088 struct df_fci { 00089 uint16_t d_rfu0; 00090 uint16_t d_free; 00091 uint16_t d_id; 00092 uint8_t d_type; 00093 uint8_t d_rfu1[5]; 00094 uint8_t d_opt_len; 00095 } _packed; 00096 00097 struct df_gsm { 00098 uint8_t g_fch; 00099 uint8_t g_num_df; 00100 uint8_t g_num_ef; 00101 uint8_t g_chv; 00102 uint8_t g_rfu0; 00103 uint8_t g_chv1; 00104 uint8_t g_chv1u; 00105 uint8_t g_chv2; 00106 uint8_t g_chv2u; 00107 } _packed; 00108 00109 #define EF_FCI_MIN_OPT_LEN 2 00110 struct ef_fci { 00111 uint16_t e_rfu; 00112 uint16_t e_size; 00113 uint16_t e_id; 00114 uint8_t e_type; 00115 uint8_t e_increase; 00116 uint8_t e_access[3]; 00117 uint8_t e_status; 00118 uint8_t e_opt_len; 00119 uint8_t e_struct; 00120 uint8_t e_reclen; 00121 } _packed; 00122 00123 struct _sms { 00124 const uint8_t *smsc; 00125 const uint8_t *sender; 00126 const uint8_t *data; 00127 uint8_t smsc_len; 00128 uint8_t smsc_type; 00129 uint8_t sender_len; 00130 uint8_t sender_type; 00131 uint8_t tp_pid; 00132 uint8_t tp_dcs; 00133 uint8_t uda; 00134 uint8_t status; 00135 uint8_t sms_deliver; 00136 uint8_t timestamp[7]; 00137 }; 00138 00139 struct _sim { 00140 chipcard_t s_cc; 00141 xfr_t s_xfr; 00142 uint16_t s_df; 00143 uint16_t s_ef; 00144 uint8_t s_reclen; 00145 struct df_fci s_df_fci; 00146 struct df_gsm s_df_gsm; 00147 struct ef_fci s_ef_fci; 00148 }; 00149 00150 _private int _apdu_select(struct _sim *s, uint16_t id); 00151 _private int _apdu_read_binary(struct _sim *s, uint16_t ofs, uint8_t len); 00152 _private int _apdu_read_record(struct _sim *s, uint8_t rec, uint8_t len); 00153 _private void _sms_decode(struct _sms *, const uint8_t *ptr); /* 175 bytes */ 00154 00155 #endif /* _SIM_INTERNAL_H */