X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/fe346768b35409677b6c7f40a6f2a6768cf54ac3..f69f1de80c924b8de4456cf6c86b18bda5c25a5d:/client/emv/apduinfo.c?ds=inline

diff --git a/client/emv/apduinfo.c b/client/emv/apduinfo.c
index e2e51d9d..a631c614 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)."},
@@ -257,6 +257,7 @@ const APDUCode APDUCodeTable[] = {
 	{"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)"}
 };
+const size_t APDUCodeTableLen = sizeof(APDUCodeTable)/sizeof(APDUCode);
 
 int CodeCmp(const char *code1, const char *code2) {
 	int xsymb = 0;
@@ -276,29 +277,42 @@ 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 = 100;
+	int mineqindx = 0;
 	
-	sprintf(&buf[0], "%02X ", sw1);
-	sprintf(&buf[2], "%02X ", sw2);
+	sprintf(&buf[0], "%02X", sw1);
+	sprintf(&buf[2], "%02X", 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 < 100) {
+		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
 }
-
-