Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
n1474335 committed Jul 8, 2022
2 parents 683bd3e + 578a61d commit 6b16f11
Show file tree
Hide file tree
Showing 6 changed files with 166 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/core/config/Categories.json
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,8 @@
"Blowfish Decrypt",
"DES Encrypt",
"DES Decrypt",
"Cetacean Cipher Encode",
"Cetacean Cipher Decode",
"Triple DES Encrypt",
"Triple DES Decrypt",
"LS47 Encrypt",
Expand Down
64 changes: 64 additions & 0 deletions src/core/operations/CetaceanCipherDecode.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/**
* @author dolphinOnKeys [robin@weird.io]
* @copyright Crown Copyright 2022
* @license Apache-2.0
*/

import Operation from "../Operation.mjs";

/**
* Cetacean Cipher Decode operation
*/
class CetaceanCipherDecode extends Operation {

/**
* CetaceanCipherDecode constructor
*/
constructor() {
super();

this.name = "Cetacean Cipher Decode";
this.module = "Ciphers";
this.description = "Decode Cetacean Cipher input. <br/><br/>e.g. <code>EEEEEEEEEeeEeEEEEEEEEEEEEeeEeEEe</code> becomes <code>hi</code>";
this.infoURL = "";
this.inputType = "string";
this.outputType = "string";

this.checks = [
{
pattern: "^(?:[eE]{16,})(?: [eE]{16,})*$",
flags: "",
args: []
}
]
}

/**
* @param {string} input
* @param {Object[]} args
* @returns {string}
*/
run(input, args) {
const binaryArray = [];
for ( const char of input ) {
if ( char === ' ' ) {
binaryArray.push(...[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 ]);
} else {
binaryArray.push( char === 'e' ? 1 : 0 );
}
}

const byteArray = [];

for ( let i = 0; i < binaryArray.length; i += 16 ) {
byteArray.push(binaryArray.slice(i, i + 16).join(''))
}

return byteArray.map( byte =>
String.fromCharCode(parseInt( byte , 2 )
)
).join('');
}
}

export default CetaceanCipherDecode;
54 changes: 54 additions & 0 deletions src/core/operations/CetaceanCipherEncode.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/**
* @author dolphinOnKeys [robin@weird.io]
* @copyright Crown Copyright 2022
* @license Apache-2.0
*/

import Operation from "../Operation.mjs";

/**
* Cetacean Cipher Encode operation
*/
class CetaceanCipherEncode extends Operation {

/**
* CetaceanCipherEncode constructor
*/
constructor() {
super();

this.name = "Cetacean Cipher Encode";
this.module = "Ciphers";
this.description = "Converts any input into Cetacean Cipher. <br/><br/>e.g. <code>hi</code> becomes <code>EEEEEEEEEeeEeEEEEEEEEEEEEeeEeEEe</code>\"";
this.infoURL = "";
this.inputType = "string";
this.outputType = "string";
}

/**
* @param {string} input
* @param {Object[]} args
* @returns {string}
*/
run(input, args) {
let result = [];
let charArray = input.split('');

charArray.map( ( character ) => {
if ( character === ' ' ) {
result.push( character );
} else {
const binaryArray = this.encodeToBinary( character ).split('');
result.push( binaryArray.map(( str ) => str === '1' ? 'e' : 'E' ).join(''));
}
});

return result.join('');
}

encodeToBinary( char, padding = 16 ) {
return char.charCodeAt(0).toString(2).padStart( padding, '0');
}
}

export default CetaceanCipherEncode;
2 changes: 2 additions & 0 deletions tests/operations/index.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ import "./tests/Base85.mjs";
import "./tests/BitwiseOp.mjs";
import "./tests/ByteRepr.mjs";
import "./tests/CartesianProduct.mjs";
import "./tests/CetaceanCipherEncode.mjs";
import "./tests/CetaceanCipherDecode.mjs";
import "./tests/CharEnc.mjs";
import "./tests/ChangeIPFormat.mjs";
import "./tests/Charts.mjs";
Expand Down
22 changes: 22 additions & 0 deletions tests/operations/tests/CetaceanCipherDecode.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/**
* CetaceanCipher Encode tests
*
* @author dolphinOnKeys
* @copyright Crown Copyright 2022
* @licence Apache-2.0
*/
import TestRegister from "../../lib/TestRegister.mjs";

TestRegister.addTests([
{
name: "Cetacean Cipher Decode",
input: "EEEEEEEEEeeEEEEe EEEEEEEEEeeEEEeE EEEEEEEEEeeEEEee EEeeEEEEEeeEEeee",
expectedOutput: "a b c で",
recipeConfig: [
{
op: "Cetacean Cipher Decode",
args: []
},
],
}
]);
22 changes: 22 additions & 0 deletions tests/operations/tests/CetaceanCipherEncode.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/**
* CetaceanCipher Encode tests
*
* @author dolphinOnKeys
* @copyright Crown Copyright 2022
* @licence Apache-2.0
*/
import TestRegister from "../../lib/TestRegister.mjs";

TestRegister.addTests([
{
name: "Cetacean Cipher Encode",
input: "a b c で",
expectedOutput: "EEEEEEEEEeeEEEEe EEEEEEEEEeeEEEeE EEEEEEEEEeeEEEee EEeeEEEEEeeEEeee",
recipeConfig: [
{
op: "Cetacean Cipher Encode",
args: []
},
],
}
]);

0 comments on commit 6b16f11

Please sign in to comment.