fix: ROT13 - shifting numbers by negative amounts

Fixes https://github.com/gchq/CyberChef/issues/1886.
This commit is contained in:
Francisco Pombal 2024-09-15 23:51:48 +01:00
parent d635cca210
commit 7e5eb01a5e
2 changed files with 89 additions and 11 deletions

View file

@ -59,15 +59,16 @@ class ROT13 extends Operation {
rot13Upperacse = args[1], rot13Upperacse = args[1],
rotNumbers = args[2]; rotNumbers = args[2];
let amount = args[3], let amount = args[3],
chr; amountNumbers = args[3];
if (amount) { if (amount) {
if (amount < 0) { if (amount < 0) {
amount = 26 - (Math.abs(amount) % 26); amount = 26 - (Math.abs(amount) % 26);
amountNumbers = 10 - (Math.abs(amountNumbers) % 10);
} }
for (let i = 0; i < input.length; i++) { for (let i = 0; i < input.length; i++) {
chr = input[i]; let chr = input[i];
if (rot13Upperacse && chr >= 65 && chr <= 90) { // Upper case if (rot13Upperacse && chr >= 65 && chr <= 90) { // Upper case
chr = (chr - 65 + amount) % 26; chr = (chr - 65 + amount) % 26;
output[i] = chr + 65; output[i] = chr + 65;
@ -75,7 +76,7 @@ class ROT13 extends Operation {
chr = (chr - 97 + amount) % 26; chr = (chr - 97 + amount) % 26;
output[i] = chr + 97; output[i] = chr + 97;
} else if (rotNumbers && chr >= 48 && chr <= 57) { // Numbers } else if (rotNumbers && chr >= 48 && chr <= 57) { // Numbers
chr = (chr - 48 + amount) % 10; chr = (chr - 48 + amountNumbers) % 10;
output[i] = chr + 48; output[i] = chr + 48;
} }
} }

View file

@ -135,10 +135,21 @@ TestRegister.addTests([
}, },
], ],
}, },
{
name: "ROT13: no shift amount",
input: "The Quick Brown Fox Jumped Over The Lazy Dog. 0123456789",
expectedOutput: "The Quick Brown Fox Jumped Over The Lazy Dog. 0123456789",
recipeConfig: [
{
op: "ROT13",
args: [true, true, true, 0]
},
],
},
{ {
name: "ROT13: normal", name: "ROT13: normal",
input: "The Quick Brown Fox Jumped Over The Lazy Dog.", input: "The Quick Brown Fox Jumped Over The Lazy Dog. 0123456789",
expectedOutput: "Gur Dhvpx Oebja Sbk Whzcrq Bire Gur Ynml Qbt.", expectedOutput: "Gur Dhvpx Oebja Sbk Whzcrq Bire Gur Ynml Qbt. 3456789012",
recipeConfig: [ recipeConfig: [
{ {
op: "ROT13", op: "ROT13",
@ -146,10 +157,21 @@ TestRegister.addTests([
}, },
], ],
}, },
{
name: "ROT13: negative shift amount",
input: "The Quick Brown Fox Jumped Over The Lazy Dog. 0123456789",
expectedOutput: "Gur Dhvpx Oebja Sbk Whzcrq Bire Gur Ynml Qbt. 7890123456",
recipeConfig: [
{
op: "ROT13",
args: [true, true, true, -13]
},
],
},
{ {
name: "ROT13: full loop", name: "ROT13: full loop",
input: "The Quick Brown Fox Jumped Over The Lazy Dog.", input: "The Quick Brown Fox Jumped Over The Lazy Dog. 0123456789",
expectedOutput: "The Quick Brown Fox Jumped Over The Lazy Dog.", expectedOutput: "The Quick Brown Fox Jumped Over The Lazy Dog. 6789012345",
recipeConfig: [ recipeConfig: [
{ {
op: "ROT13", op: "ROT13",
@ -157,10 +179,21 @@ TestRegister.addTests([
}, },
], ],
}, },
{
name: "ROT13: full loop (negative shift amount)",
input: "The Quick Brown Fox Jumped Over The Lazy Dog. 0123456789",
expectedOutput: "The Quick Brown Fox Jumped Over The Lazy Dog. 4567890123",
recipeConfig: [
{
op: "ROT13",
args: [true, true, true, -26]
},
],
},
{ {
name: "ROT13: lowercase only", name: "ROT13: lowercase only",
input: "The Quick Brown Fox Jumped Over The Lazy Dog.", input: "The Quick Brown Fox Jumped Over The Lazy Dog. 0123456789",
expectedOutput: "Tur Qhvpx Bebja Fbk Jhzcrq Oire Tur Lnml Dbt.", expectedOutput: "Tur Qhvpx Bebja Fbk Jhzcrq Oire Tur Lnml Dbt. 0123456789",
recipeConfig: [ recipeConfig: [
{ {
op: "ROT13", op: "ROT13",
@ -170,8 +203,8 @@ TestRegister.addTests([
}, },
{ {
name: "ROT13: uppercase only", name: "ROT13: uppercase only",
input: "The Quick Brown Fox Jumped Over The Lazy Dog.", input: "The Quick Brown Fox Jumped Over The Lazy Dog. 0123456789",
expectedOutput: "Ghe Duick Orown Sox Wumped Bver Ghe Yazy Qog.", expectedOutput: "Ghe Duick Orown Sox Wumped Bver Ghe Yazy Qog. 0123456789",
recipeConfig: [ recipeConfig: [
{ {
op: "ROT13", op: "ROT13",
@ -179,6 +212,50 @@ TestRegister.addTests([
}, },
], ],
}, },
{
name: "ROT13: numbers only",
input: "The Quick Brown Fox Jumped Over The Lazy Dog. 0123456789",
expectedOutput: "The Quick Brown Fox Jumped Over The Lazy Dog. 5678901234",
recipeConfig: [
{
op: "ROT13",
args: [false, false, true, 5]
},
],
},
{
name: "ROT13: numbers only (negative shift amount)",
input: "The Quick Brown Fox Jumped Over The Lazy Dog. 0123456789",
expectedOutput: "The Quick Brown Fox Jumped Over The Lazy Dog. 5678901234",
recipeConfig: [
{
op: "ROT13",
args: [false, false, true, 5]
},
],
},
{
name: "ROT13: numbers only loop",
input: "The Quick Brown Fox Jumped Over The Lazy Dog. 0123456789",
expectedOutput: "The Quick Brown Fox Jumped Over The Lazy Dog. 0123456789",
recipeConfig: [
{
op: "ROT13",
args: [false, false, true, 10]
},
],
},
{
name: "ROT13: numbers only loop (negative shift amount)",
input: "The Quick Brown Fox Jumped Over The Lazy Dog. 0123456789",
expectedOutput: "The Quick Brown Fox Jumped Over The Lazy Dog. 0123456789",
recipeConfig: [
{
op: "ROT13",
args: [false, false, true, -10]
},
],
},
{ {
name: "ROT47: nothing", name: "ROT47: nothing",
input: "", input: "",