mifare_nested_worker.h 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #pragma once
  2. #include <lib/nfc/nfc_device.h>
  3. #define NESTED_FOLDER EXT_PATH("nfc/.nested")
  4. typedef struct MifareNestedWorker MifareNestedWorker;
  5. typedef enum {
  6. MifareNestedWorkerStateReady,
  7. MifareNestedWorkerStateCheck,
  8. MifareNestedWorkerStateCollecting,
  9. MifareNestedWorkerStateCollectingStatic,
  10. MifareNestedWorkerStateCollectingHard,
  11. MifareNestedWorkerStateValidating,
  12. MifareNestedWorkerStateStop,
  13. } MifareNestedWorkerState;
  14. typedef enum {
  15. MifareNestedWorkerEventReserved = 1000,
  16. MifareNestedWorkerEventNoTagDetected,
  17. MifareNestedWorkerEventNoncesCollected,
  18. MifareNestedWorkerEventCollecting,
  19. MifareNestedWorkerEventNewNonce,
  20. MifareNestedWorkerEventKeyChecked,
  21. MifareNestedWorkerEventKeysFound,
  22. MifareNestedWorkerEventNeedKey,
  23. MifareNestedWorkerEventAttackFailed,
  24. MifareNestedWorkerEventCalibrating,
  25. MifareNestedWorkerEventStaticEncryptedNonce,
  26. MifareNestedWorkerEventNeedPrediction,
  27. MifareNestedWorkerEventProcessingKeys,
  28. MifareNestedWorkerEventNeedKeyRecovery,
  29. MifareNestedWorkerEventNeedCollection,
  30. MifareNestedWorkerEventHardnestedStatesFound
  31. } MifareNestedWorkerEvent;
  32. typedef bool (*MifareNestedWorkerCallback)(MifareNestedWorkerEvent event, void* context);
  33. MifareNestedWorker* mifare_nested_worker_alloc();
  34. void mifare_nested_worker_change_state(
  35. MifareNestedWorker* mifare_nested_worker,
  36. MifareNestedWorkerState state);
  37. void mifare_nested_worker_free(MifareNestedWorker* mifare_nested_worker);
  38. void mifare_nested_worker_stop(MifareNestedWorker* mifare_nested_worker);
  39. void mifare_nested_worker_start(
  40. MifareNestedWorker* mifare_nested_worker,
  41. MifareNestedWorkerState state,
  42. NfcDeviceData* dev_data,
  43. MifareNestedWorkerCallback callback,
  44. void* context);
  45. typedef struct {
  46. uint32_t key_type;
  47. uint32_t block;
  48. uint32_t target_nt[2];
  49. uint32_t target_ks[2];
  50. uint8_t parity[2][4];
  51. bool collected;
  52. bool skipped;
  53. bool hardnested;
  54. } Nonces;
  55. typedef struct {
  56. uint32_t cuid;
  57. uint32_t sector_count;
  58. // 40 (or 16/5) sectors, 2 keys (A/B), 3 tries
  59. Nonces* nonces[40][2][3];
  60. uint32_t tries;
  61. // unique first bytes
  62. uint32_t hardnested_states;
  63. } NonceList_t;
  64. typedef struct {
  65. uint32_t total_keys;
  66. uint32_t checked_keys;
  67. uint32_t found_keys;
  68. uint32_t added_keys;
  69. uint32_t sector_keys;
  70. bool tag_lost;
  71. } KeyInfo_t;