mirror of
https://github.com/DarkFlippers/unleashed-firmware.git
synced 2025-12-13 05:06:30 +04:00
Merge branch 'dev' into release
This commit is contained in:
18
CHANGELOG.md
18
CHANGELOG.md
@@ -1,4 +1,12 @@
|
||||
## New changes
|
||||
* NFC: **Fixed stuck Saved success screen**
|
||||
* NFC: Fixed EMV txs render
|
||||
* NFC/LFRFID: Don't Stop emulation after 5 mins to avoid antenna damage if debug is ON (by @Leptopt1los)
|
||||
* LFRFID: Fixed T5577 custom password input (by @Leptopt1los)
|
||||
* OFW PR 3410: lfrfid/em4100: added support for different bit rates - by @Mrkvak (RF/32 full support, RF/16 support without reading (16clk removed for now))
|
||||
* OFW PR 3412: Fixed MyKey LockID - by @zProAle
|
||||
--
|
||||
Changes from 070 release:
|
||||
* NFC: **EMV parser** added (by @Leptopt1los and @wosk | PR #700)
|
||||
* NFC: Metromoney parser balance fix (by @Leptopt1los | PR #699)
|
||||
* NFC/LFRFID: Stop emulation after 5 mins to avoid antenna damage (by @Leptopt1los)
|
||||
@@ -16,11 +24,11 @@
|
||||
* System: More contrast values for replacement displays (up to +8 or -8)
|
||||
* USB/BLE HID: Add macOS Music app volume control
|
||||
* Apps: **Check out Apps updates by following** [this link](https://github.com/xMasterX/all-the-plugins/commits/dev)
|
||||
* OFW PR 3384: NFC: Display unread Mifare Classic bytes as question marks - by TollyH
|
||||
* OFW PR 3396: NFC: **fix application opening from browser** - by RebornedBrain (+ fix for leftover issues)
|
||||
* OFW PR 3382: NFC UI refactor - by RebornedBrain
|
||||
* OFW PR 3391: Rework more info scene for Ultralight cards - by RebornedBrain
|
||||
* OFW PR 3401: it-IT-mac layout - by nminaylov
|
||||
* OFW PR 3384: NFC: Display unread Mifare Classic bytes as question marks - by @TollyH
|
||||
* OFW PR 3396: NFC: **fix application opening from browser** - by @RebornedBrain (+ fix for leftover issues)
|
||||
* OFW PR 3382: NFC UI refactor - by @RebornedBrain
|
||||
* OFW PR 3391: Rework more info scene for Ultralight cards - by @RebornedBrain
|
||||
* OFW PR 3401: it-IT-mac layout - by @nminaylov
|
||||
* OFW: Fix expansion protocol crash when fed lots of garbage
|
||||
* OFW: 0.98.0-rc various fixes
|
||||
* OFW: RFID CLI: better usage
|
||||
|
||||
@@ -33,7 +33,9 @@ void lfrfid_scene_emulate_on_enter(void* context) {
|
||||
|
||||
timer_auto_exit =
|
||||
furi_timer_alloc(lfrfid_scene_emulate_popup_callback, FuriTimerTypeOnce, app);
|
||||
furi_timer_start(timer_auto_exit, LFRFID_EMULATION_TIME_MAX_MS);
|
||||
|
||||
if(!furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug))
|
||||
furi_timer_start(timer_auto_exit, LFRFID_EMULATION_TIME_MAX_MS);
|
||||
|
||||
view_dispatcher_switch_to_view(app->view_dispatcher, LfRfidViewPopup);
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ void lfrfid_scene_enter_password_on_enter(void* context) {
|
||||
const uint32_t* password_list = lfrfid_get_t5577_default_passwords(&password_list_size);
|
||||
uint32_t pass = password_list[furi_get_tick() % password_list_size];
|
||||
|
||||
for(uint8_t i = 0; i < 4; i++) app->password[i] = (pass >> (8 * i)) & 0xFF;
|
||||
for(uint8_t i = 0; i < 4; i++) app->password[4 - (i + 1)] = (pass >> (8 * i)) & 0xFF;
|
||||
}
|
||||
|
||||
byte_input_set_header_text(byte_input, "Enter the password in hex");
|
||||
|
||||
@@ -26,7 +26,7 @@ void lfrfid_scene_saved_key_menu_on_enter(void* context) {
|
||||
submenu, "Write", SubmenuIndexWrite, lfrfid_scene_saved_key_menu_submenu_callback, app);
|
||||
submenu_add_item(
|
||||
submenu,
|
||||
"Write and set pass",
|
||||
"Write and set password",
|
||||
SubmenuIndexWriteAndSetPass,
|
||||
lfrfid_scene_saved_key_menu_submenu_callback,
|
||||
app);
|
||||
|
||||
@@ -117,7 +117,8 @@ void nfc_render_emv_transactions(const EmvApplication* apl, FuriString* str) {
|
||||
|
||||
furi_string_cat_printf(str, "Transactions:\n");
|
||||
for(int i = 0; i < len; i++) {
|
||||
//if(!apl->trans[i].amount) continue; - NO Skip here pls
|
||||
// If no date and amount - skip
|
||||
if((!apl->trans[i].date) && (!apl->trans[i].amount)) continue;
|
||||
// transaction counter
|
||||
furi_string_cat_printf(str, "\e#%d: ", apl->trans[i].atc);
|
||||
|
||||
@@ -167,10 +168,13 @@ void nfc_render_emv_transactions(const EmvApplication* apl, FuriString* str) {
|
||||
if(apl->trans[i].time)
|
||||
furi_string_cat_printf(
|
||||
str,
|
||||
"%02lx:%02lx:%02lx\n",
|
||||
"%02lx:%02lx:%02lx",
|
||||
apl->trans[i].time & 0xff,
|
||||
(apl->trans[i].time >> 8) & 0xff,
|
||||
apl->trans[i].time >> 16);
|
||||
|
||||
// Line break
|
||||
furi_string_cat_printf(str, "\n");
|
||||
}
|
||||
|
||||
furi_string_free(tmp);
|
||||
|
||||
@@ -13,7 +13,7 @@ static bool mykey_is_blank(const St25tbData* data) {
|
||||
}
|
||||
|
||||
static bool mykey_has_lockid(const St25tbData* data) {
|
||||
return (data->blocks[5] & 0xFF) == 0x7F;
|
||||
return (data->blocks[5] >> 24) == 0x7F;
|
||||
}
|
||||
|
||||
static bool check_invalid_low_nibble(uint8_t value) {
|
||||
|
||||
@@ -20,7 +20,9 @@ void nfc_scene_emulate_on_enter(void* context) {
|
||||
|
||||
timer_auto_exit =
|
||||
furi_timer_alloc(nfc_scene_emulate_timer_callback, FuriTimerTypeOnce, instance);
|
||||
furi_timer_start(timer_auto_exit, NFC_EMULATION_TIME_MAX_MS);
|
||||
|
||||
if(!furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug))
|
||||
furi_timer_start(timer_auto_exit, NFC_EMULATION_TIME_MAX_MS);
|
||||
}
|
||||
|
||||
bool nfc_scene_emulate_on_event(void* context, SceneManagerEvent event) {
|
||||
|
||||
@@ -31,12 +31,22 @@ bool nfc_scene_save_success_on_event(void* context, SceneManagerEvent event) {
|
||||
} else if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneSaveConfirm)) {
|
||||
scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicDetectReader);
|
||||
consumed = true;
|
||||
} else if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneSetType)) {
|
||||
consumed = scene_manager_search_and_switch_to_another_scene(
|
||||
nfc->scene_manager, NfcSceneFileSelect);
|
||||
} else if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneReadSuccess)) {
|
||||
consumed = scene_manager_search_and_switch_to_another_scene(
|
||||
nfc->scene_manager, NfcSceneFileSelect);
|
||||
} else {
|
||||
consumed = scene_manager_search_and_switch_to_previous_scene(
|
||||
nfc->scene_manager, NfcSceneFileSelect);
|
||||
if(!consumed) {
|
||||
consumed = scene_manager_search_and_switch_to_previous_scene(
|
||||
nfc->scene_manager, NfcSceneSavedMenu);
|
||||
if(!consumed) {
|
||||
consumed = scene_manager_search_and_switch_to_another_scene(
|
||||
nfc->scene_manager, NfcSceneFileSelect);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
|
||||
const ProtocolBase* lfrfid_protocols[] = {
|
||||
[LFRFIDProtocolEM4100] = &protocol_em4100,
|
||||
[LFRFIDProtocolEM4100_32] = &protocol_em4100_32,
|
||||
[LFRFIDProtocolH10301] = &protocol_h10301,
|
||||
[LFRFIDProtocolIdteck] = &protocol_idteck,
|
||||
[LFRFIDProtocolIndala26] = &protocol_indala26,
|
||||
|
||||
@@ -9,6 +9,7 @@ typedef enum {
|
||||
|
||||
typedef enum {
|
||||
LFRFIDProtocolEM4100,
|
||||
LFRFIDProtocolEM4100_32,
|
||||
LFRFIDProtocolH10301,
|
||||
LFRFIDProtocolIdteck,
|
||||
LFRFIDProtocolIndala26,
|
||||
|
||||
@@ -24,16 +24,9 @@ typedef uint64_t EM4100DecodedData;
|
||||
#define EM4100_DECODED_DATA_SIZE (5)
|
||||
#define EM4100_ENCODED_DATA_SIZE (sizeof(EM4100DecodedData))
|
||||
|
||||
#define EM4100_CLOCK_PER_BIT (64)
|
||||
|
||||
#define EM_READ_SHORT_TIME (256)
|
||||
#define EM_READ_LONG_TIME (512)
|
||||
#define EM_READ_JITTER_TIME (100)
|
||||
|
||||
#define EM_READ_SHORT_TIME_LOW (EM_READ_SHORT_TIME - EM_READ_JITTER_TIME)
|
||||
#define EM_READ_SHORT_TIME_HIGH (EM_READ_SHORT_TIME + EM_READ_JITTER_TIME)
|
||||
#define EM_READ_LONG_TIME_LOW (EM_READ_LONG_TIME - EM_READ_JITTER_TIME)
|
||||
#define EM_READ_LONG_TIME_HIGH (EM_READ_LONG_TIME + EM_READ_JITTER_TIME)
|
||||
#define EM_READ_SHORT_TIME_BASE (256)
|
||||
#define EM_READ_LONG_TIME_BASE (512)
|
||||
#define EM_READ_JITTER_TIME_BASE (100)
|
||||
|
||||
typedef struct {
|
||||
uint8_t data[EM4100_DECODED_DATA_SIZE];
|
||||
@@ -43,10 +36,60 @@ typedef struct {
|
||||
bool encoded_polarity;
|
||||
|
||||
ManchesterState decoder_manchester_state;
|
||||
uint8_t clock_per_bit;
|
||||
} ProtocolEM4100;
|
||||
|
||||
uint16_t protocol_em4100_get_time_divisor(ProtocolEM4100* proto) {
|
||||
switch(proto->clock_per_bit) {
|
||||
case 64:
|
||||
return 1;
|
||||
case 32:
|
||||
return 2;
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t protocol_em4100_get_t5577_bitrate(ProtocolEM4100* proto) {
|
||||
switch(proto->clock_per_bit) {
|
||||
case 64:
|
||||
return LFRFID_T5577_BITRATE_RF_64;
|
||||
case 32:
|
||||
return LFRFID_T5577_BITRATE_RF_32;
|
||||
default:
|
||||
return LFRFID_T5577_BITRATE_RF_64;
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t protocol_em4100_get_short_time_low(ProtocolEM4100* proto) {
|
||||
return EM_READ_SHORT_TIME_BASE / protocol_em4100_get_time_divisor(proto) -
|
||||
EM_READ_JITTER_TIME_BASE / protocol_em4100_get_time_divisor(proto);
|
||||
}
|
||||
|
||||
uint16_t protocol_em4100_get_short_time_high(ProtocolEM4100* proto) {
|
||||
return EM_READ_SHORT_TIME_BASE / protocol_em4100_get_time_divisor(proto) +
|
||||
EM_READ_JITTER_TIME_BASE / protocol_em4100_get_time_divisor(proto);
|
||||
}
|
||||
|
||||
uint16_t protocol_em4100_get_long_time_low(ProtocolEM4100* proto) {
|
||||
return EM_READ_LONG_TIME_BASE / protocol_em4100_get_time_divisor(proto) -
|
||||
EM_READ_JITTER_TIME_BASE / protocol_em4100_get_time_divisor(proto);
|
||||
}
|
||||
|
||||
uint16_t protocol_em4100_get_long_time_high(ProtocolEM4100* proto) {
|
||||
return EM_READ_LONG_TIME_BASE / protocol_em4100_get_time_divisor(proto) +
|
||||
EM_READ_JITTER_TIME_BASE / protocol_em4100_get_time_divisor(proto);
|
||||
}
|
||||
|
||||
ProtocolEM4100* protocol_em4100_alloc(void) {
|
||||
ProtocolEM4100* proto = malloc(sizeof(ProtocolEM4100));
|
||||
proto->clock_per_bit = 64;
|
||||
return (void*)proto;
|
||||
};
|
||||
|
||||
ProtocolEM4100* protocol_em4100_32_alloc(void) {
|
||||
ProtocolEM4100* proto = malloc(sizeof(ProtocolEM4100));
|
||||
proto->clock_per_bit = 32;
|
||||
return (void*)proto;
|
||||
};
|
||||
|
||||
@@ -145,13 +188,16 @@ bool protocol_em4100_decoder_feed(ProtocolEM4100* proto, bool level, uint32_t du
|
||||
|
||||
ManchesterEvent event = ManchesterEventReset;
|
||||
|
||||
if(duration > EM_READ_SHORT_TIME_LOW && duration < EM_READ_SHORT_TIME_HIGH) {
|
||||
if(duration > protocol_em4100_get_short_time_low(proto) &&
|
||||
duration < protocol_em4100_get_short_time_high(proto)) {
|
||||
if(!level) {
|
||||
event = ManchesterEventShortHigh;
|
||||
} else {
|
||||
event = ManchesterEventShortLow;
|
||||
}
|
||||
} else if(duration > EM_READ_LONG_TIME_LOW && duration < EM_READ_LONG_TIME_HIGH) {
|
||||
} else if(
|
||||
duration > protocol_em4100_get_long_time_low(proto) &&
|
||||
duration < protocol_em4100_get_long_time_high(proto)) {
|
||||
if(!level) {
|
||||
event = ManchesterEventLongHigh;
|
||||
} else {
|
||||
@@ -227,7 +273,7 @@ bool protocol_em4100_encoder_start(ProtocolEM4100* proto) {
|
||||
|
||||
LevelDuration protocol_em4100_encoder_yield(ProtocolEM4100* proto) {
|
||||
bool level = (proto->encoded_data >> (63 - proto->encoded_data_index)) & 1;
|
||||
uint32_t duration = EM4100_CLOCK_PER_BIT / 2;
|
||||
uint32_t duration = proto->clock_per_bit / 2;
|
||||
|
||||
if(proto->encoded_polarity) {
|
||||
proto->encoded_polarity = false;
|
||||
@@ -260,7 +306,7 @@ bool protocol_em4100_write_data(ProtocolEM4100* protocol, void* data) {
|
||||
|
||||
if(request->write_type == LFRFIDWriteTypeT5577) {
|
||||
request->t5577.block[0] =
|
||||
(LFRFID_T5577_MODULATION_MANCHESTER | LFRFID_T5577_BITRATE_RF_64 |
|
||||
(LFRFID_T5577_MODULATION_MANCHESTER | protocol_em4100_get_t5577_bitrate(protocol) |
|
||||
(2 << LFRFID_T5577_MAXBLOCK_SHIFT));
|
||||
request->t5577.block[1] = protocol->encoded_data;
|
||||
request->t5577.block[2] = protocol->encoded_data >> 32;
|
||||
@@ -273,7 +319,11 @@ bool protocol_em4100_write_data(ProtocolEM4100* protocol, void* data) {
|
||||
void protocol_em4100_render_data(ProtocolEM4100* protocol, FuriString* result) {
|
||||
uint8_t* data = protocol->data;
|
||||
furi_string_printf(
|
||||
result, "FC: %03u, Card: %05u", data[2], (uint16_t)((data[3] << 8) | (data[4])));
|
||||
result,
|
||||
"FC: %03u, Card: %05u\n(RF/%u)",
|
||||
data[2],
|
||||
(uint16_t)((data[3] << 8) | (data[4])),
|
||||
protocol->clock_per_bit);
|
||||
};
|
||||
|
||||
const ProtocolBase protocol_em4100 = {
|
||||
@@ -298,4 +348,28 @@ const ProtocolBase protocol_em4100 = {
|
||||
.render_data = (ProtocolRenderData)protocol_em4100_render_data,
|
||||
.render_brief_data = (ProtocolRenderData)protocol_em4100_render_data,
|
||||
.write_data = (ProtocolWriteData)protocol_em4100_write_data,
|
||||
};
|
||||
};
|
||||
|
||||
const ProtocolBase protocol_em4100_32 = {
|
||||
.name = "EM4100/32",
|
||||
.manufacturer = "EM-Micro",
|
||||
.data_size = EM4100_DECODED_DATA_SIZE,
|
||||
.features = LFRFIDFeatureASK | LFRFIDFeaturePSK,
|
||||
.validate_count = 3,
|
||||
.alloc = (ProtocolAlloc)protocol_em4100_32_alloc,
|
||||
.free = (ProtocolFree)protocol_em4100_free,
|
||||
.get_data = (ProtocolGetData)protocol_em4100_get_data,
|
||||
.decoder =
|
||||
{
|
||||
.start = (ProtocolDecoderStart)protocol_em4100_decoder_start,
|
||||
.feed = (ProtocolDecoderFeed)protocol_em4100_decoder_feed,
|
||||
},
|
||||
.encoder =
|
||||
{
|
||||
.start = (ProtocolEncoderStart)protocol_em4100_encoder_start,
|
||||
.yield = (ProtocolEncoderYield)protocol_em4100_encoder_yield,
|
||||
},
|
||||
.render_data = (ProtocolRenderData)protocol_em4100_render_data,
|
||||
.render_brief_data = (ProtocolRenderData)protocol_em4100_render_data,
|
||||
.write_data = (ProtocolWriteData)protocol_em4100_write_data,
|
||||
};
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
#pragma once
|
||||
#include <toolbox/protocols/protocol.h>
|
||||
|
||||
extern const ProtocolBase protocol_em4100;
|
||||
extern const ProtocolBase protocol_em4100;
|
||||
|
||||
extern const ProtocolBase protocol_em4100_32;
|
||||
|
||||
Reference in New Issue
Block a user