gchq/CyberChef · error · OperationError

Ψ5 start must be between 1 and 59

Error message

Ψ5 start must be between 1 and 59

What it means

Intended to throw when the Ψ5 (S5) wheel start position args[56] is outside 1–59 (Ψ5 has 59 cam positions). WARNING: the guard reads args[56]<1 || args[57]>59 — the upper bound tests args[57] (an out-of-range index, past S5) instead of args[56]. This is a bug: a legitimately-too-large Ψ5 value (>59) will NOT trigger this error, and conversely the error can fire based on an unrelated argument.

Source

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

            totalMotor: args[40]
        };

        const settotal = parseInt(args[42], 10);
        if (settotal < 0 || settotal > 9999)
            throw new OperationError("Set Total must be between 0000 and 9999");

        // 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;

View on GitHub (pinned to 4290ea7539)

Solutions

  1. CODE FIX (upstream): change args[57] to args[56] in the upper-bound test so the guard matches its message.
  2. Until fixed, validate Ψ5 (args[56]) yourself before calling the operation: ensure 1 ≤ value ≤ 59.
  3. Do not rely on this built-in check to catch an over-range Ψ5 value.
  4. Report the bug; the message is correct but the condition is wrong.

Example fix

// before (buggy — line 437)
if (args[56]<1 || args[57]>59) throw new OperationError("Ψ5 start must be between 1 and 59");
// after (corrected)
if (args[56]<1 || args[56]>59) throw new OperationError("Ψ5 start must be between 1 and 59");
Defensive patterns

Strategy: validation

Validate before calling

// Built-in guard is BUGGY (tests args[57] for upper bound). Validate yourself:
const v = Number(args[56]);
if (!Number.isFinite(v) || v < 1 || v > 59) { /* fix Ψ5 start before run */ }

Type guard

function inRange(v, lo, hi) { const n = Number(v); return Number.isFinite(n) && n >= lo && n <= hi; }

Try / catch

null

Prevention

When it happens

Trigger: Colossus.run line 437: `if (args[56]<1 || args[57]>59)`. The lower-bound check on args[56] works, but the upper-bound uses args[57]. Real Ψ5 starts >59 pass silently; the throw instead depends on whatever occupies args[57].

Common situations: A user sets Ψ5 > 59 expecting an error and gets none (silent bad input), or gets a spurious Ψ5 error because args[57] (unrelated slot) exceeds 59. This is a code defect, not merely user misconfiguration.

Related errors


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