00001
00025
00026
00027 #define EMV_MORE_TAGS_MASK 0x1F
00028 #define EMV_EXTRA_LENGTH_BYTE 0x81
00029
00030
00031
00032
00036 typedef struct {
00037 uint8_t len;
00038 uint8_t *bytes;
00039 } ByteArray;
00040
00044 typedef struct {
00045 uint8_t cla;
00046 uint8_t ins;
00047 uint8_t p1;
00048 uint8_t p2;
00049 uint8_t p3;
00050 } EMVCommandHeader;
00051
00052
00056 typedef struct {
00057 uint8_t lenData;
00058 EMVCommandHeader *cmdHeader;
00059 uint8_t *cmdData;
00060 } CAPDU;
00061
00065 typedef struct {
00066 uint8_t sw1;
00067 uint8_t sw2;
00068 } EMVStatus;
00069
00070
00074 typedef struct {
00075 uint8_t lenData;
00076 EMVStatus *repStatus;
00077 uint8_t *repData;
00078 } RAPDU;
00079
00083 typedef struct {
00084 CAPDU *cmd;
00085 RAPDU *response;
00086 } CRP;
00087
00091 typedef enum {
00092 CMD_SELECT = 0,
00093 CMD_GET_RESPONSE,
00094 CMD_READ_RECORD,
00095 CMD_GET_PROCESSING_OPTS,
00096 CMD_VERIFY,
00097 CMD_GENERATE_AC,
00098 CMD_GET_DATA,
00099 CMD_INTERNAL_AUTHENTICATE
00100 }EMV_CMD;
00101
00102
00103
00104
00105
00106
00108 EMVCommandHeader* MakeCommandHeader(uint8_t cla, uint8_t ins, uint8_t p1,
00109 uint8_t p2, uint8_t p3);
00110
00112 EMVCommandHeader* MakeCommandHeaderC(EMV_CMD command);
00113
00115 CAPDU* MakeCommand(uint8_t cla, uint8_t ins, uint8_t p1,
00116 uint8_t p2, uint8_t p3, const uint8_t cmdData[], uint8_t lenData);
00117
00119 CAPDU* MakeCommandP(const EMVCommandHeader *cmdHdr, const uint8_t cmdData[],
00120 uint8_t lenData);
00121
00123 CAPDU* MakeCommandC(EMV_CMD command, const uint8_t cmdData[],
00124 uint8_t lenData);
00125
00127 uint8_t InitSCDTransaction(uint8_t t_inverse, uint8_t t_TC1,
00128 uint8_t *inverse_convention, uint8_t *proto, uint8_t *TC1,
00129 uint8_t *TA3, uint8_t *TB3);
00130
00132 uint8_t GetCommandCase(uint8_t cla, uint8_t ins);
00133
00135 EMVCommandHeader* ReceiveT0CmdHeader(uint8_t inverse_convention, uint8_t TC1);
00136
00138 uint8_t* ReceiveT0CmdData(uint8_t inverse_convention, uint8_t TC1,
00139 uint8_t len);
00140
00142 CAPDU* ReceiveT0Command(uint8_t inverse_convention, uint8_t TC1);
00143
00145 uint8_t SendT0CmdHeader(uint8_t inverse_convention, uint8_t TC1,
00146 EMVCommandHeader *cmdHeader);
00147
00149 uint8_t SendT0CmdData(uint8_t inverse_convention, uint8_t TC1,
00150 uint8_t *cmdData, uint8_t len);
00151
00153 uint8_t SendT0Command(uint8_t inverse_convention, uint8_t TC1, CAPDU *cmd);
00154
00156 CAPDU* ForwardCommand(uint8_t tInverse, uint8_t cInverse,
00157 uint8_t tTC1, uint8_t cTC1);
00158
00160 uint8_t* SerializeCommand(CAPDU *cmd, uint8_t *len);
00161
00163 RAPDU* ReceiveT0Response(uint8_t inverse_convention,
00164 EMVCommandHeader *cmdHeader);
00165
00167 uint8_t SendT0Response(uint8_t inverse_convention,
00168 EMVCommandHeader *cmdHeader, RAPDU *response);
00169
00171 RAPDU* ForwardResponse(uint8_t tInverse, uint8_t cInverse,
00172 EMVCommandHeader *cmdHeader);
00173
00175 uint8_t* SerializeResponse(RAPDU *response, uint8_t *len);
00176
00178 CRP* ExchangeData(uint8_t tInverse, uint8_t cInverse,
00179 uint8_t tTC1, uint8_t cTC1);
00180
00182 CRP* ExchangeCompleteData(uint8_t tInverse, uint8_t cInverse,
00183 uint8_t tTC1, uint8_t cTC1);
00184
00186 ByteArray* MakeByteArray(uint8_t *data, uint8_t len);
00187
00189 ByteArray* MakeByteArrayV(uint8_t nargs, ...);
00190
00192 ByteArray* CopyByteArray(const uint8_t *data, uint8_t len);
00193
00195 void FreeByteArray(ByteArray* data);
00196
00198 void FreeCAPDU(CAPDU* cmd);
00199
00201 CAPDU* CopyCAPDU(CAPDU* cmd);
00202
00204 void FreeRAPDU(RAPDU* response);
00205
00207 RAPDU* CopyRAPDU(RAPDU* resp);
00208
00210 void FreeCRP(CRP* data);
00211
00212