mifare_nested_worker.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. MifareNestedWorkerStateValidating,
  11. MifareNestedWorkerStateStop,
  12. } MifareNestedWorkerState;
  13. typedef enum {
  14. MifareNestedWorkerEventReserved = 1000,
  15. MifareNestedWorkerEventNoTagDetected,
  16. MifareNestedWorkerEventNoncesCollected,
  17. MifareNestedWorkerEventCollecting,
  18. MifareNestedWorkerEventNewNonce,
  19. MifareNestedWorkerEventKeyChecked,
  20. MifareNestedWorkerEventKeysFound,
  21. MifareNestedWorkerEventNeedKey,
  22. MifareNestedWorkerEventAttackFailed,
  23. MifareNestedWorkerEventCalibrating,
  24. MifareNestedWorkerEventUnpredictablePRNG,
  25. MifareNestedWorkerEventNeedPrediction,
  26. MifareNestedWorkerEventProcessingKeys,
  27. MifareNestedWorkerEventNeedKeyRecovery,
  28. MifareNestedWorkerEventNeedCollection
  29. } MifareNestedWorkerEvent;
  30. typedef bool (*MifareNestedWorkerCallback)(MifareNestedWorkerEvent event, void* context);
  31. MifareNestedWorker* mifare_nested_worker_alloc();
  32. void mifare_nested_worker_change_state(
  33. MifareNestedWorker* mifare_nested_worker,
  34. MifareNestedWorkerState state);
  35. void mifare_nested_worker_free(MifareNestedWorker* mifare_nested_worker);
  36. void mifare_nested_worker_stop(MifareNestedWorker* mifare_nested_worker);
  37. void mifare_nested_worker_start(
  38. MifareNestedWorker* mifare_nested_worker,
  39. MifareNestedWorkerState state,
  40. NfcDeviceData* dev_data,
  41. MifareNestedWorkerCallback callback,
  42. void* context);
  43. typedef struct {
  44. uint32_t key_type;
  45. uint32_t block;
  46. uint32_t target_nt[2];
  47. uint32_t target_ks[2];
  48. uint8_t parity[2][4];
  49. bool collected;
  50. bool skipped;
  51. } Nonces;
  52. typedef struct {
  53. uint32_t cuid;
  54. uint32_t sector_count;
  55. // 40 (or 16/5) sectors, 2 keys (A/B), 3 tries
  56. Nonces* nonces[40][2][3];
  57. uint32_t tries;
  58. } NonceList_t;
  59. typedef struct {
  60. uint32_t total_keys;
  61. uint32_t checked_keys;
  62. uint32_t found_keys;
  63. uint32_t added_keys;
  64. uint32_t sector_keys;
  65. bool tag_lost;
  66. } KeyInfo_t;