Changeset 3304

Show
Ignore:
Timestamp:
12/17/07 13:39:20 (13 months ago)
Author:
ludovic.rousseau
Message:

add support of ruToken

Thanks to Andrew V. Stepanov for the patch
http://www.opensc-project.org/pipermail/opensc-devel/2007-December/010617.html

Location:
trunk
Files:
4 added
14 modified

Legend:

Unmodified
Added
Removed
  • trunk/etc/opensc.conf.in

    r3296 r3304  
    280280                # enable_builtin_emulation = yes; 
    281281                # list of the builtin pkcs15 emulators to test 
    282                 builtin_emulators = esteid, openpgp, tcos, starcert, infocamere, postecert, actalis, atrust-acos, gemsafeGPK, gemsafeV1, tccardos, PIV-II; 
     282                builtin_emulators = esteid, openpgp, tcos, starcert, infocamere, postecert, actalis, atrust-acos, gemsafeGPK, gemsafeV1, tccardos, PIV-II, rutoken; 
    283283 
    284284                # additional settings per driver 
  • trunk/src/libopensc/Makefile.am

    r3296 r3304  
    3232        card-oberthur.c card-belpic.c card-atrust-acos.c \ 
    3333        card-incrypto34.c card-piv.c card-muscle.c card-acos5.c \ 
    34         card-asepcos.c card-akis.c card-gemsafeV1.c \ 
     34        card-asepcos.c card-akis.c card-gemsafeV1.c card-rutoken.c\ 
    3535        \ 
    3636        pkcs15-openpgp.c pkcs15-infocamere.c pkcs15-starcert.c \ 
    3737        pkcs15-tcos.c pkcs15-esteid.c pkcs15-postecert.c pkcs15-gemsafeGPK.c \ 
    3838        pkcs15-actalis.c pkcs15-atrust-acos.c pkcs15-tccardos.c pkcs15-piv.c \ 
    39         compression.c p15card-helper.c 
     39        compression.c p15card-helper.c pkcs15-rutoken.c 
    4040libopensc_la_LDFLAGS = -version-info @OPENSC_LT_CURRENT@:@OPENSC_LT_REVISION@:@OPENSC_LT_AGE@ 
    4141libopensc_la_LIBADD = @LIBSCCONF@ $(OPENSSL_LIBS) $(OPENCT_LIBS) $(PCSC_LIBS) $(LTLIB_LIBS) 
  • trunk/src/libopensc/cardctl.h

    r3200 r3304  
    140140        SC_CARDCTL_ASEPCOS_AKN2FILEID, 
    141141        SC_CARDCTL_ASEPCOS_SET_SATTR, 
    142         SC_CARDCTL_ASEPCOS_ACTIVATE_FILE 
     142        SC_CARDCTL_ASEPCOS_ACTIVATE_FILE, 
     143 
     144        /* 
     145        *  ruToken specific calls 
     146        */ 
     147        SC_CARDCTL_RUTOKEN_BASE = _CTL_PREFIX('R', 'T', 'K'), 
     148        /*  PUT_DATA  */ 
     149        SC_CARDCTL_RUTOKEN_CREATE_DO, 
     150        SC_CARDCTL_RUTOKEN_CHANGE_DO, 
     151        SC_CARDCTL_RUTOKEN_GENERATE_KEY_DO, 
     152        SC_CARDCTL_RUTOKEN_DELETE_DO, 
     153        SC_CARDCTL_RUTOKEN_GET_INFO, 
     154        /* NON STANDART  */ 
     155        SC_CARDCTL_RUTOKEN_GET_DO_INFO, 
     156        SC_CARDCTL_RUTOKEN_GOST_ENCIPHER,  
     157        SC_CARDCTL_RUTOKEN_GOST_DECIPHER, 
     158        SC_CARDCTL_RUTOKEN_TRIES_LEFT 
    143159}; 
    144160 
     
    357373        int     LengthMax; 
    358374}; 
    359  
    360 #define OP_TYPE_GENERATE        0 
    361 #define OP_TYPE_STORE           1 
    362375 
    363376struct sc_cardctl_setcos_gen_store_key_info { 
     
    427440} sc_cardctl_asepcos_activate_file_t; 
    428441 
     442#define OP_TYPE_GENERATE        0 
     443#define OP_TYPE_STORE           1 
     444 
     445/* 
     446 *  RuToken types and constants 
     447 */ 
     448 
     449#define SC_RUTOKEN_DO_PART_BODY_LEN    199     
     450#define SC_RUTOKEN_DO_HDR_LEN  32 
     451 
     452/*   DO Types  */ 
     453#define SC_RUTOKEN_TYPE_MASK             0xF 
     454#define SC_RUTOKEN_TYPE_SE               0x0 
     455#define SC_RUTOKEN_TYPE_CHV              0x1 
     456#define SC_RUTOKEN_TYPE_KEY              0x2 
     457 
     458#define SC_RUTOKEN_COMPACT_DO_MAX_LEN  16          /*  MAX Body length of Compact DOs  */ 
     459 
     460#define SC_RUTOKEN_DO_ALL_MIN_ID       0x1         /*  MIN ID value of All DOs  */ 
     461#define SC_RUTOKEN_DO_CHV_MAX_ID       0x1F        /*  MAX ID value of CHV-objects  */ 
     462#define SC_RUTOKEN_DO_NOCHV_MAX_ID     0xFE        /*  MAX ID value of All Other DOs  */ 
     463 
     464/*  DO Default Lengths  */ 
     465#define SC_RUTOKEN_DEF_LEN_DO_GOST         32 
     466#define SC_RUTOKEN_DEF_LEN_DO_SE           6 
     467 
     468 
     469#define SC_RUTOKEN_ALLTYPE_SE            SC_RUTOKEN_TYPE_SE             /* SE  */ 
     470#define SC_RUTOKEN_ALLTYPE_GCHV          SC_RUTOKEN_TYPE_CHV    /* GCHV  */ 
     471#define SC_RUTOKEN_ALLTYPE_LCHV          0x11                           /*  LCHV  */ 
     472#define SC_RUTOKEN_ALLTYPE_GOST          SC_RUTOKEN_TYPE_KEY    /*  GOST  */ 
     473 
     474/*  DO ID  */ 
     475#define SC_RUTOKEN_ID_CURDF_RESID_FLAG   0x80        /*  DO placed in current DF  */ 
     476                                             
     477#define SC_RUTOKEN_DEF_ID_GCHV_ADMIN       0x01      /*  ID DO ADMIN  */ 
     478#define SC_RUTOKEN_DEF_ID_GCHV_USER        0x02      /*  ID DO USER  */ 
     479 
     480/*  DO Options  */ 
     481#define SC_RUTOKEN_OPTIONS_GCHV_ACCESS_MASK  0x7     /*  Access rights  */ 
     482#define SC_RUTOKEN_OPTIONS_GACCESS_ADMIN     SC_RUTOKEN_DEF_ID_GCHV_ADMIN   /*  ADMIN  */ 
     483#define SC_RUTOKEN_OPTIONS_GACCESS_USER      SC_RUTOKEN_DEF_ID_GCHV_USER    /*  USER  */ 
     484 
     485#define SC_RUTOKEN_OPTIONS_GOST_CRYPT_MASK   0x7     /*  crypto algorithm  */ 
     486#define SC_RUTOKEN_OPTIONS_GOST_CRYPT_PZ     0x0     /*  (encryptECB) simple-change mode  */ 
     487#define SC_RUTOKEN_OPTIONS_GOST_CRYPT_GAMM   0x1     /*  (encryptCNT) gamma mode  */ 
     488#define SC_RUTOKEN_OPTIONS_GOST_CRYPT_GAMMOS 0x2     /*  (encryptCFB) feed-back gamma mode  */ 
     489 
     490 
     491/*  DO flags  */ 
     492#define SC_RUTOKEN_FLAGS_COMPACT_DO      0x1 
     493#define SC_RUTOKEN_FLAGS_OPEN_DO_MASK    0x6 
     494#define SC_RUTOKEN_FLAGS_BLEN_OPEN_DO    0x2 
     495#define SC_RUTOKEN_FLAGS_FULL_OPEN_DO    0x6 
     496 
     497/*  DO MAX:CUR try  */ 
     498#define SC_RUTOKEN_MAXTRY_MASK           0xF0        /*  MAX try  */ 
     499#define SC_RUTOKEN_CURTRY_MASK           0x0F        /*  CUR try  */ 
     500 
     501#define SC_RUTOKEN_DO_CHV_MAX_ID_V2       SC_RUTOKEN_DEF_ID_GCHV_USER   /*  MAX ID value of CHV-objects  */ 
     502#define SC_RUTOKEN_DO_NOCHV_MAX_ID_V2     SC_RUTOKEN_DO_NOCHV_MAX_ID    /*  MAX ID value of All Other DOs  */ 
     503 
     504#define SEC_ATTR_SIZE 15 
     505         
     506#pragma pack(push, 1) 
     507typedef u8 sc_SecAttrV2_t[SEC_ATTR_SIZE]; 
     508 
     509typedef struct sc_ObjectTypeID{ 
     510        u8    byObjectType; 
     511        u8    byObjectID; 
     512} sc_ObjectTypeID_t; 
     513 
     514typedef struct sc_ObjectParams{ 
     515        u8    byObjectOptions; 
     516        u8    byObjectFlags; 
     517        u8    byObjectTry; 
     518} sc_ObjectParams_t; 
     519 
     520typedef struct sc_DOHdrV2 { 
     521        unsigned short          wDOBodyLen; 
     522        sc_ObjectTypeID_t       OTID; 
     523        sc_ObjectParams_t       OP; 
     524        u8                                      dwReserv1[4]; 
     525        u8                                      abyReserv2[6]; 
     526        sc_SecAttrV2_t          SA_V2; 
     527} sc_DOHdrV2_t; 
     528 
     529typedef struct sc_DO_V2 { 
     530        sc_DOHdrV2_t    HDR; 
     531        u8                              abyDOBody[SC_RUTOKEN_DO_PART_BODY_LEN]; 
     532} sc_DO_V2_t; 
     533 
     534typedef enum 
     535{ 
     536        select_first, 
     537        select_by_id, 
     538        select_next, 
     539} SC_RUTOKEN_DO_SEL_TYPES; 
     540 
     541typedef struct sc_DO_INFO_V2 { 
     542        u8                                              DoId; 
     543        SC_RUTOKEN_DO_SEL_TYPES SelType; 
     544        u8                                              pDoData[256]; 
     545} sc_DO_INFO_t; 
     546 
     547struct sc_rutoken_decipherinfo{ 
     548    u8  *inbuf; 
     549    size_t inlen; 
     550    u8  *outbuf; 
     551    size_t outlen; 
     552}; 
     553#pragma pack(pop) 
     554 
    429555#ifdef __cplusplus 
    430556} 
  • trunk/src/libopensc/ctx.c

    r3296 r3304  
    5252static const struct _sc_driver_entry internal_card_drivers[] = { 
    5353        /* legacy, the old name was "etoken", so we keep that for a while */ 
     54        { "rutoken",    (void *(*)(void)) sc_get_rutoken_driver }, 
    5455        { "cardos",     (void *(*)(void)) sc_get_cardos_driver }, 
    5556        { "etoken",     (void *(*)(void)) sc_get_cardos_driver }, 
  • trunk/src/libopensc/opensc.h

    r3303 r3304  
    152152#define SC_ALGORITHM_DES                64 
    153153#define SC_ALGORITHM_3DES               65 
     154#define SC_ALGORITHM_GOST               66 
    154155 
    155156/* Hash algorithms */ 
    156157#define SC_ALGORITHM_MD5                128 
    157158#define SC_ALGORITHM_SHA1               129 
     159#define SC_ALGORITHM_GOSTHASH           130 
    158160 
    159161/* Key derivation algorithms */ 
     
    188190#define SC_ALGORITHM_RSA_HASH_SHA224    0x00001000 
    189191#define SC_ALGORITHM_RSA_HASHES         0x00001FE0 
     192 
     193#define SC_ALGORITHM_GOST_CRYPT_PZ     0x0      
     194#define SC_ALGORITHM_GOST_CRYPT_GAMM   0x1      
     195#define SC_ALGORITHM_GOST_CRYPT_GAMMOS 0x2      
    190196 
    191197/* Event masks for sc_wait_for_event() */ 
     
    11591165extern struct sc_reader_driver *sc_get_openct_driver(void); 
    11601166 
     1167extern sc_card_driver_t *sc_get_rutoken_driver(void); 
    11611168extern sc_card_driver_t *sc_get_default_driver(void); 
    11621169extern sc_card_driver_t *sc_get_emv_driver(void); 
  • trunk/src/libopensc/pkcs15-algo.c

    r2815 r3304  
    233233                        asn1_encode_des_params, 
    234234                        free }, 
     235#endif 
     236#ifdef SC_ALGORITHM_GOST /* EDE CBC mode */ 
     237        { SC_ALGORITHM_GOST, {{ 1, 2, 4434, 66565, 3, 7 }}, 
     238                        NULL, 
     239                        NULL, 
     240                        NULL }, 
    235241#endif 
    236242/* We do not support PBES1 because the encryption is weak */ 
  • trunk/src/libopensc/pkcs15-syn.c

    r3296 r3304  
    5353extern int sc_pkcs15emu_tccardos_init_ex(sc_pkcs15_card_t *, sc_pkcs15emu_opt_t *); 
    5454 
     55extern int sc_pkcs15emu_rutoken_init_ex(sc_pkcs15_card_t *, sc_pkcs15emu_opt_t *); 
     56 
    5557static struct { 
    5658        const char *            name; 
     
    6971        { "atrust-acos",sc_pkcs15emu_atrust_acos_init_ex}, 
    7072        { "tccardos",   sc_pkcs15emu_tccardos_init_ex   }, 
     73        { "rutoken",    sc_pkcs15emu_rutoken_init_ex    }, 
    7174        { NULL, NULL } 
    7275}; 
  • trunk/src/pkcs11/framework-pkcs15.c

    r3259 r3304  
    20752075                flags = SC_ALGORITHM_RSA_RAW; 
    20762076                break; 
     2077        case CKM_GOST: 
     2078                flags = SC_ALGORITHM_GOST; 
     2079                break; 
    20772080        default: 
    20782081                return CKR_MECHANISM_INVALID; 
     
    21532156                flags |= SC_ALGORITHM_RSA_RAW; 
    21542157                break; 
     2158        case CKM_GOST: 
     2159                flags |= SC_ALGORITHM_GOST; 
    21552160        default: 
    21562161                return CKR_MECHANISM_INVALID;            
     
    28092814                } 
    28102815                 
     2816                if (alg_info->algorithm == SC_ALGORITHM_GOST){ 
     2817                    mech_info.flags = CKF_HW | CKF_SIGN | CKF_ENCRYPT | CKF_DECRYPT; 
     2818                    #ifdef HAVE_OPENSSL 
     2819                    mech_info.flags |= CKF_VERIFY; 
     2820                    #endif 
     2821                    mech_info.ulMinKeySize = 32; 
     2822                    mech_info.ulMaxKeySize = 32; 
     2823                    mt = sc_pkcs11_new_fw_mechanism(CKM_GOST, 
     2824                                        &mech_info, CKK_RSA, NULL); 
     2825                    rc = sc_pkcs11_register_mechanism(p11card, mt); 
     2826                        sc_debug(card->ctx, "register GOST!!! %d", rc); 
     2827                        if(rc < 0) 
     2828                                return rc;       
     2829                } 
     2830                         
    28112831                alg_info++; 
    28122832        } 
  • trunk/src/pkcs11/pkcs11.h

    r3196 r3304  
    359359#define CKK_VENDOR_DEFINED      ((unsigned long) (1 << 31)) 
    360360 
     361//rutoken: 
     362#define CKK_GOST            (CKK_VENDOR_DEFINED+1) 
     363#define CKA_GOST CKA_VENDOR_DEFINED+1 
     364#define CKM_GOST CKM_VENDOR_DEFINED+1 
    361365 
    362366typedef unsigned long ck_certificate_type_t; 
  • trunk/src/pkcs15init/Makefile.am

    r3235 r3304  
    2121        pkcs15.profile \ 
    2222        muscle.profile \ 
     23        rutoken.profile \ 
    2324        asepcos.profile 
    2425         
  • trunk/src/pkcs15init/pkcs15-init.h

    r3200 r3304  
    402402extern struct sc_pkcs15init_operations *sc_pkcs15init_get_muscle_ops(void); 
    403403extern struct sc_pkcs15init_operations *sc_pkcs15init_get_asepcos_ops(void); 
     404extern struct sc_pkcs15init_operations *sc_pkcs15init_get_rutoken_ops(void); 
    404405 
    405406#ifdef __cplusplus 
  • trunk/src/pkcs15init/pkcs15-lib.c

    r3200 r3304  
    150150        void *func; 
    151151} profile_operations[] = { 
     152        { "rutoken", (void *) sc_pkcs15init_get_rutoken_ops }, 
    152153        { "gpk", (void *) sc_pkcs15init_get_gpk_ops }, 
    153154        { "miocos", (void *) sc_pkcs15init_get_miocos_ops }, 
  • trunk/src/tools/Makefile.am

    r3244 r3304  
    1313 
    1414bin_PROGRAMS = opensc-tool opensc-explorer pkcs15-tool pkcs15-crypt \ 
    15         pkcs11-tool cardos-info eidenv \ 
     15        pkcs11-tool cardos-info eidenv rutoken-tool \ 
    1616        $(PROGRAMS_OPENSSL) 
    1717 
     
    3434netkey_tool_SOURCES = netkey-tool.c $(top_srcdir)/src/common/my_getopt.c 
    3535netkey_tool_LDADD = $(OPENSSL_LIBS) 
     36rutoken_tool_SOURCES = rutoken-tool.c util.c 
     37rutoken_tool_LDADD = $(OPENSSL_LIBS) 
    3638 
    3739noinst_HEADERS = util.h 
  • trunk/src/tools/pkcs11-tool.c

    r3233 r3304  
    35683568      { CKM_DH_PKCS_PARAMETER_GEN,"DH-PKCS-PARAMETER-GEN", NULL }, 
    35693569      { CKM_X9_42_DH_PARAMETER_GEN,"X9-42-DH-PARAMETER-GEN", NULL }, 
     3570      { CKM_GOST,"GOST", NULL }, 
    35703571      { NO_MECHANISM, NULL, NULL } 
    35713572};