From bca4c34b3abe2e6cfea72d8589f2501e775e8aab Mon Sep 17 00:00:00 2001 From: Tan Zhen Yong Date: Mon, 7 Oct 2019 17:44:00 +0800 Subject: [PATCH] Add Argon2 hash compare operation --- src/core/config/Categories.json | 1 + src/core/operations/Argon2Compare.mjs | 58 +++++++++++++++++++++++++++ tests/node/tests/operations.mjs | 7 ++++ 3 files changed, 66 insertions(+) create mode 100644 src/core/operations/Argon2Compare.mjs diff --git a/src/core/config/Categories.json b/src/core/config/Categories.json index da9e0d0d..fec21d50 100644 --- a/src/core/config/Categories.json +++ b/src/core/config/Categories.json @@ -380,6 +380,7 @@ "Bcrypt parse", "Scrypt", "Argon2", + "Argon2 compare", "NT Hash", "LM Hash", "Fletcher-8 Checksum", diff --git a/src/core/operations/Argon2Compare.mjs b/src/core/operations/Argon2Compare.mjs new file mode 100644 index 00000000..01ad9234 --- /dev/null +++ b/src/core/operations/Argon2Compare.mjs @@ -0,0 +1,58 @@ +/** + * @author Tan Zhen Yong [tzy@beyondthesprawl.com] + * @copyright Crown Copyright 2019 + * @license Apache-2.0 + */ + +import Operation from "../Operation.mjs"; +import argon2 from "argon2-browser"; + +/** + * Argon2 compare operation + */ +class Argon2Compare extends Operation { + + /** + * Argon2Compare constructor + */ + constructor() { + super(); + + this.name = "Argon2 compare"; + this.module = "Crypto"; + this.description = "Tests whether the input matches the given Argon2 hash. To test multiple possible passwords, use the 'Fork' operation."; + this.infoURL = "https://wikipedia.org/wiki/Argon2"; + this.inputType = "string"; + this.outputType = "string"; + this.args = [ + { + "name": "Hash", + "type": "string", + "value": "" + } + ]; + } + + /** + * @param {string} input + * @param {Object[]} args + * @returns {string} + */ + async run(input, args) { + const encoded = args[0]; + + try { + await argon2.verify({ + pass: input, + encoded + }); + + return `Match: ${input}`; + } catch (err) { + return "No match"; + } + } + +} + +export default Argon2Compare; diff --git a/tests/node/tests/operations.mjs b/tests/node/tests/operations.mjs index 45b38c7e..eaf92804 100644 --- a/tests/node/tests/operations.mjs +++ b/tests/node/tests/operations.mjs @@ -138,6 +138,13 @@ Tiger-128`; assert.strictEqual(result.toString(), "$argon2i$v=19$m=4096,t=3,p=1$c29tZXNhbHQ$s43my9eBljQADuF/LWCG8vGqwAJzOorKQ0Yog8jFvbw"); }), + it("argon2 compare", async () => { + const result = await chef.argon2Compare("argon2password", { + hash: "$argon2i$v=19$m=4096,t=3,p=1$c29tZXNhbHQ$s43my9eBljQADuF/LWCG8vGqwAJzOorKQ0Yog8jFvbw" + }); + assert.strictEqual(result.toString(), "Match: argon2password"); + }), + it("Bcrypt", async () => { const result = await chef.bcrypt("Put a Sock In It"); const strResult = result.toString();