diff --git a/config/config.qrc b/config/config.qrc
index 1dc106c..0630063 100644
--- a/config/config.qrc
+++ b/config/config.qrc
@@ -4,5 +4,6 @@
config_rrgv4.13441.json
config_rrgv4.15864.json
config_rrgv4.16717.json
+ config_rrgv4.21128.json
diff --git a/config/config_rrgv4.21128.json b/config/config_rrgv4.21128.json
new file mode 100644
index 0000000..bdff028
--- /dev/null
+++ b/config/config_rrgv4.21128.json
@@ -0,0 +1,205 @@
+{
+ "//": "Based on Proxmark3 rrg repo v4.21128 (Permafrost), 2026-02-25",
+ "//": "You can change this file if the command format of client changes",
+ "mifare classic": {
+ "nested": {
+ "cmd": "hf mf nested -- --blk - -k ",
+ "static cmd": "hf mf staticnested -- --blk - -k ",
+ "card type": {
+ "mini": "mini",
+ "1k": "1k",
+ "2k": "2k",
+ "4k": "4k"
+ },
+ "key type": {
+ "A": "a",
+ "B": "b"
+ },
+ "key pattern": "\\s*\\d{3}\\s*\\|\\s*\\d{3}\\s*\\|\\s*.+?\\s*\\|\\s*.+?\\s*\\|\\s*.+?\\s*\\|\\s*.+?\\s*$",
+ "key A index": 2,
+ "key B index": 4
+ },
+ "autopwn": {
+ "cmd": "hf mf autopwn --",
+ "card type": {
+ "mini": "mini",
+ "1k": "1k",
+ "2k": "2k",
+ "4k": "4k"
+ },
+ "key pattern": "\\s*\\d{3}\\s*\\|\\s*\\d{3}\\s*\\|\\s*.+?\\s*\\|\\s*.+?\\s*\\|\\s*.+?\\s*\\|\\s*.+?\\s*$",
+ "key A index": 2,
+ "key B index": 4
+ },
+ "check": {
+ "cmd": "hf mf fchk --",
+ "card type": {
+ "mini": "mini",
+ "1k": "1k",
+ "2k": "2k",
+ "4k": "4k"
+ },
+ "key pattern": "\\s*\\d{3}\\s*\\|\\s*\\d{3}\\s*\\|\\s*.+?\\s*\\|\\s*.+?\\s*\\|\\s*.+?\\s*\\|\\s*.+?\\s*$",
+ "key A index": 2,
+ "key B index": 4
+ },
+ "info": {
+ "cmd": "hf 14a info -nsv",
+ "basic cmd": "hf 14a info"
+ },
+ "sniff": {
+ "cmd": "hf sniff"
+ },
+ "sniff 14a": {
+ "cmd": "hf 14a sniff"
+ },
+ "list": {
+ "cmd": "trace list -t mf"
+ },
+ "dump": {
+ "cmd": "hf mf dump --",
+ "card type": {
+ "mini": "mini",
+ "1k": "1k",
+ "2k": "2k",
+ "4k": "4k"
+ }
+ },
+ "restore": {
+ "cmd": "hf mf restore -- --force",
+ "card type": {
+ "mini": "mini",
+ "1k": "1k",
+ "2k": "2k",
+ "4k": "4k"
+ }
+ },
+ "emulator wipe": {
+ "cmd": "hf mf eclr"
+ },
+ "Magic Card wipe": {
+ "cmd": "hf mf cwipe"
+ },
+ "emulator read block": {
+ "cmd": "hf mf egetblk --blk ",
+ "data pattern": "([0-9a-fA-F]{2} ){15}[0-9a-fA-F]{2}"
+ },
+ "Magic Card read block": {
+ "cmd": "hf mf cgetblk --blk ",
+ "data pattern": "([0-9a-fA-F]{2} ){15}[0-9a-fA-F]{2}"
+ },
+ "normal read block": {
+ "cmd": "hf mf rdbl --blk - -k ",
+ "key type": {
+ "A": "a",
+ "B": "b"
+ },
+ "data pattern": "([0-9a-fA-F]{2} ){15}[0-9a-fA-F]{2}"
+ },
+ "darkside": {
+ "cmd": "hf mf darkside"
+ },
+ "save sniff": {
+ "cmd": "trace save -f ",
+ "path cmd": "prefs show",
+ "path pattern": "trace save path\\.+\\s*(.+)$"
+ },
+ "load sniff": {
+ "cmd": "trace load -f ",
+ "show cmd": "trace list --buffer -t mf"
+ },
+ "hardnested": {
+ "cmd": "hf mf hardnested --blk - -k --tblk --t",
+ "known key type": {
+ "A": "a",
+ "B": "b"
+ },
+ "target key type": {
+ "A": "a",
+ "B": "b"
+ }
+ },
+ "normal read sector": {
+ "cmd": "hf mf rdsc --sec - -k ",
+ "key type": {
+ "A": "a",
+ "B": "b"
+ },
+ "data pattern": "([0-9a-fA-F]{2} ){15}[0-9a-fA-F]{2}"
+ },
+ "Magic Card read sector": {
+ "cmd": "hf mf cgetsc --sec ",
+ "data pattern": "([0-9a-fA-F]{2} ){15}[0-9a-fA-F]{2}"
+ },
+ "normal write block": {
+ "cmd": "hf mf wrbl --blk - -k -d --force",
+ "key type": {
+ "A": "a",
+ "B": "b"
+ },
+ "failed flag": ["fail", "error"]
+ },
+ "Magic Card write block": {
+ "cmd": "hf mf csetblk --blk -d ",
+ "failed flag": ["fail", "error"]
+ },
+ "emulator write block": {
+ "cmd": "hf mf esetblk --blk -d "
+ },
+ "Magic Card lock": {
+ "cmd": "hf 14a raw ",
+ "sequence": [
+ "-ak -b 7 40",
+ "-ak 43",
+ "-ak E0 00 39 F7",
+ "-ak E1 00 E1 EE",
+ "-ak 85 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 18 47",
+ "-a 52"
+ ]
+ },
+ "Magic Card set parameter": {
+ "cmd": "hf mf csetuid --uid --atqa --sak "
+ }
+ },
+ "lf": {
+ "read": {
+ "cmd": "lf read -v",
+ "show cmd": "data plot"
+ },
+ "sniff": {
+ "cmd": "lf sniff -v",
+ "show cmd": "data plot"
+ },
+ "search": {
+ "cmd": "lf search -u"
+ },
+ "tune": {
+ "cmd": "lf tune --divisor "
+ },
+ "get config": {
+ "cmd": "hw status",
+ "field start": "LF Sampling config",
+ "field end": "\\[#\\] \\S",
+ "divisor": {"flag": "divisor", "pattern": "\\d+"},
+ "bits per sample": {"flag": "bits per sample", "pattern": "\\d+"},
+ "decimation": {"flag": "decimation", "pattern": "\\d+"},
+ "averaging": {"flag": "averaging", "pattern": "\\d+", "replace": {"yes": "1", "no": "0", "Yes": "1", "No": "0"}},
+ "trigger threshold": {"flag": "trigger threshold", "pattern": "\\d+"},
+ "samples to skip": {"flag": "samples to skip", "pattern": "\\d+"}
+ },
+ "set config": {
+ "cmd": "lf config --divisor --bps --dec --avg --trig --skip ",
+ "divisor cmd": "hw setlfdivisor -d "
+ }
+ },
+ "t55xx": {
+ "clone em410x": {
+ "read": "lf em 410x reader",
+ "successful read flag": "EM 410x ID",
+ "pattern": "EM 410x ID\\s*\\K[0-9a-fA-F]{10}",
+ "clone cmd": "lf em 410x clone --id ",
+ "t5555 flag": "--q5",
+ "t55x7 flag": ""
+ }
+ }
+}