mifare_nested_worker.h 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. 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 invalid;
  54. bool collected;
  55. bool hardnested;
  56. } Nonces;
  57. typedef struct {
  58. uint32_t cuid;
  59. uint32_t sector_count;
  60. // 40 (or 16/5) sectors, 2 keys (A/B), 3 tries
  61. Nonces* nonces[40][2][3];
  62. uint32_t tries;
  63. // unique first bytes
  64. uint32_t hardnested_states;
  65. } NonceList_t;
  66. typedef struct {
  67. uint32_t total_keys;
  68. uint32_t checked_keys;
  69. uint32_t found_keys;
  70. uint32_t added_keys;
  71. uint32_t sector_keys;
  72. bool tag_lost;
  73. } KeyInfo_t;
  74. typedef struct {
  75. uint32_t saved;
  76. uint32_t invalid;
  77. uint32_t skipped;
  78. } SaveNoncesResult_t;