keyfabe 0.7.1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -7
- package/dist/commands/clone.d.ts +3 -1
- package/dist/commands/clone.js +97 -11
- package/dist/commands/clone.js.map +1 -1
- package/dist/commands/read.d.ts +3 -1
- package/dist/commands/read.js +9 -7
- package/dist/commands/read.js.map +1 -1
- package/dist/commands/rename.js +2 -10
- package/dist/commands/rename.js.map +1 -1
- package/dist/commands/verify.js +7 -5
- package/dist/commands/verify.js.map +1 -1
- package/dist/commands/write.js +53 -4
- package/dist/commands/write.js.map +1 -1
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/card-ops.d.ts +6 -0
- package/dist/lib/card-ops.js +43 -3
- package/dist/lib/card-ops.js.map +1 -1
- package/dist/lib/constants.d.ts +24 -0
- package/dist/lib/constants.js +24 -0
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/display.d.ts +5 -0
- package/dist/lib/display.js +17 -0
- package/dist/lib/display.js.map +1 -1
- package/dist/lib/mf-ops.d.ts +20 -0
- package/dist/lib/mf-ops.js +41 -0
- package/dist/lib/mf-ops.js.map +1 -0
- package/dist/lib/parsers.d.ts +23 -0
- package/dist/lib/parsers.js +36 -0
- package/dist/lib/parsers.js.map +1 -1
- package/dist/lib/prompts.d.ts +2 -0
- package/dist/lib/prompts.js +24 -0
- package/dist/lib/prompts.js.map +1 -1
- package/dist/lib/store.d.ts +1 -0
- package/dist/lib/store.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -52,10 +52,10 @@ keyfabe doctor
|
|
|
52
52
|
keyfabe setup
|
|
53
53
|
|
|
54
54
|
# guided interactive clone flow (read original → write to blank)
|
|
55
|
-
keyfabe clone
|
|
55
|
+
keyfabe clone [--save-as <name>]
|
|
56
56
|
|
|
57
57
|
# read and identify a tag without cloning
|
|
58
|
-
keyfabe read
|
|
58
|
+
keyfabe read [--save-as <name>]
|
|
59
59
|
|
|
60
60
|
# write a previously-saved identity to a blank tag
|
|
61
61
|
keyfabe write [name]
|
|
@@ -87,6 +87,39 @@ keyfabe repair
|
|
|
87
87
|
|
|
88
88
|
Commands that take `[name]` arguments are fully optional — when omitted, you'll get an interactive tag picker.
|
|
89
89
|
|
|
90
|
+
### Scripting / Non-Interactive Mode
|
|
91
|
+
|
|
92
|
+
keyfabe auto-detects non-interactive mode when stdin is not a TTY (e.g., piped input, cron jobs, called from another process). No flags needed — interactive prompts are automatically skipped or replaced with sensible defaults:
|
|
93
|
+
|
|
94
|
+
- **Pause prompts** (`waitForEnter`) — logged and skipped (scripted callers handle card placement themselves)
|
|
95
|
+
- **Save prompts** (`promptName`) — skipped (use `--save-as` to save)
|
|
96
|
+
- **Confirmation prompts** — auto-yes (you explicitly invoked the command)
|
|
97
|
+
- **Selection prompts** — exit with error (provide the name as a CLI argument instead)
|
|
98
|
+
|
|
99
|
+
```sh
|
|
100
|
+
# read a tag and save it non-interactively
|
|
101
|
+
keyfabe read --save-as front-door < /dev/null
|
|
102
|
+
|
|
103
|
+
# clone and save in one shot
|
|
104
|
+
keyfabe clone --save-as lobby-key < /dev/null
|
|
105
|
+
|
|
106
|
+
# write a saved identity (already non-interactive with name arg)
|
|
107
|
+
keyfabe write front-door < /dev/null
|
|
108
|
+
|
|
109
|
+
# verify a tag against a saved identity
|
|
110
|
+
keyfabe verify front-door < /dev/null
|
|
111
|
+
|
|
112
|
+
# export/import work without changes
|
|
113
|
+
keyfabe export > backup.json
|
|
114
|
+
keyfabe import backup.json
|
|
115
|
+
|
|
116
|
+
# list and show work without changes
|
|
117
|
+
keyfabe list --json
|
|
118
|
+
keyfabe show front-door
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Commands that require interactive selection (e.g., `keyfabe delete` without a name argument) will exit with a clear error message when run non-interactively.
|
|
122
|
+
|
|
90
123
|
## Commands
|
|
91
124
|
|
|
92
125
|
### `keyfabe doctor`
|
|
@@ -99,15 +132,18 @@ Interactive wizard for flashing Iceman firmware to a stock Proxmark3 Easy. Handl
|
|
|
99
132
|
|
|
100
133
|
### `keyfabe clone`
|
|
101
134
|
|
|
102
|
-
Guided clone flow: reads the original tag (LF and HF), writes
|
|
135
|
+
Guided clone flow: reads the original tag (LF and HF), writes to a blank card, and verifies the readback. Optionally saves the identity for later use. Use `--save-as <name>` to save without prompting.
|
|
136
|
+
|
|
137
|
+
- **LF cards** (EM410x, HID Prox): writes the UID to a blank T55x7
|
|
138
|
+
- **MIFARE Classic**: full-card clone — automatically cracks all sector keys, dumps all blocks, and restores them onto a magic card. Supports standard chips via `autopwn` and FM11RF08S chips via automatic fallback recovery (~28 min)
|
|
103
139
|
|
|
104
140
|
### `keyfabe read`
|
|
105
141
|
|
|
106
|
-
Reads and identifies whatever tag is on the antenna. Searches LF first, then falls back to HF. Supports EM410x, HID Prox, MIFARE Classic, MIFARE Ultralight, MIFARE DESFire, and ISO 14443-A. Optionally saves the identity.
|
|
142
|
+
Reads and identifies whatever tag is on the antenna. Searches LF first, then falls back to HF. Supports EM410x, HID Prox, MIFARE Classic, MIFARE Ultralight, MIFARE DESFire, and ISO 14443-A. Optionally saves the identity. Use `--save-as <name>` to save without prompting.
|
|
107
143
|
|
|
108
144
|
### `keyfabe write [name]`
|
|
109
145
|
|
|
110
|
-
Writes a previously-saved identity to a blank tag. Without a name, presents an interactive picker.
|
|
146
|
+
Writes a previously-saved identity to a blank tag. Without a name, presents an interactive picker. For MIFARE Classic identities with a saved full-card dump, restores all blocks (not just UID).
|
|
111
147
|
|
|
112
148
|
### `keyfabe verify [name]`
|
|
113
149
|
|
|
@@ -149,7 +185,7 @@ For detailed information on magic card types, block 0 format, and recovery proce
|
|
|
149
185
|
|------|-----------|------|-------|-------|
|
|
150
186
|
| EM410x | LF (125 kHz) | yes | yes | Most common LF tag |
|
|
151
187
|
| HID Prox | LF (125 kHz) | yes | yes | Uses `lf hid clone` |
|
|
152
|
-
| MIFARE Classic 1K/4K | HF (13.56 MHz) | yes | yes |
|
|
188
|
+
| MIFARE Classic 1K/4K | HF (13.56 MHz) | yes | yes | Full-card clone (all sectors + keys) to Gen1A or Gen2/CUID magic cards |
|
|
153
189
|
| MIFARE Ultralight | HF (13.56 MHz) | yes | no | Read-only support |
|
|
154
190
|
| MIFARE DESFire | HF (13.56 MHz) | yes | no | Read-only support |
|
|
155
191
|
| ISO 14443-A | HF (13.56 MHz) | yes | no | Generic HF detection |
|
|
@@ -194,6 +230,7 @@ src/
|
|
|
194
230
|
store.ts # read/write ~/.keyfabe/fobs.json
|
|
195
231
|
constants.ts # shared card type and pm3 command constants
|
|
196
232
|
card-ops.ts # search, write-and-verify logic shared by commands
|
|
233
|
+
mf-ops.ts # MIFARE Classic full-card operations (crack, dump, restore)
|
|
197
234
|
display.ts # shared display helpers and constants
|
|
198
|
-
prompts.ts # interactive user prompts
|
|
235
|
+
prompts.ts # interactive user prompts (auto-detects non-interactive mode)
|
|
199
236
|
```
|
package/dist/commands/clone.d.ts
CHANGED
package/dist/commands/clone.js
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import * as p from "@clack/prompts";
|
|
2
|
-
import {
|
|
3
|
-
import { cardFrequency, WriteTarget } from "../lib/constants.js";
|
|
4
|
-
import { printCardInfo, printDoctorHint } from "../lib/display.js";
|
|
5
|
-
import {
|
|
2
|
+
import { detectMagicType, searchCardWithDiagnosis, writeAndVerify } from "../lib/card-ops.js";
|
|
3
|
+
import { CardType, cardFrequency, DetectionSummary, MagicCardType, Pm3Cmd, WriteTarget } from "../lib/constants.js";
|
|
4
|
+
import { printCardInfo, printDetectionHint, printDoctorHint, printFullCardCloneProgress, printNotMagicHint, } from "../lib/display.js";
|
|
5
|
+
import { crackKeys, dumpCard, restoreCard } from "../lib/mf-ops.js";
|
|
6
|
+
import { parseHfSearch } from "../lib/parsers.js";
|
|
7
|
+
import { Pm3Error, pm3Exec, requireDevice } from "../lib/pm3.js";
|
|
6
8
|
import { promptName, waitForEnter } from "../lib/prompts.js";
|
|
7
9
|
import { saveFob } from "../lib/store.js";
|
|
8
10
|
const MAX_READ_RETRIES = 3;
|
|
9
11
|
const READ_RETRY_DELAY = 2000;
|
|
10
|
-
export async function clone() {
|
|
12
|
+
export async function clone(options) {
|
|
11
13
|
if (!(await requireDevice()))
|
|
12
14
|
return false;
|
|
13
15
|
p.intro("Clone Tag");
|
|
@@ -18,13 +20,15 @@ export async function clone() {
|
|
|
18
20
|
const s = p.spinner();
|
|
19
21
|
s.start(`Reading original (attempt ${attempt}/${MAX_READ_RETRIES})...`);
|
|
20
22
|
try {
|
|
21
|
-
|
|
22
|
-
if (card) {
|
|
23
|
+
const result = await searchCardWithDiagnosis();
|
|
24
|
+
if (result.card) {
|
|
25
|
+
card = result.card;
|
|
23
26
|
s.stop("Original tag read");
|
|
24
27
|
break;
|
|
25
28
|
}
|
|
26
|
-
s.stop(
|
|
27
|
-
p.log.error(
|
|
29
|
+
s.stop(DetectionSummary[result.diagnosis]);
|
|
30
|
+
p.log.error(DetectionSummary[result.diagnosis]);
|
|
31
|
+
printDetectionHint(result.diagnosis);
|
|
28
32
|
}
|
|
29
33
|
catch (err) {
|
|
30
34
|
if (err instanceof Pm3Error) {
|
|
@@ -49,13 +53,17 @@ export async function clone() {
|
|
|
49
53
|
return false;
|
|
50
54
|
}
|
|
51
55
|
printCardInfo(card);
|
|
52
|
-
//
|
|
56
|
+
// Route MIFARE Classic to full-card flow
|
|
57
|
+
if (card.type === CardType.MIFARE_CLASSIC_1K || card.type === CardType.MIFARE_CLASSIC_4K) {
|
|
58
|
+
return cloneMifareClassic(card, options);
|
|
59
|
+
}
|
|
60
|
+
// Step 2: Write to blank (UID-only path for LF/simple HF)
|
|
53
61
|
const freq = cardFrequency(card.type);
|
|
54
62
|
await waitForEnter(`Remove original and place a ${WriteTarget[freq]} on the antenna.`);
|
|
55
63
|
const success = await writeAndVerify(card);
|
|
56
64
|
if (success) {
|
|
57
65
|
p.log.success("Clone successful!");
|
|
58
|
-
const name = await promptName();
|
|
66
|
+
const name = options?.saveAs ?? (await promptName());
|
|
59
67
|
if (name) {
|
|
60
68
|
await saveFob({
|
|
61
69
|
name,
|
|
@@ -72,4 +80,82 @@ export async function clone() {
|
|
|
72
80
|
p.log.error("Clone failed.");
|
|
73
81
|
return false;
|
|
74
82
|
}
|
|
83
|
+
async function cloneMifareClassic(card, options) {
|
|
84
|
+
// Step 2a: Crack sector keys
|
|
85
|
+
const crackSpinner = p.spinner();
|
|
86
|
+
crackSpinner.start("Cracking sector keys (this may take a while)...");
|
|
87
|
+
const crackResult = await crackKeys(card.id, card.type);
|
|
88
|
+
if (!crackResult) {
|
|
89
|
+
crackSpinner.stop("Failed to crack sector keys.");
|
|
90
|
+
p.log.error("Could not recover sector keys. The card may use an unsupported encryption method.");
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
crackSpinner.stop(`Sector keys recovered (${crackResult.method})`);
|
|
94
|
+
printFullCardCloneProgress(crackResult.method);
|
|
95
|
+
// Step 2b: Dump all blocks
|
|
96
|
+
const dumpSpinner = p.spinner();
|
|
97
|
+
dumpSpinner.start("Dumping all card data...");
|
|
98
|
+
const dumpResult = await dumpCard(card.id, card.type, crackResult.keyFile);
|
|
99
|
+
if (!dumpResult) {
|
|
100
|
+
dumpSpinner.stop("Failed to dump card data.");
|
|
101
|
+
p.log.error("Could not dump card data.");
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
dumpSpinner.stop("Full card dump saved");
|
|
105
|
+
// Step 3: Prompt to place blank magic card
|
|
106
|
+
await waitForEnter(`Remove original and place a ${WriteTarget.HF} on the antenna.`);
|
|
107
|
+
// Step 3a: Detect magic card type on target
|
|
108
|
+
const magicSpinner = p.spinner();
|
|
109
|
+
magicSpinner.start("Detecting magic card type...");
|
|
110
|
+
const magicType = await detectMagicType();
|
|
111
|
+
if (magicType === MagicCardType.UNKNOWN) {
|
|
112
|
+
magicSpinner.stop("Target is not a magic card.");
|
|
113
|
+
printNotMagicHint();
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
if (magicType === MagicCardType.BRICKED) {
|
|
117
|
+
magicSpinner.stop("Card has broken anticollision.");
|
|
118
|
+
p.log.warn("Run `keyfabe repair` first, then try again.");
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
magicSpinner.stop(`Magic card detected (${magicType})`);
|
|
122
|
+
// Step 4: Restore all blocks
|
|
123
|
+
const restoreSpinner = p.spinner();
|
|
124
|
+
restoreSpinner.start("Restoring all blocks to magic card...");
|
|
125
|
+
const restoreResult = await restoreCard(dumpResult.dumpFile, dumpResult.keyFile, card.type);
|
|
126
|
+
if (!restoreResult.success) {
|
|
127
|
+
restoreSpinner.stop("Restore failed.");
|
|
128
|
+
p.log.error(`${restoreResult.failedBlocks} block(s) failed to write.`);
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
restoreSpinner.stop("All blocks restored");
|
|
132
|
+
// Step 5: Power cycle and verify
|
|
133
|
+
await waitForEnter("Remove the card from the antenna, then place it back.");
|
|
134
|
+
const verifySpinner = p.spinner();
|
|
135
|
+
verifySpinner.start("Verifying clone...");
|
|
136
|
+
const { stdout: verifyOut } = await pm3Exec(Pm3Cmd.HF_SEARCH);
|
|
137
|
+
const readback = parseHfSearch(verifyOut);
|
|
138
|
+
if (readback && readback.id === card.id) {
|
|
139
|
+
verifySpinner.stop("Verification passed — UIDs match");
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
verifySpinner.stop("Verification warning — UID readback mismatch");
|
|
143
|
+
p.log.warn("The UID may not have updated yet. Try removing and replacing the card.");
|
|
144
|
+
}
|
|
145
|
+
// Step 6: Save
|
|
146
|
+
p.log.success("Full-card clone successful!");
|
|
147
|
+
const name = options?.saveAs ?? (await promptName());
|
|
148
|
+
if (name) {
|
|
149
|
+
await saveFob({
|
|
150
|
+
name,
|
|
151
|
+
type: card.type,
|
|
152
|
+
id: card.id,
|
|
153
|
+
dumpFile: dumpResult.dumpFile,
|
|
154
|
+
savedAt: new Date().toISOString(),
|
|
155
|
+
});
|
|
156
|
+
p.log.success(`Saved as "${name}".`);
|
|
157
|
+
}
|
|
158
|
+
p.outro("Done!");
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
75
161
|
//# sourceMappingURL=clone.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clone.js","sourceRoot":"","sources":["../../src/commands/clone.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"clone.js","sourceRoot":"","sources":["../../src/commands/clone.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/read.d.ts
CHANGED
package/dist/commands/read.js
CHANGED
|
@@ -1,26 +1,28 @@
|
|
|
1
1
|
import * as p from "@clack/prompts";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { searchCardWithDiagnosis } from "../lib/card-ops.js";
|
|
3
|
+
import { DetectionSummary } from "../lib/constants.js";
|
|
4
|
+
import { printCardInfo, printDetectionHint, printDoctorHint } from "../lib/display.js";
|
|
4
5
|
import { Pm3Error, requireDevice } from "../lib/pm3.js";
|
|
5
6
|
import { promptName } from "../lib/prompts.js";
|
|
6
7
|
import { saveFob } from "../lib/store.js";
|
|
7
|
-
export async function read() {
|
|
8
|
+
export async function read(options) {
|
|
8
9
|
if (!(await requireDevice()))
|
|
9
10
|
return false;
|
|
10
11
|
p.intro("Read Tag");
|
|
11
12
|
const s = p.spinner();
|
|
12
13
|
s.start("Searching for tag...");
|
|
13
14
|
try {
|
|
14
|
-
const card = await
|
|
15
|
+
const { card, diagnosis } = await searchCardWithDiagnosis();
|
|
15
16
|
if (!card) {
|
|
16
|
-
s.stop(
|
|
17
|
-
p.log.error(
|
|
17
|
+
s.stop(DetectionSummary[diagnosis]);
|
|
18
|
+
p.log.error(DetectionSummary[diagnosis]);
|
|
19
|
+
printDetectionHint(diagnosis);
|
|
18
20
|
return false;
|
|
19
21
|
}
|
|
20
22
|
s.stop("Tag detected");
|
|
21
23
|
printCardInfo(card);
|
|
22
24
|
// Prompt to save
|
|
23
|
-
const name = await promptName();
|
|
25
|
+
const name = options?.saveAs ?? (await promptName());
|
|
24
26
|
if (name) {
|
|
25
27
|
await saveFob({
|
|
26
28
|
name,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/commands/read.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/commands/read.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACvF,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAA6B;IACpD,IAAI,CAAC,CAAC,MAAM,aAAa,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IAE3C,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAEpB,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IACtB,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAChC,IAAI,CAAC;QACD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,uBAAuB,EAAE,CAAC;QAC5D,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;YACpC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;YACzC,kBAAkB,CAAC,SAAS,CAAC,CAAC;YAC9B,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACvB,aAAa,CAAC,IAAI,CAAC,CAAC;QAEpB,iBAAiB;QACjB,MAAM,IAAI,GAAG,OAAO,EAAE,MAAM,IAAI,CAAC,MAAM,UAAU,EAAE,CAAC,CAAC;QACrD,IAAI,IAAI,EAAE,CAAC;YACP,MAAM,OAAO,CAAC;gBACV,IAAI;gBACJ,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;YACH,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YAC1B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACpB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACzB,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBACpC,eAAe,EAAE,CAAC;YACtB,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACzB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC"}
|
package/dist/commands/rename.js
CHANGED
|
@@ -1,13 +1,7 @@
|
|
|
1
1
|
import * as p from "@clack/prompts";
|
|
2
2
|
import { printFobNotFound, printNoSavedTags } from "../lib/display.js";
|
|
3
|
-
import { selectFob } from "../lib/prompts.js";
|
|
3
|
+
import { promptText, selectFob } from "../lib/prompts.js";
|
|
4
4
|
import { loadFobs, renameFob } from "../lib/store.js";
|
|
5
|
-
function handleCancel(value) {
|
|
6
|
-
if (p.isCancel(value)) {
|
|
7
|
-
p.cancel("Operation cancelled.");
|
|
8
|
-
process.exit(0);
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
5
|
export async function rename(oldName, newName) {
|
|
12
6
|
if (!oldName) {
|
|
13
7
|
const fobs = await loadFobs();
|
|
@@ -18,9 +12,7 @@ export async function rename(oldName, newName) {
|
|
|
18
12
|
oldName = await selectFob(fobs, "Which tag to rename?");
|
|
19
13
|
}
|
|
20
14
|
if (!newName) {
|
|
21
|
-
|
|
22
|
-
handleCancel(value);
|
|
23
|
-
newName = value;
|
|
15
|
+
newName = await promptText("New name", "e.g. front-door");
|
|
24
16
|
}
|
|
25
17
|
const result = await renameFob(oldName, newName);
|
|
26
18
|
if (result === "not-found") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rename.js","sourceRoot":"","sources":["../../src/commands/rename.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"rename.js","sourceRoot":"","sources":["../../src/commands/rename.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAgB,EAAE,OAAgB;IAC3D,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,MAAM,IAAI,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,gBAAgB,EAAE,CAAC;YACnB,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,OAAO,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,OAAiB,CAAC,CAAC;IAE3D,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QACzB,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC1B,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;QAC1B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,gBAAgB,OAAO,+DAA+D,CAAC,CAAC;QACpG,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,OAAO,SAAS,OAAO,IAAI,CAAC,CAAC;IACvD,OAAO,IAAI,CAAC;AAChB,CAAC"}
|
package/dist/commands/verify.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as p from "@clack/prompts";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { searchCardWithDiagnosis } from "../lib/card-ops.js";
|
|
3
|
+
import { DetectionSummary } from "../lib/constants.js";
|
|
4
|
+
import { printDetectionHint, printDoctorHint, printFobNotFound, printNoSavedTags } from "../lib/display.js";
|
|
4
5
|
import { Pm3Error, requireDevice } from "../lib/pm3.js";
|
|
5
6
|
import { selectFob, waitForEnter } from "../lib/prompts.js";
|
|
6
7
|
import { getFob, loadFobs } from "../lib/store.js";
|
|
@@ -26,10 +27,11 @@ export async function verify(name) {
|
|
|
26
27
|
const spinner = p.spinner();
|
|
27
28
|
spinner.start("Reading tag...");
|
|
28
29
|
try {
|
|
29
|
-
const card = await
|
|
30
|
+
const { card, diagnosis } = await searchCardWithDiagnosis();
|
|
30
31
|
if (!card) {
|
|
31
|
-
spinner.stop(
|
|
32
|
-
p.log.error(
|
|
32
|
+
spinner.stop(DetectionSummary[diagnosis]);
|
|
33
|
+
p.log.error(DetectionSummary[diagnosis]);
|
|
34
|
+
printDetectionHint(diagnosis);
|
|
33
35
|
return false;
|
|
34
36
|
}
|
|
35
37
|
spinner.stop(`Read: ${card.type} ${card.id}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/write.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import * as p from "@clack/prompts";
|
|
2
|
-
import { writeAndVerify } from "../lib/card-ops.js";
|
|
3
|
-
import { cardFrequency, WriteTarget } from "../lib/constants.js";
|
|
4
|
-
import { printFobNotFound, printNoSavedTags } from "../lib/display.js";
|
|
5
|
-
import {
|
|
2
|
+
import { detectMagicType, writeAndVerify } from "../lib/card-ops.js";
|
|
3
|
+
import { CardType, cardFrequency, MagicCardType, Pm3Cmd, WriteTarget } from "../lib/constants.js";
|
|
4
|
+
import { printFobNotFound, printNoSavedTags, printNotMagicHint } from "../lib/display.js";
|
|
5
|
+
import { restoreCard } from "../lib/mf-ops.js";
|
|
6
|
+
import { parseHfSearch } from "../lib/parsers.js";
|
|
7
|
+
import { pm3Exec, requireDevice } from "../lib/pm3.js";
|
|
6
8
|
import { selectFob, waitForEnter } from "../lib/prompts.js";
|
|
7
9
|
import { getFob, loadFobs } from "../lib/store.js";
|
|
8
10
|
export async function write(name) {
|
|
@@ -23,6 +25,10 @@ export async function write(name) {
|
|
|
23
25
|
if (!(await requireDevice()))
|
|
24
26
|
return false;
|
|
25
27
|
p.log.info(`Writing "${fob.name}" (${fob.type} ${fob.id})`);
|
|
28
|
+
// Full-card restore path
|
|
29
|
+
if (fob.dumpFile && (fob.type === CardType.MIFARE_CLASSIC_1K || fob.type === CardType.MIFARE_CLASSIC_4K)) {
|
|
30
|
+
return writeFullCard(fob);
|
|
31
|
+
}
|
|
26
32
|
const freq = cardFrequency(fob.type);
|
|
27
33
|
await waitForEnter(`Place a ${WriteTarget[freq]} on the antenna.`);
|
|
28
34
|
const success = await writeAndVerify({ type: fob.type, id: fob.id, encoding: fob.encoding });
|
|
@@ -33,4 +39,47 @@ export async function write(name) {
|
|
|
33
39
|
p.log.error("Write failed.");
|
|
34
40
|
return false;
|
|
35
41
|
}
|
|
42
|
+
async function writeFullCard(fob) {
|
|
43
|
+
await waitForEnter(`Place a ${WriteTarget.HF} on the antenna.`);
|
|
44
|
+
// Detect magic card type
|
|
45
|
+
const magicSpinner = p.spinner();
|
|
46
|
+
magicSpinner.start("Detecting magic card type...");
|
|
47
|
+
const magicType = await detectMagicType();
|
|
48
|
+
if (magicType === MagicCardType.UNKNOWN) {
|
|
49
|
+
magicSpinner.stop("Target is not a magic card.");
|
|
50
|
+
printNotMagicHint();
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
if (magicType === MagicCardType.BRICKED) {
|
|
54
|
+
magicSpinner.stop("Card has broken anticollision.");
|
|
55
|
+
p.log.warn("Run `keyfabe repair` first, then try again.");
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
magicSpinner.stop(`Magic card detected (${magicType})`);
|
|
59
|
+
// Restore all blocks
|
|
60
|
+
const restoreSpinner = p.spinner();
|
|
61
|
+
restoreSpinner.start("Restoring all blocks to magic card...");
|
|
62
|
+
const restoreResult = await restoreCard(fob.dumpFile, fob.dumpFile.replace("-dump.", "-key."), fob.type);
|
|
63
|
+
if (!restoreResult.success) {
|
|
64
|
+
restoreSpinner.stop("Restore failed.");
|
|
65
|
+
p.log.error(`${restoreResult.failedBlocks} block(s) failed to write.`);
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
restoreSpinner.stop("All blocks restored");
|
|
69
|
+
// Power cycle and verify
|
|
70
|
+
await waitForEnter("Remove the card from the antenna, then place it back.");
|
|
71
|
+
const verifySpinner = p.spinner();
|
|
72
|
+
verifySpinner.start("Verifying clone...");
|
|
73
|
+
const { stdout: verifyOut } = await pm3Exec(Pm3Cmd.HF_SEARCH);
|
|
74
|
+
const readback = parseHfSearch(verifyOut);
|
|
75
|
+
if (readback && readback.id === fob.id) {
|
|
76
|
+
verifySpinner.stop("Verification passed — UIDs match");
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
verifySpinner.stop("Verification warning — UID readback mismatch");
|
|
80
|
+
p.log.warn("The UID may not have updated yet. Try removing and replacing the card.");
|
|
81
|
+
}
|
|
82
|
+
p.outro("Full-card write successful!");
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
36
85
|
//# sourceMappingURL=write.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/commands/write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/commands/write.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -70,11 +70,16 @@ program
|
|
|
70
70
|
.command("doctor")
|
|
71
71
|
.description("Check device connection, firmware, and antenna health")
|
|
72
72
|
.action(withExitCode(doctor));
|
|
73
|
-
program
|
|
73
|
+
program
|
|
74
|
+
.command("read")
|
|
75
|
+
.description("Read and identify a tag on the antenna")
|
|
76
|
+
.option("--save-as <name>", "save the tag with this name")
|
|
77
|
+
.action(withExitCode((opts) => read(opts)));
|
|
74
78
|
program
|
|
75
79
|
.command("clone")
|
|
76
80
|
.description("Interactive guided clone flow (read + write + verify)")
|
|
77
|
-
.
|
|
81
|
+
.option("--save-as <name>", "save the cloned tag with this name")
|
|
82
|
+
.action(withExitCode((opts) => clone(opts)));
|
|
78
83
|
program
|
|
79
84
|
.command("write")
|
|
80
85
|
.description("Write a previously-saved identity to a blank tag")
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/card-ops.d.ts
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
|
+
import { type DetectionKindName } from "./constants.js";
|
|
1
2
|
import { type CardInfo } from "./parsers.js";
|
|
2
3
|
export declare function searchCard(): Promise<CardInfo | null>;
|
|
4
|
+
export interface SearchDiagnosis {
|
|
5
|
+
card: CardInfo | null;
|
|
6
|
+
diagnosis: DetectionKindName;
|
|
7
|
+
}
|
|
8
|
+
export declare function searchCardWithDiagnosis(): Promise<SearchDiagnosis>;
|
|
3
9
|
/** Detect magic card type by running hf search and parsing capabilities. */
|
|
4
10
|
export declare function detectMagicType(): Promise<string>;
|
|
5
11
|
export declare function writeAndVerify(card: CardInfo): Promise<boolean>;
|
package/dist/lib/card-ops.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as p from "@clack/prompts";
|
|
2
2
|
import { buildBlock0 } from "./block0.js";
|
|
3
|
-
import { CardType, cardFrequency, MagicCardType, Pm3Cmd, WriteTarget } from "./constants.js";
|
|
4
|
-
import { printDoctorHint } from "./display.js";
|
|
5
|
-
import { parseCloneResult, parseHfSearch, parseLfSearch, parseMagicType, parseT55xxDetect, } from "./parsers.js";
|
|
3
|
+
import { CardType, cardFrequency, DetectionKind, MagicCardType, Pm3Cmd, WriteTarget, } from "./constants.js";
|
|
4
|
+
import { printDoctorHint, printFrequencyMismatchHint, printNotMagicHint } from "./display.js";
|
|
5
|
+
import { detectBrickedHf, parseCloneResult, parseHfSearch, parseLfSearch, parseMagicType, parseT55xxDetect, } from "./parsers.js";
|
|
6
6
|
import { Pm3Error, pm3Exec } from "./pm3.js";
|
|
7
7
|
export async function searchCard() {
|
|
8
8
|
const { stdout: lfOut } = await pm3Exec(Pm3Cmd.LF_SEARCH);
|
|
@@ -12,6 +12,35 @@ export async function searchCard() {
|
|
|
12
12
|
const { stdout: hfOut } = await pm3Exec(Pm3Cmd.HF_SEARCH);
|
|
13
13
|
return parseHfSearch(hfOut);
|
|
14
14
|
}
|
|
15
|
+
export async function searchCardWithDiagnosis() {
|
|
16
|
+
// 1. Normal LF search
|
|
17
|
+
const { stdout: lfOut } = await pm3Exec(Pm3Cmd.LF_SEARCH);
|
|
18
|
+
const lfCard = parseLfSearch(lfOut);
|
|
19
|
+
if (lfCard)
|
|
20
|
+
return { card: lfCard, diagnosis: DetectionKind.NONE };
|
|
21
|
+
// 2. Normal HF search
|
|
22
|
+
const { stdout: hfOut } = await pm3Exec(Pm3Cmd.HF_SEARCH);
|
|
23
|
+
const hfCard = parseHfSearch(hfOut);
|
|
24
|
+
if (hfCard)
|
|
25
|
+
return { card: hfCard, diagnosis: DetectionKind.NONE };
|
|
26
|
+
// 3. Neither found — run fallback probes
|
|
27
|
+
// 3a. Check hfOutput for bricked indicators
|
|
28
|
+
if (detectBrickedHf(hfOut)) {
|
|
29
|
+
return { card: null, diagnosis: DetectionKind.BRICKED_HF };
|
|
30
|
+
}
|
|
31
|
+
// 3b. Check for blank T55x7
|
|
32
|
+
try {
|
|
33
|
+
const { stdout: t55Out } = await pm3Exec(Pm3Cmd.LF_T55XX_DETECT);
|
|
34
|
+
const t55 = parseT55xxDetect(t55Out);
|
|
35
|
+
if (t55) {
|
|
36
|
+
return { card: null, diagnosis: DetectionKind.BLANK_T55X7 };
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Graceful fallback — treat as nothing found
|
|
41
|
+
}
|
|
42
|
+
return { card: null, diagnosis: DetectionKind.NONE };
|
|
43
|
+
}
|
|
15
44
|
/** Detect magic card type by running hf search and parsing capabilities. */
|
|
16
45
|
export async function detectMagicType() {
|
|
17
46
|
const { stdout } = await pm3Exec(Pm3Cmd.HF_SEARCH);
|
|
@@ -77,6 +106,16 @@ export async function writeAndVerify(card) {
|
|
|
77
106
|
const t55 = parseT55xxDetect(stdout);
|
|
78
107
|
if (!t55) {
|
|
79
108
|
stopWithError(detectSpinner, `Card is not a writable T55x7. Use a ${WriteTarget.LF}.`);
|
|
109
|
+
// Check if an HF card is on the antenna instead
|
|
110
|
+
try {
|
|
111
|
+
const { stdout: hfOut } = await pm3Exec(Pm3Cmd.HF_SEARCH);
|
|
112
|
+
if (parseHfSearch(hfOut)) {
|
|
113
|
+
printFrequencyMismatchHint("LF");
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// ignore — just a hint
|
|
118
|
+
}
|
|
80
119
|
return false;
|
|
81
120
|
}
|
|
82
121
|
detectSpinner.stop(`Writable card detected (${t55.chipType})`);
|
|
@@ -108,6 +147,7 @@ export async function writeAndVerify(card) {
|
|
|
108
147
|
}
|
|
109
148
|
if (magicType === MagicCardType.UNKNOWN) {
|
|
110
149
|
stopWithError(magicSpinner, `Target is not a recognized magic card. Use a ${WriteTarget.HF}.`);
|
|
150
|
+
printNotMagicHint();
|
|
111
151
|
return false;
|
|
112
152
|
}
|
|
113
153
|
magicSpinner.stop(`Magic card detected (${magicType})`);
|
package/dist/lib/card-ops.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card-ops.js","sourceRoot":"","sources":["../../src/lib/card-ops.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,
|
|
1
|
+
{"version":3,"file":"card-ops.js","sourceRoot":"","sources":["../../src/lib/card-ops.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/constants.d.ts
CHANGED
|
@@ -13,6 +13,26 @@ export declare const WriteTarget: {
|
|
|
13
13
|
readonly LF: "blank T55x7 tag";
|
|
14
14
|
readonly HF: "magic card (Gen1A or Gen2/CUID)";
|
|
15
15
|
};
|
|
16
|
+
export declare const DetectionKind: {
|
|
17
|
+
readonly BLANK_T55X7: "blank_t55x7";
|
|
18
|
+
readonly BRICKED_HF: "bricked_hf";
|
|
19
|
+
readonly NONE: "none";
|
|
20
|
+
};
|
|
21
|
+
export type DetectionKindName = (typeof DetectionKind)[keyof typeof DetectionKind];
|
|
22
|
+
export declare const DetectionSummary: {
|
|
23
|
+
readonly blank_t55x7: "Blank T55x7 detected (no cloned data).";
|
|
24
|
+
readonly bricked_hf: "Card detected but anticollision failed.";
|
|
25
|
+
readonly none: "No tag detected.";
|
|
26
|
+
};
|
|
27
|
+
export declare const DetectionHint: {
|
|
28
|
+
readonly blank_t55x7: "This is a blank T55x7 — it has no data yet. Use `keyfabe write` to program an LF identity onto it.";
|
|
29
|
+
readonly bricked_hf: "An HF card was detected but anticollision failed — it may have a corrupted block 0.\nRun `keyfabe repair` to fix it.";
|
|
30
|
+
readonly none: "Make sure the tag is flat against the antenna.";
|
|
31
|
+
};
|
|
32
|
+
export declare const WriteHint: {
|
|
33
|
+
readonly not_magic: "This is a regular MIFARE Classic card with a factory-locked UID.\nOnly \"magic\" cards (Gen1A or Gen2/CUID) allow UID changes.";
|
|
34
|
+
readonly wrong_freq_lf_got_hf: "Detected an HF card, but this identity requires a blank T55x7 (LF) tag.\nRemove this card and place a T55x7 on the antenna.";
|
|
35
|
+
};
|
|
16
36
|
export declare const MagicCardType: {
|
|
17
37
|
readonly GEN1A: "Gen1A";
|
|
18
38
|
readonly GEN2_CUID: "Gen2/CUID";
|
|
@@ -42,7 +62,11 @@ export declare const Pm3Cmd: {
|
|
|
42
62
|
readonly HF_MF_CSETUID: Pm3Command;
|
|
43
63
|
readonly HF_MF_WRBL: Pm3Command;
|
|
44
64
|
readonly HF_MF_RDBL: Pm3Command;
|
|
65
|
+
readonly HF_MF_AUTOPWN: Pm3Command;
|
|
66
|
+
readonly HF_MF_DUMP: Pm3Command;
|
|
67
|
+
readonly HF_MF_RESTORE: Pm3Command;
|
|
45
68
|
readonly HF_14A_CONFIG: Pm3Command;
|
|
46
69
|
readonly HW_STATUS: Pm3Command;
|
|
47
70
|
readonly HW_TUNE: Pm3Command;
|
|
71
|
+
readonly SCRIPT_RUN: Pm3Command;
|
|
48
72
|
};
|
package/dist/lib/constants.js
CHANGED
|
@@ -20,6 +20,25 @@ export const WriteTarget = {
|
|
|
20
20
|
LF: "blank T55x7 tag",
|
|
21
21
|
HF: "magic card (Gen1A or Gen2/CUID)",
|
|
22
22
|
};
|
|
23
|
+
export const DetectionKind = {
|
|
24
|
+
BLANK_T55X7: "blank_t55x7",
|
|
25
|
+
BRICKED_HF: "bricked_hf",
|
|
26
|
+
NONE: "none",
|
|
27
|
+
};
|
|
28
|
+
export const DetectionSummary = {
|
|
29
|
+
blank_t55x7: "Blank T55x7 detected (no cloned data).",
|
|
30
|
+
bricked_hf: "Card detected but anticollision failed.",
|
|
31
|
+
none: "No tag detected.",
|
|
32
|
+
};
|
|
33
|
+
export const DetectionHint = {
|
|
34
|
+
blank_t55x7: "This is a blank T55x7 — it has no data yet. Use `keyfabe write` to program an LF identity onto it.",
|
|
35
|
+
bricked_hf: "An HF card was detected but anticollision failed — it may have a corrupted block 0.\nRun `keyfabe repair` to fix it.",
|
|
36
|
+
none: "Make sure the tag is flat against the antenna.",
|
|
37
|
+
};
|
|
38
|
+
export const WriteHint = {
|
|
39
|
+
not_magic: 'This is a regular MIFARE Classic card with a factory-locked UID.\nOnly "magic" cards (Gen1A or Gen2/CUID) allow UID changes.',
|
|
40
|
+
wrong_freq_lf_got_hf: "Detected an HF card, but this identity requires a blank T55x7 (LF) tag.\nRemove this card and place a T55x7 on the antenna.",
|
|
41
|
+
};
|
|
23
42
|
export const MagicCardType = {
|
|
24
43
|
GEN1A: "Gen1A",
|
|
25
44
|
GEN2_CUID: "Gen2/CUID",
|
|
@@ -61,6 +80,7 @@ const em410x = lf.sub("em").sub("410x");
|
|
|
61
80
|
const hid = lf.sub("hid");
|
|
62
81
|
const mf = hf.sub("mf");
|
|
63
82
|
const hf14a = hf.sub("14a");
|
|
83
|
+
const script = new Pm3Command("script");
|
|
64
84
|
export const Pm3Cmd = {
|
|
65
85
|
LF_SEARCH: lf.sub("search"),
|
|
66
86
|
HF_SEARCH: hf.sub("search"),
|
|
@@ -72,8 +92,12 @@ export const Pm3Cmd = {
|
|
|
72
92
|
HF_MF_CSETUID: mf.sub("csetuid"),
|
|
73
93
|
HF_MF_WRBL: mf.sub("wrbl"),
|
|
74
94
|
HF_MF_RDBL: mf.sub("rdbl"),
|
|
95
|
+
HF_MF_AUTOPWN: mf.sub("autopwn"),
|
|
96
|
+
HF_MF_DUMP: mf.sub("dump"),
|
|
97
|
+
HF_MF_RESTORE: mf.sub("restore"),
|
|
75
98
|
HF_14A_CONFIG: hf14a.sub("config"),
|
|
76
99
|
HW_STATUS: hw.sub("status"),
|
|
77
100
|
HW_TUNE: hw.sub("tune"),
|
|
101
|
+
SCRIPT_RUN: script.sub("run"),
|
|
78
102
|
};
|
|
79
103
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG;IACpB,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;IACpB,iBAAiB,EAAE,mBAAmB;IACtC,iBAAiB,EAAE,mBAAmB;IACtC,iBAAiB,EAAE,mBAAmB;IACtC,cAAc,EAAE,gBAAgB;IAChC,UAAU,EAAE,aAAa;CACnB,CAAC;AAIX,MAAM,UAAU,aAAa,CAAC,IAAY;IACtC,QAAQ,IAAI,EAAE,CAAC;QACX,KAAK,QAAQ,CAAC,MAAM,CAAC;QACrB,KAAK,QAAQ,CAAC,QAAQ;YAClB,OAAO,IAAI,CAAC;QAChB;YACI,OAAO,IAAI,CAAC;IACpB,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG;IACvB,EAAE,EAAE,iBAAiB;IACrB,EAAE,EAAE,iCAAiC;CAC/B,CAAC;AAEX,MAAM,CAAC,MAAM,aAAa,GAAG;IACzB,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;CACZ,CAAC;AAIX,MAAM,OAAO,UAAU;IACV,KAAK,CAAoB;IAElC,YAAY,GAAG,KAAe;QAC1B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,kDAAkD;IAClD,GAAG,CAAC,IAAY;QACZ,OAAO,IAAI,UAAU,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;IAED,+DAA+D;IAC/D,GAAG,CAAC,IAAY,EAAE,KAAc;QAC5B,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAClH,CAAC;IAED,4EAA4E;IAC5E,MAAM,CAAC,KAAK,CAAC,GAAG,QAAsB;QAClC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,IAAI,CAAC,GAAG,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,IAAI,UAAU,CAAC,GAAG,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,QAAQ;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;CACJ;AAED,kEAAkE;AAClE,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;AAChC,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;AAChC,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;AAEhC,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACxC,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC1B,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAExB,MAAM,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/display.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type DetectionKindName } from "./constants.js";
|
|
1
2
|
import type { CardInfo } from "./parsers.js";
|
|
2
3
|
export declare const LF_VOLTAGE_THRESHOLD = 15;
|
|
3
4
|
export declare const HF_VOLTAGE_THRESHOLD = 10;
|
|
@@ -7,3 +8,7 @@ export declare function printCardInfo(card: CardInfo): void;
|
|
|
7
8
|
export declare function printDoctorHint(): void;
|
|
8
9
|
export declare function printNoSavedTags(): void;
|
|
9
10
|
export declare function printFobNotFound(name: string): void;
|
|
11
|
+
export declare function printDetectionHint(diagnosis: DetectionKindName): void;
|
|
12
|
+
export declare function printNotMagicHint(): void;
|
|
13
|
+
export declare function printFrequencyMismatchHint(expected: "LF"): void;
|
|
14
|
+
export declare function printFullCardCloneProgress(method: string): void;
|
package/dist/lib/display.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as p from "@clack/prompts";
|
|
2
|
+
import { DetectionHint, WriteHint } from "./constants.js";
|
|
2
3
|
export const LF_VOLTAGE_THRESHOLD = 15;
|
|
3
4
|
export const HF_VOLTAGE_THRESHOLD = 10;
|
|
4
5
|
export const BREW_INSTALL_CMD = "brew tap rfidresearchgroup/proxmark3 && brew install proxmark3";
|
|
@@ -21,4 +22,20 @@ export function printNoSavedTags() {
|
|
|
21
22
|
export function printFobNotFound(name) {
|
|
22
23
|
p.log.error(`No saved tag named "${name}". Use \`keyfabe list\` to see saved tags.`);
|
|
23
24
|
}
|
|
25
|
+
export function printDetectionHint(diagnosis) {
|
|
26
|
+
p.log.warn(DetectionHint[diagnosis]);
|
|
27
|
+
}
|
|
28
|
+
export function printNotMagicHint() {
|
|
29
|
+
p.log.warn(WriteHint.not_magic);
|
|
30
|
+
}
|
|
31
|
+
export function printFrequencyMismatchHint(expected) {
|
|
32
|
+
if (expected === "LF") {
|
|
33
|
+
p.log.warn(WriteHint.wrong_freq_lf_got_hf);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export function printFullCardCloneProgress(method) {
|
|
37
|
+
if (method === "fm11rf08s") {
|
|
38
|
+
p.log.info("Using FM11RF08S recovery — this takes approximately 28 minutes.");
|
|
39
|
+
}
|
|
40
|
+
}
|
|
24
41
|
//# sourceMappingURL=display.js.map
|
package/dist/lib/display.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/lib/display.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/lib/display.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,aAAa,EAA0B,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGlF,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AACvC,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEvC,MAAM,CAAC,MAAM,gBAAgB,GAAG,gEAAgE,CAAC;AAEjG,MAAM,UAAU,gBAAgB;IAC5B,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,0BAA0B,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAc;IACxC,MAAM,KAAK,GAAG,CAAC,aAAa,IAAI,CAAC,IAAI,EAAE,EAAE,aAAa,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACjE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,eAAe;IAC3B,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC5B,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY;IACzC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,uBAAuB,IAAI,4CAA4C,CAAC,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,SAA4B;IAC3D,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC7B,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,QAAc;IACrD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACpB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IAC/C,CAAC;AACL,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,MAAc;IACrD,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QACzB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;IAClF,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface MfCrackResult {
|
|
2
|
+
success: boolean;
|
|
3
|
+
keyFile: string;
|
|
4
|
+
method: "autopwn" | "fm11rf08s";
|
|
5
|
+
}
|
|
6
|
+
export interface MfDumpResult {
|
|
7
|
+
success: boolean;
|
|
8
|
+
dumpFile: string;
|
|
9
|
+
keyFile: string;
|
|
10
|
+
}
|
|
11
|
+
export interface MfRestoreResult {
|
|
12
|
+
success: boolean;
|
|
13
|
+
failedBlocks: number;
|
|
14
|
+
}
|
|
15
|
+
/** Crack all sector keys using autopwn -> fm11rf08s fallback chain. */
|
|
16
|
+
export declare function crackKeys(_uid: string, _cardType: string): Promise<MfCrackResult | null>;
|
|
17
|
+
/** Dump all blocks using recovered keys. */
|
|
18
|
+
export declare function dumpCard(_uid: string, cardType: string, keyFile: string): Promise<MfDumpResult | null>;
|
|
19
|
+
/** Restore all blocks to a blank magic card. */
|
|
20
|
+
export declare function restoreCard(dumpFile: string, keyFile: string, cardType: string): Promise<MfRestoreResult>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Pm3Cmd } from "./constants.js";
|
|
2
|
+
import { parseAutopwn, parseDump, parseFm11rf08sRecovery, parseRestore } from "./parsers.js";
|
|
3
|
+
import { pm3Exec } from "./pm3.js";
|
|
4
|
+
/** Crack all sector keys using autopwn -> fm11rf08s fallback chain. */
|
|
5
|
+
export async function crackKeys(_uid, _cardType) {
|
|
6
|
+
const { stdout } = await pm3Exec(Pm3Cmd.HF_MF_AUTOPWN, 120_000);
|
|
7
|
+
const result = parseAutopwn(stdout);
|
|
8
|
+
if (result.success && result.keyFile) {
|
|
9
|
+
return { success: true, keyFile: result.keyFile, method: "autopwn" };
|
|
10
|
+
}
|
|
11
|
+
// If static nonce detected, try fm11rf08s recovery (~28 min)
|
|
12
|
+
if (result.staticNonce) {
|
|
13
|
+
const fmCmd = Pm3Cmd.SCRIPT_RUN.arg("fm11rf08s_recovery");
|
|
14
|
+
const { stdout: fmOut } = await pm3Exec(fmCmd, 2_400_000);
|
|
15
|
+
const fmResult = parseFm11rf08sRecovery(fmOut);
|
|
16
|
+
if (fmResult.success && fmResult.keyFile) {
|
|
17
|
+
return { success: true, keyFile: fmResult.keyFile, method: "fm11rf08s" };
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
/** Dump all blocks using recovered keys. */
|
|
23
|
+
export async function dumpCard(_uid, cardType, keyFile) {
|
|
24
|
+
const sizeFlag = cardType.includes("4K") ? "--4k" : "--1k";
|
|
25
|
+
const cmd = Pm3Cmd.HF_MF_DUMP.arg(sizeFlag).arg("-k", keyFile);
|
|
26
|
+
const { stdout } = await pm3Exec(cmd, 60_000);
|
|
27
|
+
const result = parseDump(stdout);
|
|
28
|
+
if (result.success && result.dumpFile) {
|
|
29
|
+
return { success: true, dumpFile: result.dumpFile, keyFile };
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
/** Restore all blocks to a blank magic card. */
|
|
34
|
+
export async function restoreCard(dumpFile, keyFile, cardType) {
|
|
35
|
+
const sizeFlag = cardType.includes("4K") ? "--4k" : "--1k";
|
|
36
|
+
const cmd = Pm3Cmd.HF_MF_RESTORE.arg(sizeFlag).arg("-f", dumpFile).arg("-k", keyFile).arg("--force");
|
|
37
|
+
const { stdout } = await pm3Exec(cmd, 60_000);
|
|
38
|
+
const result = parseRestore(stdout);
|
|
39
|
+
return { success: result.success, failedBlocks: result.failedBlocks };
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=mf-ops.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mf-ops.js","sourceRoot":"","sources":["../../src/lib/mf-ops.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/parsers.d.ts
CHANGED
|
@@ -25,6 +25,29 @@ export declare function parseHwTune(output: string): HwTune;
|
|
|
25
25
|
export declare function parseLfSearch(output: string): CardInfo | null;
|
|
26
26
|
export declare function parseT55xxDetect(output: string): T55xxInfo | null;
|
|
27
27
|
export declare function parseHfSearch(output: string): CardInfo | null;
|
|
28
|
+
/** Check if hf search output shows a card present but with broken anticollision. */
|
|
29
|
+
export declare function detectBrickedHf(output: string): boolean;
|
|
28
30
|
export declare function parseMagicType(output: string): MagicCardTypeName;
|
|
29
31
|
export declare function parseBlock0Data(output: string): string | null;
|
|
30
32
|
export declare function parseCloneResult(output: string): CloneResult;
|
|
33
|
+
export interface AutopwnResult {
|
|
34
|
+
success: boolean;
|
|
35
|
+
keyFile: string | null;
|
|
36
|
+
staticNonce: boolean;
|
|
37
|
+
}
|
|
38
|
+
export declare function parseAutopwn(output: string): AutopwnResult;
|
|
39
|
+
export interface DumpResult {
|
|
40
|
+
success: boolean;
|
|
41
|
+
dumpFile: string | null;
|
|
42
|
+
}
|
|
43
|
+
export declare function parseDump(output: string): DumpResult;
|
|
44
|
+
export interface RestoreResult {
|
|
45
|
+
success: boolean;
|
|
46
|
+
failedBlocks: number;
|
|
47
|
+
}
|
|
48
|
+
export declare function parseRestore(output: string): RestoreResult;
|
|
49
|
+
export interface Fm11rf08sResult {
|
|
50
|
+
success: boolean;
|
|
51
|
+
keyFile: string | null;
|
|
52
|
+
}
|
|
53
|
+
export declare function parseFm11rf08sRecovery(output: string): Fm11rf08sResult;
|
package/dist/lib/parsers.js
CHANGED
|
@@ -74,6 +74,10 @@ export function parseHfSearch(output) {
|
|
|
74
74
|
}
|
|
75
75
|
return { type, id: uid };
|
|
76
76
|
}
|
|
77
|
+
/** Check if hf search output shows a card present but with broken anticollision. */
|
|
78
|
+
export function detectBrickedHf(output) {
|
|
79
|
+
return /anticollision|can'?t select/i.test(output);
|
|
80
|
+
}
|
|
77
81
|
export function parseMagicType(output) {
|
|
78
82
|
if (/Gen\s*1\s*a|magic\s*backdoor/i.test(output))
|
|
79
83
|
return MagicCardType.GEN1A;
|
|
@@ -95,4 +99,36 @@ export function parseCloneResult(output) {
|
|
|
95
99
|
const hasDone = /done/i.test(output) || /written/i.test(output) || /cloned/i.test(output) || /verified/i.test(output);
|
|
96
100
|
return { success: !hasError && hasDone };
|
|
97
101
|
}
|
|
102
|
+
export function parseAutopwn(output) {
|
|
103
|
+
const staticNonce = /static encrypted nonce/i.test(output);
|
|
104
|
+
const keyFileMatch = output.match(/saved\s+to\s+(?:file\s+)?(\S+\.bin)/i) ??
|
|
105
|
+
output.match(/keys\s+(?:saved|dumped)\s+(?:to\s+)?(\S+\.bin)/i) ??
|
|
106
|
+
output.match(/(\S+hf-mf-[0-9A-Fa-f]+-key\.bin)/i);
|
|
107
|
+
const keyFile = keyFileMatch?.[1] ?? null;
|
|
108
|
+
const success = keyFile !== null && !staticNonce;
|
|
109
|
+
return { success, keyFile, staticNonce };
|
|
110
|
+
}
|
|
111
|
+
export function parseDump(output) {
|
|
112
|
+
const dumpFileMatch = output.match(/saved\s+(?:\d+\s+blocks?\s+)?to\s+(?:file\s+)?(\S+\.bin)/i) ??
|
|
113
|
+
output.match(/(\S+hf-mf-[0-9A-Fa-f]+-dump\.bin)/i);
|
|
114
|
+
const dumpFile = dumpFileMatch?.[1] ?? null;
|
|
115
|
+
const hasError = /error/i.test(output) && !/errorrate/i.test(output);
|
|
116
|
+
return { success: dumpFile !== null && !hasError, dumpFile };
|
|
117
|
+
}
|
|
118
|
+
export function parseRestore(output) {
|
|
119
|
+
const failedMatch = output.match(/(\d+)\s+blocks?\s+failed/i);
|
|
120
|
+
const failedBlocks = failedMatch ? parseInt(failedMatch[1], 10) : 0;
|
|
121
|
+
const hasError = /error/i.test(output) && !/errorrate/i.test(output);
|
|
122
|
+
const hasDone = /done/i.test(output) || /restored/i.test(output) || /wrote/i.test(output);
|
|
123
|
+
const success = !hasError && hasDone && failedBlocks === 0;
|
|
124
|
+
return { success, failedBlocks };
|
|
125
|
+
}
|
|
126
|
+
export function parseFm11rf08sRecovery(output) {
|
|
127
|
+
const keyFileMatch = output.match(/saved\s+to\s+(?:file\s+)?(\S+\.bin)/i) ??
|
|
128
|
+
output.match(/keys\s+(?:saved|dumped)\s+(?:to\s+)?(\S+\.bin)/i) ??
|
|
129
|
+
output.match(/(\S+hf-mf-[0-9A-Fa-f]+-key\.bin)/i);
|
|
130
|
+
const keyFile = keyFileMatch?.[1] ?? null;
|
|
131
|
+
const hasError = /error/i.test(output) && !/errorrate/i.test(output);
|
|
132
|
+
return { success: keyFile !== null && !hasError, keyFile };
|
|
133
|
+
}
|
|
98
134
|
//# sourceMappingURL=parsers.js.map
|
package/dist/lib/parsers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../src/lib/parsers.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../src/lib/parsers.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/prompts.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { Fob } from "./store.js";
|
|
2
|
+
export declare function isInteractive(): boolean;
|
|
2
3
|
export declare function confirm(message: string): Promise<boolean>;
|
|
3
4
|
export declare function waitForEnter(message: string): Promise<void>;
|
|
4
5
|
export declare function promptName(): Promise<string | null>;
|
|
5
6
|
export declare function selectFob(fobs: Fob[], message?: string): Promise<string>;
|
|
7
|
+
export declare function promptText(message: string, placeholder?: string): Promise<string>;
|
package/dist/lib/prompts.js
CHANGED
|
@@ -5,22 +5,37 @@ function handleCancel(value) {
|
|
|
5
5
|
process.exit(0);
|
|
6
6
|
}
|
|
7
7
|
}
|
|
8
|
+
export function isInteractive() {
|
|
9
|
+
return !!process.stdin.isTTY;
|
|
10
|
+
}
|
|
8
11
|
export async function confirm(message) {
|
|
12
|
+
if (!isInteractive())
|
|
13
|
+
return true;
|
|
9
14
|
const value = await p.confirm({ message });
|
|
10
15
|
handleCancel(value);
|
|
11
16
|
return value;
|
|
12
17
|
}
|
|
13
18
|
export async function waitForEnter(message) {
|
|
19
|
+
if (!isInteractive()) {
|
|
20
|
+
p.log.info(message);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
14
23
|
const value = await p.text({ message, placeholder: "Press Enter", defaultValue: "" });
|
|
15
24
|
handleCancel(value);
|
|
16
25
|
}
|
|
17
26
|
export async function promptName() {
|
|
27
|
+
if (!isInteractive())
|
|
28
|
+
return null;
|
|
18
29
|
const value = await p.text({ message: "Save as", placeholder: "name, or Enter to skip", defaultValue: "" });
|
|
19
30
|
handleCancel(value);
|
|
20
31
|
const trimmed = value.trim();
|
|
21
32
|
return trimmed || null;
|
|
22
33
|
}
|
|
23
34
|
export async function selectFob(fobs, message = "Select a tag") {
|
|
35
|
+
if (!isInteractive()) {
|
|
36
|
+
p.log.error("Tag name must be provided as a CLI argument in non-interactive mode.");
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
24
39
|
const value = await p.select({
|
|
25
40
|
message,
|
|
26
41
|
options: fobs.map((f) => ({
|
|
@@ -32,4 +47,13 @@ export async function selectFob(fobs, message = "Select a tag") {
|
|
|
32
47
|
handleCancel(value);
|
|
33
48
|
return value;
|
|
34
49
|
}
|
|
50
|
+
export async function promptText(message, placeholder) {
|
|
51
|
+
if (!isInteractive()) {
|
|
52
|
+
p.log.error(`"${message}" must be provided as a CLI argument in non-interactive mode.`);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
const value = await p.text({ message, placeholder });
|
|
56
|
+
handleCancel(value);
|
|
57
|
+
return value;
|
|
58
|
+
}
|
|
35
59
|
//# sourceMappingURL=prompts.js.map
|
package/dist/lib/prompts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/lib/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAGpC,SAAS,YAAY,CAAC,KAAc;IAChC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,CAAC,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAe;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3C,YAAY,CAAC,KAAK,CAAC,CAAC;IACpB,OAAO,KAAgB,CAAC;AAC5B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAe;IAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;IACtF,YAAY,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,wBAAwB,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5G,YAAY,CAAC,KAAK,CAAC,CAAC;IACpB,MAAM,OAAO,GAAI,KAAgB,CAAC,IAAI,EAAE,CAAC;IACzC,OAAO,OAAO,IAAI,IAAI,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAW,EAAE,OAAO,GAAG,cAAc;IACjE,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC;QACzB,OAAO;QACP,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtB,KAAK,EAAE,CAAC,CAAC,IAAI;YACb,KAAK,EAAE,CAAC,CAAC,IAAI;YACb,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,EAAE;SAC5B,CAAC,CAAC;KACN,CAAC,CAAC;IACH,YAAY,CAAC,KAAK,CAAC,CAAC;IACpB,OAAO,KAAe,CAAC;AAC3B,CAAC"}
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/lib/prompts.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/store.d.ts
CHANGED
package/dist/lib/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/lib/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB;IAC5C,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACzC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AAClC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/lib/store.ts"],"names":[],"mappings":"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"}
|