mifare_nested_worker.h 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #pragma once
  2. #include "lib/nfclegacy/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. MifareNestedWorkerEventNoNoncesCollected,
  18. MifareNestedWorkerEventNoncesCollected,
  19. MifareNestedWorkerEventCollecting,
  20. MifareNestedWorkerEventNewNonce,
  21. MifareNestedWorkerEventKeyChecked,
  22. MifareNestedWorkerEventKeysFound,
  23. MifareNestedWorkerEventNeedKey,
  24. MifareNestedWorkerEventAttackFailed,
  25. MifareNestedWorkerEventCalibrating,
  26. MifareNestedWorkerEventStaticEncryptedNonce,
  27. MifareNestedWorkerEventNeedPrediction,
  28. MifareNestedWorkerEventProcessingKeys,
  29. MifareNestedWorkerEventNeedKeyRecovery,
  30. MifareNestedWorkerEventNeedCollection,
  31. MifareNestedWorkerEventHardnestedStatesFound
  32. } MifareNestedWorkerEvent;
  33. typedef bool (*MifareNestedWorkerCallback)(MifareNestedWorkerEvent event, void* context);
  34. MifareNestedWorker* mifare_nested_worker_alloc();
  35. void mifare_nested_worker_change_state(
  36. MifareNestedWorker* mifare_nested_worker,
  37. MifareNestedWorkerState state);
  38. void mifare_nested_worker_free(MifareNestedWorker* mifare_nested_worker);
  39. void mifare_nested_worker_stop(MifareNestedWorker* mifare_nested_worker);
  40. void mifare_nested_worker_start(
  41. MifareNestedWorker* mifare_nested_worker,
  42. MifareNestedWorkerState state,
  43. NfcDeviceData* dev_data,
  44. MifareNestedWorkerCallback callback,
  45. void* context);
  46. typedef struct {
  47. uint32_t key_type;
  48. uint32_t block;
  49. uint32_t target_nt[2];
  50. uint32_t target_ks[2];
  51. uint8_t parity[2][4];
  52. bool skipped;
  53. bool from_start;
  54. bool invalid;
  55. bool collected;
  56. bool hardnested;
  57. } Nonces;
  58. typedef struct {
  59. uint32_t cuid;
  60. uint32_t sector_count;
  61. // 40 (or 16/5) sectors, 2 keys (A/B), 3 tries
  62. Nonces* nonces[40][2][3];
  63. uint32_t tries;
  64. // unique first bytes
  65. uint32_t hardnested_states;
  66. } NonceList_t;
  67. typedef struct {
  68. uint32_t total_keys;
  69. uint32_t checked_keys;
  70. uint32_t found_keys;
  71. uint32_t added_keys;
  72. uint32_t sector_keys;
  73. bool tag_lost;
  74. } KeyInfo_t;
  75. typedef struct {
  76. uint32_t saved;
  77. uint32_t invalid;
  78. uint32_t skipped;
  79. } SaveNoncesResult_t;