gchq/CyberChef · error · OperationError

Χ4 custom lugs must be 26 long and can only include . or x

Error message

Χ4 custom lugs must be 26 long and can only include . or x

What it means

Thrown by the Lorenz SZ operation when 'Wheel Pattern' is 'Custom' and the Χ4 (chi-4) lug string (arg[29], 'Χ4 lugs (26)') is invalid. The Χ4 wheel has 26 cam positions; the value must be exactly 26 characters matching /^[.xX]*$/. Enforced at Lorenz.mjs:292, after the Χ1–Χ3 checks pass.

Solutions

  1. Set the Χ4 lug string to exactly 26 characters using only '.', 'x', or 'X' (26 is the chi-4 wheel cam count).
  2. Use a preset wheel pattern (KH/ZMUG/BREAM/No Pattern) instead of 'Custom' to skip the check.
  3. Validate length and alphabet before invoking the operation.
  4. Confirm the field is Χ4 and the source pattern is for the chi-4 wheel.

Example fix

// before
lugx4 = "xx..x..xxxx..xx.xxx....x";   // 25 chars

// after — exactly 26 chars
lugx4 = "xx..x..xxxx..xx.xxx....x..";
Defensive patterns

Strategy: validation

Validate before calling

const CHI4_LEN = 26;
const lugRe = /^[.xX]*$/;
function validChi4(lugx4) {
  return typeof lugx4 === 'string' && lugx4.length === CHI4_LEN && lugRe.test(lugx4);
}
if (!validChi4(args[29])) throw new Error('Χ4 lugs must be 26 chars of . x X');

Type guard

function isChi4Lugs(v): v is string {
  return typeof v === 'string' && v.length === 26 && /^[.xX]*$/.test(v);
}

Prevention

When it happens

Trigger: pattern='Custom' with lugx4 of length != 26 or containing characters outside {'.', 'x', 'X'}.

Common situations: Reusing a 29-char Χ3 pattern for Χ4; alphabet-size tables that quote chi-4 at a different length; trailing whitespace or newline from a copy/paste; using uppercase 'O' instead of 'x'.

Related errors


AI-assisted analysis of gchq/CyberChef@4290ea7539 (2026-08-13). Data as JSON: /api/errors/51d60e7128ccfb57. Report an issue: GitHub.

Appendix: source

Thrown at src/core/operations/Lorenz.mjs:292

        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];
        }
        const chiSettings = chosenSetting.X; // Pin settings for Chi links (X)

View on GitHub (pinned to 4290ea7539)