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.

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)

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.