laforge has submitted this change. ( https://gerrit.osmocom.org/c/libosmocore/+/35154?usp=email )
Change subject: libosmosim: Support Microsoft smart card discovery process ......................................................................
libosmosim: Support Microsoft smart card discovery process
Our class/instruction tables (used mainly by simtrace cardem host software) only contain support for those instructions permitted in the related card specification.
Microsoft blindly tries CLA=0xCA with INS=0x00 which is not somethin that the GSM SIM, ETSI UICC or 3GPP USIM specs specify, and which hence results in log output like this:
DLINP DEBUG [0] <= osmo_st2_cardem_request_sw_tx(sw=6a88) DLGLOBAL INFO => DATA: flags=0x01 (HDR ), 00 ca 7f 68 00 DLGLOBAL ERROR Unknown APDU case 0 DLGLOBAL FATAL Failed to recognize APDU, terminating
Let's adjust to microsoft and *always* support their instructions no matter which osim_cla_ins_card_profile was used.
Special thanks to Eric Wild for pointing me to this unexpected behaviour of PC/SC on modern Windows.
Change-Id: I424964c0afab643e6a5d7824d91c2c86b0d3f25b Related: SYS#6617 --- M src/sim/class_tables.c 1 file changed, 47 insertions(+), 0 deletions(-)
Approvals: Jenkins Builder: Verified Hoernchen: Looks good to me, approved fixeria: Looks good to me, but someone else must approve
diff --git a/src/sim/class_tables.c b/src/sim/class_tables.c index 6d05ede..29c1e40 100644 --- a/src/sim/class_tables.c +++ b/src/sim/class_tables.c @@ -350,6 +350,13 @@ [0x88] = 4, /* AUTHENTICATE */ };
+/* https://learn.microsoft.com/en-us/windows-hardware/drivers/smartcard/discove... */ +static const uint8_t microsoft_discovery_ins_tbl[256] = { + [0xA4] = 4, /* SELECT FILE */ + [0xCA] = 2, /* GET DATA */ + [0xC0] = 2, /* GET RESPONSE */ +}; + int osim_determine_apdu_case(const struct osim_cla_ins_card_profile *prof, const uint8_t *hdr) { @@ -374,5 +381,16 @@ return rc; } } + /* special handling for Microsoft who insists to use INS=0xCA in CLA=0x00 which is not + * really part of GSM SIM, ETSI UICC or 3GPP USIM specifications, but only ISO7816. Rather than adding + * it to each and every card profile, let's add the instructions listed at + * https://learn.microsoft.com/en-us/windows-hardware/drivers/smartcard/discove... explicitly + * here. They will only be used in case no more specific match was found in the actual profile above. */ + if (cla == 0x00) { + rc = microsoft_discovery_ins_tbl[ins]; + if (rc) + return rc; + } + return 0; }