/* * cardctl.h: card_ctl command numbers * * Copyright (C) 2003 Olaf Kirch * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef _OPENSC_CARDCTL_H #define _OPENSC_CARDCTL_H #include #ifdef __cplusplus extern "C" { #endif #define _CTL_PREFIX(a, b, c) (((a) << 24) | ((b) << 16) | ((c) << 8)) enum { /* * Generic card_ctl calls */ SC_CARDCTL_GENERIC_BASE = 0x00000000, SC_CARDCTL_ERASE_CARD, SC_CARDCTL_GET_DEFAULT_KEY, SC_CARDCTL_LIFECYCLE_GET, SC_CARDCTL_LIFECYCLE_SET, SC_CARDCTL_GET_SERIALNR, /* * GPK specific calls */ SC_CARDCTL_GPK_BASE = _CTL_PREFIX('G', 'P', 'K'), SC_CARDCTL_GPK_VARIANT, SC_CARDCTL_GPK_LOCK, SC_CARDCTL_GPK_PKINIT, SC_CARDCTL_GPK_PKLOAD, SC_CARDCTL_GPK_IS_LOCKED, SC_CARDCTL_GPK_GENERATE_KEY, /* * Cryptoflex specific calls */ SC_CARDCTL_CRYPTOFLEX_BASE = _CTL_PREFIX('C', 'F', 'X'), SC_CARDCTL_CRYPTOFLEX_GENERATE_KEY, /* * MioCOS specific calls */ SC_CARDCTL_MIOCOS_BASE = _CTL_PREFIX('M', 'I', 'O'), SC_CARDCTL_MIOCOS_CREATE_AC, /* * TCOS specific calls */ SC_CARDCTL_TCOS_BASE = _CTL_PREFIX('T','C','S'), SC_CARDCTL_TCOS_SETPERM, /* * eToken specific calls */ SC_CARDCTL_ETOKEN_BASE = _CTL_PREFIX('E', 'T', 'K'), SC_CARDCTL_ETOKEN_PUT_DATA_FCI, SC_CARDCTL_ETOKEN_PUT_DATA_OCI, SC_CARDCTL_ETOKEN_PUT_DATA_SECI, SC_CARDCTL_ETOKEN_GENERATE_KEY, /* * Starcos SPK 2.3 specific calls */ SC_CARDCTL_STARCOS_BASE = _CTL_PREFIX('S', 'T', 'A'), SC_CARDCTL_STARCOS_CREATE_FILE, SC_CARDCTL_STARCOS_CREATE_END, SC_CARDCTL_STARCOS_WRITE_KEY, SC_CARDCTL_STARCOS_GENERATE_KEY, /* * JCOP specific calls */ SC_CARDCTL_JCOP_BASE = _CTL_PREFIX('J', 'C', 'P'), SC_CARDCTL_JCOP_LOCK, SC_CARDCTL_JCOP_GENERATE_KEY, /* * Oberthur specific calls */ SC_CARDCTL_OBERTHUR_BASE = _CTL_PREFIX('O', 'B', 'R'), SC_CARDCTL_OBERTHUR_UPDATE_KEY, SC_CARDCTL_OBERTHUR_GENERATE_KEY, SC_CARDCTL_OBERTHUR_CREATE_PIN, /* * Setcos specific calls */ SC_CARDCTL_SETCOS_BASE = _CTL_PREFIX('S', 'E', 'T'), SC_CARDCTL_SETCOS_PUTDATA, SC_CARDCTL_SETCOS_GETDATA, SC_CARDCTL_SETCOS_GENERATE_STORE_KEY, SC_CARDCTL_SETCOS_ACTIVATE_FILE, }; enum { SC_CARDCTRL_LIFECYCLE_ADMIN, SC_CARDCTRL_LIFECYCLE_USER, SC_CARDCTRL_LIFECYCLE_OTHER, }; /* * Generic cardctl - check if the required key is a default * key (such as the GPK "TEST KEYTEST KEY" key, or the Cryptoflex AAK) */ struct sc_cardctl_default_key { int method; /* SC_AC_XXX */ int key_ref; /* key reference */ size_t len; /* in: max size, out: actual size */ u8 * key_data; /* out: key data */ }; /* * GPK lock file. * Parent DF of file must be selected. */ struct sc_cardctl_gpk_lock { struct sc_file * file; unsigned int operation; }; /* * GPK initialize private key file. * Parent DF must be selected. */ struct sc_cardctl_gpk_pkinit { struct sc_file * file; unsigned int privlen; }; /* * GPK load private key portion. */ struct sc_cardctl_gpk_pkload { struct sc_file * file; u8 * data; unsigned int len; unsigned int datalen; }; struct sc_cardctl_gpk_genkey { unsigned int fid; unsigned int privlen; unsigned char * pubkey; unsigned int pubkey_len; }; enum { SC_CARDCTL_MIOCOS_AC_PIN, SC_CARDCTL_MIOCOS_AC_CHAL, SC_CARDCTL_MIOCOS_AC_LOGICAL, SC_CARDCTL_MIOCOS_AC_SMARTPIN, }; /* * MioCOS AC info */ struct sc_cardctl_miocos_ac_info { int type; int ref; int max_tries; int enable_ac; /* only applicable to PINs */ u8 key_value[8]; int max_unblock_tries; /* same here */ u8 unblock_value[8]; /* and here */ }; /* * eToken PIN info */ struct sc_cardctl_etoken_obj_info { u8 * data; size_t len; }; struct sc_cardctl_etoken_genkey_info { unsigned int key_id; unsigned int key_bits; unsigned short fid; }; /* * Cryptoflex info */ struct sc_cardctl_cryptoflex_genkey_info { unsigned int key_num; unsigned int key_bits; unsigned long exponent; unsigned char * pubkey; unsigned int pubkey_len; }; /* * Starcos stuff */ #define SC_STARCOS_MF_DATA 0x01 #define SC_STARCOS_DF_DATA 0x02 #define SC_STARCOS_EF_DATA 0x04 typedef struct sc_starcos_create_data_st { unsigned int type; union { struct { u8 header[19]; /* see starcos manual */ } mf; struct { u8 header[25]; /* see starcos manual */ u8 size[2]; } df; struct { u8 header[16]; /* see starcos manual */ } ef; } data; } sc_starcos_create_data; typedef struct sc_starcos_write_key_data_st { u8 mode; /* 1 = Update, 0 = Install */ u8 kid; /* key id */ u8 key_header[12]; /* see starcos manual */ const u8 *key; size_t key_len; } sc_starcos_wkey_data; typedef struct sc_starcos_gen_key_data_st { u8 key_id; size_t key_length; u8 *modulus; } sc_starcos_gen_key_data; struct sc_cardctl_jcop_genkey { unsigned long exponent; sc_path_t pub_file_ref; sc_path_t pri_file_ref; unsigned char * pubkey; unsigned int pubkey_len; }; /* * Oberthur ex_data stuff */ enum SC_CARDCTL_OBERTHUR_KEY_TYPE { SC_CARDCTL_OBERTHUR_KEY_DES = 0x80, SC_CARDCTL_OBERTHUR_KEY_RSA_PUBLIC = 0xA1, SC_CARDCTL_OBERTHUR_KEY_RSA_SFM, SC_CARDCTL_OBERTHUR_KEY_RSA_CRT, SC_CARDCTL_OBERTHUR_KEY_DSA_PUBLIC, SC_CARDCTL_OBERTHUR_KEY_DSA_PRIVATE, }; struct sc_cardctl_oberthur_genkey_info { unsigned int id_prv, id_pub; unsigned int key_bits; unsigned long exponent; unsigned char * pubkey; unsigned int pubkey_len; }; struct sc_cardctl_oberthur_updatekey_info { enum SC_CARDCTL_OBERTHUR_KEY_TYPE type; unsigned int component; const unsigned char *data; unsigned int len; }; struct sc_cardctl_oberthur_createpin_info { unsigned int type; unsigned int ref; const unsigned char *pin; unsigned int pin_len; unsigned int pin_tries; const unsigned char *puk; unsigned int puk_len; unsigned int puk_tries; }; /* * Setcos stuff */ struct sc_cardctl_setcos_data_obj { int P1; int P2; u8 * Data; size_t DataLen; int LengthMax; }; #define OP_TYPE_GENERATE 0 #define OP_TYPE_STORE 1 struct sc_cardctl_setcos_gen_store_key_info { int op_type; unsigned int mod_len; /* in bits */ unsigned int pubexp_len; /* in bits */ unsigned char *pubexp; unsigned int primep_len; /* in bits */ unsigned char *primep; unsigned int primeq_len; /* in bits */ unsigned char *primeq; }; #ifdef __cplusplus } #endif #endif /* _OPENSC_CARDCTL_H */