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/lib/card-ops.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
2
|
import { printDoctorHint } from "./display.js";
|
|
3
3
|
import { parseCloneResult, parseLfSearch, parseT55xxDetect } from "./parsers.js";
|
|
4
4
|
import { Pm3Error, pm3Exec } from "./pm3.js";
|
|
@@ -24,74 +24,87 @@ function verifyCommand(card) {
|
|
|
24
24
|
}
|
|
25
25
|
export async function writeAndVerify(card) {
|
|
26
26
|
// Detect T55x7
|
|
27
|
-
const detectSpinner =
|
|
27
|
+
const detectSpinner = p.spinner();
|
|
28
|
+
detectSpinner.start("Detecting writable card...");
|
|
28
29
|
try {
|
|
29
30
|
const { stdout } = await pm3Exec("lf t55xx detect");
|
|
30
31
|
const t55 = parseT55xxDetect(stdout);
|
|
31
32
|
if (!t55) {
|
|
32
|
-
detectSpinner.
|
|
33
|
+
detectSpinner.stop("Card is not a writable T55x7. Use a blank T55x7 fob.");
|
|
34
|
+
p.log.error("Card is not a writable T55x7. Use a blank T55x7 fob.");
|
|
33
35
|
return false;
|
|
34
36
|
}
|
|
35
|
-
detectSpinner.
|
|
37
|
+
detectSpinner.stop(`Writable card detected (${t55.chipType})`);
|
|
36
38
|
}
|
|
37
39
|
catch (err) {
|
|
38
40
|
if (err instanceof Pm3Error) {
|
|
39
|
-
detectSpinner.
|
|
41
|
+
detectSpinner.stop(err.message);
|
|
42
|
+
p.log.error(err.message);
|
|
40
43
|
if (err.message.includes("not found")) {
|
|
41
44
|
printDoctorHint();
|
|
42
45
|
}
|
|
43
46
|
}
|
|
44
47
|
else {
|
|
45
|
-
detectSpinner.
|
|
48
|
+
detectSpinner.stop("Failed to detect writable card.");
|
|
49
|
+
p.log.error("Failed to detect writable card.");
|
|
46
50
|
}
|
|
47
51
|
return false;
|
|
48
52
|
}
|
|
49
53
|
// Clone
|
|
50
|
-
const cloneSpinner =
|
|
54
|
+
const cloneSpinner = p.spinner();
|
|
55
|
+
cloneSpinner.start("Writing card data...");
|
|
51
56
|
try {
|
|
52
57
|
const cmd = cloneCommand(card);
|
|
53
58
|
const { stdout } = await pm3Exec(cmd);
|
|
54
59
|
const result = parseCloneResult(stdout);
|
|
55
60
|
if (!result.success) {
|
|
56
|
-
cloneSpinner.
|
|
61
|
+
cloneSpinner.stop("Write command did not confirm success.");
|
|
62
|
+
p.log.error("Write command did not confirm success.");
|
|
57
63
|
return false;
|
|
58
64
|
}
|
|
59
|
-
cloneSpinner.
|
|
65
|
+
cloneSpinner.stop("Card data written");
|
|
60
66
|
}
|
|
61
67
|
catch (err) {
|
|
62
68
|
if (err instanceof Pm3Error) {
|
|
63
|
-
cloneSpinner.
|
|
69
|
+
cloneSpinner.stop(err.message);
|
|
70
|
+
p.log.error(err.message);
|
|
64
71
|
if (err.message.includes("not found")) {
|
|
65
72
|
printDoctorHint();
|
|
66
73
|
}
|
|
67
74
|
}
|
|
68
75
|
else {
|
|
69
|
-
cloneSpinner.
|
|
76
|
+
cloneSpinner.stop("Failed to write card data.");
|
|
77
|
+
p.log.error("Failed to write card data.");
|
|
70
78
|
}
|
|
71
79
|
return false;
|
|
72
80
|
}
|
|
73
81
|
// Verify
|
|
74
|
-
const verifySpinner =
|
|
82
|
+
const verifySpinner = p.spinner();
|
|
83
|
+
verifySpinner.start("Verifying readback...");
|
|
75
84
|
try {
|
|
76
85
|
const cmd = verifyCommand(card);
|
|
77
86
|
const { stdout } = await pm3Exec(cmd);
|
|
78
87
|
const readback = parseLfSearch(stdout);
|
|
79
88
|
if (readback && readback.id === card.id) {
|
|
80
|
-
verifySpinner.
|
|
89
|
+
verifySpinner.stop("Verification passed — IDs match");
|
|
81
90
|
return true;
|
|
82
91
|
}
|
|
83
|
-
|
|
92
|
+
const msg = `Verification failed — readback ID ${readback?.id ?? "not found"} doesn't match ${card.id}. Try again.`;
|
|
93
|
+
verifySpinner.stop(msg);
|
|
94
|
+
p.log.error(msg);
|
|
84
95
|
return false;
|
|
85
96
|
}
|
|
86
97
|
catch (err) {
|
|
87
98
|
if (err instanceof Pm3Error) {
|
|
88
|
-
verifySpinner.
|
|
99
|
+
verifySpinner.stop(err.message);
|
|
100
|
+
p.log.error(err.message);
|
|
89
101
|
if (err.message.includes("not found")) {
|
|
90
102
|
printDoctorHint();
|
|
91
103
|
}
|
|
92
104
|
}
|
|
93
105
|
else {
|
|
94
|
-
verifySpinner.
|
|
106
|
+
verifySpinner.stop("Verification readback failed.");
|
|
107
|
+
p.log.error("Verification readback failed.");
|
|
95
108
|
}
|
|
96
109
|
return false;
|
|
97
110
|
}
|
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,
|
|
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,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAiB,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChG,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAE7C,SAAS,YAAY,CAAC,IAAc;IAChC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,QAAQ;YACT,OAAO,yBAAyB,IAAI,CAAC,EAAE,EAAE,CAAC;QAC9C,KAAK,UAAU;YACX,OAAO,mBAAmB,IAAI,CAAC,EAAE,EAAE,CAAC;QACxC;YACI,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,IAAc;IACjC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,QAAQ;YACT,OAAO,mBAAmB,CAAC;QAC/B,KAAK,UAAU;YACX,OAAO,eAAe,CAAC;QAC3B;YACI,OAAO,WAAW,CAAC;IAC3B,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAc;IAC/C,eAAe;IACf,MAAM,aAAa,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAClC,aAAa,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAClD,IAAI,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,EAAE,CAAC;YACP,aAAa,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;YAC3E,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;YACpE,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,aAAa,CAAC,IAAI,CAAC,2BAA2B,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC;IACnE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YAC1B,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAChC,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,aAAa,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YACtD,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,QAAQ;IACR,MAAM,YAAY,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IACjC,YAAY,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC3C,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAClB,YAAY,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;YAC5D,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;YACtD,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YAC1B,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC/B,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,YAAY,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YAChD,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,SAAS;IACT,MAAM,aAAa,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAClC,aAAa,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC7C,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,QAAQ,IAAI,QAAQ,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;YACtC,aAAa,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YACtD,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,MAAM,GAAG,GAAG,qCAAqC,QAAQ,EAAE,EAAE,IAAI,WAAW,kBAAkB,IAAI,CAAC,EAAE,cAAc,CAAC;QACpH,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjB,OAAO,KAAK,CAAC;IACjB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YAC1B,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAChC,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,aAAa,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YACpD,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC"}
|
package/dist/lib/display.js
CHANGED
|
@@ -1,23 +1,21 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
2
|
export const LF_VOLTAGE_THRESHOLD = 15;
|
|
3
3
|
export const HF_VOLTAGE_THRESHOLD = 10;
|
|
4
4
|
export const BREW_INSTALL_CMD = "brew tap rfidresearchgroup/proxmark3 && brew install proxmark3";
|
|
5
5
|
export function printBrewInstall() {
|
|
6
|
-
|
|
7
|
-
console.log(chalk.yellow(` ${BREW_INSTALL_CMD}`));
|
|
6
|
+
p.note(BREW_INSTALL_CMD, "Install Proxmark3 client");
|
|
8
7
|
}
|
|
9
8
|
export function printCardInfo(card) {
|
|
10
|
-
|
|
11
|
-
console.log(chalk.bold(` ID: ${card.id}`));
|
|
9
|
+
const lines = [`Type: ${card.type}`, `ID: ${card.id}`];
|
|
12
10
|
if (card.encoding) {
|
|
13
|
-
|
|
11
|
+
lines.push(`Encoding: ${card.encoding}`);
|
|
14
12
|
}
|
|
15
|
-
|
|
13
|
+
p.note(lines.join("\n"), "Card Info");
|
|
16
14
|
}
|
|
17
15
|
export function printDoctorHint() {
|
|
18
|
-
|
|
16
|
+
p.log.warn("Run `keyfabe doctor` to diagnose your setup.");
|
|
19
17
|
}
|
|
20
18
|
export function printFobNotFound(name) {
|
|
21
|
-
|
|
19
|
+
p.log.error(`No saved fob named "${name}". Use \`keyfabe list\` to see saved fobs.`);
|
|
22
20
|
}
|
|
23
21
|
//# 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,MAAM,
|
|
1
|
+
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/lib/display.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAGpC,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,CAAC,IAAY;IACzC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,uBAAuB,IAAI,4CAA4C,CAAC,CAAC;AACzF,CAAC"}
|
package/dist/lib/parsers.d.ts
CHANGED
|
@@ -23,4 +23,5 @@ export declare function parseHwStatus(output: string): HwStatus;
|
|
|
23
23
|
export declare function parseHwTune(output: string): HwTune;
|
|
24
24
|
export declare function parseLfSearch(output: string): CardInfo | null;
|
|
25
25
|
export declare function parseT55xxDetect(output: string): T55xxInfo | null;
|
|
26
|
+
export declare function parseHfSearch(output: string): CardInfo | null;
|
|
26
27
|
export declare function parseCloneResult(output: string): CloneResult;
|
package/dist/lib/parsers.js
CHANGED
|
@@ -51,6 +51,28 @@ export function parseT55xxDetect(output) {
|
|
|
51
51
|
passwordSet,
|
|
52
52
|
};
|
|
53
53
|
}
|
|
54
|
+
export function parseHfSearch(output) {
|
|
55
|
+
// Extract UID — formats: "UID: AB CD EF 01" or "UID: ABCDEF01" or "UID[4]: AB CD EF 01"
|
|
56
|
+
const uidMatch = output.match(/UID\s*(?:\[\d+\])?\s*[:=]\s*([0-9A-Fa-f]{2}(?:\s+[0-9A-Fa-f]{2})*)/i);
|
|
57
|
+
if (!uidMatch)
|
|
58
|
+
return null;
|
|
59
|
+
const uid = uidMatch[1].replace(/\s+/g, "").toUpperCase();
|
|
60
|
+
// Determine card type from SAK, ATQA, or text
|
|
61
|
+
let type = "ISO 14443-A";
|
|
62
|
+
if (/MIFARE\s*Classic.*4K/i.test(output)) {
|
|
63
|
+
type = "MIFARE Classic 4K";
|
|
64
|
+
}
|
|
65
|
+
else if (/MIFARE\s*Classic/i.test(output)) {
|
|
66
|
+
type = "MIFARE Classic 1K";
|
|
67
|
+
}
|
|
68
|
+
else if (/MIFARE\s*Ultralight|NTAG/i.test(output)) {
|
|
69
|
+
type = "MIFARE Ultralight";
|
|
70
|
+
}
|
|
71
|
+
else if (/MIFARE\s*DESFire/i.test(output)) {
|
|
72
|
+
type = "MIFARE DESFire";
|
|
73
|
+
}
|
|
74
|
+
return { type, id: uid };
|
|
75
|
+
}
|
|
54
76
|
export function parseCloneResult(output) {
|
|
55
77
|
const hasError = /error/i.test(output) && !/errorrate/i.test(output);
|
|
56
78
|
const hasDone = /done/i.test(output) || /written/i.test(output) || /cloned/i.test(output);
|
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":"AA0BA,MAAM,UAAU,aAAa,CAAC,MAAc;IACxC,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,CAAC,eAAe,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC1G,MAAM,OAAO,GACT,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;QAC3B,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACpC,MAAM,eAAe,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IAC1D,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,EAAE,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAc;IACtC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAChE,OAAO;QACH,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KAClD,CAAC;AACN,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc;IACxC,SAAS;IACT,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;IACrF,IAAI,OAAO,EAAE,CAAC;QACV,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAChD,OAAO;YACH,IAAI,EAAE,QAAQ;YACd,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;YAC5B,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;SACjE,CAAC;IACN,CAAC;IAED,WAAW;IACX,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACpF,IAAI,QAAQ,EAAE,CAAC;QACX,OAAO;YACH,IAAI,EAAE,UAAU;YAChB,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;SAChC,CAAC;IACN,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC3C,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAClH,IAAI,CAAC,SAAS,EAAE,CAAC;QACb,2CAA2C;QAC3C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACrD,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAED,MAAM,WAAW,GAAG,2BAA2B,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAErG,OAAO;QACH,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO;QACnC,WAAW;KACd,CAAC;AACN,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc;IACxC,wFAAwF;IACxF,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC;IACrG,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAE1D,8CAA8C;IAC9C,IAAI,IAAI,GAAG,aAAa,CAAC;IAEzB,IAAI,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACvC,IAAI,GAAG,mBAAmB,CAAC;IAC/B,CAAC;SAAM,IAAI,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,IAAI,GAAG,mBAAmB,CAAC;IAC/B,CAAC;SAAM,IAAI,2BAA2B,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,GAAG,mBAAmB,CAAC;IAC/B,CAAC;SAAM,IAAI,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,IAAI,GAAG,gBAAgB,CAAC;IAC5B,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC3C,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrE,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1F,OAAO,EAAE,OAAO,EAAE,CAAC,QAAQ,IAAI,OAAO,EAAE,CAAC;AAC7C,CAAC"}
|
package/dist/lib/pm3.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { execFile } from "node:child_process";
|
|
2
2
|
import { readdir } from "node:fs/promises";
|
|
3
|
-
import
|
|
3
|
+
import * as p from "@clack/prompts";
|
|
4
4
|
const DEFAULT_TIMEOUT = 30_000;
|
|
5
5
|
export class Pm3Error extends Error {
|
|
6
6
|
stdout;
|
|
@@ -39,7 +39,7 @@ export async function pm3Exec(command, timeout = DEFAULT_TIMEOUT) {
|
|
|
39
39
|
export async function requireDevice() {
|
|
40
40
|
const port = await detectPort();
|
|
41
41
|
if (!port) {
|
|
42
|
-
|
|
42
|
+
p.log.error("No Proxmark3 detected. Check USB connection.");
|
|
43
43
|
return false;
|
|
44
44
|
}
|
|
45
45
|
return true;
|
package/dist/lib/pm3.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pm3.js","sourceRoot":"","sources":["../../src/lib/pm3.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,KAAK,MAAM,
|
|
1
|
+
{"version":3,"file":"pm3.js","sourceRoot":"","sources":["../../src/lib/pm3.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAEpC,MAAM,eAAe,GAAG,MAAM,CAAC;AAE/B,MAAM,OAAO,QAAS,SAAQ,KAAK;IAC/B,MAAM,CAAS;IACf,MAAM,CAAS;IACf,YAAY,OAAe,EAAE,MAAc,EAAE,MAAc;QACvD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;CACJ;AAOD,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAe,EAAE,OAAO,GAAG,eAAe;IACpE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YAClF,MAAM,GAAG,GAAG,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YACrC,IAAI,KAAK,EAAE,CAAC;gBACR,kEAAkE;gBAClE,iEAAiE;gBACjE,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACrD,MAAM,CACF,IAAI,QAAQ,CACR,yEAAyE,EACzE,GAAG,EACH,GAAG,CACN,CACJ,CAAC;oBACF,OAAO;gBACX,CAAC;gBACD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,QAAQ,CAAC,+BAA+B,OAAO,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;oBAC3E,OAAO;gBACX,CAAC;gBACD,8CAA8C;gBAC9C,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;gBACtC,OAAO;YACX,CAAC;YACD,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IAC/B,MAAM,IAAI,GAAG,MAAM,UAAU,EAAE,CAAC;IAChC,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC5D,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC5B,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;QAChE,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC"}
|
package/dist/lib/prompts.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import type { Fob } from "./store.js";
|
|
2
2
|
export declare function confirm(message: string): Promise<boolean>;
|
|
3
3
|
export declare function waitForEnter(message: string): Promise<void>;
|
|
4
4
|
export declare function promptName(): Promise<string | null>;
|
|
5
|
+
export declare function selectFob(fobs: Fob[], message?: string): Promise<string>;
|
package/dist/lib/prompts.js
CHANGED
|
@@ -1,27 +1,35 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export async function prompt(message) {
|
|
7
|
-
const rl = createRl();
|
|
8
|
-
try {
|
|
9
|
-
return await rl.question(message);
|
|
10
|
-
}
|
|
11
|
-
finally {
|
|
12
|
-
rl.close();
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
|
+
function handleCancel(value) {
|
|
3
|
+
if (p.isCancel(value)) {
|
|
4
|
+
p.cancel("Operation cancelled.");
|
|
5
|
+
process.exit(0);
|
|
13
6
|
}
|
|
14
7
|
}
|
|
15
8
|
export async function confirm(message) {
|
|
16
|
-
const
|
|
17
|
-
|
|
9
|
+
const value = await p.confirm({ message });
|
|
10
|
+
handleCancel(value);
|
|
11
|
+
return value;
|
|
18
12
|
}
|
|
19
13
|
export async function waitForEnter(message) {
|
|
20
|
-
await
|
|
14
|
+
const value = await p.text({ message, placeholder: "Press Enter", defaultValue: "" });
|
|
15
|
+
handleCancel(value);
|
|
21
16
|
}
|
|
22
17
|
export async function promptName() {
|
|
23
|
-
const
|
|
24
|
-
|
|
18
|
+
const value = await p.text({ message: "Save as", placeholder: "name, or Enter to skip", defaultValue: "" });
|
|
19
|
+
handleCancel(value);
|
|
20
|
+
const trimmed = value.trim();
|
|
25
21
|
return trimmed || null;
|
|
26
22
|
}
|
|
23
|
+
export async function selectFob(fobs, message = "Select a fob") {
|
|
24
|
+
const value = await p.select({
|
|
25
|
+
message,
|
|
26
|
+
options: fobs.map((f) => ({
|
|
27
|
+
value: f.name,
|
|
28
|
+
label: f.name,
|
|
29
|
+
hint: `${f.type} ${f.id}`,
|
|
30
|
+
})),
|
|
31
|
+
});
|
|
32
|
+
handleCancel(value);
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
27
35
|
//# 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,
|
|
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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "keyfabe",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "CLI tool for Proxmark3 keyfob cloning",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -13,6 +13,11 @@
|
|
|
13
13
|
"engines": {
|
|
14
14
|
"node": ">=20"
|
|
15
15
|
},
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "https://github.com/edobry/keyfabe.git"
|
|
19
|
+
},
|
|
20
|
+
"homepage": "https://github.com/edobry/keyfabe",
|
|
16
21
|
"keywords": [
|
|
17
22
|
"proxmark3",
|
|
18
23
|
"rfid",
|
|
@@ -29,9 +34,9 @@
|
|
|
29
34
|
"test:watch": "vitest"
|
|
30
35
|
},
|
|
31
36
|
"dependencies": {
|
|
37
|
+
"@clack/prompts": "^1.0.0",
|
|
32
38
|
"chalk": "^5.6.2",
|
|
33
|
-
"commander": "^14.0.3"
|
|
34
|
-
"ora": "^9.3.0"
|
|
39
|
+
"commander": "^14.0.3"
|
|
35
40
|
},
|
|
36
41
|
"devDependencies": {
|
|
37
42
|
"@biomejs/biome": "^2.3.14",
|