* added support for ISO15693 (NfcV) emulation, added support for reading SLIX tags * SLIX: fixed crash situation when an invalid password was requested * ISO15693: show emulate menu when opening file * rename NfcV emulate scene to match other NfcV names * optimize allocation size for signals * ISO15693: further optimizations of allocation and free code * ISO15693: reduce latency on state machine reset * respond with block security status when option flag is set * increased maximum memory size to match standard added security status handling/load/save added SELECT/QUIET handling more fine grained allocation routines and checks fix memset sizes * added "Listen NfcV Reader" to sniff traffic from reader to card * added correct description to delete menu * also added DSFID/AFI handling and locking * increase sniff log size * scale NfcV frequency a bit, add echo mode, fix signal level at the end * use symbolic modulated/unmodulated GPIO levels * honor AFI field, decrease verbosity and removed debug code * refactor defines for less namespace pollution by using NFCV_ prefixes * correct an oversight that original cards return an generic error when addressing outside block range * use inverse modulation, increasing readable range significantly * rework and better document nfc chip initialization * nfcv code review fixes * Disable accidentally left on signal debug gpio output * Improve NFCV Read/Info GUIs. Authored by @xMasterX, committed by @nvx * Fix crash that occurs when you exit from NFCV emulation and start it again. Authored by @xMasterX, committed by @nvx * Remove delay from emulation loop. This improves compatibility when the reader is Android. * Lib: digital signal debug output pin info Co-authored-by: Tiernan Messmer <tiernan.messmer@gmail.com> Co-authored-by: MX <10697207+xMasterX@users.noreply.github.com> Co-authored-by: gornekich <n.gorbadey@gmail.com> Co-authored-by: あく <alleteam@gmail.com>
		
			
				
	
	
		
			100 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#pragma once
 | 
						|
 | 
						|
#include "nfc_device.h"
 | 
						|
 | 
						|
typedef struct NfcWorker NfcWorker;
 | 
						|
 | 
						|
typedef enum {
 | 
						|
    // Init states
 | 
						|
    NfcWorkerStateNone,
 | 
						|
    NfcWorkerStateReady,
 | 
						|
    // Main worker states
 | 
						|
    NfcWorkerStateRead,
 | 
						|
    NfcWorkerStateUidEmulate,
 | 
						|
    NfcWorkerStateMfUltralightEmulate,
 | 
						|
    NfcWorkerStateMfClassicEmulate,
 | 
						|
    NfcWorkerStateMfClassicWrite,
 | 
						|
    NfcWorkerStateMfClassicUpdate,
 | 
						|
    NfcWorkerStateReadMfUltralightReadAuth,
 | 
						|
    NfcWorkerStateMfClassicDictAttack,
 | 
						|
    NfcWorkerStateAnalyzeReader,
 | 
						|
    NfcWorkerStateNfcVEmulate,
 | 
						|
    NfcWorkerStateNfcVUnlock,
 | 
						|
    NfcWorkerStateNfcVUnlockAndSave,
 | 
						|
    NfcWorkerStateNfcVSniff,
 | 
						|
    // Debug
 | 
						|
    NfcWorkerStateEmulateApdu,
 | 
						|
    NfcWorkerStateField,
 | 
						|
    // Transition
 | 
						|
    NfcWorkerStateStop,
 | 
						|
} NfcWorkerState;
 | 
						|
 | 
						|
typedef enum {
 | 
						|
    // Reserve first 50 events for application events
 | 
						|
    NfcWorkerEventReserved = 50,
 | 
						|
 | 
						|
    // Nfc read events
 | 
						|
    NfcWorkerEventReadUidNfcB,
 | 
						|
    NfcWorkerEventReadUidNfcV,
 | 
						|
    NfcWorkerEventReadUidNfcF,
 | 
						|
    NfcWorkerEventReadUidNfcA,
 | 
						|
    NfcWorkerEventReadMfUltralight,
 | 
						|
    NfcWorkerEventReadMfDesfire,
 | 
						|
    NfcWorkerEventReadMfClassicDone,
 | 
						|
    NfcWorkerEventReadMfClassicLoadKeyCache,
 | 
						|
    NfcWorkerEventReadMfClassicDictAttackRequired,
 | 
						|
    NfcWorkerEventReadNfcV,
 | 
						|
 | 
						|
    // Nfc worker common events
 | 
						|
    NfcWorkerEventSuccess,
 | 
						|
    NfcWorkerEventFail,
 | 
						|
    NfcWorkerEventAborted,
 | 
						|
    NfcWorkerEventCardDetected,
 | 
						|
    NfcWorkerEventNoCardDetected,
 | 
						|
    NfcWorkerEventWrongCardDetected,
 | 
						|
 | 
						|
    // Read Mifare Classic events
 | 
						|
    NfcWorkerEventNoDictFound,
 | 
						|
    NfcWorkerEventNewSector,
 | 
						|
    NfcWorkerEventNewDictKeyBatch,
 | 
						|
    NfcWorkerEventFoundKeyA,
 | 
						|
    NfcWorkerEventFoundKeyB,
 | 
						|
    NfcWorkerEventKeyAttackStart,
 | 
						|
    NfcWorkerEventKeyAttackStop,
 | 
						|
    NfcWorkerEventKeyAttackNextSector,
 | 
						|
 | 
						|
    // Write Mifare Classic events
 | 
						|
    NfcWorkerEventWrongCard,
 | 
						|
 | 
						|
    // Detect Reader events
 | 
						|
    NfcWorkerEventDetectReaderDetected,
 | 
						|
    NfcWorkerEventDetectReaderLost,
 | 
						|
    NfcWorkerEventDetectReaderMfkeyCollected,
 | 
						|
 | 
						|
    // Mifare Ultralight events
 | 
						|
    NfcWorkerEventMfUltralightPassKey, // NFC worker requesting manual key
 | 
						|
    NfcWorkerEventMfUltralightPwdAuth, // Reader sent auth command
 | 
						|
    NfcWorkerEventNfcVPassKey, // NFC worker requesting manual key
 | 
						|
    NfcWorkerEventNfcVCommandExecuted,
 | 
						|
    NfcWorkerEventNfcVContentChanged,
 | 
						|
} NfcWorkerEvent;
 | 
						|
 | 
						|
typedef bool (*NfcWorkerCallback)(NfcWorkerEvent event, void* context);
 | 
						|
 | 
						|
NfcWorker* nfc_worker_alloc();
 | 
						|
 | 
						|
NfcWorkerState nfc_worker_get_state(NfcWorker* nfc_worker);
 | 
						|
 | 
						|
void nfc_worker_free(NfcWorker* nfc_worker);
 | 
						|
 | 
						|
void nfc_worker_start(
 | 
						|
    NfcWorker* nfc_worker,
 | 
						|
    NfcWorkerState state,
 | 
						|
    NfcDeviceData* dev_data,
 | 
						|
    NfcWorkerCallback callback,
 | 
						|
    void* context);
 | 
						|
 | 
						|
void nfc_worker_stop(NfcWorker* nfc_worker);
 | 
						|
void nfc_worker_nfcv_unlock(NfcWorker* nfc_worker);
 | 
						|
void nfc_worker_nfcv_emulate(NfcWorker* nfc_worker);
 | 
						|
void nfc_worker_nfcv_sniff(NfcWorker* nfc_worker); |