protocol.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  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 THREEBYTE_DATA_SIZE (3) // H10301
  70. #define FOURBYTE_DATA_SIZE (4) // PAC/Stanley, IoProxXSF, Indala26, Viking, Pyramid, Keri
  71. #define FIVEBYTE_DATA_SIZE (5) // EM4100, Joblotron
  72. #define SIXBYTE_DATA_SIZE (6) // HIDProx, Paradox
  73. #define EIGHTBYTE_DATA_SIZE (8) // Electra, Idteck, Gallagher, Nexwatch
  74. const uint8_t uid_list_5byte[][FIVEBYTE_DATA_SIZE] = {
  75. {0x00, 0x00, 0x00, 0x00, 0x00}, // Null bytes
  76. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, // Only FF
  77. {0x11, 0x11, 0x11, 0x11, 0x11}, // Only 11
  78. {0x22, 0x22, 0x22, 0x22, 0x22}, // Only 22
  79. {0x33, 0x33, 0x33, 0x33, 0x33}, // Only 33
  80. {0x44, 0x44, 0x44, 0x44, 0x44}, // Only 44
  81. {0x55, 0x55, 0x55, 0x55, 0x55}, // Only 55
  82. {0x66, 0x66, 0x66, 0x66, 0x66}, // Only 66
  83. {0x77, 0x77, 0x77, 0x77, 0x77}, // Only 77
  84. {0x88, 0x88, 0x88, 0x88, 0x88}, // Only 88
  85. {0x99, 0x99, 0x99, 0x99, 0x99}, // Only 99
  86. {0x12, 0x34, 0x56, 0x78, 0x9A}, // Incremental UID
  87. {0x9A, 0x78, 0x56, 0x34, 0x12}, // Decremental UID
  88. {0x04, 0xd0, 0x9b, 0x0d, 0x6a}, // From arha
  89. {0x34, 0x00, 0x29, 0x3d, 0x9e}, // From arha
  90. {0x04, 0xdf, 0x00, 0x00, 0x01}, // From arha
  91. {0xCA, 0xCA, 0xCA, 0xCA, 0xCA}, // From arha
  92. };
  93. const uint8_t uid_list_6byte[][SIXBYTE_DATA_SIZE] = {
  94. {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // Null bytes
  95. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, // Only FF
  96. {0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, // Only 11
  97. {0x22, 0x22, 0x22, 0x22, 0x22, 0x22}, // Only 22
  98. {0x33, 0x33, 0x33, 0x33, 0x33, 0x33}, // Only 33
  99. {0x44, 0x44, 0x44, 0x44, 0x44, 0x44}, // Only 44
  100. {0x55, 0x55, 0x55, 0x55, 0x55, 0x55}, // Only 55
  101. {0x66, 0x66, 0x66, 0x66, 0x66, 0x66}, // Only 66
  102. {0x77, 0x77, 0x77, 0x77, 0x77, 0x77}, // Only 77
  103. {0x88, 0x88, 0x88, 0x88, 0x88, 0x88}, // Only 88
  104. {0x99, 0x99, 0x99, 0x99, 0x99, 0x99}, // Only 99
  105. {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC}, // Incremental UID
  106. {0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12}, // Decremental UID
  107. {0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA}, // From arha
  108. };
  109. const uint8_t uid_list_4byte[][FOURBYTE_DATA_SIZE] = {
  110. {0x00, 0x00, 0x00, 0x00}, // Null bytes
  111. {0xFF, 0xFF, 0xFF, 0xFF}, // Only FF
  112. {0x11, 0x11, 0x11, 0x11}, // Only 11
  113. {0x22, 0x22, 0x22, 0x22}, // Only 22
  114. {0x33, 0x33, 0x33, 0x33}, // Only 33
  115. {0x44, 0x44, 0x44, 0x44}, // Only 44
  116. {0x55, 0x55, 0x55, 0x55}, // Only 55
  117. {0x66, 0x66, 0x66, 0x66}, // Only 66
  118. {0x77, 0x77, 0x77, 0x77}, // Only 77
  119. {0x88, 0x88, 0x88, 0x88}, // Only 88
  120. {0x99, 0x99, 0x99, 0x99}, // Only 99
  121. {0x12, 0x34, 0x56, 0x78}, // Incremental UID
  122. {0x9A, 0x78, 0x56, 0x34}, // Decremental UID
  123. {0x04, 0xd0, 0x9b, 0x0d}, // From arha
  124. {0x34, 0x00, 0x29, 0x3d}, // From arha
  125. {0x04, 0xdf, 0x00, 0x00}, // From arha
  126. {0xCA, 0xCA, 0xCA, 0xCA}, // From arha
  127. };
  128. const uint8_t uid_list_3byte[][THREEBYTE_DATA_SIZE] = {
  129. {0x00, 0x00, 0x00}, // Null bytes
  130. {0xFF, 0xFF, 0xFF}, // Only FF
  131. {0x11, 0x11, 0x11}, // Only 11
  132. {0x22, 0x22, 0x22}, // Only 22
  133. {0x33, 0x33, 0x33}, // Only 33
  134. {0x44, 0x44, 0x44}, // Only 44
  135. {0x55, 0x55, 0x55}, // Only 55
  136. {0x66, 0x66, 0x66}, // Only 66
  137. {0x77, 0x77, 0x77}, // Only 77
  138. {0x88, 0x88, 0x88}, // Only 88
  139. {0x99, 0x99, 0x99}, // Only 99
  140. {0x12, 0x34, 0x56}, // Incremental UID
  141. {0x56, 0x34, 0x12}, // Decremental UID
  142. {0xCA, 0xCA, 0xCA}, // From arha
  143. };
  144. const uint8_t uid_list_8byte[][EIGHTBYTE_DATA_SIZE] = {
  145. {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // Null bytes
  146. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, // Only FF
  147. {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, // Only 11
  148. {0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22}, // Only 22
  149. {0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33}, // Only 33
  150. {0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44}, // Only 44
  151. {0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55}, // Only 55
  152. {0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66}, // Only 66
  153. {0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77}, // Only 77
  154. {0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88}, // Only 88
  155. {0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99}, // Only 99
  156. {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xFF}, // Incremental UID
  157. {0xFF, 0xDE, 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12}, // Decremental UID
  158. {0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA}, // From arha
  159. };
  160. #if defined(RFID_125_PROTOCOL)
  161. const FuzzerProtocol fuzzer_proto_items[] = {
  162. // EM4100
  163. {
  164. .name = "EM4100",
  165. .data_size = FIVEBYTE_DATA_SIZE,
  166. .dict =
  167. {
  168. .val = (const uint8_t*)&uid_list_5byte,
  169. .len = COUNT_OF(uid_list_5byte),
  170. },
  171. },
  172. // HIDProx
  173. {
  174. .name = "HIDProx",
  175. .data_size = SIXBYTE_DATA_SIZE,
  176. .dict =
  177. {
  178. .val = (const uint8_t*)&uid_list_6byte,
  179. .len = COUNT_OF(uid_list_6byte),
  180. },
  181. },
  182. // PAC
  183. {
  184. .name = "PAC/Stanley",
  185. .data_size = FOURBYTE_DATA_SIZE,
  186. .dict =
  187. {
  188. .val = (const uint8_t*)&uid_list_4byte,
  189. .len = COUNT_OF(uid_list_4byte),
  190. },
  191. },
  192. // H10301
  193. {
  194. .name = "H10301",
  195. .data_size = THREEBYTE_DATA_SIZE,
  196. .dict =
  197. {
  198. .val = (const uint8_t*)&uid_list_3byte,
  199. .len = COUNT_OF(uid_list_3byte),
  200. },
  201. },
  202. // IoProxXSF
  203. {
  204. .name = "IoProxXSF",
  205. .data_size = FOURBYTE_DATA_SIZE,
  206. .dict =
  207. {
  208. .val = (const uint8_t*)&uid_list_4byte,
  209. .len = COUNT_OF(uid_list_4byte),
  210. },
  211. },
  212. // Paradox
  213. {
  214. .name = "Paradox",
  215. .data_size = SIXBYTE_DATA_SIZE,
  216. .dict =
  217. {
  218. .val = (const uint8_t*)&uid_list_6byte,
  219. .len = COUNT_OF(uid_list_6byte),
  220. },
  221. },
  222. // Indala26
  223. {
  224. .name = "Indala26",
  225. .data_size = FOURBYTE_DATA_SIZE,
  226. .dict =
  227. {
  228. .val = (const uint8_t*)&uid_list_4byte,
  229. .len = COUNT_OF(uid_list_4byte),
  230. },
  231. },
  232. // Viking
  233. {
  234. .name = "Viking",
  235. .data_size = FOURBYTE_DATA_SIZE,
  236. .dict =
  237. {
  238. .val = (const uint8_t*)&uid_list_4byte,
  239. .len = COUNT_OF(uid_list_4byte),
  240. },
  241. },
  242. // Pyramid
  243. {
  244. .name = "Pyramid",
  245. .data_size = FOURBYTE_DATA_SIZE,
  246. .dict =
  247. {
  248. .val = (const uint8_t*)&uid_list_4byte,
  249. .len = COUNT_OF(uid_list_4byte),
  250. },
  251. },
  252. // Keri
  253. {
  254. .name = "Keri",
  255. .data_size = FOURBYTE_DATA_SIZE,
  256. .dict =
  257. {
  258. .val = (const uint8_t*)&uid_list_4byte,
  259. .len = COUNT_OF(uid_list_4byte),
  260. },
  261. },
  262. // Jablotron
  263. {
  264. .name = "Jablotron",
  265. .data_size = FIVEBYTE_DATA_SIZE,
  266. .dict =
  267. {
  268. .val = (const uint8_t*)&uid_list_5byte,
  269. .len = COUNT_OF(uid_list_5byte),
  270. },
  271. },
  272. // Electra
  273. {
  274. .name = "Electra",
  275. .data_size = EIGHTBYTE_DATA_SIZE,
  276. .dict =
  277. {
  278. .val = (const uint8_t*)&uid_list_8byte,
  279. .len = COUNT_OF(uid_list_8byte),
  280. },
  281. },
  282. // Idteck
  283. {
  284. .name = "Idteck",
  285. .data_size = EIGHTBYTE_DATA_SIZE,
  286. .dict =
  287. {
  288. .val = (const uint8_t*)&uid_list_8byte,
  289. .len = COUNT_OF(uid_list_8byte),
  290. },
  291. },
  292. // Gallagher
  293. {
  294. .name = "Gallagher",
  295. .data_size = EIGHTBYTE_DATA_SIZE,
  296. .dict =
  297. {
  298. .val = (const uint8_t*)&uid_list_8byte,
  299. .len = COUNT_OF(uid_list_8byte),
  300. },
  301. },
  302. // Nexwatch
  303. {
  304. .name = "Nexwatch",
  305. .data_size = EIGHTBYTE_DATA_SIZE,
  306. .dict =
  307. {
  308. .val = (const uint8_t*)&uid_list_8byte,
  309. .len = COUNT_OF(uid_list_8byte),
  310. },
  311. },
  312. };
  313. #else
  314. const FuzzerProtocol fuzzer_proto_items[] = {
  315. // DS1990
  316. {
  317. .name = "DS1990",
  318. .data_size = DS1990_DATA_SIZE,
  319. .dict =
  320. {
  321. .val = (const uint8_t*)&uid_list_ds1990,
  322. .len = COUNT_OF(uid_list_ds1990),
  323. },
  324. },
  325. // Metakom
  326. {
  327. .name = "Metakom",
  328. .data_size = Metakom_DATA_SIZE,
  329. .dict =
  330. {
  331. .val = (const uint8_t*)&uid_list_metakom,
  332. .len = COUNT_OF(uid_list_metakom),
  333. },
  334. },
  335. // Cyfral
  336. {
  337. .name = "Cyfral",
  338. .data_size = Cyfral_DATA_SIZE,
  339. .dict =
  340. {
  341. .val = (const uint8_t*)&uid_list_cyfral,
  342. .len = COUNT_OF(uid_list_cyfral),
  343. },
  344. },
  345. };
  346. #endif
  347. typedef struct {
  348. const char* menu_label;
  349. FuzzerAttackId attack_id;
  350. } FuzzerMenuItems;
  351. const FuzzerMenuItems fuzzer_menu_items[] = {
  352. {"Default Values", FuzzerAttackIdDefaultValues},
  353. #ifdef RFID_125_PROTOCOL
  354. {"BF Customer ID", FuzzerAttackIdBFCustomerID},
  355. #endif
  356. {"Load File", FuzzerAttackIdLoadFile},
  357. {"Load UIDs from file", FuzzerAttackIdLoadFileCustomUids},
  358. };
  359. FuzzerPayload* fuzzer_payload_alloc() {
  360. FuzzerPayload* payload = malloc(sizeof(FuzzerPayload));
  361. payload->data = malloc(sizeof(payload->data[0]) * MAX_PAYLOAD_SIZE);
  362. return payload;
  363. }
  364. void fuzzer_payload_free(FuzzerPayload* payload) {
  365. furi_assert(payload);
  366. if(payload->data) {
  367. free(payload->data);
  368. }
  369. free(payload);
  370. }
  371. const char* fuzzer_proto_get_name(FuzzerProtocolsID index) {
  372. return fuzzer_proto_items[index].name;
  373. }
  374. uint8_t fuzzer_proto_get_count_of_protocols() {
  375. return COUNT_OF(fuzzer_proto_items);
  376. }
  377. uint8_t fuzzer_proto_get_max_data_size() {
  378. return MAX_PAYLOAD_SIZE;
  379. }
  380. uint8_t fuzzer_proto_get_def_emu_time() {
  381. return PROTOCOL_DEF_EMU_TIME;
  382. }
  383. uint8_t fuzzer_proto_get_def_idle_time() {
  384. return PROTOCOL_DEF_IDLE_TIME;
  385. }
  386. const char* fuzzer_proto_get_menu_label(uint8_t index) {
  387. return fuzzer_menu_items[index].menu_label;
  388. }
  389. FuzzerAttackId fuzzer_proto_get_attack_id_by_index(uint8_t index) {
  390. return fuzzer_menu_items[index].attack_id;
  391. }
  392. uint8_t fuzzer_proto_get_count_of_menu_items() {
  393. return COUNT_OF(fuzzer_menu_items);
  394. }