mirror of
https://github.com/DarkFlippers/unleashed-firmware.git
synced 2024-12-20 11:51:48 +03:00
890c9e87ce
* examples: plugins: utilize fal_embedded * libs: removed fnv1a_hash * furi: added FURI_PACKED; apps, libs: changed to use FURI_PACKED * lib: mbedtls: using custom config * lib: toolbox: removed md5, switched to mbedtls * targets: f18: link fix * lib: added mbedtls_cfg.h * apps: nfc: explicit dependency on libmbedtls * u2f: reworking to mbedtls * u2f: replaced sha256 & hmac with mbedtls * u2f: functional rework using mbedtls * libs: dropped micro-ecc * u2f: dropped old implementation * toolbox: removed sha256 impl * mcheck() for mbedtls * libs: removed libmisc; split into smaller libs * apps: debug: fixed display_test * apps: include cleanups * fbt: fixed VERSIONCOMSTR * furi: added FURI_CHECK_RETURN * lib: removed qrcode * cleanup * fbt: lint_py+format_py: fixed excessive command length * api: Removed bzero from f7 * api: Removed bzero from f18 * Bump API Symbols Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
230 lines
6.8 KiB
C
230 lines
6.8 KiB
C
#pragma once
|
|
|
|
#include <lib/nfc/protocols/iso14443_3a/iso14443_3a.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define MF_ULTRALIGHT_TEARING_FLAG_DEFAULT (0xBD)
|
|
|
|
#define MF_ULTRALIGHT_CMD_GET_VERSION (0x60)
|
|
#define MF_ULTRALIGHT_CMD_READ_PAGE (0x30)
|
|
#define MF_ULTRALIGHT_CMD_FAST_READ (0x3A)
|
|
#define MF_ULTRALIGHT_CMD_SECTOR_SELECT (0xC2)
|
|
#define MF_ULTRALIGHT_CMD_COMP_WRITE (0xA0)
|
|
#define MF_ULTRALIGHT_CMD_WRITE_PAGE (0xA2)
|
|
#define MF_ULTRALIGHT_CMD_FAST_WRITE (0xA6)
|
|
#define MF_ULTRALIGHT_CMD_READ_SIG (0x3C)
|
|
#define MF_ULTRALIGHT_CMD_READ_CNT (0x39)
|
|
#define MF_ULTRALIGHT_CMD_INCR_CNT (0xA5)
|
|
#define MF_ULTRALIGHT_CMD_CHECK_TEARING (0x3E)
|
|
#define MF_ULTRALIGHT_CMD_PWD_AUTH (0x1B)
|
|
#define MF_ULTRALIGHT_CMD_AUTH (0x1A)
|
|
#define MF_ULTRALIGHT_CMD_VCSL (0x4B)
|
|
|
|
#define MF_ULTRALIGHT_CMD_ACK (0x0A)
|
|
#define MF_ULTRALIGHT_CMD_NACK (0x00)
|
|
#define MF_ULTRALIGHT_CMD_AUTH_NAK (0x04)
|
|
|
|
#define MF_ULTRALIGHT_MAX_CNTR_VAL (0x00FFFFFF)
|
|
#define MF_ULTRALIGHT_MAX_PAGE_NUM (510)
|
|
#define MF_ULTRALIGHT_PAGE_SIZE (4U)
|
|
#define MF_ULTRALIGHT_SIGNATURE_SIZE (32)
|
|
#define MF_ULTRALIGHT_COUNTER_SIZE (3)
|
|
#define MF_ULTRALIGHT_COUNTER_NUM (3)
|
|
#define MF_ULTRALIGHT_TEARING_FLAG_SIZE (1)
|
|
#define MF_ULTRALIGHT_TEARING_FLAG_NUM (3)
|
|
#define MF_ULTRALIGHT_AUTH_PASSWORD_SIZE (4)
|
|
#define MF_ULTRALIGHT_AUTH_PACK_SIZE (2)
|
|
#define MF_ULTRALIGHT_AUTH_RESPONSE_SIZE (9)
|
|
|
|
typedef enum {
|
|
MfUltralightErrorNone,
|
|
MfUltralightErrorNotPresent,
|
|
MfUltralightErrorProtocol,
|
|
MfUltralightErrorAuth,
|
|
MfUltralightErrorTimeout,
|
|
} MfUltralightError;
|
|
|
|
typedef enum {
|
|
MfUltralightTypeUnknown,
|
|
MfUltralightTypeNTAG203,
|
|
MfUltralightTypeMfulC,
|
|
MfUltralightTypeUL11,
|
|
MfUltralightTypeUL21,
|
|
MfUltralightTypeNTAG213,
|
|
MfUltralightTypeNTAG215,
|
|
MfUltralightTypeNTAG216,
|
|
MfUltralightTypeNTAGI2C1K,
|
|
MfUltralightTypeNTAGI2C2K,
|
|
MfUltralightTypeNTAGI2CPlus1K,
|
|
MfUltralightTypeNTAGI2CPlus2K,
|
|
|
|
MfUltralightTypeNum,
|
|
} MfUltralightType;
|
|
|
|
typedef enum {
|
|
MfUltralightFeatureSupportReadVersion = (1U << 0),
|
|
MfUltralightFeatureSupportReadSignature = (1U << 1),
|
|
MfUltralightFeatureSupportReadCounter = (1U << 2),
|
|
MfUltralightFeatureSupportCheckTearingFlag = (1U << 3),
|
|
MfUltralightFeatureSupportFastRead = (1U << 4),
|
|
MfUltralightFeatureSupportIncCounter = (1U << 5),
|
|
MfUltralightFeatureSupportFastWrite = (1U << 6),
|
|
MfUltralightFeatureSupportCompatibleWrite = (1U << 7),
|
|
MfUltralightFeatureSupportPasswordAuth = (1U << 8),
|
|
MfUltralightFeatureSupportVcsl = (1U << 9),
|
|
MfUltralightFeatureSupportSectorSelect = (1U << 10),
|
|
MfUltralightFeatureSupportSingleCounter = (1U << 11),
|
|
MfUltralightFeatureSupportAsciiMirror = (1U << 12),
|
|
MfUltralightFeatureSupportCounterInMemory = (1U << 13),
|
|
MfUltralightFeatureSupportDynamicLock = (1U << 14),
|
|
MfUltralightFeatureSupportAuthenticate = (1U << 15),
|
|
} MfUltralightFeatureSupport;
|
|
|
|
typedef struct {
|
|
uint8_t data[MF_ULTRALIGHT_PAGE_SIZE];
|
|
} MfUltralightPage;
|
|
|
|
typedef struct {
|
|
MfUltralightPage page[4];
|
|
} MfUltralightPageReadCommandData;
|
|
|
|
typedef struct {
|
|
uint8_t header;
|
|
uint8_t vendor_id;
|
|
uint8_t prod_type;
|
|
uint8_t prod_subtype;
|
|
uint8_t prod_ver_major;
|
|
uint8_t prod_ver_minor;
|
|
uint8_t storage_size;
|
|
uint8_t protocol_type;
|
|
} MfUltralightVersion;
|
|
|
|
typedef struct {
|
|
uint8_t data[MF_ULTRALIGHT_SIGNATURE_SIZE];
|
|
} MfUltralightSignature;
|
|
|
|
typedef union {
|
|
uint32_t counter;
|
|
uint8_t data[MF_ULTRALIGHT_COUNTER_SIZE];
|
|
} MfUltralightCounter;
|
|
|
|
typedef struct {
|
|
uint8_t data;
|
|
} MfUltralightTearingFlag;
|
|
|
|
typedef struct {
|
|
uint8_t data[MF_ULTRALIGHT_AUTH_PASSWORD_SIZE];
|
|
} MfUltralightAuthPassword;
|
|
|
|
typedef struct {
|
|
uint8_t data[MF_ULTRALIGHT_AUTH_PACK_SIZE];
|
|
} MfUltralightAuthPack;
|
|
|
|
typedef enum {
|
|
MfUltralightMirrorNone,
|
|
MfUltralightMirrorUid,
|
|
MfUltralightMirrorCounter,
|
|
MfUltralightMirrorUidCounter,
|
|
} MfUltralightMirrorConf;
|
|
|
|
typedef struct FURI_PACKED {
|
|
union {
|
|
uint8_t value;
|
|
struct {
|
|
uint8_t rfui1 : 2;
|
|
bool strg_mod_en : 1;
|
|
bool rfui2 : 1;
|
|
uint8_t mirror_byte : 2;
|
|
MfUltralightMirrorConf mirror_conf : 2;
|
|
};
|
|
} mirror;
|
|
uint8_t rfui1;
|
|
uint8_t mirror_page;
|
|
uint8_t auth0;
|
|
union {
|
|
uint8_t value;
|
|
struct {
|
|
uint8_t authlim : 3;
|
|
bool nfc_cnt_pwd_prot : 1;
|
|
bool nfc_cnt_en : 1;
|
|
bool nfc_dis_sec1 : 1; // NTAG I2C Plus only
|
|
bool cfglck : 1;
|
|
bool prot : 1;
|
|
};
|
|
} access;
|
|
uint8_t vctid;
|
|
uint8_t rfui2[2];
|
|
MfUltralightAuthPassword password;
|
|
MfUltralightAuthPack pack;
|
|
uint8_t rfui3[2];
|
|
} MfUltralightConfigPages;
|
|
|
|
typedef struct {
|
|
Iso14443_3aData* iso14443_3a_data;
|
|
MfUltralightType type;
|
|
MfUltralightVersion version;
|
|
MfUltralightSignature signature;
|
|
MfUltralightCounter counter[MF_ULTRALIGHT_COUNTER_NUM];
|
|
MfUltralightTearingFlag tearing_flag[MF_ULTRALIGHT_TEARING_FLAG_NUM];
|
|
MfUltralightPage page[MF_ULTRALIGHT_MAX_PAGE_NUM];
|
|
uint16_t pages_read;
|
|
uint16_t pages_total;
|
|
uint32_t auth_attempts;
|
|
} MfUltralightData;
|
|
|
|
extern const NfcDeviceBase nfc_device_mf_ultralight;
|
|
|
|
MfUltralightData* mf_ultralight_alloc();
|
|
|
|
void mf_ultralight_free(MfUltralightData* data);
|
|
|
|
void mf_ultralight_reset(MfUltralightData* data);
|
|
|
|
void mf_ultralight_copy(MfUltralightData* data, const MfUltralightData* other);
|
|
|
|
bool mf_ultralight_verify(MfUltralightData* data, const FuriString* device_type);
|
|
|
|
bool mf_ultralight_load(MfUltralightData* data, FlipperFormat* ff, uint32_t version);
|
|
|
|
bool mf_ultralight_save(const MfUltralightData* data, FlipperFormat* ff);
|
|
|
|
bool mf_ultralight_is_equal(const MfUltralightData* data, const MfUltralightData* other);
|
|
|
|
const char*
|
|
mf_ultralight_get_device_name(const MfUltralightData* data, NfcDeviceNameType name_type);
|
|
|
|
const uint8_t* mf_ultralight_get_uid(const MfUltralightData* data, size_t* uid_len);
|
|
|
|
bool mf_ultralight_set_uid(MfUltralightData* data, const uint8_t* uid, size_t uid_len);
|
|
|
|
Iso14443_3aData* mf_ultralight_get_base_data(const MfUltralightData* data);
|
|
|
|
MfUltralightType mf_ultralight_get_type_by_version(MfUltralightVersion* version);
|
|
|
|
uint16_t mf_ultralight_get_pages_total(MfUltralightType type);
|
|
|
|
uint32_t mf_ultralight_get_feature_support_set(MfUltralightType type);
|
|
|
|
uint16_t mf_ultralight_get_config_page_num(MfUltralightType type);
|
|
|
|
uint8_t mf_ultralight_get_pwd_page_num(MfUltralightType type);
|
|
|
|
bool mf_ultralight_is_page_pwd_or_pack(MfUltralightType type, uint16_t page_num);
|
|
|
|
bool mf_ultralight_support_feature(const uint32_t feature_set, const uint32_t features_to_check);
|
|
|
|
bool mf_ultralight_get_config_page(const MfUltralightData* data, MfUltralightConfigPages** config);
|
|
|
|
bool mf_ultralight_is_all_data_read(const MfUltralightData* data);
|
|
|
|
bool mf_ultralight_detect_protocol(const Iso14443_3aData* iso14443_3a_data);
|
|
|
|
bool mf_ultralight_is_counter_configured(const MfUltralightData* data);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|