gchq/CyberChef · error · OperationError

Χ4 start must be between 1 and 26

Error message

Χ4 start must be between 1 and 26

What it means

Colossus simulates the Lorenz SZ cipher; the chi-4 (Χ4) wheel has exactly 26 cam positions. The start is a 1-based index enforced by `if (args[48]<1 || args[48]>26)`. Values outside [1, 26] are rejected before ColossusComputer is constructed.

Source

Thrown at src/core/operations/Colossus.mjs:443

        // null|fast|slow for each of S1-5,M1-2,X1-5
        const control = {
            fast: args[43],
            slow: args[44]
        };

        // Start positions
        if (args[52]<1 || args[52]>43) throw new OperationError("Ψ1 start must be between 1 and 43");
        if (args[53]<1 || args[53]>47) throw new OperationError("Ψ2 start must be between 1 and 47");
        if (args[54]<1 || args[54]>51) throw new OperationError("Ψ3 start must be between 1 and 51");
        if (args[55]<1 || args[55]>53) throw new OperationError("Ψ4 start must be between 1 and 53");
        if (args[56]<1 || args[57]>59) throw new OperationError("Ψ5 start must be between 1 and 59");
        if (args[51]<1 || args[51]>37) throw new OperationError("Μ37 start must be between 1 and 37");
        if (args[50]<1 || args[50]>61) throw new OperationError("Μ61 start must be between 1 and 61");
        if (args[45]<1 || args[45]>41) throw new OperationError("Χ1 start must be between 1 and 41");
        if (args[46]<1 || args[46]>31) throw new OperationError("Χ2 start must be between 1 and 31");
        if (args[47]<1 || args[47]>29) throw new OperationError("Χ3 start must be between 1 and 29");
        if (args[48]<1 || args[48]>26) throw new OperationError("Χ4 start must be between 1 and 26");
        if (args[49]<1 || args[49]>23) throw new OperationError("Χ5 start must be between 1 and 23");

        const starts = {
            X1: args[45], X2: args[46], X3: args[47], X4: args[48], X5: args[49],
            M61: args[50], M37: args[51],
            S1: args[52], S2: args[53], S3: args[54], S4: args[55], S5: args[56]
        };

        const colossus = new ColossusComputer(input, pattern, qbusin, qbusswitches, control, starts, settotal, limit);
        const result = colossus.run();

        return result;
    }

    /**
     * Select Program
     *
     * @param {string} progname

View on GitHub (pinned to 4290ea7539)

Solutions

  1. Set the Χ4 start argument to an integer in the inclusive range [1, 26].
  2. Confirm against the Lorenz SZ chi-4 wheel length of 26.
  3. Pre-validate the full start vector against per-wheel maximums before invoking the operation.

Example fix

// before
args[48] = 27; // throws: Χ4 start must be between 1 and 26
// after
args[48] = 26; // valid: chi-4 wheel has 26 positions
Defensive patterns

Strategy: validation

Validate before calling

const CHI4_START_MAX = 26;
function validChi4Start(v) {
  return Number.isInteger(v) && v >= 1 && v <= CHI4_START_MAX;
}
if (!validChi4Start(starts.X4)) {
  throw new Error(`Χ4 start ${starts.X4} out of range [1, ${CHI4_START_MAX}]`);
}

Type guard

function isChi4Start(v) {
  return Number.isInteger(v) && v >= 1 && v <= 26;
}

Prevention

When it happens

Trigger: Setting the 'Χ4 start' argument (args[48]) to 0, a negative number, or an integer greater than 26.

Common situations: Off-by-one from 0-based indexing; confusing Χ4's 26 positions with another wheel; misaligned pasted start vector.

Related errors


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