keyfabe 0.2.0 → 0.4.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 +23 -12
- package/dist/commands/clone.js +42 -15
- package/dist/commands/clone.js.map +1 -1
- package/dist/commands/delete.d.ts +1 -1
- package/dist/commands/delete.js +17 -3
- package/dist/commands/delete.js.map +1 -1
- package/dist/commands/doctor.js +28 -23
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/export.js +2 -3
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/import.js +5 -5
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/list.js +8 -9
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/read.js +34 -9
- package/dist/commands/read.js.map +1 -1
- package/dist/commands/rename.d.ts +1 -1
- package/dist/commands/rename.js +24 -4
- package/dist/commands/rename.js.map +1 -1
- package/dist/commands/setup.js +65 -56
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/show.d.ts +1 -1
- package/dist/commands/show.js +19 -10
- package/dist/commands/show.js.map +1 -1
- package/dist/commands/write.d.ts +1 -1
- package/dist/commands/write.js +15 -6
- package/dist/commands/write.js.map +1 -1
- package/dist/index.js +44 -5
- package/dist/index.js.map +1 -1
- package/dist/lib/card-ops.js +29 -16
- package/dist/lib/card-ops.js.map +1 -1
- package/dist/lib/display.js +7 -9
- package/dist/lib/display.js.map +1 -1
- package/dist/lib/parsers.d.ts +1 -0
- package/dist/lib/parsers.js +22 -0
- package/dist/lib/parsers.js.map +1 -1
- package/dist/lib/pm3.js +2 -2
- package/dist/lib/pm3.js.map +1 -1
- package/dist/lib/prompts.d.ts +2 -1
- package/dist/lib/prompts.js +25 -17
- package/dist/lib/prompts.js.map +1 -1
- package/package.json +8 -3
package/dist/commands/rename.js
CHANGED
|
@@ -1,17 +1,37 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
2
|
import { printFobNotFound } from "../lib/display.js";
|
|
3
|
-
import {
|
|
3
|
+
import { selectFob } from "../lib/prompts.js";
|
|
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
|
+
}
|
|
4
11
|
export async function rename(oldName, newName) {
|
|
12
|
+
if (!oldName) {
|
|
13
|
+
const fobs = await loadFobs();
|
|
14
|
+
if (fobs.length === 0) {
|
|
15
|
+
p.log.warn("No saved fobs. Use `keyfabe read` or `keyfabe clone` first.");
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
oldName = await selectFob(fobs, "Which fob to rename?");
|
|
19
|
+
}
|
|
20
|
+
if (!newName) {
|
|
21
|
+
const value = await p.text({ message: "New name", placeholder: "e.g. front-door" });
|
|
22
|
+
handleCancel(value);
|
|
23
|
+
newName = value;
|
|
24
|
+
}
|
|
5
25
|
const result = await renameFob(oldName, newName);
|
|
6
26
|
if (result === "not-found") {
|
|
7
27
|
printFobNotFound(oldName);
|
|
8
28
|
return false;
|
|
9
29
|
}
|
|
10
30
|
if (result === "name-taken") {
|
|
11
|
-
|
|
31
|
+
p.log.error(`A fob named "${newName}" already exists. Delete it first or choose a different name.`);
|
|
12
32
|
return false;
|
|
13
33
|
}
|
|
14
|
-
|
|
34
|
+
p.log.success(`Renamed "${oldName}" to "${newName}".`);
|
|
15
35
|
return true;
|
|
16
36
|
}
|
|
17
37
|
//# sourceMappingURL=rename.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rename.js","sourceRoot":"","sources":["../../src/commands/rename.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,
|
|
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,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEtD,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,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,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;YAC1E,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,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC,CAAC;QACpF,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,OAAO,GAAG,KAAe,CAAC;IAC9B,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/setup.js
CHANGED
|
@@ -1,158 +1,167 @@
|
|
|
1
|
-
import
|
|
2
|
-
import ora from "ora";
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
3
2
|
import { printBrewInstall } from "../lib/display.js";
|
|
4
3
|
import { buildFirmware, checkInstalled, execCommand, findBrewCache, flashFirmware, waitForDevice, } from "../lib/firmware.js";
|
|
5
4
|
import { parseHwStatus, parseHwTune } from "../lib/parsers.js";
|
|
6
5
|
import { detectPort, Pm3Error, pm3Exec } from "../lib/pm3.js";
|
|
7
6
|
import { confirm } from "../lib/prompts.js";
|
|
8
7
|
export async function setup() {
|
|
9
|
-
|
|
8
|
+
p.intro("Proxmark3 Firmware Setup");
|
|
10
9
|
// Step 1: Prerequisites
|
|
11
|
-
|
|
10
|
+
p.log.step("Step 1: Checking prerequisites...");
|
|
12
11
|
const hasPm3 = await checkInstalled("pm3");
|
|
13
12
|
if (!hasPm3) {
|
|
14
|
-
|
|
13
|
+
p.log.error("pm3 not found.");
|
|
15
14
|
printBrewInstall();
|
|
16
15
|
return false;
|
|
17
16
|
}
|
|
18
|
-
|
|
17
|
+
p.log.success("pm3: installed");
|
|
19
18
|
const hasMake = await checkInstalled("make");
|
|
20
19
|
if (!hasMake) {
|
|
21
|
-
|
|
20
|
+
p.log.error("make not found. Install Xcode Command Line Tools: xcode-select --install");
|
|
22
21
|
return false;
|
|
23
22
|
}
|
|
24
|
-
|
|
23
|
+
p.log.success("make: installed");
|
|
25
24
|
const hasProxmark3 = await checkInstalled("proxmark3");
|
|
26
25
|
if (!hasProxmark3) {
|
|
27
|
-
|
|
26
|
+
p.log.error("proxmark3 flasher not found.");
|
|
28
27
|
printBrewInstall();
|
|
29
28
|
return false;
|
|
30
29
|
}
|
|
31
|
-
|
|
30
|
+
p.log.success("proxmark3: installed");
|
|
32
31
|
const port = await detectPort();
|
|
33
32
|
if (!port) {
|
|
34
|
-
|
|
33
|
+
p.log.error("No Proxmark3 detected. Plug in your device and try again.");
|
|
35
34
|
return false;
|
|
36
35
|
}
|
|
37
|
-
|
|
36
|
+
p.log.success(`device: ${port}`);
|
|
38
37
|
// Step 2: Diagnose current state
|
|
39
|
-
|
|
40
|
-
const diagSpinner =
|
|
38
|
+
p.log.step("Step 2: Checking current firmware...");
|
|
39
|
+
const diagSpinner = p.spinner();
|
|
40
|
+
diagSpinner.start("Running hw status...");
|
|
41
41
|
try {
|
|
42
42
|
const { stdout } = await pm3Exec("hw status");
|
|
43
43
|
const status = parseHwStatus(stdout);
|
|
44
44
|
if (status.connected) {
|
|
45
|
-
diagSpinner.
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
diagSpinner.stop("Firmware is already working.");
|
|
46
|
+
p.log.success(`Firmware: ${status.firmwareVersion}`);
|
|
47
|
+
p.log.success("No action needed. Device is ready to use.");
|
|
48
48
|
return true;
|
|
49
49
|
}
|
|
50
|
-
diagSpinner.
|
|
50
|
+
diagSpinner.stop("Device found but firmware is incompatible. Proceeding with flash.");
|
|
51
|
+
p.log.warn("Device found but firmware is incompatible. Proceeding with flash.");
|
|
51
52
|
}
|
|
52
53
|
catch (err) {
|
|
53
54
|
if (err instanceof Pm3Error && err.message.includes("not found")) {
|
|
54
|
-
diagSpinner.
|
|
55
|
+
diagSpinner.stop("pm3 command failed.");
|
|
55
56
|
return false;
|
|
56
57
|
}
|
|
57
|
-
diagSpinner.
|
|
58
|
+
diagSpinner.stop("Cannot communicate with device. Proceeding with flash.");
|
|
59
|
+
p.log.warn("Cannot communicate with device. Proceeding with flash.");
|
|
58
60
|
}
|
|
59
61
|
// Step 3: Locate source
|
|
60
|
-
|
|
62
|
+
p.log.step("Step 3: Locating Proxmark3 source...");
|
|
61
63
|
let tarball;
|
|
62
|
-
const sourceSpinner =
|
|
64
|
+
const sourceSpinner = p.spinner();
|
|
65
|
+
sourceSpinner.start("Finding Homebrew cache...");
|
|
63
66
|
try {
|
|
64
67
|
tarball = await findBrewCache();
|
|
65
|
-
sourceSpinner.
|
|
68
|
+
sourceSpinner.stop(`Found: ${tarball}`);
|
|
66
69
|
}
|
|
67
70
|
catch {
|
|
68
|
-
sourceSpinner.
|
|
71
|
+
sourceSpinner.stop("Proxmark3 not installed via Homebrew.");
|
|
69
72
|
printBrewInstall();
|
|
70
73
|
return false;
|
|
71
74
|
}
|
|
72
75
|
// Step 4: Build firmware
|
|
73
|
-
|
|
76
|
+
p.log.step("Step 4: Building firmware...");
|
|
74
77
|
const suffix = Math.random().toString(36).slice(2, 8);
|
|
75
78
|
const sourceDir = `/tmp/pm3build-${suffix}`;
|
|
76
|
-
const extractSpinner =
|
|
79
|
+
const extractSpinner = p.spinner();
|
|
80
|
+
extractSpinner.start("Extracting source...");
|
|
77
81
|
try {
|
|
78
82
|
await execCommand("mkdir", ["-p", sourceDir]);
|
|
79
83
|
await execCommand("tar", ["xf", tarball, "-C", sourceDir, "--strip-components=1"]);
|
|
80
|
-
extractSpinner.
|
|
84
|
+
extractSpinner.stop("Source extracted.");
|
|
81
85
|
}
|
|
82
86
|
catch (err) {
|
|
83
|
-
extractSpinner.
|
|
87
|
+
extractSpinner.stop(`Failed to extract source: ${err.message}`);
|
|
84
88
|
return false;
|
|
85
89
|
}
|
|
86
|
-
const buildSpinner =
|
|
90
|
+
const buildSpinner = p.spinner();
|
|
91
|
+
buildSpinner.start("Building firmware (this may take ~30s)...");
|
|
87
92
|
try {
|
|
88
93
|
await buildFirmware(sourceDir);
|
|
89
|
-
buildSpinner.
|
|
94
|
+
buildSpinner.stop("Firmware built successfully.");
|
|
90
95
|
}
|
|
91
96
|
catch (err) {
|
|
92
|
-
buildSpinner.
|
|
97
|
+
buildSpinner.stop(`Build failed: ${err.message}`);
|
|
93
98
|
return false;
|
|
94
99
|
}
|
|
95
100
|
// Step 5: Flash
|
|
96
|
-
|
|
101
|
+
p.log.step("Step 5: Flashing firmware...");
|
|
97
102
|
const shouldFlash = await confirm("Ready to flash firmware. This will overwrite the device's current firmware. Continue?");
|
|
98
103
|
if (!shouldFlash) {
|
|
99
|
-
|
|
104
|
+
p.log.warn(`Flash cancelled. Build artifacts remain at: ${sourceDir}`);
|
|
100
105
|
return false;
|
|
101
106
|
}
|
|
102
107
|
const currentPort = await detectPort();
|
|
103
108
|
if (!currentPort) {
|
|
104
|
-
|
|
109
|
+
p.log.error("Device disconnected. Plug it back in and try again.");
|
|
105
110
|
return false;
|
|
106
111
|
}
|
|
107
|
-
const flashSpinner =
|
|
112
|
+
const flashSpinner = p.spinner();
|
|
113
|
+
flashSpinner.start("Flashing firmware...");
|
|
108
114
|
try {
|
|
109
115
|
await flashFirmware(currentPort, sourceDir);
|
|
110
|
-
flashSpinner.
|
|
116
|
+
flashSpinner.stop("Firmware flashed successfully.");
|
|
111
117
|
}
|
|
112
118
|
catch (err) {
|
|
113
|
-
flashSpinner.
|
|
114
|
-
|
|
119
|
+
flashSpinner.stop(`Flash failed: ${err.message}`);
|
|
120
|
+
p.log.warn("If flash was interrupted, hold the button while plugging in to enter recovery mode.");
|
|
115
121
|
return false;
|
|
116
122
|
}
|
|
117
123
|
// Step 6: Post-flash verification
|
|
118
|
-
|
|
119
|
-
const waitSpinner =
|
|
124
|
+
p.log.step("Step 6: Verifying...");
|
|
125
|
+
const waitSpinner = p.spinner();
|
|
126
|
+
waitSpinner.start("Waiting for device to reappear...");
|
|
120
127
|
const newPort = await waitForDevice(15_000);
|
|
121
128
|
if (!newPort) {
|
|
122
|
-
waitSpinner.
|
|
123
|
-
|
|
124
|
-
|
|
129
|
+
waitSpinner.stop("Device did not reappear after flash.");
|
|
130
|
+
p.log.warn("Try unplugging and re-plugging the device.");
|
|
131
|
+
p.log.warn("If it still doesn't work, hold the button while plugging in for recovery mode.");
|
|
125
132
|
return false;
|
|
126
133
|
}
|
|
127
|
-
waitSpinner.
|
|
128
|
-
const verifySpinner =
|
|
134
|
+
waitSpinner.stop(`Device found at ${newPort}`);
|
|
135
|
+
const verifySpinner = p.spinner();
|
|
136
|
+
verifySpinner.start("Checking communication...");
|
|
129
137
|
try {
|
|
130
138
|
const { stdout } = await pm3Exec("hw status");
|
|
131
139
|
const status = parseHwStatus(stdout);
|
|
132
140
|
if (!status.connected) {
|
|
133
|
-
verifySpinner.
|
|
134
|
-
|
|
141
|
+
verifySpinner.stop("Communication still failing after flash.");
|
|
142
|
+
p.log.warn("Try running `keyfabe setup` again.");
|
|
135
143
|
return false;
|
|
136
144
|
}
|
|
137
|
-
verifySpinner.
|
|
138
|
-
|
|
145
|
+
verifySpinner.stop("Communication OK");
|
|
146
|
+
p.log.success(`Firmware: ${status.firmwareVersion}`);
|
|
139
147
|
}
|
|
140
148
|
catch {
|
|
141
|
-
verifySpinner.
|
|
149
|
+
verifySpinner.stop("Failed to verify communication.");
|
|
142
150
|
return false;
|
|
143
151
|
}
|
|
144
|
-
const tuneSpinner =
|
|
152
|
+
const tuneSpinner = p.spinner();
|
|
153
|
+
tuneSpinner.start("Checking antenna tuning...");
|
|
145
154
|
try {
|
|
146
155
|
const { stdout } = await pm3Exec("hw tune");
|
|
147
156
|
const tune = parseHwTune(stdout);
|
|
148
|
-
tuneSpinner.
|
|
149
|
-
|
|
150
|
-
|
|
157
|
+
tuneSpinner.stop("Antenna check complete");
|
|
158
|
+
p.log.success(`LF antenna: ${tune.lfVoltage.toFixed(2)}V (125 kHz)`);
|
|
159
|
+
p.log.success(`HF antenna: ${tune.hfVoltage.toFixed(2)}V (13.56 MHz)`);
|
|
151
160
|
}
|
|
152
161
|
catch {
|
|
153
|
-
tuneSpinner.
|
|
162
|
+
tuneSpinner.stop("Failed to check antenna tuning.");
|
|
154
163
|
}
|
|
155
|
-
|
|
164
|
+
p.outro("Setup complete! Device is ready to use.");
|
|
156
165
|
return true;
|
|
157
166
|
}
|
|
158
167
|
//# sourceMappingURL=setup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/show.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare function show(name
|
|
1
|
+
export declare function show(name?: string): Promise<boolean>;
|
package/dist/commands/show.js
CHANGED
|
@@ -1,20 +1,29 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
2
|
import { printFobNotFound } from "../lib/display.js";
|
|
3
|
-
import {
|
|
3
|
+
import { selectFob } from "../lib/prompts.js";
|
|
4
|
+
import { getFob, loadFobs } from "../lib/store.js";
|
|
4
5
|
export async function show(name) {
|
|
6
|
+
if (!name) {
|
|
7
|
+
const fobs = await loadFobs();
|
|
8
|
+
if (fobs.length === 0) {
|
|
9
|
+
p.log.warn("No saved fobs. Use `keyfabe read` or `keyfabe clone` first.");
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
name = await selectFob(fobs, "Which fob to show?");
|
|
13
|
+
}
|
|
5
14
|
const fob = await getFob(name);
|
|
6
15
|
if (!fob) {
|
|
7
16
|
printFobNotFound(name);
|
|
8
17
|
return false;
|
|
9
18
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
|
|
19
|
+
const lines = [
|
|
20
|
+
`Name: ${fob.name}`,
|
|
21
|
+
`Type: ${fob.type}`,
|
|
22
|
+
`ID: ${fob.id}`,
|
|
23
|
+
...(fob.encoding ? [`Encoding: ${fob.encoding}`] : []),
|
|
24
|
+
`Saved: ${fob.savedAt.slice(0, 10)}`,
|
|
25
|
+
];
|
|
26
|
+
p.note(lines.join("\n"), "Fob Details");
|
|
18
27
|
return true;
|
|
19
28
|
}
|
|
20
29
|
//# sourceMappingURL=show.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"show.js","sourceRoot":"","sources":["../../src/commands/show.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,
|
|
1
|
+
{"version":3,"file":"show.js","sourceRoot":"","sources":["../../src/commands/show.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAa;IACpC,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,MAAM,IAAI,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;YAC1E,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;QACP,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACvB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,KAAK,GAAG;QACV,aAAa,GAAG,CAAC,IAAI,EAAE;QACvB,aAAa,GAAG,CAAC,IAAI,EAAE;QACvB,aAAa,GAAG,CAAC,EAAE,EAAE;QACrB,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,aAAa,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;KAC1C,CAAC;IACF,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC;IACxC,OAAO,IAAI,CAAC;AAChB,CAAC"}
|
package/dist/commands/write.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare function write(name
|
|
1
|
+
export declare function write(name?: string): Promise<boolean>;
|
package/dist/commands/write.js
CHANGED
|
@@ -1,10 +1,19 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
2
|
import { writeAndVerify } from "../lib/card-ops.js";
|
|
3
3
|
import { printFobNotFound } from "../lib/display.js";
|
|
4
4
|
import { requireDevice } from "../lib/pm3.js";
|
|
5
|
-
import { waitForEnter } from "../lib/prompts.js";
|
|
6
|
-
import { getFob } from "../lib/store.js";
|
|
5
|
+
import { selectFob, waitForEnter } from "../lib/prompts.js";
|
|
6
|
+
import { getFob, loadFobs } from "../lib/store.js";
|
|
7
7
|
export async function write(name) {
|
|
8
|
+
p.intro("Write Fob");
|
|
9
|
+
if (!name) {
|
|
10
|
+
const fobs = await loadFobs();
|
|
11
|
+
if (fobs.length === 0) {
|
|
12
|
+
p.log.warn("No saved fobs. Use `keyfabe read` or `keyfabe clone` first.");
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
name = await selectFob(fobs, "Which fob identity to write?");
|
|
16
|
+
}
|
|
8
17
|
const fob = await getFob(name);
|
|
9
18
|
if (!fob) {
|
|
10
19
|
printFobNotFound(name);
|
|
@@ -12,14 +21,14 @@ export async function write(name) {
|
|
|
12
21
|
}
|
|
13
22
|
if (!(await requireDevice()))
|
|
14
23
|
return false;
|
|
15
|
-
|
|
24
|
+
p.log.info(`Writing "${fob.name}" (${fob.type} ${fob.id})`);
|
|
16
25
|
await waitForEnter("Place a blank T55x7 fob on the antenna.");
|
|
17
26
|
const success = await writeAndVerify({ type: fob.type, id: fob.id, encoding: fob.encoding });
|
|
18
27
|
if (success) {
|
|
19
|
-
|
|
28
|
+
p.outro("Write successful!");
|
|
20
29
|
return true;
|
|
21
30
|
}
|
|
22
|
-
|
|
31
|
+
p.log.error("Write failed.");
|
|
23
32
|
return false;
|
|
24
33
|
}
|
|
25
34
|
//# sourceMappingURL=write.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/commands/write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,
|
|
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;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,IAAa;IACrC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAErB,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,MAAM,IAAI,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;YAC1E,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,8BAA8B,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;QACP,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACvB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,IAAI,CAAC,CAAC,MAAM,aAAa,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IAE3C,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAE5D,MAAM,YAAY,CAAC,yCAAyC,CAAC,CAAC;IAE9D,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE7F,IAAI,OAAO,EAAE,CAAC;QACV,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAC7B,OAAO,KAAK,CAAC;AACjB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import * as p from "@clack/prompts";
|
|
2
3
|
import { program } from "commander";
|
|
3
4
|
import { clone } from "./commands/clone.js";
|
|
4
5
|
import { deleteFob } from "./commands/delete.js";
|
|
@@ -19,6 +20,44 @@ function withExitCode(fn) {
|
|
|
19
20
|
};
|
|
20
21
|
}
|
|
21
22
|
program.name("keyfabe").description("CLI tool for Proxmark3 keyfob cloning").version("0.1.0");
|
|
23
|
+
program.action(withExitCode(async () => {
|
|
24
|
+
if (!process.stdout.isTTY) {
|
|
25
|
+
program.help();
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
p.intro("keyfabe");
|
|
29
|
+
const action = await p.select({
|
|
30
|
+
message: "What would you like to do?",
|
|
31
|
+
options: [
|
|
32
|
+
{ value: "clone", label: "Clone a keyfob", hint: "read + write + verify" },
|
|
33
|
+
{ value: "read", label: "Read a card", hint: "identify a fob" },
|
|
34
|
+
{ value: "write", label: "Write a saved identity", hint: "write to blank fob" },
|
|
35
|
+
{ value: "list", label: "List saved fobs" },
|
|
36
|
+
{ value: "doctor", label: "Health check", hint: "diagnose device" },
|
|
37
|
+
{ value: "setup", label: "Firmware setup", hint: "flash Iceman firmware" },
|
|
38
|
+
],
|
|
39
|
+
});
|
|
40
|
+
if (p.isCancel(action)) {
|
|
41
|
+
p.cancel("Goodbye!");
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
switch (action) {
|
|
45
|
+
case "clone":
|
|
46
|
+
return clone();
|
|
47
|
+
case "read":
|
|
48
|
+
return read();
|
|
49
|
+
case "write":
|
|
50
|
+
return write();
|
|
51
|
+
case "list":
|
|
52
|
+
return list();
|
|
53
|
+
case "doctor":
|
|
54
|
+
return doctor();
|
|
55
|
+
case "setup":
|
|
56
|
+
return setup();
|
|
57
|
+
default:
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
}));
|
|
22
61
|
program
|
|
23
62
|
.command("doctor")
|
|
24
63
|
.description("Check device connection, firmware, and antenna health")
|
|
@@ -28,7 +67,7 @@ program.command("clone").description("Interactive guided clone flow (read + writ
|
|
|
28
67
|
program
|
|
29
68
|
.command("write")
|
|
30
69
|
.description("Write a previously-saved identity to a blank fob")
|
|
31
|
-
.argument("
|
|
70
|
+
.argument("[name]", "name of the saved fob identity")
|
|
32
71
|
.action(withExitCode(write));
|
|
33
72
|
program
|
|
34
73
|
.command("list")
|
|
@@ -38,18 +77,18 @@ program
|
|
|
38
77
|
program
|
|
39
78
|
.command("show")
|
|
40
79
|
.description("Show details of a saved fob identity")
|
|
41
|
-
.argument("
|
|
80
|
+
.argument("[name]", "name of the saved fob identity")
|
|
42
81
|
.action(withExitCode(show));
|
|
43
82
|
program
|
|
44
83
|
.command("rename")
|
|
45
84
|
.description("Rename a saved fob identity")
|
|
46
|
-
.argument("
|
|
47
|
-
.argument("
|
|
85
|
+
.argument("[old-name]", "current name")
|
|
86
|
+
.argument("[new-name]", "new name")
|
|
48
87
|
.action(withExitCode(rename));
|
|
49
88
|
program
|
|
50
89
|
.command("delete")
|
|
51
90
|
.description("Delete a saved fob identity")
|
|
52
|
-
.argument("
|
|
91
|
+
.argument("[name]", "name of the saved fob identity")
|
|
53
92
|
.action(withExitCode(deleteFob));
|
|
54
93
|
program.command("export").description("Export all saved fob identities as JSON").action(withExitCode(exportFobs));
|
|
55
94
|
program
|
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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"}
|