The Smart Card Detective (SCD)
emv.h
Go to the documentation of this file.
00001 
00033 #ifndef _EMV_H_
00034 #define _EMV_H_
00035 
00036 #include "scd_logger.h"
00037 
00038 //------------------------------------------------------------------------
00039 // Constant values used in EMV
00040 #define EMV_MORE_TAGS_MASK 0x1F
00041 #define EMV_EXTRA_LENGTH_BYTE 0x81
00042 
00043 //------------------------------------------------------------------------
00044 // EMV data structures
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 // T=0 protocol functions
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 
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Defines