laforge has uploaded this change for review. (
https://gerrit.osmocom.org/c/simtrace2/+/42229?usp=email )
Change subject: WIP: make 6Cxx status codes in case 2/4 ambiguous situations
work
......................................................................
WIP: make 6Cxx status codes in case 2/4 ambiguous situations work
Change-Id: I968608e73057e9f57d3a89aae485d1a278e503e4
---
M host/include/osmocom/simtrace2/simtrace2_api.h
M host/src/simtrace2-cardem-pcsc.c
2 files changed, 30 insertions(+), 0 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/simtrace2 refs/changes/29/42229/1
diff --git a/host/include/osmocom/simtrace2/simtrace2_api.h
b/host/include/osmocom/simtrace2/simtrace2_api.h
index a29389c..baa5ed7 100644
--- a/host/include/osmocom/simtrace2/simtrace2_api.h
+++ b/host/include/osmocom/simtrace2/simtrace2_api.h
@@ -37,6 +37,12 @@
struct osim_chan_hdl *chan;
/* path of the underlying USB device */
char *usb_path;
+ struct {
+ /* did we just send a PB=0x6C and hence need to assume case2 on
re-transmit? */
+ bool last_pb_was_6c;
+ /* cache of the last APDU header */
+ struct osim_apdu_cmd_hdr last_hdr;
+ } state;
/* opaque data TBD by user */
void *priv;
};
diff --git a/host/src/simtrace2-cardem-pcsc.c b/host/src/simtrace2-cardem-pcsc.c
index f26698e..5d4940d 100644
--- a/host/src/simtrace2-cardem-pcsc.c
+++ b/host/src/simtrace2-cardem-pcsc.c
@@ -178,6 +178,18 @@
exit(1);
}
+ if (data->flags & CEMU_DATA_F_TPDU_HDR && ci->state.last_pb_was_6c) {
+ LOGCI(ci, LOGL_INFO, "==== last one was 6C\n");
+ if (!memcmp(&ci->state.last_hdr, &ac.hdr, 4)) {
+ /* force case 2 treatment */
+ LOGCI(ci, LOGL_INFO, "==== last one was 6C and hdr
matches!\n");
+ rc = APDU_ACT_TX_CAPDU_TO_CARD;
+ ac.lc.tot = 0;
+ }
+ LOGCI(ci, LOGL_INFO, "==== last_pb_was_6c => false\n");
+ ci->state.last_pb_was_6c = false;
+ }
+
if (rc & APDU_ACT_TX_CAPDU_TO_CARD) {
struct msgb *tmsg = msgb_alloc(1024, "TPDU");
struct osim_reader_hdl *rh = ci->chan->card->reader;
@@ -193,12 +205,14 @@
}
/* send to actual card */
tmsg->l3h = tmsg->tail;
+ LOGCI(ci, LOGL_INFO, "pcsc in: %s\n", msgb_hexdump(tmsg));
rc = rh->ops->transceive(rh, tmsg);
if (rc < 0) {
fprintf(stderr, "error during transceive: %d\n", rc);
msgb_free(tmsg);
return rc;
}
+ LOGCI(ci, LOGL_INFO, "pcsc out: %s\n", msgb_hexdump(tmsg));
/* send via GSMTAP for wireshark tracing */
osmo_st2_gsmtap_send_apdu(GSMTAP_SIM_APDU, tmsg->data,
msgb_length(tmsg));
@@ -208,6 +222,16 @@
if (msgb_l3len(tmsg))
osmo_st2_cardem_request_pb_and_tx(ci, ac.hdr.ins,
tmsg->l3h, msgb_l3len(tmsg));
osmo_st2_cardem_request_sw_tx(ci, ac.sw);
+ /* update our state for proper handling of case2/4 distinction
*/
+ if (ac.sw[0] == 0x6c) {
+ LOGCI(ci, LOGL_INFO, "==== last_pb_was_6c => true\n");
+ ci->state.last_pb_was_6c = true;
+ } else {
+ if (ci->state.last_pb_was_6c)
+ LOGCI(ci, LOGL_INFO, "==== last_pb_was_6c =>
false\n");
+ ci->state.last_pb_was_6c = false;
+ }
+ memcpy(&ci->state.last_hdr, &ac.hdr,
sizeof(ci->state.last_hdr));
} else if (ac.lc.tot > ac.lc.cur) {
osmo_st2_cardem_request_pb_and_rx(ci, ac.hdr.ins, ac.lc.tot -
ac.lc.cur);
}
--
To view, visit https://gerrit.osmocom.org/c/simtrace2/+/42229?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: newchange
Gerrit-Project: simtrace2
Gerrit-Branch: master
Gerrit-Change-Id: I968608e73057e9f57d3a89aae485d1a278e503e4
Gerrit-Change-Number: 42229
Gerrit-PatchSet: 1
Gerrit-Owner: laforge <[email protected]>