mfc_editor_helpers.c 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include "mfc_editor_app_i.h"
  2. uint8_t mfc_editor_calculate_uid_bcc(uint8_t* uid, uint8_t uid_len) {
  3. furi_check(uid_len > 0);
  4. uint8_t bcc = uid[0];
  5. for(int i = 1; i < uid_len; i++) {
  6. bcc ^= uid[i];
  7. }
  8. return bcc;
  9. }
  10. MfcEditorAccessBits
  11. mfc_editor_get_block_access_bits(const MfClassicData* data, uint8_t block_num) {
  12. MfcEditorAccessBits result;
  13. uint8_t sector_num = mf_classic_get_sector_by_block(block_num);
  14. MfClassicSectorTrailer* trailer = mf_classic_get_sector_trailer_by_sector(data, sector_num);
  15. uint8_t relative_block_num = block_num - mf_classic_get_first_block_num_of_sector(sector_num);
  16. if(sector_num >= 32) {
  17. // 4K large sector - access bits affect range of blocks
  18. relative_block_num /= 5;
  19. }
  20. uint8_t access_byte_1 = trailer->access_bits.data[0];
  21. uint8_t access_byte_2 = trailer->access_bits.data[1];
  22. uint8_t access_byte_3 = trailer->access_bits.data[2];
  23. result.bits = (FURI_BIT(access_byte_3, 4 + relative_block_num) << 2) |
  24. (FURI_BIT(access_byte_3, relative_block_num) << 1) |
  25. (FURI_BIT(access_byte_2, 4 + relative_block_num));
  26. result.check_bits = (FURI_BIT(access_byte_2, relative_block_num) << 2) |
  27. (FURI_BIT(access_byte_1, 4 + relative_block_num) << 1) |
  28. (FURI_BIT(access_byte_1, relative_block_num));
  29. // Check bits are inverted in storage, flip them to match actual bits
  30. result.check_bits ^= 0b111;
  31. return result;
  32. }
  33. void mfc_editor_set_block_access_bits(
  34. MfClassicData* data,
  35. uint8_t block_num,
  36. const MfcEditorAccessBits* access_bits) {
  37. uint8_t sector_num = mf_classic_get_sector_by_block(block_num);
  38. MfClassicSectorTrailer* trailer = mf_classic_get_sector_trailer_by_sector(data, sector_num);
  39. uint8_t relative_block_num = block_num - mf_classic_get_first_block_num_of_sector(sector_num);
  40. if(sector_num >= 32) {
  41. // 4K large sector - access bits affect range of blocks
  42. relative_block_num /= 5;
  43. }
  44. uint8_t* access_byte_1 = &trailer->access_bits.data[0];
  45. uint8_t* access_byte_2 = &trailer->access_bits.data[1];
  46. uint8_t* access_byte_3 = &trailer->access_bits.data[2];
  47. if(FURI_BIT(access_bits->bits, 0)) {
  48. FURI_BIT_SET(*access_byte_2, 4 + relative_block_num);
  49. } else {
  50. FURI_BIT_CLEAR(*access_byte_2, 4 + relative_block_num);
  51. }
  52. if(FURI_BIT(access_bits->bits, 1)) {
  53. FURI_BIT_SET(*access_byte_3, relative_block_num);
  54. } else {
  55. FURI_BIT_CLEAR(*access_byte_3, relative_block_num);
  56. }
  57. if(FURI_BIT(access_bits->bits, 2)) {
  58. FURI_BIT_SET(*access_byte_3, 4 + relative_block_num);
  59. } else {
  60. FURI_BIT_CLEAR(*access_byte_3, 4 + relative_block_num);
  61. }
  62. // Check bits are the inverse of the the actual bits
  63. if(FURI_BIT(access_bits->check_bits, 0)) {
  64. FURI_BIT_CLEAR(*access_byte_1, relative_block_num);
  65. } else {
  66. FURI_BIT_SET(*access_byte_1, relative_block_num);
  67. }
  68. if(FURI_BIT(access_bits->check_bits, 1)) {
  69. FURI_BIT_CLEAR(*access_byte_1, 4 + relative_block_num);
  70. } else {
  71. FURI_BIT_SET(*access_byte_1, 4 + relative_block_num);
  72. }
  73. if(FURI_BIT(access_bits->check_bits, 2)) {
  74. FURI_BIT_CLEAR(*access_byte_2, relative_block_num);
  75. } else {
  76. FURI_BIT_SET(*access_byte_2, relative_block_num);
  77. }
  78. }