1
0
mirror of synced 2024-12-01 01:37:18 +01:00

Add Argon2 hash operation

This commit is contained in:
Tan Zhen Yong 2019-10-07 02:24:09 +08:00
parent 2efd075803
commit 2fab1028c5
No known key found for this signature in database
GPG Key ID: 710D1754497C25B1
6 changed files with 126 additions and 5 deletions

11
package-lock.json generated
View File

@ -16587,6 +16587,11 @@
"integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==", "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==",
"dev": true "dev": true
}, },
"argon2-browser": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/argon2-browser/-/argon2-browser-1.11.1.tgz",
"integrity": "sha512-C+WsBLSkwQExkDYB7vriugrBTXq2z+fTRDlGWqr2zm89TaKo7zYtSGARMgoBxpDnmNNzduNlZJmpY2j0Dp7ZOQ=="
},
"argparse": { "argparse": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
@ -16976,6 +16981,12 @@
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
}, },
"base64-loader": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/base64-loader/-/base64-loader-1.0.0.tgz",
"integrity": "sha1-5TC62I6QbdKh+tCvLZ5oP6i9kqg=",
"dev": true
},
"basic-auth": { "basic-auth": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",

View File

@ -89,6 +89,7 @@
"@astronautlabs/amf": "^0.0.6", "@astronautlabs/amf": "^0.0.6",
"@babel/polyfill": "^7.12.1", "@babel/polyfill": "^7.12.1",
"@blu3r4y/lzma": "^2.3.3", "@blu3r4y/lzma": "^2.3.3",
"argon2-browser": "^1.11.1",
"arrive": "^2.4.1", "arrive": "^2.4.1",
"avsc": "^5.7.4", "avsc": "^5.7.4",
"bcryptjs": "^2.4.3", "bcryptjs": "^2.4.3",

View File

@ -379,6 +379,7 @@
"Bcrypt compare", "Bcrypt compare",
"Bcrypt parse", "Bcrypt parse",
"Scrypt", "Scrypt",
"Argon2",
"NT Hash", "NT Hash",
"LM Hash", "LM Hash",
"Fletcher-8 Checksum", "Fletcher-8 Checksum",

View File

@ -0,0 +1,101 @@
/**
* @author Tan Zhen Yong [tzy@beyondthesprawl.com]
* @copyright Crown Copyright 2019
* @license Apache-2.0
*/
import Operation from "../Operation.mjs";
import OperationError from "../errors/OperationError.mjs";
import argon2 from "argon2-browser";
/**
* Argon2 operation
*/
class Argon2 extends Operation {
/**
* Argon2 constructor
*/
constructor() {
super();
this.name = "Argon2";
this.module = "Crypto";
this.description = "Argon2 is a key derivation function that was selected as the winner of the Password Hashing Competition in July 2015. It was designed by Alex Biryukov, Daniel Dinu, and Dmitry Khovratovich from the University of Luxembourg.<br><br>Enter the password in the input to generate its hash.";
this.infoURL = "https://wikipedia.org/wiki/Argon2";
this.inputType = "string";
this.outputType = "string";
this.args = [
{
"name": "Salt",
"type": "string",
"value": "somesalt"
},
{
"name": "Iterations",
"type": "number",
"value": 3
},
{
"name": "Memory (KiB)",
"type": "number",
"value": 4096
},
{
"name": "Parallelism",
"type": "number",
"value": 1
},
{
"name": "Hash length (bytes)",
"type": "number",
"value": 32
},
{
"name": "Type",
"type": "option",
"value": ["Argon2i", "Argon2d", "Argon2id"],
"defaultIndex": 0
}
];
}
/**
* @param {string} input
* @param {Object[]} args
* @returns {string}
*/
async run(input, args) {
const argon2Types = {
"Argon2i": argon2.ArgonType.Argon2i,
"Argon2d": argon2.ArgonType.Argon2d,
"Argon2id": argon2.ArgonType.Argon2id
};
const salt = args[0],
time = args[1],
mem = args[2],
parallelism = args[3],
hashLen = args[4],
type = argon2Types[args[5]];
try {
const result = await argon2.hash({
pass: input,
salt,
time,
mem,
parallelism,
hashLen,
type,
});
return result.encoded;
} catch (err) {
throw new OperationError(`Error: ${err.message}`);
}
}
}
export default Argon2;

View File

@ -133,6 +133,11 @@ Tiger-128`;
}), }),
it("argon2", async () => {
const result = await chef.argon2("argon2password");
assert.strictEqual(result.toString(), "$argon2i$v=19$m=4096,t=3,p=1$c29tZXNhbHQ$s43my9eBljQADuF/LWCG8vGqwAJzOorKQ0Yog8jFvbw");
}),
it("Bcrypt", async () => { it("Bcrypt", async () => {
const result = await chef.bcrypt("Put a Sock In It"); const result = await chef.bcrypt("Put a Sock In It");
const strResult = result.toString(); const strResult = result.toString();

View File

@ -114,6 +114,8 @@ module.exports = {
} }
}, },
module: { module: {
// argon2-browser loads argon2.wasm by itself, so Webpack should not load it
noParse: /node_modules\/argon2-browser\/dist\/argon2\.wasm$/,
rules: [ rules: [
{ {
test: /\.m?js$/, test: /\.m?js$/,
@ -127,11 +129,11 @@ module.exports = {
loader: "babel-loader" loader: "babel-loader"
}, },
{ {
test: /node-forge/, test: /node_modules\/argon2-browser\/dist\/argon2\.wasm$/,
loader: "imports-loader", // Load argon2.wasm as base64-encoded binary file
options: { // expected by argon2-browser
additionalCode: "var jQuery = false;" loaders: "base64-loader",
} type: "javascript/auto"
}, },
{ {
test: /prime.worker.min.js$/, test: /prime.worker.min.js$/,