]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/emv/apduinfo.c
Emv scan via contact interface (#789)
[proxmark3-svn] / client / emv / apduinfo.c
index e2e51d9db79c49a3b4db38f92efb27ac9148d4ce..d14e3ff6aac0ff76d78511b9cb95c8bf24d7ce58 100644 (file)
@@ -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, \85)"},
+       {"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 charGetAPDUCodeDescription(uint8_t sw1, uint8_t sw2) {
+       const APDUCode *cd = GetAPDUCode(sw1, sw2);
        if (cd)
                return cd->Description;
        else
                return APDUCodeTable[0].Description; //empty string
 }
-
-
Impressum, Datenschutz