send response APDU from bankd (card) to SIMtrace (modem)

Change-Id: I50270dbba8eb93133d1a48ba62a7f8a7dfc555d0
This commit is contained in:
Kevin Redon 2018-10-11 08:41:57 +02:00 committed by Harald Welte
parent bc08db5cee
commit 9b69a3f4b9
1 changed files with 25 additions and 0 deletions

View File

@ -566,6 +566,28 @@ void ipa_client_conn_send_rspro(struct ipa_client_conn *ipa, RsproPDU_t *rspro)
push_and_send(ipa, msg);
}
static int bankd_handle_tpduCardToModem(struct bankd_client *bc, RsproPDU_t *pdu)
{
OSMO_ASSERT(pdu);
OSMO_ASSERT(RsproPDUchoice_PR_tpduCardToModem == pdu->msg.present);
const struct TpduCardToModem *card2modem = &pdu->msg.choice.tpduCardToModem;
if (card2modem->data.size < 2) { // at least the two SW bytes are needed
return -1;
}
// save SW to our current APDU context
ac.sw[0] = card2modem->data.buf[card2modem->data.size - 2];
ac.sw[1] = card2modem->data.buf[card2modem->data.size - 1];
printf("SW=0x%02x%02x, len_rx=%d\n", ac.sw[0], ac.sw[1], card2modem->data.size - 2);
if (card2modem->data.size > 2) { // send PB and data to modem
cardem_request_pb_and_tx(ci, ac.hdr.ins, card2modem->data.buf, card2modem->data.size - 2);
}
cardem_request_sw_tx(ci, ac.sw); // send SW to modem
return 0;
}
static int bankd_handle_msg(struct bankd_client *bc, struct msgb *msg)
{
RsproPDU_t *pdu = rspro_dec_msg(msg);
@ -578,6 +600,9 @@ static int bankd_handle_msg(struct bankd_client *bc, struct msgb *msg)
case RsproPDUchoice_PR_connectClientRes:
osmo_fsm_inst_dispatch(bc->bankd_fi, BDC_E_CLIENT_CONN_RES, pdu);
break;
case RsproPDUchoice_PR_tpduCardToModem: // APDU response from card received
bankd_handle_tpduCardToModem(bc, pdu);
break;
default:
fprintf(stderr, "Unknown/Unsuppoerted RSPRO PDU: %s\n", msgb_hexdump(msg));
return -1;