mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2024-09-24 09:16:13 +08:00
278 lines
13 KiB
C
278 lines
13 KiB
C
//-----------------------------------------------------------------------------
|
|
// Borrowed initially from https://github.com/nfc-tools/libfreefare
|
|
// Copyright (C) 2010, Romain Tartiere.
|
|
// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details.
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// See LICENSE.txt for the text of the license.
|
|
//-----------------------------------------------------------------------------
|
|
// High frequency Desfire core functions
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#ifndef __DESFIRECORE_H
|
|
#define __DESFIRECORE_H
|
|
|
|
#include "common.h"
|
|
#include "cliparser.h"
|
|
#include "mifare/desfirecrypto.h"
|
|
|
|
#define DESFIRE_TX_FRAME_MAX_LEN 54
|
|
#define DESFIRE_BUFFER_SIZE 65538
|
|
|
|
enum DesfireISOSelectControlEnum {
|
|
ISSMFDFEF = 0x00,
|
|
ISSChildDF = 0x01,
|
|
ISSEFByFileID = 0x02,
|
|
ISSParentDF = 0x03,
|
|
ISSDFName = 0x04
|
|
};
|
|
typedef enum DesfireISOSelectControlEnum DesfireISOSelectControl;
|
|
|
|
enum DesfireISOSelectWayEnum {
|
|
ISW6bAID,
|
|
ISWMF,
|
|
ISWIsoID,
|
|
ISWDFName
|
|
};
|
|
typedef enum DesfireISOSelectWayEnum DesfireISOSelectWay;
|
|
|
|
typedef struct {
|
|
const uint8_t id;
|
|
const char *text;
|
|
const uint8_t cmd;
|
|
const uint8_t len;
|
|
const uint8_t createlen;
|
|
const bool mayHaveISOfid;
|
|
} DesfireCreateFileCommands_t;
|
|
|
|
typedef struct {
|
|
// all
|
|
uint8_t fileType;
|
|
uint8_t fileOption;
|
|
uint8_t fileCommMode;
|
|
DesfireCommunicationMode commMode;
|
|
bool additionalAccessRightsEn;
|
|
uint16_t rawAccessRights;
|
|
uint8_t rAccess;
|
|
uint8_t wAccess;
|
|
uint8_t rwAccess;
|
|
uint8_t chAccess;
|
|
|
|
// data
|
|
uint32_t fileSize;
|
|
|
|
//value
|
|
uint32_t lowerLimit;
|
|
uint32_t upperLimit;
|
|
uint32_t value;
|
|
uint8_t limitedCredit;
|
|
|
|
// record
|
|
uint32_t recordSize;
|
|
uint32_t maxRecordCount;
|
|
uint32_t curRecordCount;
|
|
|
|
//mac
|
|
uint8_t keyType;
|
|
uint8_t key[16];
|
|
uint8_t keyVersion;
|
|
|
|
// additional rights
|
|
uint8_t additionalAccessRightsLength;
|
|
uint16_t additionalAccessRights[16];
|
|
|
|
} FileSettings_t;
|
|
|
|
typedef struct {
|
|
uint8_t fileNum;
|
|
uint16_t fileISONum;
|
|
FileSettings_t fileSettings;
|
|
} FileListElm_t;
|
|
|
|
typedef FileListElm_t FileList_t[32];
|
|
|
|
typedef struct {
|
|
bool checked;
|
|
bool auth;
|
|
bool authISO;
|
|
bool authAES;
|
|
bool authEV2;
|
|
bool authISONative;
|
|
bool authLRP;
|
|
} AuthCommandsChk_t;
|
|
|
|
typedef struct {
|
|
uint32_t appNum;
|
|
uint16_t appISONum;
|
|
char appDFName[16];
|
|
AuthCommandsChk_t authCmdCheck;
|
|
|
|
uint8_t keySettings;
|
|
uint8_t numKeysRaw;
|
|
bool isoFileIDEnabled; // from numKeysRaw
|
|
uint8_t numberOfKeys; // from numKeysRaw
|
|
DesfireCryptoAlgorithm keyType; // from numKeysRaw
|
|
|
|
uint8_t keyVersions[16];
|
|
|
|
bool filesReaded;
|
|
size_t filesCount;
|
|
bool isoPresent;
|
|
FileList_t fileList;
|
|
} AppListElm_t;
|
|
typedef AppListElm_t AppListS[64];
|
|
|
|
typedef struct {
|
|
size_t appCount;
|
|
uint32_t freemem;
|
|
AuthCommandsChk_t authCmdCheck;
|
|
|
|
uint8_t keySettings;
|
|
uint8_t numKeysRaw;
|
|
uint8_t numberOfKeys; // from numKeysRaw
|
|
|
|
uint8_t keyVersion0;
|
|
} PICCInfo_t;
|
|
|
|
typedef enum {
|
|
RFTAuto,
|
|
RFTData,
|
|
RFTValue,
|
|
RFTRecord,
|
|
RFTMAC,
|
|
} DesfireReadOpFileType;
|
|
|
|
extern const CLIParserOption DesfireAlgoOpts[];
|
|
extern const CLIParserOption DesfireKDFAlgoOpts[];
|
|
extern const CLIParserOption DesfireCommunicationModeOpts[];
|
|
extern const CLIParserOption DesfireCommandSetOpts[];
|
|
extern const CLIParserOption DesfireSecureChannelOpts[];
|
|
extern const CLIParserOption DesfireFileAccessModeOpts[];
|
|
extern const CLIParserOption DesfireValueFileOperOpts[];
|
|
extern const CLIParserOption DesfireReadFileTypeOpts[];
|
|
|
|
const char *DesfireGetErrorString(int res, uint16_t *sw);
|
|
uint32_t DesfireAIDByteToUint(const uint8_t *data);
|
|
void DesfireAIDUintToByte(uint32_t aid, uint8_t *data);
|
|
|
|
void DesfirePrintContext(DesfireContext_t *ctx);
|
|
|
|
int DesfireExchange(DesfireContext_t *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_t *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_t *dctx, uint8_t sid, uint8_t *resp, size_t *resplen);
|
|
|
|
int DesfireAnticollision(bool verbose);
|
|
int DesfireSelectAID(DesfireContext_t *ctx, uint8_t *aid1, uint8_t *aid2);
|
|
int DesfireSelectAIDHex(DesfireContext_t *ctx, uint32_t aid1, bool select_two, uint32_t aid2);
|
|
int DesfireSelectAIDHexNoFieldOn(DesfireContext_t *ctx, uint32_t aid);
|
|
void DesfirePrintAIDFunctions(uint32_t appid);
|
|
void DesfirePrintMADAID(uint32_t appid, bool verbose);
|
|
|
|
int DesfireGetCardUID(DesfireContext_t *ctx);
|
|
|
|
const char *DesfireSelectWayToStr(DesfireISOSelectWay way);
|
|
char *DesfireWayIDStr(DesfireISOSelectWay way, uint32_t id);
|
|
bool DesfireMFSelected(DesfireISOSelectWay way, uint32_t id);
|
|
int DesfireSelectEx(DesfireContext_t *ctx, bool fieldon, DesfireISOSelectWay way, uint32_t id, const char *dfname);
|
|
int DesfireSelect(DesfireContext_t *ctx, DesfireISOSelectWay way, uint32_t id, char *dfname);
|
|
|
|
const char *DesfireAuthErrorToStr(int error);
|
|
int DesfireSelectAndAuthenticate(DesfireContext_t *dctx, DesfireSecureChannel secureChannel, uint32_t aid, bool verbose);
|
|
int DesfireSelectAndAuthenticateEx(DesfireContext_t *dctx, DesfireSecureChannel secureChannel, uint32_t aid, bool noauth, bool verbose);
|
|
int DesfireSelectAndAuthenticateW(DesfireContext_t *dctx, DesfireSecureChannel secureChannel, DesfireISOSelectWay way, uint32_t id, bool selectfile, uint16_t isofileid, bool noauth, bool verbose);
|
|
int DesfireSelectAndAuthenticateAppW(DesfireContext_t *dctx, DesfireSecureChannel secureChannel, DesfireISOSelectWay way, uint32_t id, bool noauth, bool verbose);
|
|
int DesfireSelectAndAuthenticateISO(DesfireContext_t *dctx, DesfireSecureChannel secureChannel, bool useaid, uint32_t aid, uint16_t isoappid, bool selectfile, uint16_t isofileid, bool noauth, bool verbose);
|
|
int DesfireAuthenticate(DesfireContext_t *dctx, DesfireSecureChannel secureChannel, bool verbose);
|
|
|
|
bool DesfireCheckAuthCmd(DesfireISOSelectWay way, uint32_t appID, uint8_t keyNum, uint8_t authcmd, bool checklrp);
|
|
void DesfireCheckAuthCommands(DesfireISOSelectWay way, uint32_t appID, char *dfname, uint8_t keyNum, AuthCommandsChk_t *authCmdCheck);
|
|
void DesfireCheckAuthCommandsPrint(AuthCommandsChk_t *authCmdCheck);
|
|
|
|
int DesfireFormatPICC(DesfireContext_t *dctx);
|
|
int DesfireGetFreeMem(DesfireContext_t *dctx, uint32_t *freemem);
|
|
int DesfireGetUID(DesfireContext_t *dctx, uint8_t *resp, size_t *resplen);
|
|
int DesfireGetAIDList(DesfireContext_t *dctx, uint8_t *resp, size_t *resplen);
|
|
int DesfireGetDFList(DesfireContext_t *dctx, uint8_t *resp, size_t *resplen);
|
|
int DesfireFillPICCInfo(DesfireContext_t *dctx, PICCInfo_t *PICCInfo, bool deepmode);
|
|
int DesfireFillAppList(DesfireContext_t *dctx, PICCInfo_t *PICCInfo, AppListS appList, bool deepmode, bool readFiles, bool fillAppSettings);
|
|
void DesfirePrintPICCInfo(DesfireContext_t *dctx, PICCInfo_t *PICCInfo);
|
|
void DesfirePrintAppList(DesfireContext_t *dctx, PICCInfo_t *PICCInfo, AppListS appList);
|
|
|
|
int DesfireCreateApplication(DesfireContext_t *dctx, uint8_t *appdata, size_t appdatalen);
|
|
int DesfireDeleteApplication(DesfireContext_t *dctx, uint32_t aid);
|
|
|
|
int DesfireGetKeyVersion(DesfireContext_t *dctx, uint8_t *data, size_t len, uint8_t *resp, size_t *resplen);
|
|
int DesfireGetKeySettings(DesfireContext_t *dctx, uint8_t *resp, size_t *resplen);
|
|
int DesfireChangeKeySettings(DesfireContext_t *dctx, uint8_t *data, size_t len);
|
|
void PrintKeySettings(uint8_t keysettings, uint8_t numkeys, bool applevel, bool print2ndbyte);
|
|
|
|
int DesfireChangeKeyCmd(DesfireContext_t *dctx, uint8_t *data, size_t datalen, uint8_t *resp, size_t *resplen);
|
|
int DesfireChangeKey(DesfireContext_t *dctx, bool change_master_key, uint8_t newkeynum, DesfireCryptoAlgorithm newkeytype, uint32_t newkeyver, uint8_t *newkey, DesfireCryptoAlgorithm oldkeytype, uint8_t *oldkey, bool verbose);
|
|
|
|
int DesfireSetConfigurationCmd(DesfireContext_t *dctx, uint8_t *data, size_t len, uint8_t *resp, size_t *resplen);
|
|
int DesfireSetConfiguration(DesfireContext_t *dctx, uint8_t paramid, uint8_t *param, size_t paramlen);
|
|
|
|
int DesfireFillFileList(DesfireContext_t *dctx, FileList_t FileList, size_t *filescount, bool *isopresent);
|
|
int DesfireGetFileIDList(DesfireContext_t *dctx, uint8_t *resp, size_t *resplen);
|
|
int DesfireGetFileISOIDList(DesfireContext_t *dctx, uint8_t *resp, size_t *resplen);
|
|
|
|
void DesfireFillFileSettings(uint8_t *data, size_t datalen, FileSettings_t *fsettings);
|
|
void DesfirePrintFileSettingsOneLine(FileSettings_t *fsettings);
|
|
void DesfirePrintFileSettingsTable(bool printheader, uint8_t id, bool isoidavail, uint16_t isoid, FileSettings_t *fsettings);
|
|
void DesfirePrintFileSettingsExtended(FileSettings_t *fsettings);
|
|
int DesfireGetFileSettings(DesfireContext_t *dctx, uint8_t fileid, uint8_t *resp, size_t *resplen);
|
|
int DesfireFileSettingsStruct(DesfireContext_t *dctx, uint8_t fileid, FileSettings_t *fsettings);
|
|
int DesfireChangeFileSettings(DesfireContext_t *dctx, uint8_t *data, size_t datalen);
|
|
|
|
const DesfireCreateFileCommands_t *GetDesfireFileCmdRec(uint8_t type);
|
|
const char *GetDesfireAccessRightStr(uint8_t right);
|
|
const char *GetDesfireAccessRightShortStr(uint8_t right);
|
|
void DesfireEncodeFileAcessMode(uint8_t *mode, uint8_t r, uint8_t w, uint8_t rw, uint8_t ch);
|
|
void DesfireDecodeFileAcessMode(const uint8_t *mode, uint8_t *r, uint8_t *w, uint8_t *rw, uint8_t *ch);
|
|
void DesfirePrintAccessRight(uint8_t *data);
|
|
void DesfirePrintFileSettings(uint8_t *data, size_t len);
|
|
void DesfirePrintSetFileSettings(uint8_t *data, size_t len);
|
|
void DesfirePrintCreateFileSettings(uint8_t filetype, uint8_t *data, size_t len);
|
|
|
|
const char *GetDesfireFileType(uint8_t type);
|
|
int DesfireCreateFile(DesfireContext_t *dctx, uint8_t ftype, uint8_t *fdata, size_t fdatalen, bool checklen);
|
|
int DesfireDeleteFile(DesfireContext_t *dctx, uint8_t fnum);
|
|
int DesfireCommitReaderID(DesfireContext_t *dctx, uint8_t *readerid, size_t readeridlen, uint8_t *resp, size_t *resplen);
|
|
int DesfireCommitTransactionEx(DesfireContext_t *dctx, bool enable_options, uint8_t options, uint8_t *resp, size_t *resplen);
|
|
int DesfireCommitTransaction(DesfireContext_t *dctx, bool enable_options, uint8_t options);
|
|
int DesfireAbortTransaction(DesfireContext_t *dctx);
|
|
|
|
int DesfireValueFileOperations(DesfireContext_t *dctx, uint8_t fid, uint8_t operation, uint32_t *value);
|
|
int DesfireClearRecordFile(DesfireContext_t *dctx, uint8_t fnum);
|
|
|
|
int DesfireReadFile(DesfireContext_t *dctx, uint8_t fnum, uint32_t offset, uint32_t len, uint8_t *resp, size_t *resplen);
|
|
int DesfireWriteFile(DesfireContext_t *dctx, uint8_t fnum, uint32_t offset, uint32_t len, uint8_t *data);
|
|
int DesfireReadRecords(DesfireContext_t *dctx, uint8_t fnum, uint32_t recnum, uint32_t reccount, uint8_t *resp, size_t *resplen);
|
|
int DesfireWriteRecord(DesfireContext_t *dctx, uint8_t fnum, uint32_t offset, uint32_t len, uint8_t *data);
|
|
int DesfireUpdateRecord(DesfireContext_t *dctx, uint8_t fnum, uint32_t recnum, uint32_t offset, uint32_t len, uint8_t *data);
|
|
|
|
int DesfireISOSelectDF(DesfireContext_t *dctx, char *dfname, uint8_t *resp, size_t *resplen);
|
|
int DesfireISOSelect(DesfireContext_t *dctx, DesfireISOSelectControl cntr, uint8_t *data, uint8_t datalen, uint8_t *resp, size_t *resplen);
|
|
int DesfireISOSelectFile(DesfireContext_t *dctx, char *appdfname, uint16_t appid, uint16_t fileid);
|
|
int DesfireISOSelectEx(DesfireContext_t *dctx, bool fieldon, DesfireISOSelectControl cntr, uint8_t *data, uint8_t datalen, uint8_t *resp, size_t *resplen);
|
|
int DesfireISOGetChallenge(DesfireContext_t *dctx, DesfireCryptoAlgorithm keytype, uint8_t *resp, size_t *resplen);
|
|
int DesfireISOExternalAuth(DesfireContext_t *dctx, bool app_level, uint8_t keynum, DesfireCryptoAlgorithm keytype, uint8_t *data);
|
|
int DesfireISOInternalAuth(DesfireContext_t *dctx, bool app_level, uint8_t keynum, DesfireCryptoAlgorithm keytype, uint8_t *data, uint8_t *resp, size_t *resplen);
|
|
|
|
int DesfireISOReadBinary(DesfireContext_t *dctx, bool use_file_id, uint8_t fileid, uint16_t offset, uint8_t length, uint8_t *resp, size_t *resplen);
|
|
int DesfireISOUpdateBinary(DesfireContext_t *dctx, bool use_file_id, uint8_t fileid, uint16_t offset, uint8_t *data, size_t datalen);
|
|
int DesfireISOReadRecords(DesfireContext_t *dctx, uint8_t recordnum, bool read_all_records, uint8_t fileid, uint8_t length, uint8_t *resp, size_t *resplen);
|
|
int DesfireISOAppendRecord(DesfireContext_t *dctx, uint8_t fileid, uint8_t *data, size_t datalen);
|
|
|
|
#endif // __DESFIRECORE_H
|