00001
00033 #ifndef _EMV_H_
00034 #define _EMV_H_
00035
00036 #include "scd_logger.h"
00037
00038
00039
00040 #define EMV_MORE_TAGS_MASK 0x1F
00041 #define EMV_EXTRA_LENGTH_BYTE 0x81
00042
00043
00044
00045
00049 typedef struct {
00050 uint8_t len;
00051 uint8_t *bytes;
00052 } ByteArray;
00053
00057 typedef struct {
00058 uint8_t cla;
00059 uint8_t ins;
00060 uint8_t p1;
00061 uint8_t p2;
00062 uint8_t p3;
00063 } EMVCommandHeader;
00064
00065
00069 typedef struct {
00070 uint8_t lenData;
00071 EMVCommandHeader *cmdHeader;
00072 uint8_t *cmdData;
00073 } CAPDU;
00074
00078 typedef struct {
00079 uint8_t sw1;
00080 uint8_t sw2;
00081 } EMVStatus;
00082
00083
00087 typedef struct {
00088 uint8_t lenData;
00089 EMVStatus *repStatus;
00090 uint8_t *repData;
00091 } RAPDU;
00092
00096 typedef struct {
00097 CAPDU *cmd;
00098 RAPDU *response;
00099 } CRP;
00100
00104 typedef enum {
00105 CMD_SELECT = 0,
00106 CMD_GET_RESPONSE,
00107 CMD_READ_RECORD,
00108 CMD_GET_PROCESSING_OPTS,
00109 CMD_VERIFY,
00110 CMD_GENERATE_AC,
00111 CMD_GET_DATA,
00112 CMD_INTERNAL_AUTHENTICATE,
00113 CMD_PIN_CHANGE_UNBLOCK
00114 }EMV_CMD;
00115
00116
00118 uint8_t ResetICC(
00119 uint8_t warm,
00120 uint8_t *inverse_convention,
00121 uint8_t *proto,
00122 uint8_t *TC1,
00123 uint8_t *TA3,
00124 uint8_t *TB3,
00125 log_struct_t *logger);
00126
00127
00128
00129
00131 void SendT0ATRTerminal(
00132 uint8_t inverse_convention,
00133 uint8_t TC1,
00134 log_struct_t *logger);
00135
00137 uint8_t GetATRICC(
00138 uint8_t *inverse_convention,
00139 uint8_t *proto,
00140 uint8_t *TS,
00141 uint8_t *T0,
00142 uint16_t *selection,
00143 uint8_t bytes[32],
00144 uint8_t *tck,
00145 log_struct_t *logger);
00146
00148 EMVCommandHeader* MakeCommandHeader(uint8_t cla, uint8_t ins, uint8_t p1,
00149 uint8_t p2, uint8_t p3);
00150
00152 EMVCommandHeader* MakeCommandHeaderC(EMV_CMD command);
00153
00155 CAPDU* MakeCommand(uint8_t cla, uint8_t ins, uint8_t p1,
00156 uint8_t p2, uint8_t p3, const uint8_t cmdData[], uint8_t lenData);
00157
00159 CAPDU* MakeCommandP(const EMVCommandHeader *cmdHdr, const uint8_t cmdData[],
00160 uint8_t lenData);
00161
00163 CAPDU* MakeCommandC(EMV_CMD command, const uint8_t cmdData[],
00164 uint8_t lenData);
00165
00167 uint8_t InitSCDTransaction(uint8_t t_inverse, uint8_t t_TC1,
00168 uint8_t *inverse_convention, uint8_t *proto, uint8_t *TC1,
00169 uint8_t *TA3, uint8_t *TB3, log_struct_t *logger);
00170
00172 uint8_t GetCommandCase(uint8_t cla, uint8_t ins);
00173
00175 EMVCommandHeader* ReceiveT0CmdHeader(
00176 uint8_t inverse_convention,
00177 uint8_t TC1,
00178 log_struct_t *logger);
00179
00181 uint8_t* ReceiveT0CmdData(
00182 uint8_t inverse_convention,
00183 uint8_t TC1,
00184 uint8_t len,
00185 log_struct_t *logger);
00186
00188 CAPDU* ReceiveT0Command(
00189 uint8_t inverse_convention,
00190 uint8_t TC1,
00191 log_struct_t *logger);
00192
00194 uint8_t SendT0CmdHeader(
00195 uint8_t inverse_convention,
00196 uint8_t TC1,
00197 EMVCommandHeader *cmdHeader,
00198 log_struct_t *logger);
00199
00201 uint8_t SendT0CmdData(
00202 uint8_t inverse_convention,
00203 uint8_t TC1,
00204 uint8_t *cmdData,
00205 uint8_t len,
00206 log_struct_t *logger);
00207
00209 uint8_t SendT0Command(
00210 uint8_t inverse_convention,
00211 uint8_t TC1,
00212 CAPDU *cmd,
00213 log_struct_t *logger);
00214
00216 CAPDU* ForwardCommand(
00217 uint8_t tInverse,
00218 uint8_t cInverse,
00219 uint8_t tTC1,
00220 uint8_t cTC1,
00221 log_struct_t *logger);
00222
00224 uint8_t* SerializeCommand(CAPDU *cmd, uint8_t *len);
00225
00227 RAPDU* ReceiveT0Response(
00228 uint8_t inverse_convention,
00229 EMVCommandHeader *cmdHeader,
00230 log_struct_t *logger);
00231
00233 uint8_t SendT0Response(
00234 uint8_t inverse_convention,
00235 EMVCommandHeader *cmdHeader,
00236 RAPDU *response,
00237 log_struct_t *logger);
00238
00240 RAPDU* ForwardResponse(
00241 uint8_t tInverse,
00242 uint8_t cInverse,
00243 EMVCommandHeader *cmdHeader,
00244 log_struct_t *logger);
00245
00247 uint8_t* SerializeResponse(RAPDU *response, uint8_t *len);
00248
00250 CRP* ExchangeData(
00251 uint8_t tInverse,
00252 uint8_t cInverse,
00253 uint8_t tTC1,
00254 uint8_t cTC1,
00255 log_struct_t *logger);
00256
00258 CRP* ExchangeCompleteData(
00259 uint8_t tInverse,
00260 uint8_t cInverse,
00261 uint8_t tTC1,
00262 uint8_t cTC1,
00263 log_struct_t *logger);
00264
00266 ByteArray* MakeByteArray(uint8_t *data, uint8_t len);
00267
00269 ByteArray* MakeByteArrayV(uint8_t nargs, ...);
00270
00272 ByteArray* CopyByteArray(const uint8_t *data, uint8_t len);
00273
00275 void FreeByteArray(ByteArray* data);
00276
00278 void FreeCAPDU(CAPDU* cmd);
00279
00281 CAPDU* CopyCAPDU(CAPDU* cmd);
00282
00284 void FreeRAPDU(RAPDU* response);
00285
00287 RAPDU* CopyRAPDU(RAPDU* resp);
00288
00290 void FreeCRP(CRP* data);
00291
00292 #endif // _EMV_H_
00293