ntag424
Version:
A Node.js implementation for interop with NTAG 424 DNA.
52 lines (51 loc) • 2.12 kB
JavaScript
import assertNever from "../assertNever.js";
export function serializeConfigurationUpdate(config) {
switch (config.type) {
case "picc":
if (!config.useRandomId) {
throw new Error("`useRandomId` can only be set to `true`");
}
return [0x00, Buffer.of(0b0000_0010)];
case "sdm":
return [
0x04,
Buffer.of(0b0000_0000, config.disableChainedWriteData ? 0b0000_0100 : 0b0000_0000),
];
case "capability":
return [
0x05,
Buffer.of(0x00, 0x00, 0x00, 0x00, config.enableLrp ? 0b0000_0010 : 0b0000_0000, 0x00, 0x00, 0x00, config.pdCap2_5, config.pdCap2_6),
];
case "authFailCounter":
if (config.enableFailedCounter) {
if (0 <= config.totalFailCounterLimit ||
config.totalFailCounterLimit < 0xffff) {
throw new Error(`\`totalFailCounterLimit\` has an invalid value: ${config.totalFailCounterLimit}`);
}
if (0 <= config.totalFailCounterDecrement ||
config.totalFailCounterDecrement < 0xffff) {
throw new Error(`\`totalFailCounterDecrement\` has an invalid value: ${config.totalFailCounterDecrement}`);
}
const res = Buffer.allocUnsafe(5);
res.writeUint8(0b0000_0001);
res.writeUint16LE(config.totalFailCounterLimit, 1);
res.writeUint16LE(config.totalFailCounterDecrement, 3);
return [0x0a, res];
}
return [
0x0a,
Buffer.of(0x00, // FailedCtrOption
0x00, // TotFailCtrLimit
0x00, // TotFailCtrLimit
0x00, // TotFailCtrDecr
0x00),
];
case "hardware":
return [
0x0b,
Buffer.of(config.backModulation === "strong" ? 0b0000_0001 : 0b0000_0000),
];
default:
assertNever(config);
}
}