protocol.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490
  1. #include "protocol_i.h"
  2. #include "furi.h"
  3. // #######################
  4. // ## Ibutton Protocols ##
  5. // #######################
  6. #define DS1990_DATA_SIZE (8)
  7. #define Metakom_DATA_SIZE (4)
  8. #define Cyfral_DATA_SIZE (2)
  9. const uint8_t uid_list_ds1990[][DS1990_DATA_SIZE] = {
  10. {0x01, 0xBE, 0x40, 0x11, 0x5A, 0x36, 0x00, 0xE1}, //– код универсального ключа, для Vizit
  11. {0x01, 0xBE, 0x40, 0x11, 0x5A, 0x56, 0x00, 0xBB}, //- проверен работает
  12. {0x01, 0xBE, 0x40, 0x11, 0x00, 0x00, 0x00, 0x77}, //- проверен работает
  13. {0x01, 0xBE, 0x40, 0x11, 0x0A, 0x00, 0x00, 0x1D}, //- проверен работает Визит иногда КЕЙМАНЫ
  14. {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F}, //- проверен(метаком, цифрал, ВИЗИТ).
  15. {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x9B}, //- проверен Визит, Метакомы, КОНДОР
  16. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x14}, //???-Открываает 98% Метаком и некоторые Цифрал
  17. {0x01, 0x00, 0x00, 0x00, 0x00, 0x90, 0x19, 0xFF}, //???-Отлично работает на старых домофонах
  18. {0x01, 0x6F, 0x2E, 0x88, 0x8A, 0x00, 0x00, 0x4D}, //???-Открывать что-то должен
  19. {0x01, 0x53, 0xD4, 0xFE, 0x00, 0x00, 0x7E, 0x88}, //???-Cyfral, Metakom
  20. {0x01, 0x53, 0xD4, 0xFE, 0x00, 0x00, 0x00, 0x6F}, //???-домофоны Визит (Vizit) - до 99%
  21. {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D}, //???-домофоны Cyfral CCD-20 - до 70%
  22. {0x01, 0x00, 0xBE, 0x11, 0xAA, 0x00, 0x00, 0xFB}, //???-домофоны Кейман (KEYMAN)
  23. {0x01, 0x76, 0xB8, 0x2E, 0x0F, 0x00, 0x00, 0x5C}, //???-домофоны Форвард
  24. {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // Null bytes
  25. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x14}, // Only FF
  26. {0x01, 0x78, 0x00, 0x48, 0xFD, 0xFF, 0xFF, 0xD1}, // StarNew Uni5
  27. {0x01, 0xA9, 0xE4, 0x3C, 0x09, 0x00, 0x00, 0xE6}, // Eltis Uni
  28. };
  29. const uint8_t uid_list_metakom[][Metakom_DATA_SIZE] = {
  30. {0x00, 0x00, 0x00, 0x00}, // Null bytes
  31. {0xFF, 0xFF, 0xFF, 0xFF}, // Only FF
  32. {0x11, 0x11, 0x11, 0x11}, // Only 11
  33. {0x22, 0x22, 0x22, 0x22}, // Only 22
  34. {0x33, 0x33, 0x33, 0x33}, // Only 33
  35. {0x44, 0x44, 0x44, 0x44}, // Only 44
  36. {0x55, 0x55, 0x55, 0x55}, // Only 55
  37. {0x66, 0x66, 0x66, 0x66}, // Only 66
  38. {0x77, 0x77, 0x77, 0x77}, // Only 77
  39. {0x88, 0x88, 0x88, 0x88}, // Only 88
  40. {0x99, 0x99, 0x99, 0x99}, // Only 99
  41. {0x12, 0x34, 0x56, 0x78}, // Incremental UID
  42. {0x9A, 0x78, 0x56, 0x34}, // Decremental UID
  43. {0x04, 0xd0, 0x9b, 0x0d}, // ??
  44. {0x34, 0x00, 0x29, 0x3d}, // ??
  45. {0x04, 0xdf, 0x00, 0x00}, // ??
  46. {0xCA, 0xCA, 0xCA, 0xCA}, // ??
  47. };
  48. const uint8_t uid_list_cyfral[][Cyfral_DATA_SIZE] = {
  49. {0x00, 0x00}, // Null bytes
  50. {0xFF, 0xFF}, // Only FF
  51. {0x11, 0x11}, // Only 11
  52. {0x22, 0x22}, // Only 22
  53. {0x33, 0x33}, // Only 33
  54. {0x44, 0x44}, // Only 44
  55. {0x55, 0x55}, // Only 55
  56. {0x66, 0x66}, // Only 66
  57. {0x77, 0x77}, // Only 77
  58. {0x88, 0x88}, // Only 88
  59. {0x99, 0x99}, // Only 99
  60. {0x12, 0x34}, // Incremental UID
  61. {0x56, 0x34}, // Decremental UID
  62. {0xCA, 0xCA}, // ??
  63. {0x8E, 0xC9}, // Elevator code
  64. {0x6A, 0x50}, // VERY fresh code from smartkey
  65. };
  66. // ###########################
  67. // ## Rfid_125khz Protocols ##
  68. // ###########################
  69. #define EM4100_DATA_SIZE (5)
  70. #define HIDProx_DATA_SIZE (6)
  71. #define PAC_DATA_SIZE (4)
  72. #define H10301_DATA_SIZE (3)
  73. #define IOPROXXSF_DATA_SIZE (4)
  74. #define PARADOX_DATA_SIZE (6)
  75. #define INDALA26_DATA_SIZE (4)
  76. #define VIKING_DATA_SIZE (4)
  77. #define PYRAMID_DATA_SIZE (4)
  78. #define KERI_DATA_SIZE (4)
  79. #define JABLOTRON_DATA_SIZE (5)
  80. const uint8_t uid_list_em4100[][EM4100_DATA_SIZE] = {
  81. {0x00, 0x00, 0x00, 0x00, 0x00}, // Null bytes
  82. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, // Only FF
  83. {0x11, 0x11, 0x11, 0x11, 0x11}, // Only 11
  84. {0x22, 0x22, 0x22, 0x22, 0x22}, // Only 22
  85. {0x33, 0x33, 0x33, 0x33, 0x33}, // Only 33
  86. {0x44, 0x44, 0x44, 0x44, 0x44}, // Only 44
  87. {0x55, 0x55, 0x55, 0x55, 0x55}, // Only 55
  88. {0x66, 0x66, 0x66, 0x66, 0x66}, // Only 66
  89. {0x77, 0x77, 0x77, 0x77, 0x77}, // Only 77
  90. {0x88, 0x88, 0x88, 0x88, 0x88}, // Only 88
  91. {0x99, 0x99, 0x99, 0x99, 0x99}, // Only 99
  92. {0x12, 0x34, 0x56, 0x78, 0x9A}, // Incremental UID
  93. {0x9A, 0x78, 0x56, 0x34, 0x12}, // Decremental UID
  94. {0x04, 0xd0, 0x9b, 0x0d, 0x6a}, // From arha
  95. {0x34, 0x00, 0x29, 0x3d, 0x9e}, // From arha
  96. {0x04, 0xdf, 0x00, 0x00, 0x01}, // From arha
  97. {0xCA, 0xCA, 0xCA, 0xCA, 0xCA}, // From arha
  98. };
  99. const uint8_t uid_list_hid[][HIDProx_DATA_SIZE] = {
  100. {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // Null bytes
  101. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, // Only FF
  102. {0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, // Only 11
  103. {0x22, 0x22, 0x22, 0x22, 0x22, 0x22}, // Only 22
  104. {0x33, 0x33, 0x33, 0x33, 0x33, 0x33}, // Only 33
  105. {0x44, 0x44, 0x44, 0x44, 0x44, 0x44}, // Only 44
  106. {0x55, 0x55, 0x55, 0x55, 0x55, 0x55}, // Only 55
  107. {0x66, 0x66, 0x66, 0x66, 0x66, 0x66}, // Only 66
  108. {0x77, 0x77, 0x77, 0x77, 0x77, 0x77}, // Only 77
  109. {0x88, 0x88, 0x88, 0x88, 0x88, 0x88}, // Only 88
  110. {0x99, 0x99, 0x99, 0x99, 0x99, 0x99}, // Only 99
  111. {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC}, // Incremental UID
  112. {0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12}, // Decremental UID
  113. {0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA}, // From arha
  114. };
  115. const uint8_t uid_list_pac[][PAC_DATA_SIZE] = {
  116. {0x00, 0x00, 0x00, 0x00}, // Null bytes
  117. {0xFF, 0xFF, 0xFF, 0xFF}, // Only FF
  118. {0x11, 0x11, 0x11, 0x11}, // Only 11
  119. {0x22, 0x22, 0x22, 0x22}, // Only 22
  120. {0x33, 0x33, 0x33, 0x33}, // Only 33
  121. {0x44, 0x44, 0x44, 0x44}, // Only 44
  122. {0x55, 0x55, 0x55, 0x55}, // Only 55
  123. {0x66, 0x66, 0x66, 0x66}, // Only 66
  124. {0x77, 0x77, 0x77, 0x77}, // Only 77
  125. {0x88, 0x88, 0x88, 0x88}, // Only 88
  126. {0x99, 0x99, 0x99, 0x99}, // Only 99
  127. {0x12, 0x34, 0x56, 0x78}, // Incremental UID
  128. {0x9A, 0x78, 0x56, 0x34}, // Decremental UID
  129. {0x04, 0xd0, 0x9b, 0x0d}, // From arha
  130. {0x34, 0x00, 0x29, 0x3d}, // From arha
  131. {0x04, 0xdf, 0x00, 0x00}, // From arha
  132. {0xCA, 0xCA, 0xCA, 0xCA}, // From arha
  133. };
  134. const uint8_t uid_list_h10301[][H10301_DATA_SIZE] = {
  135. {0x00, 0x00, 0x00}, // Null bytes
  136. {0xFF, 0xFF, 0xFF}, // Only FF
  137. {0x11, 0x11, 0x11}, // Only 11
  138. {0x22, 0x22, 0x22}, // Only 22
  139. {0x33, 0x33, 0x33}, // Only 33
  140. {0x44, 0x44, 0x44}, // Only 44
  141. {0x55, 0x55, 0x55}, // Only 55
  142. {0x66, 0x66, 0x66}, // Only 66
  143. {0x77, 0x77, 0x77}, // Only 77
  144. {0x88, 0x88, 0x88}, // Only 88
  145. {0x99, 0x99, 0x99}, // Only 99
  146. {0x12, 0x34, 0x56}, // Incremental UID
  147. {0x56, 0x34, 0x12}, // Decremental UID
  148. {0xCA, 0xCA, 0xCA}, // From arha
  149. };
  150. const uint8_t uid_list_ioproxxsf[][IOPROXXSF_DATA_SIZE] = {
  151. {0x00, 0x00, 0x00, 0x00}, // Null bytes
  152. {0xFF, 0xFF, 0xFF, 0xFF}, // Only FF
  153. {0x11, 0x11, 0x11, 0x11}, // Only 11
  154. {0x22, 0x22, 0x22, 0x22}, // Only 22
  155. {0x33, 0x33, 0x33, 0x33}, // Only 33
  156. {0x44, 0x44, 0x44, 0x44}, // Only 44
  157. {0x55, 0x55, 0x55, 0x55}, // Only 55
  158. {0x66, 0x66, 0x66, 0x66}, // Only 66
  159. {0x77, 0x77, 0x77, 0x77}, // Only 77
  160. {0x88, 0x88, 0x88, 0x88}, // Only 88
  161. {0x99, 0x99, 0x99, 0x99}, // Only 99
  162. {0x12, 0x34, 0x56, 0x78}, // Incremental UID
  163. {0x9A, 0x78, 0x56, 0x34}, // Decremental UID
  164. {0x04, 0xd0, 0x9b, 0x0d}, // From arha
  165. {0x34, 0x00, 0x29, 0x3d}, // From arha
  166. {0x04, 0xdf, 0x00, 0x00}, // From arha
  167. {0xCA, 0xCA, 0xCA, 0xCA}, // From arha
  168. };
  169. const uint8_t uid_list_paradox[][PARADOX_DATA_SIZE] = {
  170. {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // Null bytes
  171. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, // Only FF
  172. {0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, // Only 11
  173. {0x22, 0x22, 0x22, 0x22, 0x22, 0x22}, // Only 22
  174. {0x33, 0x33, 0x33, 0x33, 0x33, 0x33}, // Only 33
  175. {0x44, 0x44, 0x44, 0x44, 0x44, 0x44}, // Only 44
  176. {0x55, 0x55, 0x55, 0x55, 0x55, 0x55}, // Only 55
  177. {0x66, 0x66, 0x66, 0x66, 0x66, 0x66}, // Only 66
  178. {0x77, 0x77, 0x77, 0x77, 0x77, 0x77}, // Only 77
  179. {0x88, 0x88, 0x88, 0x88, 0x88, 0x88}, // Only 88
  180. {0x99, 0x99, 0x99, 0x99, 0x99, 0x99}, // Only 99
  181. {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC}, // Incremental UID
  182. {0xFF, 0xDE, 0xBC, 0x9A, 0x78, 0x56}, // Decremental UID
  183. {0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA}, // From arha
  184. };
  185. const uint8_t uid_list_indala26[][INDALA26_DATA_SIZE] = {
  186. {0x00, 0x00, 0x00, 0x00}, // Null bytes
  187. {0xFF, 0xFF, 0xFF, 0xFF}, // Only FF
  188. {0x11, 0x11, 0x11, 0x11}, // Only 11
  189. {0x22, 0x22, 0x22, 0x22}, // Only 22
  190. {0x33, 0x33, 0x33, 0x33}, // Only 33
  191. {0x44, 0x44, 0x44, 0x44}, // Only 44
  192. {0x55, 0x55, 0x55, 0x55}, // Only 55
  193. {0x66, 0x66, 0x66, 0x66}, // Only 66
  194. {0x77, 0x77, 0x77, 0x77}, // Only 77
  195. {0x88, 0x88, 0x88, 0x88}, // Only 88
  196. {0x99, 0x99, 0x99, 0x99}, // Only 99
  197. {0x12, 0x34, 0x56, 0x78}, // Incremental UID
  198. {0xFF, 0xDE, 0xBC, 0x9A}, // Decremental UID
  199. {0xCA, 0xCA, 0xCA, 0xCA}, // From arha
  200. };
  201. const uint8_t uid_list_viking[][VIKING_DATA_SIZE] = {
  202. {0x00, 0x00, 0x00, 0x00}, // Null bytes
  203. {0xFF, 0xFF, 0xFF, 0xFF}, // Only FF
  204. {0x11, 0x11, 0x11, 0x11}, // Only 11
  205. {0x22, 0x22, 0x22, 0x22}, // Only 22
  206. {0x33, 0x33, 0x33, 0x33}, // Only 33
  207. {0x44, 0x44, 0x44, 0x44}, // Only 44
  208. {0x55, 0x55, 0x55, 0x55}, // Only 55
  209. {0x66, 0x66, 0x66, 0x66}, // Only 66
  210. {0x77, 0x77, 0x77, 0x77}, // Only 77
  211. {0x88, 0x88, 0x88, 0x88}, // Only 88
  212. {0x99, 0x99, 0x99, 0x99}, // Only 99
  213. {0x12, 0x34, 0x56, 0x78}, // Incremental UID
  214. {0xFF, 0xDE, 0xBC, 0x9A}, // Decremental UID
  215. {0xCA, 0xCA, 0xCA, 0xCA}, // From arha
  216. };
  217. const uint8_t uid_list_pyramid[][PYRAMID_DATA_SIZE] = {
  218. {0x00, 0x00, 0x00, 0x00}, // Null bytes
  219. {0xFF, 0xFF, 0xFF, 0xFF}, // Only FF
  220. {0x11, 0x11, 0x11, 0x11}, // Only 11
  221. {0x22, 0x22, 0x22, 0x22}, // Only 22
  222. {0x33, 0x33, 0x33, 0x33}, // Only 33
  223. {0x44, 0x44, 0x44, 0x44}, // Only 44
  224. {0x55, 0x55, 0x55, 0x55}, // Only 55
  225. {0x66, 0x66, 0x66, 0x66}, // Only 66
  226. {0x77, 0x77, 0x77, 0x77}, // Only 77
  227. {0x88, 0x88, 0x88, 0x88}, // Only 88
  228. {0x99, 0x99, 0x99, 0x99}, // Only 99
  229. {0x12, 0x34, 0x56, 0x78}, // Incremental UID
  230. {0xFF, 0xDE, 0xBC, 0x9A}, // Decremental UID
  231. {0xCA, 0xCA, 0xCA, 0xCA}, // From arha
  232. };
  233. const uint8_t uid_list_keri[][KERI_DATA_SIZE] = {
  234. {0x00, 0x00, 0x00, 0x00}, // Null bytes
  235. {0xFF, 0xFF, 0xFF, 0xFF}, // Only FF
  236. {0x11, 0x11, 0x11, 0x11}, // Only 11
  237. {0x22, 0x22, 0x22, 0x22}, // Only 22
  238. {0x33, 0x33, 0x33, 0x33}, // Only 33
  239. {0x44, 0x44, 0x44, 0x44}, // Only 44
  240. {0x55, 0x55, 0x55, 0x55}, // Only 55
  241. {0x66, 0x66, 0x66, 0x66}, // Only 66
  242. {0x77, 0x77, 0x77, 0x77}, // Only 77
  243. {0x88, 0x88, 0x88, 0x88}, // Only 88
  244. {0x99, 0x99, 0x99, 0x99}, // Only 99
  245. {0x12, 0x34, 0x56, 0x78}, // Incremental UID
  246. {0xFF, 0xDE, 0xBC, 0x9A}, // Decremental UID
  247. {0xCA, 0xCA, 0xCA, 0xCA}, // From arha
  248. };
  249. const uint8_t uid_list_jablotron[][JABLOTRON_DATA_SIZE] = {
  250. {0x00, 0x00, 0x00, 0x00, 0x00}, // Null bytes
  251. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, // Only FF
  252. {0x11, 0x11, 0x11, 0x11, 0x11}, // Only 11
  253. {0x22, 0x22, 0x22, 0x22, 0x22}, // Only 22
  254. {0x33, 0x33, 0x33, 0x33, 0x33}, // Only 33
  255. {0x44, 0x44, 0x44, 0x44, 0x44}, // Only 44
  256. {0x55, 0x55, 0x55, 0x55, 0x55}, // Only 55
  257. {0x66, 0x66, 0x66, 0x66, 0x66}, // Only 66
  258. {0x77, 0x77, 0x77, 0x77, 0x77}, // Only 77
  259. {0x88, 0x88, 0x88, 0x88, 0x88}, // Only 88
  260. {0x99, 0x99, 0x99, 0x99, 0x99}, // Only 99
  261. {0x12, 0x34, 0x56, 0x78, 0x9A}, // Incremental UID
  262. {0xFF, 0xDE, 0xBC, 0x9A, 0x78}, // Decremental UID
  263. {0xCA, 0xCA, 0xCA, 0xCA, 0xCA}, // From arha
  264. };
  265. #if defined(RFID_125_PROTOCOL)
  266. const FuzzerProtocol fuzzer_proto_items[] = {
  267. // EM4100
  268. {
  269. .name = "EM4100",
  270. .data_size = EM4100_DATA_SIZE,
  271. .dict =
  272. {
  273. .val = (const uint8_t*)&uid_list_em4100,
  274. .len = COUNT_OF(uid_list_em4100),
  275. },
  276. },
  277. // HIDProx
  278. {
  279. .name = "HIDProx",
  280. .data_size = HIDProx_DATA_SIZE,
  281. .dict =
  282. {
  283. .val = (const uint8_t*)&uid_list_hid,
  284. .len = COUNT_OF(uid_list_hid),
  285. },
  286. },
  287. // PAC
  288. {
  289. .name = "PAC/Stanley",
  290. .data_size = PAC_DATA_SIZE,
  291. .dict =
  292. {
  293. .val = (const uint8_t*)&uid_list_pac,
  294. .len = COUNT_OF(uid_list_pac),
  295. },
  296. },
  297. // H10301
  298. {
  299. .name = "H10301",
  300. .data_size = H10301_DATA_SIZE,
  301. .dict =
  302. {
  303. .val = (const uint8_t*)&uid_list_h10301,
  304. .len = COUNT_OF(uid_list_h10301),
  305. },
  306. },
  307. // IoProxXSF
  308. {
  309. .name = "IoProxXSF",
  310. .data_size = IOPROXXSF_DATA_SIZE,
  311. .dict =
  312. {
  313. .val = (const uint8_t*)&uid_list_ioproxxsf,
  314. .len = COUNT_OF(uid_list_ioproxxsf),
  315. },
  316. },
  317. // Paradox
  318. {
  319. .name = "Paradox",
  320. .data_size = PARADOX_DATA_SIZE,
  321. .dict =
  322. {
  323. .val = (const uint8_t*)&uid_list_paradox,
  324. .len = COUNT_OF(uid_list_paradox),
  325. },
  326. },
  327. // Indala26
  328. {
  329. .name = "Indala26",
  330. .data_size = INDALA26_DATA_SIZE,
  331. .dict =
  332. {
  333. .val = (const uint8_t*)&uid_list_indala26,
  334. .len = COUNT_OF(uid_list_indala26),
  335. },
  336. },
  337. // Viking
  338. {
  339. .name = "Viking",
  340. .data_size = VIKING_DATA_SIZE,
  341. .dict =
  342. {
  343. .val = (const uint8_t*)&uid_list_viking,
  344. .len = COUNT_OF(uid_list_viking),
  345. },
  346. },
  347. // Pyramid
  348. {
  349. .name = "Pyramid",
  350. .data_size = PYRAMID_DATA_SIZE,
  351. .dict =
  352. {
  353. .val = (const uint8_t*)&uid_list_pyramid,
  354. .len = COUNT_OF(uid_list_pyramid),
  355. },
  356. },
  357. // Keri
  358. {
  359. .name = "Keri",
  360. .data_size = KERI_DATA_SIZE,
  361. .dict =
  362. {
  363. .val = (const uint8_t*)&uid_list_keri,
  364. .len = COUNT_OF(uid_list_keri),
  365. },
  366. },
  367. // Jablotron
  368. {
  369. .name = "Jablotron",
  370. .data_size = JABLOTRON_DATA_SIZE,
  371. .dict =
  372. {
  373. .val = (const uint8_t*)&uid_list_jablotron,
  374. .len = COUNT_OF(uid_list_jablotron),
  375. },
  376. },
  377. };
  378. #else
  379. const FuzzerProtocol fuzzer_proto_items[] = {
  380. // DS1990
  381. {
  382. .name = "DS1990",
  383. .data_size = DS1990_DATA_SIZE,
  384. .dict =
  385. {
  386. .val = (const uint8_t*)&uid_list_ds1990,
  387. .len = COUNT_OF(uid_list_ds1990),
  388. },
  389. },
  390. // Metakom
  391. {
  392. .name = "Metakom",
  393. .data_size = Metakom_DATA_SIZE,
  394. .dict =
  395. {
  396. .val = (const uint8_t*)&uid_list_metakom,
  397. .len = COUNT_OF(uid_list_metakom),
  398. },
  399. },
  400. // Cyfral
  401. {
  402. .name = "Cyfral",
  403. .data_size = Cyfral_DATA_SIZE,
  404. .dict =
  405. {
  406. .val = (const uint8_t*)&uid_list_cyfral,
  407. .len = COUNT_OF(uid_list_cyfral),
  408. },
  409. },
  410. };
  411. #endif
  412. typedef struct {
  413. const char* menu_label;
  414. FuzzerAttackId attack_id;
  415. } FuzzerMenuItems;
  416. const FuzzerMenuItems fuzzer_menu_items[] = {
  417. {"Default Values", FuzzerAttackIdDefaultValues},
  418. #ifdef RFID_125_PROTOCOL
  419. {"BF Customer ID", FuzzerAttackIdBFCustomerID},
  420. #endif
  421. {"Load File", FuzzerAttackIdLoadFile},
  422. {"Load UIDs from file", FuzzerAttackIdLoadFileCustomUids},
  423. };
  424. FuzzerPayload* fuzzer_payload_alloc() {
  425. FuzzerPayload* payload = malloc(sizeof(FuzzerPayload));
  426. payload->data = malloc(sizeof(payload->data[0]) * MAX_PAYLOAD_SIZE);
  427. return payload;
  428. }
  429. void fuzzer_payload_free(FuzzerPayload* payload) {
  430. furi_assert(payload);
  431. if(payload->data) {
  432. free(payload->data);
  433. }
  434. free(payload);
  435. }
  436. const char* fuzzer_proto_get_name(FuzzerProtocolsID index) {
  437. return fuzzer_proto_items[index].name;
  438. }
  439. uint8_t fuzzer_proto_get_count_of_protocols() {
  440. return COUNT_OF(fuzzer_proto_items);
  441. }
  442. uint8_t fuzzer_proto_get_max_data_size() {
  443. return MAX_PAYLOAD_SIZE;
  444. }
  445. uint8_t fuzzer_proto_get_def_emu_time() {
  446. return PROTOCOL_DEF_EMU_TIME;
  447. }
  448. uint8_t fuzzer_proto_get_def_idle_time() {
  449. return PROTOCOL_DEF_IDLE_TIME;
  450. }
  451. const char* fuzzer_proto_get_menu_label(uint8_t index) {
  452. return fuzzer_menu_items[index].menu_label;
  453. }
  454. FuzzerAttackId fuzzer_proto_get_attack_id_by_index(uint8_t index) {
  455. return fuzzer_menu_items[index].attack_id;
  456. }
  457. uint8_t fuzzer_proto_get_count_of_menu_items() {
  458. return COUNT_OF(fuzzer_menu_items);
  459. }