From 13012c33b0012682be78aa4e4abcea167e6096e1 Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Fri, 4 Feb 2022 15:16:43 +0200 Subject: [PATCH] print attributes --- client/src/cipurse/cipursecore.c | 35 ++++++++++++++++++++++++++++++++ client/src/cipurse/cipursecore.h | 2 ++ 2 files changed, 37 insertions(+) diff --git a/client/src/cipurse/cipursecore.c b/client/src/cipurse/cipursecore.c index 6da5f7849..231a2b1b4 100644 --- a/client/src/cipurse/cipursecore.c +++ b/client/src/cipurse/cipursecore.c @@ -200,6 +200,10 @@ int CIPURSEReadFileAttributes(uint8_t *result, size_t max_result_len, size_t *re return CIPURSEExchange((sAPDU_t) {0x80, 0xce, 0x00, 0x00, 0, NULL}, result, max_result_len, result_len, sw); } +int CIPURSEUpdateFileAttributes(uint8_t *data, uint16_t datalen, uint8_t *result, size_t max_result_len, size_t *result_len, uint16_t *sw) { + return CIPURSEExchange((sAPDU_t) {0x80, 0xde, 0x00, 0x00, datalen, data}, result, max_result_len, result_len, sw); +} + int CIPURSEReadBinary(uint16_t offset, uint8_t *result, size_t max_result_len, size_t *result_len, uint16_t *sw) { return CIPURSEExchange((sAPDU_t) {0x00, 0xb0, (offset >> 8) & 0x7f, offset & 0xff, 0, NULL}, result, max_result_len, result_len, sw); } @@ -610,3 +614,34 @@ void CIPURSEPrintFileAttrEx(uint8_t *attr, size_t len, bool isDGI) { void CIPURSEPrintFileAttr(uint8_t *attr, size_t len) { return CIPURSEPrintFileAttrEx(attr, len, false); } + +void CIPURSEPrintFileUpdateAttr(uint8_t *attr, size_t len) { + uint8_t keynum = attr[0]; + PrintAndLogEx(INFO, "Keys assigned... %d", keynum); + + size_t idx = 1; + if ( keynum > 0) { + if (len >= idx + 2) { + PrintAndLogEx(INFO, "SMR entries... %02x%02x", attr[idx], attr[idx + 1]); + CIPURSEPrintSMR(&attr[idx]); + } + idx += 2; + + if (len >= idx + keynum + 1) { + PrintAndLogEx(INFO, "ART... %s", sprint_hex(&attr[idx], keynum + 1)); + CIPURSEPrintART(&attr[idx], keynum + 1); + PrintAndLogEx(NORMAL, ""); + } + idx += keynum + 1; + } + + // FCI + if (len >= idx + 1) { + int xlen = len - idx; + if (xlen > 0 && xlen < 200) { + PrintAndLogEx(INFO, "TLV file control parameters... [%d] %s", xlen, sprint_hex(&attr[idx], xlen)); + TLVPrintFromBuffer(&attr[idx], xlen); + PrintAndLogEx(NORMAL, ""); + } + } +} diff --git a/client/src/cipurse/cipursecore.h b/client/src/cipurse/cipursecore.h index 3a880326a..89af5e5bf 100644 --- a/client/src/cipurse/cipursecore.h +++ b/client/src/cipurse/cipursecore.h @@ -51,6 +51,7 @@ int CIPURSESelectMFEx(bool activate_field, bool leave_field_on, uint8_t *result, int CIPURSESelectMF(uint8_t *result, size_t max_result_len, size_t *result_len, uint16_t *sw); int CIPURSEReadFileAttributes(uint8_t *result, size_t max_result_len, size_t *result_len, uint16_t *sw); +int CIPURSEUpdateFileAttributes(uint8_t *data, uint16_t datalen, uint8_t *result, size_t max_result_len, size_t *result_len, uint16_t *sw); int CIPURSEReadBinary(uint16_t offset, uint8_t *result, size_t max_result_len, size_t *result_len, uint16_t *sw); int CIPURSEUpdateBinary(uint16_t offset, uint8_t *data, uint16_t datalen, uint8_t *result, size_t max_result_len, size_t *result_len, uint16_t *sw); @@ -66,6 +67,7 @@ void CIPURSEPrintART(uint8_t *artrec, size_t artlen); void CIPURSEPrintEFFileAttr(uint8_t *attr, size_t len); void CIPURSEPrintFileAttrEx(uint8_t *attr, size_t len, bool isDGI); void CIPURSEPrintFileAttr(uint8_t *attr, size_t len); +void CIPURSEPrintFileUpdateAttr(uint8_t *attr, size_t len); void CIPURSEPrintFileDescriptor(uint8_t desc); void CIPURSEPrintDGIArray(uint8_t *dgi, size_t dgilen); void CIPURSEPrintDGI(uint8_t *dgi, size_t dgilen);