|
|
@@ -3,6 +3,33 @@
|
|
|
|
|
|
#define TAG "SceneWrite"
|
|
|
|
|
|
+static uint8_t SLB[] = {0x00, 0x00, 0x0F, 0xE0};
|
|
|
+static uint8_t CC[] = {0xf1, 0x10, 0xff, 0xee};
|
|
|
+static uint8_t DLB[] = {0x01, 0x00, 0x0f, 0xbd};
|
|
|
+static uint8_t CFG0[] = {0x00, 0x00, 0x00, 0x04};
|
|
|
+static uint8_t CFG1[] = {0x5f, 0x00, 0x00, 0x00};
|
|
|
+static uint8_t PACKRFUI[] = {0x80, 0x80, 0x00, 0x00};
|
|
|
+
|
|
|
+enum NTAG215Pages {
|
|
|
+ staticLockBits = 2,
|
|
|
+ capabilityContainer = 3,
|
|
|
+ userMemoryFirst = 4,
|
|
|
+ userMemoryLast = 129,
|
|
|
+ dynamicLockBits = 130,
|
|
|
+ cfg0 = 131,
|
|
|
+ cfg1 = 132,
|
|
|
+ pwd = 133,
|
|
|
+ pack = 134,
|
|
|
+ total = 135
|
|
|
+};
|
|
|
+
|
|
|
+void weebo_scene_write_calculate_pwd(uint8_t* uid, uint8_t* pwd) {
|
|
|
+ pwd[0] = uid[1] ^ uid[3] ^ 0xAA;
|
|
|
+ pwd[1] = uid[2] ^ uid[4] ^ 0x55;
|
|
|
+ pwd[2] = uid[3] ^ uid[5] ^ 0xAA;
|
|
|
+ pwd[3] = uid[4] ^ uid[6] ^ 0x55;
|
|
|
+}
|
|
|
+
|
|
|
NfcCommand weebo_scene_write_poller_callback(NfcGenericEvent event, void* context) {
|
|
|
furi_assert(event.protocol == NfcProtocolMfUltralight);
|
|
|
Weebo* weebo = context;
|
|
|
@@ -32,18 +59,59 @@ NfcCommand weebo_scene_write_poller_callback(NfcGenericEvent event, void* contex
|
|
|
data->iso14443_3a_data->uid[3],
|
|
|
data->iso14443_3a_data->uid[4],
|
|
|
data->iso14443_3a_data->uid[5]);
|
|
|
- ret = NfcCommandStop;
|
|
|
- }
|
|
|
- /*
|
|
|
- } else if(instance->mf_ul_auth->type == MfUltralightAuthTypeAmiibo) {
|
|
|
- if(mf_ultralight_generate_amiibo_pass(
|
|
|
- weebo->mf_ul_auth,
|
|
|
- data->iso14443_3a_data->uid,
|
|
|
- data->iso14443_3a_data->uid_len)) {
|
|
|
- mf_ultralight_event->data->auth_context.skip_auth = false;
|
|
|
+
|
|
|
+ for(size_t p = 0; p < 2; p++) {
|
|
|
+ for(size_t i = 0; i < MF_ULTRALIGHT_PAGE_SIZE; i++) {
|
|
|
+ weebo->figure[NFC3D_UID_OFFSET + p * MF_ULTRALIGHT_PAGE_SIZE + i] =
|
|
|
+ data->page[p].data[i];
|
|
|
}
|
|
|
-*/
|
|
|
+ }
|
|
|
+
|
|
|
+ uint8_t modified[NTAG215_SIZE];
|
|
|
+ nfc3d_amiibo_pack(&weebo->amiiboKeys, weebo->figure, modified);
|
|
|
+
|
|
|
+ /*
|
|
|
+ MfUltralightAuth* mf_ul_auth;
|
|
|
+ mf_ul_auth = mf_ultralight_auth_alloc();
|
|
|
+ mf_ultralight_generate_amiibo_pass(
|
|
|
+ mf_ul_auth, data->iso14443_3a_data->uid, data->iso14443_3a_data->uid_len);
|
|
|
+ */
|
|
|
+ uint8_t PWD[4];
|
|
|
+ weebo_scene_write_calculate_pwd(data->iso14443_3a_data->uid, PWD);
|
|
|
+
|
|
|
+ MfUltralightData* newdata = mf_ultralight_alloc();
|
|
|
+ nfc_device_copy_data(weebo->nfc_device, NfcProtocolMfUltralight, newdata);
|
|
|
+
|
|
|
+ do {
|
|
|
+ // user data
|
|
|
+ for(size_t i = userMemoryFirst; i <= userMemoryLast; i++) {
|
|
|
+ newdata->page[i / MF_ULTRALIGHT_PAGE_SIZE].data[i % MF_ULTRALIGHT_PAGE_SIZE] =
|
|
|
+ modified[i];
|
|
|
+ }
|
|
|
+ // pwd
|
|
|
+ memcpy(newdata->page[pwd].data, PWD, sizeof(PWD));
|
|
|
+ // pack
|
|
|
+ memcpy(newdata->page[pack].data, PACKRFUI, sizeof(PACKRFUI));
|
|
|
+ // capability container
|
|
|
+ memcpy(newdata->page[capabilityContainer].data, CC, sizeof(CC));
|
|
|
+ // cfg0
|
|
|
+ memcpy(newdata->page[cfg0].data, CFG0, sizeof(CFG0));
|
|
|
+ // cfg1
|
|
|
+ memcpy(newdata->page[cfg1].data, CFG1, sizeof(CFG1));
|
|
|
+ // dynamic lock bits
|
|
|
+ memcpy(newdata->page[dynamicLockBits].data, DLB, sizeof(DLB));
|
|
|
+ // static lock bits
|
|
|
+ memcpy(newdata->page[staticLockBits].data, SLB, sizeof(SLB));
|
|
|
+
|
|
|
+ nfc_device_set_data(weebo->nfc_device, NfcProtocolMfUltralight, newdata);
|
|
|
+
|
|
|
+ } while(false);
|
|
|
+
|
|
|
+ mf_ultralight_free(newdata);
|
|
|
+ //mf_ultralight_auth_free(instance->mf_ul_auth);
|
|
|
|
|
|
+ ret = NfcCommandStop;
|
|
|
+ }
|
|
|
return ret;
|
|
|
}
|
|
|
|