libosmosim 1.9.0.209-e0c63
Osmocom SIM library
sim.h
Go to the documentation of this file.
5#pragma once
6
7#include <osmocom/core/msgb.h>
9
10#define APDU_HDR_LEN 5
11#define MAX_AID_LEN 16 /* Table 13.2 of TS 102 221 */
12
13
18#define OSIM_MAX_ATR_LEN 33
19
32};
33
44 uint8_t cla;
45 uint8_t ins;
46 uint8_t p1;
47 uint8_t p2;
48 uint8_t p3;
49} __attribute__ ((packed));
50
51#define msgb_apdu_dr(__x)
52
60 uint16_t lc;
61 uint16_t le;
62 uint16_t sw;
63} __attribute__((__may_alias__));
64#define OSIM_MSGB_CB(__msgb) ((struct osim_msgb_cb *)&((__msgb)->cb[0]))
66#define msgb_apdu_case(__x) OSIM_MSGB_CB(__x)->apduc
67#define msgb_apdu_lc(__x) OSIM_MSGB_CB(__x)->lc
68#define msgb_apdu_le(__x) OSIM_MSGB_CB(__x)->le
69#define msgb_apdu_sw(__x) OSIM_MSGB_CB(__x)->sw
71#define msgb_apdu_h(__x) ((struct osim_apdu_cmd_hdr *)(__x)->l2h)
72
73#define msgb_apdu_dc(__x) ((__x)->l2h + sizeof(struct osim_apdu_cmd_hdr))
74#define msgb_apdu_de(__x) ((__x)->l2h + sizeof(struct osim_apdu_cmd_hdr) + msgb_apdu_lc(__x))
75
76int osim_init(void *ctx);
77
78/* FILES */
79
80struct osim_file;
81struct osim_file_desc;
83
87 int (*parse)(struct osim_decoded_data *dd,
88 const struct osim_file_desc *desc,
89 int len, uint8_t *data);
91 struct msgb * (*encode)(const struct osim_file_desc *desc,
92 const struct osim_decoded_data *decoded);
93};
94
105};
106
111};
112
116
119 const char *name;
120
121 unsigned int length;
122 union {
123 uint8_t u8;
124 uint16_t u16;
125 uint32_t u32;
126 uint8_t *buf;
129 } u;
130};
131
135 const struct osim_file *file;
138};
139
140
148};
149
155};
156
157#define F_OPTIONAL 0x0001
158
159#define SFI_NONE 0xFF
160
169 uint16_t fid;
170 uint8_t sfid;
171 const uint8_t *df_name;
172 uint8_t df_name_len;
173
174 const char *short_name;
175 const char *long_name;
176 unsigned int flags;
177
180 struct {
181 size_t min;
184 size_t rec;
186};
187
189struct osim_file {
191 const struct osim_file_desc *desc;
192
197};
198
200#define EF(pfid, sfi, pns, pflags, pnl, ptype, smin, srec, pdec, penc) \
201 { \
202 .fid = pfid, \
203 .sfid = sfi, \
204 .type = TYPE_EF, \
205 .ef_type = ptype, \
206 .short_name = pns, \
207 .long_name = pnl, \
208 .flags = pflags, \
209 .ops = { .encode = penc, .parse = pdec }, \
210 .size = { .min = smin, .rec = srec}, \
211 }
212
213
215#define EF_TRANSP(fid, sfi, ns, flags, smin, srec, nl, dec, enc) \
216 EF(fid, sfi, ns, flags, nl, EF_TYPE_TRANSP, \
217 smin, srec, dec, enc)
219#define EF_TRANSP_N(fid, sfi, ns, flags, smin, srec, nl) \
220 EF_TRANSP(fid, sfi, ns, flags, smin, srec, \
221 nl, &default_decode, NULL)
222
224#define EF_CYCLIC(fid, sfi, ns, flags, smin, srec, nl, dec, enc) \
225 EF(fid, sfi, ns, flags, nl, EF_TYPE_RECORD_CYCLIC, \
226 smin, srec, dec, enc)
228#define EF_CYCLIC_N(fid, sfi, ns, flags, smin, srec, nl) \
229 EF_CYCLIC(fid, sfi, ns, flags, smin, srec, nl, \
230 &default_decode, NULL)
231
233#define EF_LIN_FIX(fid, sfi, ns, flags, smin, srec, nl, dec, enc) \
234 EF(fid, sfi, ns, flags, nl, EF_TYPE_RECORD_FIXED, \
235 smin, srec, dec, enc)
237#define EF_LIN_FIX_N(fid, sfi, ns, flags, smin, srec, nl) \
238 EF_LIN_FIX(fid, sfi, ns, flags, smin, srec, nl, \
239 &default_decode, NULL)
240
242#define EF_KEY(fid, sfi, ns, flags, smin, srec, nl, dec, enc) \
243 EF(fid, sfi, ns, flags, nl, EF_TYPE_KEY, \
244 smin, srec, dec, enc)
246#define EF_KEY_N(fid, sfi, ns, flags, smin, srec, nl) \
247 EF_KEY(fid, sfi, ns, flags, smin, srec, nl, \
248 &default_decode, NULL)
249
250
251struct osim_file_desc *
253
254struct osim_file_desc *
255osim_file_desc_find_aid(struct osim_file_desc *parent, const uint8_t *aid, uint8_t aid_len);
256
257struct osim_file_desc *
259
260struct osim_file_desc *
262
263/* STATUS WORDS */
264
268};
269
276};
277
281 uint16_t code;
283 uint16_t mask;
286 union {
288 const char *str;
289 } u;
290};
291
292#define OSIM_CARD_SW_LAST { \
293 .code = 0, .mask = 0, .type = SW_TYPE_NONE, \
294 .class = SW_CLS_NONE, .u.str = NULL \
295}
296
302 const char *name;
304 uint8_t aid[MAX_AID_LEN];
305 uint8_t aid_len;
309 const struct osim_card_sw *sw;
310};
311
312const struct osim_card_app_profile *
314
315const struct osim_card_app_profile *
316osim_app_profile_find_by_aid(const uint8_t *aid, uint8_t aid_len);
317
318const struct osim_card_sw *osim_app_profile_find_sw(const struct osim_card_app_profile *ap, uint16_t sw_in);
319
322 const char *name;
326 const struct osim_card_sw **sws;
327};
328
329const struct osim_card_sw *osim_cprof_find_sw(const struct osim_card_profile *cp, uint16_t sw_in);
330
331struct osim_chan_hdl;
332enum osim_card_sw_class osim_sw_class(const struct osim_chan_hdl *ch, uint16_t sw_in);
333char *osim_print_sw_buf(char *buf, size_t buf_len, const struct osim_chan_hdl *ch, uint16_t sw_in);
334char *osim_print_sw(const struct osim_chan_hdl *ch, uint16_t sw_in);
335char *osim_print_sw_c(const void *ctx, const struct osim_chan_hdl *ch, uint16_t sw_in);
336
337extern const struct tlv_definition ts102221_fcp_tlv_def;
338extern const struct value_string ts102221_fcp_vals[14];
339
340/* 11.1.1.3 */
355};
356
357struct msgb *osim_new_apdumsg(uint8_t cla, uint8_t ins, uint8_t p1,
358 uint8_t p2, uint16_t lc, uint16_t le);
359
360/* CARD READERS */
361
365};
366
371};
372
374 const char *name;
375 struct osim_reader_hdl *(*reader_open)(int idx, const char *name, void *ctx);
376 struct osim_card_hdl *(*card_open)(struct osim_reader_hdl *rh, enum osim_proto proto);
377 int (*card_reset)(struct osim_card_hdl *card, bool cold_reset);
378 int (*card_close)(struct osim_card_hdl *card);
379 int (*transceive)(struct osim_reader_hdl *rh, struct msgb *msg);
380};
381
385 const struct osim_reader_ops *ops;
387 void *priv;
390};
391
397 uint8_t aid[MAX_AID_LEN];
398 uint8_t aid_len;
400 char *label;
403};
404
414
417
420
423 unsigned int atr_len;
424};
425
432 const struct osim_file_desc *cwd;
435};
436
437int osim_card_hdl_add_app(struct osim_card_hdl *ch, const uint8_t *aid, uint8_t aid_len,
438 const char *label);
439
440/* reader.c */
441int osim_transceive_apdu(struct osim_chan_hdl *st, struct msgb *amsg);
442struct osim_reader_hdl *osim_reader_open(enum osim_reader_driver drv, int idx,
443 const char *name, void *ctx);
445int osim_card_reset(struct osim_card_hdl *card, bool cold_reset);
446int osim_card_close(struct osim_card_hdl *card);
static size_t len(const char *str)
uint8_t data[0]
const char * name
struct osim_file_desc * osim_file_desc_find_sfid(struct osim_file_desc *parent, uint8_t sfid)
Definition: core.c:215
osim_proto
Definition: sim.h:362
@ OSIM_PROTO_T1
Definition: sim.h:364
@ OSIM_PROTO_T0
Definition: sim.h:363
uint16_t le
maximum number of bytes expected in the response data field, which will encoded in 0,...
Definition: sim.h:2
osim_apdu_case
command-response pairs cases
Definition: sim.h:24
@ APDU_CASE_3E
command header, command data field (extended), no response data field
Definition: sim.h:29
@ APDU_CASE_4S
command header, command data field (short), response data field (short)
Definition: sim.h:30
@ APDU_CASE_2E
command header, no command data field, response data field (extended)
Definition: sim.h:27
@ APDU_CASE_3S
command header, command data field (short), no response data field
Definition: sim.h:28
@ APDU_CASE_4E
command header, command data field (extended), response data field (extended)
Definition: sim.h:31
@ APDU_CASE_2S
command header, no command data field, response data field (short)
Definition: sim.h:26
@ APDU_CASE_1
command header, no command data field, no response data field
Definition: sim.h:25
const struct osim_card_app_profile * osim_app_profile_find_by_name(const char *name)
Find any registered application profile based on its name (e.g.
Definition: core.c:245
int osim_card_reset(struct osim_card_hdl *card, bool cold_reset)
Definition: reader.c:277
struct osim_file_desc * osim_file_desc_find_aid(struct osim_file_desc *parent, const uint8_t *aid, uint8_t aid_len)
Definition: core.c:187
const struct tlv_definition ts102221_fcp_tlv_def
Definition: card_fs_uicc.c:209
osim_card_sw_class
Definition: sim.h:270
@ SW_CLS_WARN
Definition: sim.h:274
@ SW_CLS_NONE
Definition: sim.h:271
@ SW_CLS_OK
Definition: sim.h:272
@ SW_CLS_ERROR
Definition: sim.h:275
@ SW_CLS_POSTP
Definition: sim.h:273
int osim_transceive_apdu(struct osim_chan_hdl *st, struct msgb *amsg)
Definition: reader.c:224
uint8_t p1
Parameter 1 byte.
Definition: sim.h:2
osim_file_type
Definition: sim.h:141
@ TYPE_NONE
Definition: sim.h:142
@ TYPE_MF
Master File.
Definition: sim.h:147
@ TYPE_ADF
Application Dedicated File.
Definition: sim.h:144
@ TYPE_EF
Entry File.
Definition: sim.h:145
@ TYPE_DF
Dedicated File.
Definition: sim.h:143
@ TYPE_EF_INT
Internal Entry File.
Definition: sim.h:146
struct osim_file_desc * osim_file_desc_find_name(struct osim_file_desc *parent, const char *name)
Definition: core.c:175
ts102221_fcp_tag
Definition: sim.h:341
@ UICC_FCP_T_FILE_DESC
Definition: sim.h:345
@ UICC_FCP_T_FILE_ID
Definition: sim.h:346
@ UICC_FCP_T_SEC_ATTR_COMP
Definition: sim.h:351
@ UICC_FCP_T_FCP
Definition: sim.h:342
@ UICC_FCP_T_PROPRIETARY
Definition: sim.h:352
@ UICC_FCP_T_FILE_SIZE
Definition: sim.h:343
@ UICC_FCP_T_SFID
Definition: sim.h:348
@ UICC_FCP_T_DF_NAME
Definition: sim.h:347
@ UICC_FCP_T_SEC_ATTR_REFEXP
Definition: sim.h:350
@ UICC_FCP_T_LIFEC_STS
Definition: sim.h:349
@ UICC_FCP_T_SEC_ATTR_EXP
Definition: sim.h:353
@ UICC_FCP_T_PIN_STS_DO
Definition: sim.h:354
@ UICC_FCP_T_TOT_F_SIZE
Definition: sim.h:344
int osim_card_close(struct osim_card_hdl *card)
Definition: reader.c:284
#define MAX_AID_LEN
Definition: sim.h:11
const struct osim_card_sw * osim_cprof_find_sw(const struct osim_card_profile *cp, uint16_t sw_in)
Find status word within given card profile.
Definition: core.c:416
struct msgb * osim_new_apdumsg(uint8_t cla, uint8_t ins, uint8_t p1, uint8_t p2, uint16_t lc, uint16_t le)
Generate an APDU message and initialize APDU command header.
Definition: core.c:324
uint8_t p2
Parameter 2 byte.
Definition: sim.h:3
struct osim_reader_hdl * osim_reader_open(enum osim_reader_driver drv, int idx, const char *name, void *ctx)
Definition: reader.c:234
char * osim_print_sw_buf(char *buf, size_t buf_len, const struct osim_chan_hdl *ch, uint16_t sw_in)
Definition: core.c:366
char * osim_print_sw_c(const void *ctx, const struct osim_chan_hdl *ch, uint16_t sw_in)
Definition: core.c:407
uint16_t lc
number of bytes in the command data field Nc, which will encoded in 0, 1 or 3 bytes into Lc,...
Definition: sim.h:1
uint8_t cla
CLASS byte.
Definition: sim.h:0
const struct osim_card_sw * osim_app_profile_find_sw(const struct osim_card_app_profile *ap, uint16_t sw_in)
Find application-specific status word within given card application profile.
Definition: core.c:431
osim_element_repr
Definition: sim.h:107
@ ELEM_REPR_HEX
Definition: sim.h:110
@ ELEM_REPR_DEC
Definition: sim.h:109
@ ELEM_REPR_NONE
Definition: sim.h:108
#define OSIM_MAX_ATR_LEN
Maximum Answer-To-Reset (ATR) size in bytes.
Definition: sim.h:18
uint8_t ins
INSTRUCTION byte.
Definition: sim.h:1
int osim_init(void *ctx)
Definition: core.c:473
struct osim_file_ops __attribute__
const struct value_string ts102221_fcp_vals[14]
Definition: card_fs_uicc.c:191
osim_element_type
Definition: sim.h:95
@ ELEM_T_UINT16
unsigned integer
Definition: sim.h:99
@ ELEM_T_UINT32
unsigned integer
Definition: sim.h:100
@ ELEM_T_GROUP
group container, has siblings
Definition: sim.h:104
@ ELEM_T_BOOL
a boolean flag
Definition: sim.h:97
@ ELEM_T_BCD
BCD encoded digits.
Definition: sim.h:102
@ ELEM_T_STRING
generic string
Definition: sim.h:101
@ ELEM_T_BYTES
BCD encoded digits.
Definition: sim.h:103
@ ELEM_T_UINT8
unsigned integer
Definition: sim.h:98
@ ELEM_T_NONE
Definition: sim.h:96
const struct osim_card_app_profile * osim_app_profile_find_by_aid(const uint8_t *aid, uint8_t aid_len)
Find any registered application profile based on its AID.
Definition: core.c:258
enum osim_card_sw_class osim_sw_class(const struct osim_chan_hdl *ch, uint16_t sw_in)
Definition: core.c:442
osim_card_sw_type
Definition: sim.h:265
@ SW_TYPE_STR
Definition: sim.h:267
@ SW_TYPE_NONE
Definition: sim.h:266
struct osim_file_desc * osim_file_desc_find_fid(struct osim_file_desc *parent, uint16_t fid)
Definition: core.c:203
int osim_card_hdl_add_app(struct osim_card_hdl *ch, const uint8_t *aid, uint8_t aid_len, const char *label)
Add an application to a given card.
Definition: core.c:287
osim_ef_type
Definition: sim.h:150
@ EF_TYPE_TRANSP
Transparent EF.
Definition: sim.h:151
@ EF_TYPE_RECORD_FIXED
Fixed-Size Record EF.
Definition: sim.h:152
@ EF_TYPE_RECORD_CYCLIC
Cyclic Record EF.
Definition: sim.h:153
@ EF_TYPE_KEY
Key file as used in TETRA.
Definition: sim.h:154
osim_reader_driver
Definition: sim.h:367
@ OSIM_READER_DRV_SERIAL
Definition: sim.h:370
@ OSIM_READER_DRV_OPENCT
Definition: sim.h:369
@ OSIM_READER_DRV_PCSC
Definition: sim.h:368
struct osim_card_hdl * osim_card_open(struct osim_reader_hdl *rh, enum osim_proto proto)
Definition: reader.c:261
char * osim_print_sw(const struct osim_chan_hdl *ch, uint16_t sw_in)
Definition: core.c:401
APDU/TPDU command header.
Definition: sim.h:43
uint8_t p2
Parameter 2 byte.
Definition: sim.h:47
uint8_t cla
CLASS byte.
Definition: sim.h:44
uint8_t p1
Parameter 1 byte.
Definition: sim.h:46
uint8_t p3
Parameter 3 byte, used for TPDU by T=0.
Definition: sim.h:48
uint8_t ins
INSTRUCTION byte.
Definition: sim.h:45
descriptor for a given application present on a card
Definition: sim.h:393
const struct osim_card_app_profile * prof
application profile (if any known)
Definition: sim.h:402
uint8_t aid[MAX_AID_LEN]
AID of the application.
Definition: sim.h:397
struct llist_head list
member in card list of applications
Definition: sim.h:395
char * label
application label from EF_DIR
Definition: sim.h:400
uint8_t aid_len
Definition: sim.h:398
A card application (e.g.
Definition: sim.h:298
struct llist_head list
entry in the global list of card application profiles
Definition: sim.h:300
const char * name
human-readable name
Definition: sim.h:302
uint8_t aid[MAX_AID_LEN]
AID of this application, as used in EF.DIR.
Definition: sim.h:304
uint8_t aid_len
Definition: sim.h:305
const struct osim_card_sw * sw
Status words defined by application.
Definition: sim.h:309
struct osim_file_desc * adf
file system description
Definition: sim.h:307
Definition: sim.h:405
unsigned int atr_len
Definition: sim.h:423
struct osim_card_profile * prof
card profile
Definition: sim.h:411
struct osim_reader_hdl * reader
reader through which card is accessed
Definition: sim.h:409
struct llist_head list
member in global list of cards
Definition: sim.h:407
enum osim_proto proto
card protocol
Definition: sim.h:413
struct llist_head channels
list of channels for this card
Definition: sim.h:416
uint8_t atr[OSIM_MAX_ATR_LEN]
ATR (Answer To Reset) of the card.
Definition: sim.h:422
struct llist_head apps
list of applications found on card
Definition: sim.h:419
A card profile (e.g.
Definition: sim.h:321
const char * name
Definition: sim.h:322
struct osim_file_desc * mf
Descriptor for the MF (root directory.
Definition: sim.h:324
const struct osim_card_sw ** sws
Array of pointers to status words.
Definition: sim.h:326
A card status word (SW)
Definition: sim.h:279
uint16_t code
status word code (2 bytes)
Definition: sim.h:281
union osim_card_sw::@2 u
const char * str
Human-readable meaning of SW.
Definition: sim.h:288
uint16_t mask
status word mask (2 bytes), to match range/prefix of SW
Definition: sim.h:283
enum osim_card_sw_type type
Definition: sim.h:284
Definition: sim.h:426
const struct osim_file_desc * cwd
current working directory
Definition: sim.h:432
struct llist_head list
linked to card->channels
Definition: sim.h:428
struct osim_card_app_hdl * cur_app
currently selected application (if any)
Definition: sim.h:434
struct osim_card_hdl * card
card to which this channel belongs
Definition: sim.h:430
Decoded data for a single file, consisting of all decoded elements.
Definition: sim.h:133
const struct osim_file * file
file to which we belong
Definition: sim.h:135
struct llist_head decoded_elements
list of 'struct decoded_element'
Definition: sim.h:137
A single decoded element inside a file.
Definition: sim.h:114
unsigned int length
Definition: sim.h:121
uint8_t * buf
Definition: sim.h:126
union osim_decoded_element::@0 u
enum osim_element_repr representation
Definition: sim.h:118
uint8_t u8
Definition: sim.h:123
uint16_t u16
Definition: sim.h:124
uint32_t u32
Definition: sim.h:125
enum osim_element_type type
Definition: sim.h:117
struct llist_head siblings
A list of sibling decoded_items.
Definition: sim.h:128
const char * name
Definition: sim.h:119
struct llist_head list
Definition: sim.h:115
Definition: sim.h:161
size_t min
Minimum size of the file (transparent) or record in cyclic / linear file.
Definition: sim.h:181
unsigned int flags
Definition: sim.h:176
struct osim_file_ops ops
Operations (parse/encode.
Definition: sim.h:178
enum osim_ef_type ef_type
Type of the EF, if type == TYPE_EF.
Definition: sim.h:167
struct osim_file_desc::@1 size
struct osim_file_desc * parent
parent DF
Definition: sim.h:164
struct llist_head list
local element in list
Definition: sim.h:162
const char * short_name
Short Name (like EF.ICCID)
Definition: sim.h:174
uint8_t sfid
Short File IDentifier.
Definition: sim.h:170
struct llist_head child_list
list of children EF in DF
Definition: sim.h:163
size_t rec
Recommended size.
Definition: sim.h:184
uint16_t fid
File Identifier.
Definition: sim.h:169
const char * long_name
Long / description.
Definition: sim.h:175
const uint8_t * df_name
Definition: sim.h:171
uint8_t df_name_len
Definition: sim.h:172
enum osim_file_type type
Type of the file (EF, DF, ...)
Definition: sim.h:166
Operations for a given File.
Definition: sim.h:85
int(* parse)(struct osim_decoded_data *dd, const struct osim_file_desc *desc, int len, uint8_t *data)
Parse binary file data into osim_decoded_data.
Definition: sim.h:87
A single instance of a file: Descriptor and contents.
Definition: sim.h:189
struct msgb * encoded_data
Encoded file contents.
Definition: sim.h:194
const struct osim_file_desc * desc
Descriptor for the file.
Definition: sim.h:191
struct osim_decoded_data * decoded_data
Parsed/Decoded file contents.
Definition: sim.h:196
APDU command body.
Definition: sim.h:58
uint16_t sw
status word, composed of SW1 and SW2 bytes
Definition: sim.h:62
uint16_t lc
number of bytes in the command data field Nc, which will encoded in 0, 1 or 3 bytes into Lc,...
Definition: sim.h:60
enum osim_apdu_case apduc
command-response pair case, defining the encoding of Lc and Le
Definition: sim.h:59
uint16_t le
maximum number of bytes expected in the response data field, which will encoded in 0,...
Definition: sim.h:61
Definition: sim.h:382
const struct osim_reader_ops * ops
Definition: sim.h:385
struct osim_card_hdl * card
current card, if any
Definition: sim.h:389
void * priv
Definition: sim.h:387
uint32_t proto_supported
Definition: sim.h:386
struct llist_head list
member in global list of readers
Definition: sim.h:384
Definition: sim.h:373
int(* transceive)(struct osim_reader_hdl *rh, struct msgb *msg)
Definition: sim.h:379
int(* card_close)(struct osim_card_hdl *card)
Definition: sim.h:378
const char * name
Definition: sim.h:374
int(* card_reset)(struct osim_card_hdl *card, bool cold_reset)
Definition: sim.h:377