weebo_common.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #include "weebo_common.h"
  2. #define TAG "WeeboCommon"
  3. void weebo_calculate_pwd(uint8_t* uid, uint8_t* pwd) {
  4. pwd[0] = uid[1] ^ uid[3] ^ 0xAA;
  5. pwd[1] = uid[2] ^ uid[4] ^ 0x55;
  6. pwd[2] = uid[3] ^ uid[5] ^ 0xAA;
  7. pwd[3] = uid[4] ^ uid[6] ^ 0x55;
  8. }
  9. void weebo_remix(Weebo* weebo) {
  10. uint8_t PWD[4];
  11. uint8_t UID[8];
  12. uint8_t modified[NTAG215_SIZE];
  13. MfUltralightData* data = mf_ultralight_alloc();
  14. nfc_device_copy_data(weebo->nfc_device, NfcProtocolMfUltralight, data);
  15. //random uid
  16. FURI_LOG_D(TAG, "Generating random UID");
  17. UID[0] = 0x04;
  18. furi_hal_random_fill_buf(UID + 1, 6);
  19. UID[7] = UID[3] ^ UID[4] ^ UID[5] ^ UID[6];
  20. memcpy(weebo->figure + NFC3D_UID_OFFSET, UID, 8);
  21. memcpy(data->iso14443_3a_data->uid, UID, 7);
  22. //pack
  23. nfc3d_amiibo_pack(&weebo->keys, weebo->figure, modified);
  24. //copy data in
  25. for(size_t i = 0; i < 130; i++) {
  26. memcpy(
  27. data->page[i].data, modified + i * MF_ULTRALIGHT_PAGE_SIZE, MF_ULTRALIGHT_PAGE_SIZE);
  28. }
  29. //new pwd
  30. weebo_calculate_pwd(data->iso14443_3a_data->uid, PWD);
  31. memcpy(data->page[133].data, PWD, sizeof(PWD));
  32. //set data
  33. nfc_device_set_data(weebo->nfc_device, NfcProtocolMfUltralight, data);
  34. mf_ultralight_free(data);
  35. }