X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/fe346768b35409677b6c7f40a6f2a6768cf54ac3..700d8687944db0a48535f818b59b6c9859952c61:/client/emv/apduinfo.c diff --git a/client/emv/apduinfo.c b/client/emv/apduinfo.c index e2e51d9d..d14e3ff6 100644 --- a/client/emv/apduinfo.c +++ b/client/emv/apduinfo.c @@ -132,7 +132,7 @@ const APDUCode APDUCodeTable[] = { {"6EXX", APDUCODE_TYPE_ERROR, "Instruction class not supported (procedure byte), (ISO 7816-3)"}, {"6F--", APDUCODE_TYPE_ERROR, "Internal exception"}, {"6F00", APDUCODE_TYPE_ERROR, "Command aborted - more exact diagnosis not possible (e.g., operating system error)."}, - {"6FFF", APDUCODE_TYPE_ERROR, "Card dead (overuse, …)"}, + {"6FFF", APDUCODE_TYPE_ERROR, "Card dead (overuse, ...)"}, {"6FXX", APDUCODE_TYPE_ERROR, "No precise diagnosis (procedure byte), (ISO 7816-3)"}, {"9---", APDUCODE_TYPE_NONE, ""}, {"9000", APDUCODE_TYPE_INFO, "Command successfully executed (OK)."}, @@ -255,8 +255,9 @@ const APDUCode APDUCodeTable[] = { {"9F00", APDUCODE_TYPE_NONE, "PIN blocked and Unblock Try Counter is 3"}, {"9F04", APDUCODE_TYPE_NONE, "PIN not succesfully verified, PIN blocked and Unblock Try Counter is 3"}, {"9FXX", APDUCODE_TYPE_NONE, "Command successfully executed; 'xx' bytes of data are available and can be requested using GET RESPONSE."}, - {"9xXX", APDUCODE_TYPE_NONE, "Application related status, (ISO 7816-3)"} + {"9XXX", APDUCODE_TYPE_NONE, "Application related status, (ISO 7816-3)"} }; +const size_t APDUCodeTableLen = sizeof(APDUCodeTable)/sizeof(APDUCode); int CodeCmp(const char *code1, const char *code2) { int xsymb = 0; @@ -276,29 +277,41 @@ int CodeCmp(const char *code1, const char *code2) { return -1; } -APDUCode *GetAPDUCode(uint8_t sw1, uint8_t sw2) { - char buf[4] = {0}; +const APDUCode* const GetAPDUCode(uint8_t sw1, uint8_t sw2) { + char buf[5] = {0}; + int res; + int mineq = APDUCodeTableLen; + int mineqindx = 0; - sprintf(&buf[0], "%02X ", sw1); - sprintf(&buf[2], "%02X ", sw2); + sprintf(buf, "%02X%02X", sw1, sw2); + for (int i = 0; i < APDUCodeTableLen; i++) { + res = CodeCmp(APDUCodeTable[i].ID, buf); - int tableLen = sizeof(APDUCodeTable)/sizeof(APDUCode); - for (int i = 0; i < tableLen; i++) { - if (CodeCmp(APDUCodeTable[i].ID, buf) == 0) { // TODO make not so equal comparation... XXXX - not works... + // equal + if (res == 0) { return &APDUCodeTable[i]; } + + // with some 'X' + if (res > 0 && mineq > res) { + mineq = res; + mineqindx = i; + } } + // if we have not equal, but with some 'X' + if (mineqindx < APDUCodeTableLen) { + return &APDUCodeTable[mineqindx]; + } + return NULL; } -const char *GetAPDUCodeDescription(uint8_t sw1, uint8_t sw2) { - APDUCode *cd = GetAPDUCode(sw1, sw2); +const char* GetAPDUCodeDescription(uint8_t sw1, uint8_t sw2) { + const APDUCode *cd = GetAPDUCode(sw1, sw2); if (cd) return cd->Description; else return APDUCodeTable[0].Description; //empty string } - -