gchq/CyberChef · error · OperationError
Χ3 custom lugs must be 29 long and can only include . or x
Error message
Χ3 custom lugs must be 29 long and can only include . or x
What it means
Thrown by the Lorenz SZ operation when 'Wheel Pattern' is 'Custom' and the Χ3 (chi-3) lug string (arg[28], 'Χ3 lugs (29)') is invalid. The Χ3 wheel has 29 cam positions; the supplied string must be exactly 29 characters matching /^[.xX]*$/. Enforced at Lorenz.mjs:291, after the Χ1 and Χ2 checks pass.
Source
Thrown at src/core/operations/Lorenz.mjs:291
if (x2<1 || x2>31) throw new OperationError("Χ2 start must be between 1 and 31");
if (x3<1 || x3>29) throw new OperationError("Χ3 start must be between 1 and 29");
if (x4<1 || x4>26) throw new OperationError("Χ4 start must be between 1 and 26");
if (x5<1 || x5>23) throw new OperationError("Χ5 start must be between 1 and 23");
// Initialise chosen wheel pattern
let chosenSetting = "";
if (pattern === "Custom") {
const re = new RegExp("^[.xX]*$");
if (lugs1.length !== 43 || !re.test(lugs1)) throw new OperationError("Ψ1 custom lugs must be 43 long and can only include . or x ");
if (lugs2.length !== 47 || !re.test(lugs2)) throw new OperationError("Ψ2 custom lugs must be 47 long and can only include . or x");
if (lugs3.length !== 51 || !re.test(lugs3)) throw new OperationError("Ψ3 custom lugs must be 51 long and can only include . or x");
if (lugs4.length !== 53 || !re.test(lugs4)) throw new OperationError("Ψ4 custom lugs must be 53 long and can only include . or x");
if (lugs5.length !== 59 || !re.test(lugs5)) throw new OperationError("Ψ5 custom lugs must be 59 long and can only include . or x");
if (lugm37.length !== 37 || !re.test(lugm37)) throw new OperationError("M37 custom lugs must be 37 long and can only include . or x");
if (lugm61.length !== 61 || !re.test(lugm61)) throw new OperationError("M61 custom lugs must be 61 long and can only include . or x");
if (lugx1.length !== 41 || !re.test(lugx1)) throw new OperationError("Χ1 custom lugs must be 41 long and can only include . or x");
if (lugx2.length !== 31 || !re.test(lugx2)) throw new OperationError("Χ2 custom lugs must be 31 long and can only include . or x");
if (lugx3.length !== 29 || !re.test(lugx3)) throw new OperationError("Χ3 custom lugs must be 29 long and can only include . or x");
if (lugx4.length !== 26 || !re.test(lugx4)) throw new OperationError("Χ4 custom lugs must be 26 long and can only include . or x");
if (lugx5.length !== 23 || !re.test(lugx5)) throw new OperationError("Χ5 custom lugs must be 23 long and can only include . or x");
chosenSetting = INIT_PATTERNS["No Pattern"];
chosenSetting.S[1] = this.readLugs(lugs1);
chosenSetting.S[2] = this.readLugs(lugs2);
chosenSetting.S[3] = this.readLugs(lugs3);
chosenSetting.S[4] = this.readLugs(lugs4);
chosenSetting.S[5] = this.readLugs(lugs5);
chosenSetting.M[1] = this.readLugs(lugm61);
chosenSetting.M[2] = this.readLugs(lugm37);
chosenSetting.X[1] = this.readLugs(lugx1);
chosenSetting.X[2] = this.readLugs(lugx2);
chosenSetting.X[3] = this.readLugs(lugx3);
chosenSetting.X[4] = this.readLugs(lugx4);
chosenSetting.X[5] = this.readLugs(lugx5);
} else {
chosenSetting = INIT_PATTERNS[pattern];
}View on GitHub (pinned to 4290ea7539)
Solutions
- Set the Χ3 lug string to exactly 29 characters using only '.', 'x', or 'X' (29 is the chi-3 wheel cam count).
- Use a preset wheel pattern instead of 'Custom' if you do not need custom Χ3 settings.
- Validate length and alphabet before invoking the operation.
- Re-verify the source pattern is specifically for the chi-3 wheel.
Example fix
// before lugx3 = "..xx..x.xxx...xx...xx..xx.xx"; // 30 chars // after — exactly 29 chars lugx3 = "..xx..x.xxx...xx...xx..xx.xx.";
Defensive patterns
Strategy: validation
Validate before calling
const CHI3_LEN = 29;
const lugRe = /^[.xX]*$/;
function validChi3(lugx3) {
return typeof lugx3 === 'string' && lugx3.length === CHI3_LEN && lugRe.test(lugx3);
}
if (!validChi3(args[28])) throw new Error('Χ3 lugs must be 29 chars of . x X'); Type guard
function isChi3Lugs(v): v is string {
return typeof v === 'string' && v.length === 29 && /^[.xX]*$/.test(v);
} Prevention
- Assert the chi-3 length is exactly 29 before invoking.
- Strip non-ASCII lookalikes for 'x' before validation.
- Prefer preset patterns unless custom chi-3 is required.
When it happens
Trigger: pattern='Custom' with lugx3 of length != 29 or containing characters outside {'.', 'x', 'X'}.
Common situations: Pasting a 31-char Χ2 pattern into the Χ3 field; transcribed patterns with off-by-one length; non-ASCII lookalikes for 'x' (e.g. Cyrillic х); whitespace introduced by formatting.
Related errors
- Χ1 custom lugs must be 41 long and can only include . or x
- Χ2 custom lugs must be 31 long and can only include . or x
- Χ4 custom lugs must be 26 long and can only include . or x
- Lorenz model type not recognised
- Invalid ITA2 character : ${errltr}
AI-assisted analysis of gchq/CyberChef@4290ea7539 (2026-08-13).
Data as JSON: /api/errors/e5fc783e35063392.
Report an issue: GitHub.