00001
00033 #ifndef _TERMINAL_H_
00034 #define _TERMINAL_H_
00035
00037 #define MAX_EXCHANGES 50
00038
00039
00040 extern CRP* transactionData[MAX_EXCHANGES];
00041 extern uint8_t nTransactions;
00042 extern uint8_t nCounter;
00043
00044
00045
00046
00047
00052 typedef enum {
00053 PDO_ATC = 0x36,
00054 PDO_LAST_ATC = 0x13,
00055 PDO_PIN_TRY_COUNTER = 0x17,
00056 PDO_LOG_FORMAT = 0x4F
00057 } CARD_PDO;
00058
00062 typedef enum{
00063 AC_REQ_AAC = 0,
00064 AC_REQ_ARQC = 0x80,
00065 AC_REQ_TC = 0x40
00066 } AC_REQ_TYPE;
00067
00071 typedef struct {
00072 uint8_t tag1;
00073 uint8_t tag2;
00074 uint8_t len;
00075 uint8_t *value;
00076 } TLV;
00077
00081 typedef struct {
00082 uint8_t count;
00083 TLV **objects;
00084 } RECORD;
00085
00089 typedef struct {
00090 uint8_t lenDFName;
00091 uint8_t* dfName;
00092 RECORD* fciData;
00093 } FCITemplate;
00094
00098 typedef struct {
00099 uint8_t count;
00100 FCITemplate** objects;
00101 } FCIList;
00102
00106 typedef struct {
00107 uint8_t count;
00108 RECORD** objects;
00109 } RECORDList;
00110
00114 typedef struct {
00115 uint8_t sfi;
00116 uint8_t recordStart;
00117 uint8_t recordEnd;
00118 uint8_t recordsOfflineAuth;
00119 } AFL;
00120
00124 typedef struct {
00125 uint8_t count;
00126 uint8_t aip[2];
00127 AFL** aflList;
00128 } APPINFO;
00129
00138 typedef struct {
00139 uint8_t amount[6];
00140 uint8_t amountOther[6];
00141 uint8_t terminalCountryCode[2];
00142 uint8_t tvr[5];
00143 uint8_t terminalCurrencyCode[2];
00144 uint8_t transactionDate[3];
00145 uint8_t transactionType;
00146 uint8_t unpredictableNumber[4];
00147 uint8_t terminalType;
00148 uint8_t dataAuthCode[2];
00149 uint8_t iccDynamicNumber[8];
00150 uint8_t cvmResults[3];
00151 uint8_t arc[2];
00152 uint8_t IssuerAuthData[8];
00153 } GENERATE_AC_PARAMS;
00154
00155
00156
00157
00158
00160 RAPDU* TerminalSendT0Command(
00161 CAPDU* cmd,
00162 uint8_t inverse_convention,
00163 uint8_t TC1,
00164 log_struct_t *logger);
00165
00167 FCITemplate* ApplicationSelection(
00168 uint8_t convention,
00169 uint8_t TC1,
00170 const ByteArray *aid,
00171 uint8_t autoselect,
00172 log_struct_t *logger);
00173
00175 APPINFO* InitializeTransaction(
00176 uint8_t convention,
00177 uint8_t TC1,
00178 const FCITemplate *fci,
00179 log_struct_t *logger);
00180
00182 RECORD* GetTransactionData(
00183 uint8_t convention,
00184 uint8_t TC1,
00185 const APPINFO* appInfo,
00186 ByteArray *offlineAuthData,
00187 log_struct_t *logger);
00188
00190 FCITemplate* SelectFromAID(
00191 uint8_t convention,
00192 uint8_t TC1,
00193 const ByteArray *aid,
00194 log_struct_t *logger);
00195
00197 FCITemplate* SelectFromPSE(
00198 uint8_t convention,
00199 uint8_t TC1,
00200 uint8_t sfiPSE,
00201 uint8_t autoselect,
00202 log_struct_t *logger);
00203
00205 uint8_t VerifyPlaintextPIN(
00206 uint8_t convention,
00207 uint8_t TC1,
00208 const ByteArray *pin,
00209 log_struct_t *logger);
00210
00212 RAPDU* SendGenerateAC(
00213 uint8_t convention,
00214 uint8_t TC1,
00215 AC_REQ_TYPE acType,
00216 const TLV* cdol,
00217 const GENERATE_AC_PARAMS *params,
00218 log_struct_t *logger);
00219
00221 RAPDU* SignDynamicData(
00222 uint8_t convention,
00223 uint8_t TC1,
00224 const ByteArray *data,
00225 log_struct_t *logger);
00226
00228 uint8_t GetSFIFromSELECT(const RAPDU *response);
00229
00231 TLV* GetPDOLFromFCI(const FCITemplate *fci);
00232
00234 TLV* GetPDOL(const FCITemplate *fci);
00235
00237 ByteArray* GetDataObject(
00238 uint8_t convention,
00239 uint8_t TC1,
00240 CARD_PDO pdo,
00241 log_struct_t *logger);
00242
00244 TLV* GetTLVFromRECORD(RECORD *rec, uint8_t tag1, uint8_t tag2);
00245
00247 uint8_t AmountPositionInCDOLRecord(const RECORD *record);
00248
00250 FCITemplate* ParseFCI(const uint8_t *data, uint8_t lenData);
00251
00253 TLV* ParseTLV(const uint8_t *data, uint8_t lenData, uint8_t includeValue);
00254
00256 TLV* CopyTLV(const TLV *data);
00257
00259 RECORD* ParseRECORD(const uint8_t *data, uint8_t lenData);
00260
00262 uint8_t AddRECORD(RECORD *dest, const RECORD *src);
00263
00265 RECORD* ParseManyTLV(const uint8_t *data, uint8_t lenData);
00266
00268 uint8_t ParsePSD(RECORDList *rlist, const uint8_t *data, uint8_t lenData);
00269
00271 APPINFO* ParseApplicationInfo(const uint8_t* data, uint8_t len);
00272
00274 ByteArray* SerializeTLV(const TLV* tlv);
00275
00277 void FreeTLV(TLV *data);
00278
00280 void FreeRECORD(RECORD *data);
00281
00283 void FreeRECORDList(RECORDList *data);
00284
00286 void FreeFCITemplate(FCITemplate *data);
00287
00289 void FreeFCIList(FCIList *data);
00290
00292 void FreeAPPINFO(APPINFO *data);
00293
00294 #endif // _TERMINAL_H_
00295