The Smart Card Detective (SCD)
|
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