-
Notifications
You must be signed in to change notification settings - Fork 3.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'master' into cryptochef
- Loading branch information
Showing
17 changed files
with
1,055 additions
and
38 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,6 @@ | ||
{ | ||
"name": "cyberchef", | ||
"version": "10.4.0", | ||
"version": "10.5.2", | ||
"description": "The Cyber Swiss Army Knife for encryption, encoding, compression and data analysis.", | ||
"author": "n1474335 <[email protected]>", | ||
"homepage": "https://gchq.github.io/CyberChef", | ||
|
@@ -95,6 +95,7 @@ | |
"@astronautlabs/amf": "^0.0.6", | ||
"@babel/polyfill": "^7.12.1", | ||
"@blu3r4y/lzma": "^2.3.3", | ||
"@wavesenterprise/crypto-gost-js": "^2.1.0-RC1", | ||
"argon2-browser": "^1.18.0", | ||
"arrive": "^2.4.1", | ||
"avsc": "^5.7.7", | ||
|
@@ -182,7 +183,7 @@ | |
"build": "npx grunt prod", | ||
"node": "npx grunt node", | ||
"repl": "node --experimental-modules --experimental-json-modules --experimental-specifier-resolution=node --no-experimental-fetch --no-warnings src/node/repl.mjs", | ||
"test": "npx grunt configTests && node --experimental-modules --experimental-json-modules --no-warnings --no-deprecation --openssl-legacy-provider --no-experimental-fetch tests/node/index.mjs && node --experimental-modules --experimental-json-modules --no-warnings --no-deprecation --openssl-legacy-provider --no-experimental-fetch tests/operations/index.mjs", | ||
"test": "npx grunt configTests && node --experimental-modules --experimental-json-modules --no-warnings --no-deprecation --openssl-legacy-provider --no-experimental-fetch tests/node/index.mjs && node --experimental-modules --experimental-json-modules --no-warnings --no-deprecation --openssl-legacy-provider --no-experimental-fetch --trace-uncaught tests/operations/index.mjs", | ||
"testnodeconsumer": "npx grunt testnodeconsumer", | ||
"testui": "npx grunt testui", | ||
"testuidev": "npx nightwatch --env=dev", | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,138 @@ | ||
/** | ||
* @author n1474335 [[email protected]] | ||
* @copyright Crown Copyright 2023 | ||
* @license Apache-2.0 | ||
*/ | ||
|
||
import Operation from "../Operation.mjs"; | ||
import OperationError from "../errors/OperationError.mjs"; | ||
import Utils from "../Utils.mjs"; | ||
import { toHexFast, fromHex } from "../lib/Hex.mjs"; | ||
import { CryptoGost, GostEngine } from "@wavesenterprise/crypto-gost-js/index.js"; | ||
|
||
/** | ||
* GOST Decrypt operation | ||
*/ | ||
class GOSTDecrypt extends Operation { | ||
|
||
/** | ||
* GOSTDecrypt constructor | ||
*/ | ||
constructor() { | ||
super(); | ||
|
||
this.name = "GOST Decrypt"; | ||
this.module = "Ciphers"; | ||
this.description = "The GOST block cipher (Magma), defined in the standard GOST 28147-89 (RFC 5830), is a Soviet and Russian government standard symmetric key block cipher with a block size of 64 bits. The original standard, published in 1989, did not give the cipher any name, but the most recent revision of the standard, GOST R 34.12-2015 (RFC 7801, RFC 8891), specifies that it may be referred to as Magma. The GOST hash function is based on this cipher. The new standard also specifies a new 128-bit block cipher called Kuznyechik.<br><br>Developed in the 1970s, the standard had been marked 'Top Secret' and then downgraded to 'Secret' in 1990. Shortly after the dissolution of the USSR, it was declassified and it was released to the public in 1994. GOST 28147 was a Soviet alternative to the United States standard algorithm, DES. Thus, the two are very similar in structure."; | ||
this.infoURL = "https://wikipedia.org/wiki/GOST_(block_cipher)"; | ||
this.inputType = "string"; | ||
this.outputType = "string"; | ||
this.args = [ | ||
{ | ||
name: "Key", | ||
type: "toggleString", | ||
value: "", | ||
toggleValues: ["Hex", "UTF8", "Latin1", "Base64"] | ||
}, | ||
{ | ||
name: "IV", | ||
type: "toggleString", | ||
value: "", | ||
toggleValues: ["Hex", "UTF8", "Latin1", "Base64"] | ||
}, | ||
{ | ||
name: "Input type", | ||
type: "option", | ||
value: ["Hex", "Raw"] | ||
}, | ||
{ | ||
name: "Output type", | ||
type: "option", | ||
value: ["Raw", "Hex"] | ||
}, | ||
{ | ||
name: "Algorithm", | ||
type: "argSelector", | ||
value: [ | ||
{ | ||
name: "GOST 28147 (Magma, 1989)", | ||
off: [5], | ||
on: [6] | ||
}, | ||
{ | ||
name: "GOST R 34.12 (Kuznyechik, 2015)", | ||
on: [5], | ||
off: [6] | ||
} | ||
] | ||
}, | ||
{ | ||
name: "Block length", | ||
type: "option", | ||
value: ["64", "128"] | ||
}, | ||
{ | ||
name: "sBox", | ||
type: "option", | ||
value: ["E-TEST", "E-A", "E-B", "E-C", "E-D", "E-SC", "E-Z", "D-TEST", "D-A", "D-SC"] | ||
}, | ||
{ | ||
name: "Block mode", | ||
type: "option", | ||
value: ["ECB", "CFB", "OFB", "CTR", "CBC"] | ||
}, | ||
{ | ||
name: "Key meshing mode", | ||
type: "option", | ||
value: ["NO", "CP"] | ||
}, | ||
{ | ||
name: "Padding", | ||
type: "option", | ||
value: ["NO", "PKCS5", "ZERO", "RANDOM", "BIT"] | ||
} | ||
]; | ||
} | ||
|
||
/** | ||
* @param {string} input | ||
* @param {Object[]} args | ||
* @returns {string} | ||
*/ | ||
async run(input, args) { | ||
const [keyObj, ivObj, inputType, outputType, version, length, sBox, blockMode, keyMeshing, padding] = args; | ||
|
||
const key = toHexFast(Utils.convertToByteArray(keyObj.string, keyObj.option)); | ||
const iv = toHexFast(Utils.convertToByteArray(ivObj.string, ivObj.option)); | ||
input = inputType === "Hex" ? input : toHexFast(Utils.strToArrayBuffer(input)); | ||
|
||
const versionNum = version === "GOST 28147 (Magma, 1989)" ? 1989 : 2015; | ||
const blockLength = versionNum === 1989 ? 64 : parseInt(length, 10); | ||
const sBoxVal = versionNum === 1989 ? sBox : null; | ||
|
||
const algorithm = { | ||
version: versionNum, | ||
length: blockLength, | ||
mode: "ES", | ||
sBox: sBoxVal, | ||
block: blockMode, | ||
keyMeshing: keyMeshing, | ||
padding: padding | ||
}; | ||
|
||
try { | ||
const Hex = CryptoGost.coding.Hex; | ||
if (iv) algorithm.iv = Hex.decode(iv); | ||
|
||
const cipher = GostEngine.getGostCipher(algorithm); | ||
const out = Hex.encode(cipher.decrypt(Hex.decode(key), Hex.decode(input))); | ||
|
||
return outputType === "Hex" ? out : Utils.byteArrayToChars(fromHex(out)); | ||
} catch (err) { | ||
throw new OperationError(err); | ||
} | ||
} | ||
|
||
} | ||
|
||
export default GOSTDecrypt; |
Oops, something went wrong.