Index: src/libopensc/card-cardos.c
===================================================================
--- src/libopensc/card-cardos.c	(revision 3639)
+++ src/libopensc/card-cardos.c	(working copy)
@@ -50,6 +50,7 @@
 	{ "3b:f4:98:00:ff:c1:10:31:fe:55:4d:34:63:76:b4", NULL, NULL, SC_CARD_TYPE_CARDOS_GENERIC, 0, NULL},
 	/* cardos m4.2 and above */
 	{ "3b:f2:18:00:ff:c1:0a:31:fe:55:c8:06:8a", "ff:ff:0f:ff:00:ff:00:ff:ff:00:00:00:00", NULL, SC_CARD_TYPE_CARDOS_M4_2, 0, NULL },
+	{ "3b:f4:18:00:02:c1:0a:31:fe:58:56:34:63:76:c5", "ff:ff:0f:ff:00:ff:00:ff:ff:00:00:00:00:00:00", NULL, SC_CARD_TYPE_CARDOS_M4_2, 0, NULL },
 	{ NULL, NULL, NULL, 0, 0, NULL }
 };
 
@@ -86,24 +87,30 @@
 		SC_TEST_RET(card->ctx, rv, "APDU transmit failed");
 		if (apdu.sw1 != 0x90 || apdu.sw2 != 0x00)
 			return 0;
-		if (apdu.resp[0] != card->atr[10] ||
-		    apdu.resp[1] != card->atr[11])
+		if (apdu.resp[0] != 0xC8)
 			/* version mismatch */
 			return 0;
-		if (card->atr[11] <= 0x04) {
-			sc_debug(card->ctx, "found cardos m4.01");
+		if (apdu.resp[1] <= 0x04) {
+			sc_debug(card->ctx, "found cardos M4.01");
 			card->type = SC_CARD_TYPE_CARDOS_M4_01;
-		} else if (card->atr[11] == 0x08) {
-			sc_debug(card->ctx, "found cardos v4.3b");
+		} else if (apdu.resp[1] == 0x06) {
+			sc_debug(card->ctx, "found cardos M4.2");
+			card->type = SC_CARD_TYPE_CARDOS_M4_2;
+		} else if (apdu.resp[1] == 0x07) {
+			sc_debug(card->ctx, "found cardos M4.3");
 			card->type = SC_CARD_TYPE_CARDOS_M4_3;
-		} else if (card->atr[11] == 0x09) {
-			sc_debug(card->ctx, "found cardos v4.2b");
+		} else if (apdu.resp[1] == 0x08) {
+			sc_debug(card->ctx, "found cardos M4.3b");
+			card->type = SC_CARD_TYPE_CARDOS_M4_3;
+		} else if (apdu.resp[1] == 0x09) {
+			sc_debug(card->ctx, "found cardos M4.2b");
 			card->type = SC_CARD_TYPE_CARDOS_M4_2B;
-                } else if (card->atr[11] >= 0x0B) {
-                        sc_debug(card->ctx, "found cardos v4.2c or higher");
-                        card->type = SC_CARD_TYPE_CARDOS_M4_2C;
+		} else if (apdu.resp[1] >= 0x0B) {
+			sc_debug(card->ctx, "found cardos M4.2c or higher");
+			card->type = SC_CARD_TYPE_CARDOS_M4_2C;
 		} else {
-			sc_debug(card->ctx, "found cardos m4.2");
+			sc_debug(card->ctx, "Unknown cardos version.");
+			card->type = SC_CARD_TYPE_CARDOS_GENERIC;
 		}
 	}
 	return 1;
@@ -1105,9 +1112,9 @@
 	/* FIXME: the following values depend on what pin length was
 	 * used when creating the BS objects */
 	if (data->pin1.max_length == 0)
-		data->pin1.max_length = 8;
+		data->pin1.max_length = 10;
 	if (data->pin2.max_length == 0)
-		data->pin2.max_length = 8;
+		data->pin2.max_length = 10;
 	return iso_ops->pin_cmd(card, data, tries_left);
 }
 

