diff --git a/client/src/mifare/desfirecore.c b/client/src/mifare/desfirecore.c index 05331f383..00328bef1 100644 --- a/client/src/mifare/desfirecore.c +++ b/client/src/mifare/desfirecore.c @@ -1688,6 +1688,26 @@ int DesfireGetFreeMem(DesfireContext *dctx, uint32_t *freemem) { return res; } +int DesfireReadSignature(DesfireContext *dctx, uint8_t sid, uint8_t *resp, size_t *resplen) { + *resplen = 0; + + uint8_t xresp[257] = {0}; + size_t xresplen = 0; + uint8_t respcode = 0xff; + + int res = DesfireExchange(dctx, MFDES_READSIG, &sid, 1, &respcode, xresp, &xresplen); + if (res != PM3_SUCCESS) + return res; + + if (respcode != 0x90) + return PM3_EAPDU_FAIL; + + memcpy(resp, xresp, xresplen); + *resplen = xresplen; + + return PM3_SUCCESS; +} + int DesfireGetUID(DesfireContext *dctx, uint8_t *resp, size_t *resplen) { return DesfireCommandRxData(dctx, MFDES_GET_UID, resp, resplen, -1); } diff --git a/client/src/mifare/desfirecore.h b/client/src/mifare/desfirecore.h index 2100a521a..4d53e96f2 100644 --- a/client/src/mifare/desfirecore.h +++ b/client/src/mifare/desfirecore.h @@ -153,6 +153,8 @@ void DesfirePrintContext(DesfireContext *ctx); int DesfireExchange(DesfireContext *ctx, uint8_t cmd, uint8_t *data, size_t datalen, uint8_t *respcode, uint8_t *resp, size_t *resplen); int DesfireExchangeEx(bool activate_field, DesfireContext *ctx, uint8_t cmd, uint8_t *data, size_t datalen, uint8_t *respcode, uint8_t *resp, size_t *resplen, bool enable_chaining, size_t splitbysize); +int DesfireReadSignature(DesfireContext *dctx, uint8_t sid, uint8_t *resp, size_t *resplen); + int DesfireSelectAID(DesfireContext *ctx, uint8_t *aid1, uint8_t *aid2); int DesfireSelectAIDHex(DesfireContext *ctx, uint32_t aid1, bool select_two, uint32_t aid2); int DesfireSelectAIDHexNoFieldOn(DesfireContext *ctx, uint32_t aid);