picopass_scene_write_key.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include "../picopass_i.h"
  2. #include <dolphin/dolphin.h>
  3. NfcCommand picopass_scene_write_key_poller_callback(PicopassPollerEvent event, void* context) {
  4. NfcCommand command = NfcCommandContinue;
  5. Picopass* picopass = context;
  6. if(event.type == PicopassPollerEventTypeRequestMode) {
  7. event.data->req_mode.mode = PicopassPollerModeWriteKey;
  8. } else if(event.type == PicopassPollerEventTypeRequestKey) {
  9. event.data->req_key.is_key_provided = true;
  10. memcpy(event.data->req_key.key, picopass->dev->dev_data.pacs.key, PICOPASS_KEY_LEN);
  11. event.data->req_key.is_elite_key = picopass->dev->dev_data.pacs.elite_kdf;
  12. } else if(event.type == PicopassPollerEventTypeRequestWriteKey) {
  13. event.data->req_write_key.data = &picopass->dev->dev_data;
  14. memcpy(
  15. event.data->req_write_key.key,
  16. picopass->write_key_context.key_to_write,
  17. PICOPASS_KEY_LEN);
  18. event.data->req_write_key.is_elite_key = picopass->write_key_context.is_elite;
  19. } else if(event.type == PicopassPollerEventTypeSuccess) {
  20. view_dispatcher_send_custom_event(
  21. picopass->view_dispatcher, PicopassCustomEventPollerSuccess);
  22. } else if(
  23. event.type == PicopassPollerEventTypeFail ||
  24. event.type == PicopassPollerEventTypeAuthFail) {
  25. view_dispatcher_send_custom_event(
  26. picopass->view_dispatcher, PicopassCustomEventPollerFail);
  27. }
  28. return command;
  29. }
  30. void picopass_scene_write_key_on_enter(void* context) {
  31. Picopass* picopass = context;
  32. dolphin_deed(DolphinDeedNfcSave);
  33. // Setup view
  34. Popup* popup = picopass->popup;
  35. popup_set_header(popup, "Writing\niClass\nkey", 68, 30, AlignLeft, AlignTop);
  36. popup_set_icon(popup, 0, 3, &I_RFIDDolphinSend_97x61);
  37. // Start worker
  38. view_dispatcher_switch_to_view(picopass->view_dispatcher, PicopassViewPopup);
  39. picopass_blink_start(picopass);
  40. // If there is no user dictionary, create it with the key they entered
  41. // Prevent people who set all 0's from bricking their card
  42. // TODO: Consider checking the elite user dict, when it exists, for the key
  43. if(!iclass_elite_dict_check_presence(IclassEliteDictTypeUser)) {
  44. storage_simply_mkdir(picopass->dev->storage, STORAGE_APP_DATA_PATH_PREFIX);
  45. storage_simply_mkdir(picopass->dev->storage, APP_DATA_PATH("assets"));
  46. IclassEliteDict* dict = iclass_elite_dict_alloc(IclassEliteDictTypeUser);
  47. iclass_elite_dict_add_key(dict, picopass->write_key_context.key_to_write);
  48. iclass_elite_dict_free(dict);
  49. }
  50. picopass->poller = picopass_poller_alloc(picopass->nfc);
  51. picopass_poller_start(picopass->poller, picopass_scene_write_key_poller_callback, picopass);
  52. }
  53. bool picopass_scene_write_key_on_event(void* context, SceneManagerEvent event) {
  54. Picopass* picopass = context;
  55. bool consumed = false;
  56. if(event.type == SceneManagerEventTypeCustom) {
  57. if(event.event == PicopassCustomEventPollerSuccess) {
  58. scene_manager_next_scene(picopass->scene_manager, PicopassSceneWriteCardSuccess);
  59. consumed = true;
  60. } else if(event.event == PicopassCustomEventPollerFail) {
  61. scene_manager_next_scene(picopass->scene_manager, PicopassSceneWriteCardFailure);
  62. consumed = true;
  63. }
  64. }
  65. return consumed;
  66. }
  67. void picopass_scene_write_key_on_exit(void* context) {
  68. Picopass* picopass = context;
  69. // Stop worker
  70. picopass_poller_stop(picopass->poller);
  71. picopass_poller_free(picopass->poller);
  72. // Clear view
  73. popup_reset(picopass->popup);
  74. picopass_blink_stop(picopass);
  75. }