1 /***************************************************************************
2     begin       : Mon Mar 01 2004
3     copyright   : (C) 2004-2010 by Martin Preuss
4     email       : martin@libchipcard.de
5 
6  ***************************************************************************
7  *          Please see toplevel file COPYING for license details           *
8  ***************************************************************************/
9 
10 
11 #ifndef CHIPCARD_CLIENT_CARD_P_H
12 #define CHIPCARD_CLIENT_CARD_P_H
13 
14 
15 #include "card_l.h"
16 #include <gwenhywfar/inherit.h>
17 
18 
19 #define LC_PCSC_MAX_FEATURES 32
20 
21 
22 
23 struct LC_CARD {
24   GWEN_LIST_ELEMENT(LC_CARD)
25   GWEN_INHERIT_ELEMENT(LC_CARD)
26   LC_CLIENT *client;
27 
28   char *readerType;
29   char *driverType;
30   uint32_t readerFlags;
31   char *cardType;
32   GWEN_BUFFER *atr;
33   GWEN_STRINGLIST *cardTypes;
34 
35   LC_CARD_OPEN_FN openFn;
36   LC_CARD_CLOSE_FN closeFn;
37 
38   int connected;
39 
40   int lastSW1;
41   int lastSW2;
42   char *lastResult;
43   char *lastText;
44 
45   GWEN_DB_NODE *dbCommandCache;
46   GWEN_XMLNODE *cardNode;
47   GWEN_XMLNODE *appNode;
48   GWEN_XMLNODE *dfNode;
49   GWEN_XMLNODE *efNode;
50 
51   /* SCard stuff */
52   SCARDHANDLE scardHandle;
53   uint32_t featureCode[LC_PCSC_MAX_FEATURES];
54   DWORD protocol;
55   char *readerName;
56 
57   /* ISO stuff */
58   LC_CARD_GETPINSTATUS_FN getPinStatusFn;
59   LC_CARD_GETINITIALPIN_FN getInitialPinFn;
60 
61   LC_CARD_ISOREADBINARY_FN readBinaryFn;
62   LC_CARD_ISOWRITEBINARY_FN writeBinaryFn;
63   LC_CARD_ISOUPDATEBINARY_FN updateBinaryFn;
64   LC_CARD_ISOERASEBINARY_FN eraseBinaryFn;
65   LC_CARD_ISOREADRECORD_FN readRecordFn;
66   LC_CARD_ISOWRITERECORD_FN writeRecordFn;
67   LC_CARD_ISOAPPENDRECORD_FN appendRecordFn;
68   LC_CARD_ISOUPDATERECORD_FN updateRecordFn;
69   LC_CARD_ISOVERIFYPIN_FN verifyPinFn;
70   LC_CARD_ISOMODIFYPIN_FN modifyPinFn;
71 
72   LC_CARD_ISOPERFORMVERIFICATION_FN performVerificationFn;
73   LC_CARD_ISOPERFORMMODIFICATION_FN performModificationFn;
74 
75   LC_CARD_ISOMANAGESE_FN manageSeFn;
76   LC_CARD_ISOSIGN_FN signFn;
77   LC_CARD_ISOVERIFY_FN verifyFn;
78   LC_CARD_ISOENCIPHER_FN encipherFn;
79   LC_CARD_ISODECIPHER_FN decipherFn;
80   LC_CARD_ISOINTERNALAUTH_FN internalAuthFn;
81 
82   int usage;
83 };
84 
85 
86 
87 LC_CLIENT_RESULT CHIPCARD_CB LC_Card__Open(LC_CARD *card);
88 LC_CLIENT_RESULT CHIPCARD_CB LC_Card__Close(LC_CARD *card);
89 
90 
91 LC_CLIENT_RESULT CHIPCARD_CB LC_Card__IsoReadBinary(LC_CARD *card,
92                                                     uint32_t flags,
93                                                     int offset,
94                                                     int size,
95                                                     GWEN_BUFFER *buf);
96 LC_CLIENT_RESULT CHIPCARD_CB LC_Card__IsoUpdateBinary(LC_CARD *card,
97                                                       uint32_t flags,
98                                                       int offset,
99                                                       const char *ptr,
100                                                       unsigned int size);
101 LC_CLIENT_RESULT CHIPCARD_CB LC_Card__IsoWriteBinary(LC_CARD *card,
102                                                      uint32_t flags,
103                                                      int offset,
104                                                      const char *ptr,
105                                                      unsigned int size);
106 LC_CLIENT_RESULT CHIPCARD_CB LC_Card__IsoEraseBinary(LC_CARD *card,
107                                                      uint32_t flags,
108                                                      int offset,
109                                                      unsigned int size);
110 LC_CLIENT_RESULT CHIPCARD_CB LC_Card__IsoReadRecord(LC_CARD *card,
111                                                     uint32_t flags,
112                                                     int recNum,
113                                                     GWEN_BUFFER *buf);
114 LC_CLIENT_RESULT CHIPCARD_CB LC_Card__IsoWriteRecord(LC_CARD *card,
115                                                      uint32_t flags,
116                                                      int recNum,
117                                                      const char *ptr,
118                                                      unsigned int size);
119 LC_CLIENT_RESULT CHIPCARD_CB LC_Card__IsoUpdateRecord(LC_CARD *card,
120                                                       uint32_t flags,
121                                                       int recNum,
122                                                       const char *ptr,
123                                                       unsigned int size);
124 LC_CLIENT_RESULT CHIPCARD_CB LC_Card__IsoAppendRecord(LC_CARD *card,
125                                                       uint32_t flags,
126                                                       const char *ptr,
127                                                       unsigned int size);
128 LC_CLIENT_RESULT CHIPCARD_CB LC_Card__IsoVerifyPin(LC_CARD *card,
129                                                    uint32_t flags,
130                                                    const LC_PININFO *pi,
131                                                    const unsigned char *ptr,
132                                                    unsigned int size,
133                                                    int *triesLeft);
134 
135 LC_CLIENT_RESULT CHIPCARD_CB LC_Card__IsoPerformVerification(LC_CARD *card,
136                                                              uint32_t flags,
137                                                              const LC_PININFO *pi,
138                                                              int *triesLeft);
139 
140 LC_CLIENT_RESULT CHIPCARD_CB LC_Card__IsoModifyPin(LC_CARD *card,
141                                                    uint32_t flags,
142                                                    const LC_PININFO *pi,
143                                                    const unsigned char *oldptr,
144                                                    unsigned int oldsize,
145                                                    const unsigned char *newptr,
146                                                    unsigned int newsize,
147                                                    int *triesLeft);
148 
149 LC_CLIENT_RESULT CHIPCARD_CB LC_Card__IsoPerformModification(LC_CARD *card,
150                                                              uint32_t flags,
151                                                              const LC_PININFO *pi,
152                                                              int *triesLeft);
153 
154 
155 LC_CLIENT_RESULT CHIPCARD_CB LC_Card__IsoManageSe(LC_CARD *card,
156                                                   int tmpl, int kids, int kidp, int ar);
157 LC_CLIENT_RESULT CHIPCARD_CB LC_Card__IsoEncipher(LC_CARD *card,
158                                                   const char *ptr,
159                                                   unsigned int size,
160                                                   GWEN_BUFFER *codeBuf);
161 LC_CLIENT_RESULT CHIPCARD_CB LC_Card__IsoDecipher(LC_CARD *card,
162                                                   const char *ptr,
163                                                   unsigned int size,
164                                                   GWEN_BUFFER *plainBuf);
165 
166 
167 GWEN_XMLNODE *LC_Card_FindFile(LC_CARD *card,
168                                const char *type,
169                                const char *fname);
170 
171 
172 
173 #endif /* CHIPCARD_CLIENT_CARD_P_H */
174