#ifndef _OPENSC_TYPES_H
#define _OPENSC_TYPES_H
#ifdef __cplusplus
extern "C" {
#endif
typedef unsigned char u8;
#define SC_MAX_CARD_DRIVERS 48
#define SC_MAX_CARD_DRIVER_SNAME_SIZE 16
#define SC_MAX_CARD_APPS 8
#define SC_MAX_APDU_BUFFER_SIZE 261
#define SC_MAX_APDU_DATA_SIZE 0xFF
#define SC_MAX_APDU_RESP_SIZE (0xFF+1)
#define SC_MAX_EXT_APDU_BUFFER_SIZE 65538
#define SC_MAX_EXT_APDU_DATA_SIZE 0xFFFF
#define SC_MAX_EXT_APDU_RESP_SIZE (0xFFFF+1)
#define SC_MAX_PIN_SIZE 256
#define SC_MAX_ATR_SIZE 33
#define SC_MAX_UID_SIZE 10
#define SC_MAX_AID_SIZE 16
#define SC_MAX_AID_STRING_SIZE (SC_MAX_AID_SIZE * 2 + 3)
#define SC_MAX_IIN_SIZE 10
#define SC_MAX_OBJECT_ID_OCTETS 16
#define SC_MAX_PATH_SIZE 16
#define SC_MAX_PATH_STRING_SIZE (SC_MAX_PATH_SIZE * 2 + 3)
#define SC_MAX_SDO_ACLS 8
#define SC_MAX_CRTS_IN_SE 12
#define SC_MAX_SE_NUM 8
#define SC_MAX_SUPPORTED_ALGORITHMS 8
struct sc_lv_data {
unsigned char *value;
size_t len;
};
struct sc_tlv_data {
unsigned tag;
unsigned char *value;
size_t len;
};
struct sc_object_id {
int value[SC_MAX_OBJECT_ID_OCTETS];
};
struct sc_aid {
unsigned char value[SC_MAX_AID_SIZE];
size_t len;
};
struct sc_atr {
unsigned char value[SC_MAX_ATR_SIZE];
size_t len;
};
struct sc_uid {
unsigned char value[SC_MAX_UID_SIZE];
size_t len;
};
struct sc_iid {
unsigned char value[SC_MAX_IIN_SIZE];
size_t len;
};
struct sc_version {
unsigned char hw_major;
unsigned char hw_minor;
unsigned char fw_major;
unsigned char fw_minor;
};
struct sc_ddo {
struct sc_aid aid;
struct sc_iid iid;
struct sc_object_id oid;
size_t len;
unsigned char *value;
};
#define SC_PATH_TYPE_FILE_ID 0
#define SC_PATH_TYPE_DF_NAME 1
#define SC_PATH_TYPE_PATH 2
#define SC_PATH_TYPE_PATH_PROT 3
#define SC_PATH_TYPE_FROM_CURRENT 4
#define SC_PATH_TYPE_PARENT 5
typedef struct sc_path {
u8 value[SC_MAX_PATH_SIZE];
size_t len;
int index;
int count;
int type;
struct sc_aid aid;
} sc_path_t;
struct sc_crt {
unsigned tag;
unsigned usage;
unsigned algo;
unsigned refs[8];
};
#define SC_AC_NONE 0x00000000
#define SC_AC_CHV 0x00000001
#define SC_AC_TERM 0x00000002
#define SC_AC_PRO 0x00000004
#define SC_AC_AUT 0x00000008
#define SC_AC_SYMBOLIC 0x00000010
#define SC_AC_SEN 0x00000020
#define SC_AC_SCB 0x00000040
#define SC_AC_IDA 0x00000080
#define SC_AC_SESSION 0x00000100
#define SC_AC_CONTEXT_SPECIFIC 0x00000200
#define SC_AC_UNKNOWN 0xFFFFFFFE
#define SC_AC_NEVER 0xFFFFFFFF
#define SC_AC_OP_SELECT 0
#define SC_AC_OP_LOCK 1
#define SC_AC_OP_DELETE 2
#define SC_AC_OP_CREATE 3
#define SC_AC_OP_REHABILITATE 4
#define SC_AC_OP_INVALIDATE 5
#define SC_AC_OP_LIST_FILES 6
#define SC_AC_OP_CRYPTO 7
#define SC_AC_OP_DELETE_SELF 8
#define SC_AC_OP_PSO_DECRYPT 9
#define SC_AC_OP_PSO_ENCRYPT 10
#define SC_AC_OP_PSO_COMPUTE_SIGNATURE 11
#define SC_AC_OP_PSO_VERIFY_SIGNATURE 12
#define SC_AC_OP_PSO_COMPUTE_CHECKSUM 13
#define SC_AC_OP_PSO_VERIFY_CHECKSUM 14
#define SC_AC_OP_INTERNAL_AUTHENTICATE 15
#define SC_AC_OP_EXTERNAL_AUTHENTICATE 16
#define SC_AC_OP_PIN_DEFINE 17
#define SC_AC_OP_PIN_CHANGE 18
#define SC_AC_OP_PIN_RESET 19
#define SC_AC_OP_ACTIVATE 20
#define SC_AC_OP_DEACTIVATE 21
#define SC_AC_OP_READ 22
#define SC_AC_OP_UPDATE 23
#define SC_AC_OP_WRITE 24
#define SC_AC_OP_RESIZE 25
#define SC_AC_OP_GENERATE 26
#define SC_AC_OP_CREATE_EF 27
#define SC_AC_OP_CREATE_DF 28
#define SC_AC_OP_ADMIN 29
#define SC_AC_OP_PIN_USE 30
#define SC_MAX_AC_OPS 31
#define SC_AC_OP_ERASE SC_AC_OP_DELETE
#define SC_AC_KEY_REF_NONE 0xFFFFFFFF
typedef struct sc_acl_entry {
unsigned int method;
unsigned int key_ref;
struct sc_crt crts[SC_MAX_CRTS_IN_SE];
struct sc_acl_entry *next;
} sc_acl_entry_t;
#define SC_FILE_TYPE_DF 0x04
#define SC_FILE_TYPE_INTERNAL_EF 0x03
#define SC_FILE_TYPE_WORKING_EF 0x01
#define SC_FILE_TYPE_BSO 0x10
#define SC_FILE_EF_UNKNOWN 0x00
#define SC_FILE_EF_TRANSPARENT 0x01
#define SC_FILE_EF_LINEAR_FIXED 0x02
#define SC_FILE_EF_LINEAR_FIXED_TLV 0x03
#define SC_FILE_EF_LINEAR_VARIABLE 0x04
#define SC_FILE_EF_LINEAR_VARIABLE_TLV 0x05
#define SC_FILE_EF_CYCLIC 0x06
#define SC_FILE_EF_CYCLIC_TLV 0x07
#define SC_FILE_STATUS_ACTIVATED 0x00
#define SC_FILE_STATUS_INVALIDATED 0x01
#define SC_FILE_STATUS_CREATION 0x02
typedef struct sc_file {
struct sc_path path;
unsigned char name[16];
size_t namelen;
unsigned int type, ef_structure, status;
unsigned int shareable;
size_t size;
int id;
int sid;
struct sc_acl_entry *acl[SC_MAX_AC_OPS];
size_t record_length;
size_t record_count;
unsigned char *sec_attr;
size_t sec_attr_len;
unsigned char *prop_attr;
size_t prop_attr_len;
unsigned char *type_attr;
size_t type_attr_len;
unsigned char *encoded_content;
size_t encoded_content_len;
unsigned int magic;
} sc_file_t;
#define SC_APDU_CASE_NONE 0x00
#define SC_APDU_CASE_1 0x01
#define SC_APDU_CASE_2_SHORT 0x02
#define SC_APDU_CASE_3_SHORT 0x03
#define SC_APDU_CASE_4_SHORT 0x04
#define SC_APDU_SHORT_MASK 0x0f
#define SC_APDU_EXT 0x10
#define SC_APDU_CASE_2_EXT SC_APDU_CASE_2_SHORT | SC_APDU_EXT
#define SC_APDU_CASE_3_EXT SC_APDU_CASE_3_SHORT | SC_APDU_EXT
#define SC_APDU_CASE_4_EXT SC_APDU_CASE_4_SHORT | SC_APDU_EXT
#define SC_APDU_CASE_2 0x22
#define SC_APDU_CASE_3 0x23
#define SC_APDU_CASE_4 0x24
#define SC_APDU_FLAGS_CHAINING 0x00000001UL
#define SC_APDU_FLAGS_NO_GET_RESP 0x00000002UL
#define SC_APDU_FLAGS_NO_RETRY_WL 0x00000004UL
#define SC_APDU_FLAGS_NO_SM 0x00000008UL
#define SC_APDU_ALLOCATE_FLAG 0x01
#define SC_APDU_ALLOCATE_FLAG_DATA 0x02
#define SC_APDU_ALLOCATE_FLAG_RESP 0x04
typedef struct sc_apdu {
int cse;
unsigned char cla, ins, p1, p2;
size_t lc, le;
const unsigned char *data;
size_t datalen;
unsigned char *resp;
size_t resplen;
unsigned char control;
unsigned allocation_flags;
unsigned int sw1, sw2;
unsigned char mac[8];
size_t mac_len;
unsigned long flags;
struct sc_apdu *next;
} sc_apdu_t;
#define SC_CPLC_TAG 0x9F7F
#define SC_CPLC_DER_SIZE 45
struct sc_cplc {
unsigned char ic_fabricator[2];
unsigned char ic_type[2];
unsigned char os_data[6];
unsigned char ic_date[2];
unsigned char ic_serial[4];
unsigned char ic_batch_id[2];
unsigned char ic_module_data[4];
unsigned char icc_manufacturer[2];
unsigned char ic_embed_date[2];
unsigned char pre_perso_data[6];
unsigned char personalizer_data[6];
unsigned char value[SC_CPLC_DER_SIZE];
size_t len;
};
struct sc_iin {
unsigned char mii;
unsigned country;
unsigned long issuer_id;
};
#define SC_MAX_SERIALNR 32
typedef struct sc_serial_number {
unsigned char value[SC_MAX_SERIALNR];
size_t len;
struct sc_iin iin;
} sc_serial_number_t;
#define SC_REMOTE_APDU_FLAG_NOT_FATAL 0x01
#define SC_REMOTE_APDU_FLAG_RETURN_ANSWER 0x02
struct sc_remote_apdu {
unsigned char sbuf[2*SC_MAX_APDU_BUFFER_SIZE];
unsigned char rbuf[2*SC_MAX_APDU_BUFFER_SIZE];
struct sc_apdu apdu;
unsigned flags;
struct sc_remote_apdu *next;
};
struct sc_remote_data {
struct sc_remote_apdu *data;
int length;
int (*alloc)(struct sc_remote_data *rdata, struct sc_remote_apdu **out);
void (*free)(struct sc_remote_data *rdata);
};
#ifdef __cplusplus
}
#endif
#endif