diff --git a/fido2/apdu.c b/fido2/apdu.c index b2516ea..2e8123f 100644 --- a/fido2/apdu.c +++ b/fido2/apdu.c @@ -44,8 +44,8 @@ int apdu_decode(uint8_t *data, size_t len, APDU_STRUCT *apdu) // case 3S (Lc + data) if (len == 5U + b0 && b0 != 0) { - apdu->case_type = 0x13; - apdu->lc = (hapdu->lc[1] << 8) + hapdu->lc[2]; + apdu->case_type = 0x03; + apdu->lc = b0; } // case 4S (Lc + data + Le) diff --git a/targets/stm32l432/src/nfc.c b/targets/stm32l432/src/nfc.c index 9a2a859..54c3859 100644 --- a/targets/stm32l432/src/nfc.c +++ b/targets/stm32l432/src/nfc.c @@ -440,12 +440,24 @@ void nfc_process_iblock(uint8_t * buf, int len) int status; uint16_t reslen; - APDU_STRUCT apdu; - apdu_decode(buf + 1, len - 1, &apdu); - printf1(TAG_NFC,"Iblock: "); dump_hex1(TAG_NFC, buf, len); + uint8_t apdu_offset = 1; + // NAD following + if (buf[0] & 0x04) apdu_offset++; + // CID following + if (buf[0] & 0x08) apdu_offset++; + + APDU_STRUCT apdu; + if (apdu_decode(buf + apdu_offset, len - apdu_offset, &apdu)) { + printf1(TAG_NFC,"apdu decode error\n"); + nfc_write_response(buf[0], SW_COND_USE_NOT_SATISFIED); + return; + } + printf1(TAG_NFC,"apdu ok. %scase=%02x cla=%02x ins=%02x p1=%02x p2=%02x lc=%d le=%d\n", + apdu.extended_apdu ? "[e]":"", apdu.case_type, apdu.cla, apdu.ins, apdu.p1, apdu.p2, apdu.lc, apdu.le); + // TODO this needs to be organized better switch(apdu.ins) {