From 75b52bef6de5b8f78b27291ae5ef1b21d441aa18 Mon Sep 17 00:00:00 2001 From: victorlpgazolli Date: Tue, 21 Mar 2023 18:37:45 -0300 Subject: [PATCH 01/13] add uuid dependency --- package-lock.json | 40 +++++++++++++++++++++++++++------------- package.json | 1 + 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index e731efff..adc9c018 100644 --- a/package-lock.json +++ b/package-lock.json @@ -50,7 +50,6 @@ "jimp": "^0.22.12", "jq-web": "^0.5.1", "jquery": "3.7.1", - "js-crc": "^0.2.0", "js-sha3": "^0.9.3", "jsesc": "^3.0.2", "json5": "^2.2.3", @@ -94,6 +93,7 @@ "ua-parser-js": "^1.0.38", "unorm": "^1.6.0", "utf8": "^3.0.0", + "uuid": "^11.1.0", "vkbeautify": "^0.99.3", "xpath": "0.0.34", "xregexp": "^5.1.1", @@ -12303,12 +12303,6 @@ "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", "license": "MIT" }, - "node_modules/js-crc": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/js-crc/-/js-crc-0.2.0.tgz", - "integrity": "sha512-8DdCSAOACpF8WDAjyDFBC2rj8OS4HUP9mNZBDfl8jCiPCnJG+2bkuycalxwZh6heFy6PrMvoWTp47lp6gzT65A==", - "license": "MIT" - }, "node_modules/js-sha3": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.9.3.tgz", @@ -13866,6 +13860,15 @@ "node": ">=8" } }, + "node_modules/nightwatch/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/nightwatch/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -16809,6 +16812,15 @@ "node": ">=0.8.0" } }, + "node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/socks": { "version": "2.8.3", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", @@ -18096,13 +18108,15 @@ } }, "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "license": "MIT", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { - "uuid": "dist/bin/uuid" + "uuid": "dist/esm/bin/uuid" } }, "node_modules/v8flags": { diff --git a/package.json b/package.json index 337e8679..43655124 100644 --- a/package.json +++ b/package.json @@ -179,6 +179,7 @@ "ua-parser-js": "^1.0.38", "unorm": "^1.6.0", "utf8": "^3.0.0", + "uuid": "^11.1.0", "vkbeautify": "^0.99.3", "xpath": "0.0.34", "xregexp": "^5.1.1", From 197d6735d2570fe60d31b19947a094911083be46 Mon Sep 17 00:00:00 2001 From: victorlpgazolli Date: Tue, 21 Mar 2023 18:38:21 -0300 Subject: [PATCH 02/13] ref generate uuid versions v1, v3, v4 and v5 --- src/core/operations/GenerateUUID.mjs | 44 +++++++++++++++++++--------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/src/core/operations/GenerateUUID.mjs b/src/core/operations/GenerateUUID.mjs index 1ee0faba..cb2373d9 100644 --- a/src/core/operations/GenerateUUID.mjs +++ b/src/core/operations/GenerateUUID.mjs @@ -5,8 +5,8 @@ */ import Operation from "../Operation.mjs"; -import crypto from "crypto"; - +import * as uuid from "uuid"; +import OperationError from "../errors/OperationError.mjs"; /** * Generate UUID operation */ @@ -20,11 +20,24 @@ class GenerateUUID extends Operation { this.name = "Generate UUID"; this.module = "Crypto"; - this.description = "Generates an RFC 4122 version 4 compliant Universally Unique Identifier (UUID), also known as a Globally Unique Identifier (GUID).

A version 4 UUID relies on random numbers, in this case generated using window.crypto if available and falling back to Math.random if not."; + this.description = "Generates an RFC 4122 compliant Universally Unique Identifier (UUID), also known as a Globally Unique Identifier (GUID).

A version 4 UUID relies on random numbers, in this case generated using uuid package"; this.infoURL = "https://wikipedia.org/wiki/Universally_unique_identifier"; this.inputType = "string"; this.outputType = "string"; - this.args = []; + this.args = [ + { + name: "UUID Version", + type: "option", + value: [ + "v1", "v3", "v4", "v5" + ] + }, + { + name: "UUID namespace (valid for v3 and v5)", + type: "string", + value: "1b671a64-40d5-491e-99b0-da01ff1f3341" + } + ]; } /** @@ -33,16 +46,19 @@ class GenerateUUID extends Operation { * @returns {string} */ run(input, args) { - const buf = new Uint32Array(4).map(() => { - return crypto.randomBytes(4).readUInt32BE(0, true); - }); - let i = 0; - return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) { - const r = (buf[i >> 3] >> ((i % 8) * 4)) & 0xf, - v = c === "x" ? r : (r & 0x3 | 0x8); - i++; - return v.toString(16); - }); + const [version, namespace] = args; + const hasDesiredVersion = typeof uuid[version] === "function"; + if (!hasDesiredVersion) throw new OperationError("Invalid UUID version"); + + const versionThatRequiresNamespace = ["v3", "v5"]; + + const requiresNamespace = versionThatRequiresNamespace.includes(version); + if (!requiresNamespace) return uuid[version](); + + const hasValidNamespace = typeof namespace === "string" && uuid.validate(namespace); + if (!hasValidNamespace) throw new OperationError("Invalid UUID namespace"); + + return uuid[version](input, namespace); } } From ae5648ede1235ef78a0d451d4fb40f8f1500eff6 Mon Sep 17 00:00:00 2001 From: victorlpgazolli Date: Tue, 21 Mar 2023 18:38:39 -0300 Subject: [PATCH 03/13] add analyse uuid version --- src/core/operations/AnalyseUUID.mjs | 47 +++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/core/operations/AnalyseUUID.mjs diff --git a/src/core/operations/AnalyseUUID.mjs b/src/core/operations/AnalyseUUID.mjs new file mode 100644 index 00000000..cde3c3cb --- /dev/null +++ b/src/core/operations/AnalyseUUID.mjs @@ -0,0 +1,47 @@ +/** + * @author n1474335 [n1474335@gmail.com] + * @copyright Crown Copyright 2023 + * @license Apache-2.0 + */ + +import Operation from "../Operation.mjs"; +import * as uuid from "uuid"; +import OperationError from "../errors/OperationError.mjs"; + +/** + * Analyse hash operation + */ +class AnalyseHash extends Operation { + + /** + * AnalyseHash constructor + */ + constructor() { + super(); + + this.name = "Analyse UUID"; + this.module = "Crypto"; + this.description = "Tries to determine information about a given UUID and suggests which version may have been used to generate it"; + this.infoURL = "https://wikipedia.org/wiki/Universally_unique_identifier"; + this.inputType = "string"; + this.outputType = "string"; + this.args = []; + } + + /** + * @param {string} input + * @param {Object[]} args + * @returns {string} + */ + run(input, args) { + try { + const uuidVersion = uuid.version(input); + return "UUID version: " + uuidVersion; + } catch (error) { + throw new OperationError("Invalid UUID"); + } + } + +} + +export default AnalyseHash; From c0af2a9eb5ec814d006c802a373c61ad95b96f73 Mon Sep 17 00:00:00 2001 From: victorlpgazolli Date: Tue, 21 Mar 2023 19:11:18 -0300 Subject: [PATCH 04/13] add analyse uuid category --- src/core/config/Categories.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/config/Categories.json b/src/core/config/Categories.json index bae41f9e..6c5e7fc0 100644 --- a/src/core/config/Categories.json +++ b/src/core/config/Categories.json @@ -544,6 +544,7 @@ "Pseudo-Random Number Generator", "Generate De Bruijn Sequence", "Generate UUID", + "Analyse UUID", "Generate TOTP", "Generate HOTP", "Generate QR Code", From e146636250a9740df8c6ac0d82cb30bdf3614f48 Mon Sep 17 00:00:00 2001 From: victorlpgazolli Date: Tue, 21 Mar 2023 19:11:30 -0300 Subject: [PATCH 05/13] add more uuid tests --- tests/node/tests/operations.mjs | 68 ++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 2 deletions(-) diff --git a/tests/node/tests/operations.mjs b/tests/node/tests/operations.mjs index 4c5d4ada..dd44f8db 100644 --- a/tests/node/tests/operations.mjs +++ b/tests/node/tests/operations.mjs @@ -580,12 +580,76 @@ Password: 282760`; assert.strictEqual(result.toString().substr(0, 37), "-----BEGIN PGP PRIVATE KEY BLOCK-----"); }), - it("Generate UUID", () => { - const result = chef.generateUUID(); + it("Generate UUID v1", () => { + const result = chef.generateUUID("", "v1"); assert.ok(result.toString()); assert.strictEqual(result.toString().length, 36); }), + it("Generate UUID v3", () => { + const namespace = chef.generateUUID("", "v1"); + const result = chef.generateUUID("v3", "random string", namespace); + assert.ok(result.toString()); + assert.strictEqual(result.toString().length, 36); + }), + + it("Generate UUID v4", () => { + const result = chef.generateUUID("", "v4"); + assert.ok(result.toString()); + assert.strictEqual(result.toString().length, 36); + }), + + it("Generate UUID v5", () => { + const namespace = chef.generateUUID("", "v1"); + const result = chef.generateUUID("v5", "random string", namespace); + assert.ok(result.toString()); + assert.strictEqual(result.toString().length, 36); + }), + + it("Validate UUID v3 namespace", () => { + const namespace = chef.generateUUID("", "v1"); + const firstResult = chef.generateUUID("v3", "random string", namespace); + const secondResult = chef.generateUUID("v3", "random string", namespace); + assert.strictEqual(firstResult.toString(), secondResult.toString()); + }), + + it("Validate UUID v5 namespace", () => { + const namespace = chef.generateUUID("", "v1"); + const firstResult = chef.generateUUID("v5", "random string", namespace); + const secondResult = chef.generateUUID("v5", "random string", namespace); + assert.strictEqual(firstResult.toString(), secondResult.toString()); + }), + + it("Analyse UUID v1", () => { + const uuidv1 = chef.generateUUID("", "v1"); + const uuidAnalysis = chef.analyseUUID(uuidv1); + + assert.strictEqual(uuidAnalysis, "UUID version: 1"); + }), + + it("Analyse UUID v3", () => { + const namespace = chef.generateUUID("", "v1"); + const uuidv3 = chef.generateUUID("v3", "random string", namespace); + const uuidAnalysis = chef.analyseUUID(uuidv3); + + assert.strictEqual(uuidAnalysis, "UUID version: 3"); + }), + + it("Analyse UUID v4", () => { + const uuidv4 = chef.generateUUID("", "v4"); + const uuidAnalysis = chef.analyseUUID(uuidv4); + + assert.strictEqual(uuidAnalysis, "UUID version: 4"); + }), + + it("Analyse UUID v5", () => { + const namespace = chef.generateUUID("", "v1"); + const uuidv5 = chef.generateUUID("v5", "random string", namespace); + const uuidAnalysis = chef.analyseUUID(uuidv5); + + assert.strictEqual(uuidAnalysis, "UUID version: 3"); + }), + it("Gzip, Gunzip", () => { assert.strictEqual(chef.gunzip(chef.gzip("Down To The Wire")).toString(), "Down To The Wire"); }), From 9069d8e3ec088dff2b9326599beb2521d8b40023 Mon Sep 17 00:00:00 2001 From: victorlpgazolli Date: Tue, 21 Mar 2023 19:18:28 -0300 Subject: [PATCH 06/13] ref uuid tests --- tests/node/tests/operations.mjs | 66 ++++++++++++++++----------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/tests/node/tests/operations.mjs b/tests/node/tests/operations.mjs index dd44f8db..1685276c 100644 --- a/tests/node/tests/operations.mjs +++ b/tests/node/tests/operations.mjs @@ -581,73 +581,73 @@ Password: 282760`; }), it("Generate UUID v1", () => { - const result = chef.generateUUID("", "v1"); - assert.ok(result.toString()); - assert.strictEqual(result.toString().length, 36); + const result = chef.generateUUID("", "v1").toString(); + assert.ok(result); + assert.strictEqual(result.length, 36); }), it("Generate UUID v3", () => { - const namespace = chef.generateUUID("", "v1"); - const result = chef.generateUUID("v3", "random string", namespace); - assert.ok(result.toString()); - assert.strictEqual(result.toString().length, 36); + const namespace = chef.generateUUID("", "v1").toString(); + const result = chef.generateUUID("v3", "user input", namespace).toString(); + assert.ok(result); + assert.strictEqual(result.length, 36); }), it("Generate UUID v4", () => { - const result = chef.generateUUID("", "v4"); - assert.ok(result.toString()); - assert.strictEqual(result.toString().length, 36); + const result = chef.generateUUID("", "v4").toString(); + assert.ok(result); + assert.strictEqual(result.length, 36); }), it("Generate UUID v5", () => { - const namespace = chef.generateUUID("", "v1"); - const result = chef.generateUUID("v5", "random string", namespace); - assert.ok(result.toString()); - assert.strictEqual(result.toString().length, 36); + const namespace = chef.generateUUID("", "v1").toString(); + const result = chef.generateUUID("v5", "user input", namespace).toString(); + assert.ok(result); + assert.strictEqual(result.length, 36); }), it("Validate UUID v3 namespace", () => { - const namespace = chef.generateUUID("", "v1"); - const firstResult = chef.generateUUID("v3", "random string", namespace); - const secondResult = chef.generateUUID("v3", "random string", namespace); - assert.strictEqual(firstResult.toString(), secondResult.toString()); + const namespace = chef.generateUUID("", "v1").toString(); + const firstResult = chef.generateUUID("v3", "user input", namespace).toString(); + const secondResult = chef.generateUUID("v3", "user input", namespace).toString(); + assert.strictEqual(firstResult, secondResult); }), it("Validate UUID v5 namespace", () => { - const namespace = chef.generateUUID("", "v1"); - const firstResult = chef.generateUUID("v5", "random string", namespace); - const secondResult = chef.generateUUID("v5", "random string", namespace); - assert.strictEqual(firstResult.toString(), secondResult.toString()); + const namespace = chef.generateUUID("", "v1").toString(); + const firstResult = chef.generateUUID("v5", "user input", namespace).toString(); + const secondResult = chef.generateUUID("v5", "user input", namespace).toString(); + assert.strictEqual(firstResult, secondResult); }), it("Analyse UUID v1", () => { - const uuidv1 = chef.generateUUID("", "v1"); - const uuidAnalysis = chef.analyseUUID(uuidv1); + const uuidv1 = chef.generateUUID("", "v1").toString(); + const uuidAnalysis = chef.analyseUUID(uuidv1).toString(); assert.strictEqual(uuidAnalysis, "UUID version: 1"); }), it("Analyse UUID v3", () => { - const namespace = chef.generateUUID("", "v1"); - const uuidv3 = chef.generateUUID("v3", "random string", namespace); - const uuidAnalysis = chef.analyseUUID(uuidv3); + const namespace = chef.generateUUID("", "v1").toString(); + const uuidv3 = chef.generateUUID("v3", "user input", namespace).toString(); + const uuidAnalysis = chef.analyseUUID(uuidv3).toString(); assert.strictEqual(uuidAnalysis, "UUID version: 3"); }), it("Analyse UUID v4", () => { - const uuidv4 = chef.generateUUID("", "v4"); - const uuidAnalysis = chef.analyseUUID(uuidv4); + const uuidv4 = chef.generateUUID("", "v4").toString(); + const uuidAnalysis = chef.analyseUUID(uuidv4).toString(); assert.strictEqual(uuidAnalysis, "UUID version: 4"); }), it("Analyse UUID v5", () => { - const namespace = chef.generateUUID("", "v1"); - const uuidv5 = chef.generateUUID("v5", "random string", namespace); - const uuidAnalysis = chef.analyseUUID(uuidv5); + const namespace = chef.generateUUID("", "v1").toString(); + const uuidv5 = chef.generateUUID("v5", "user input", namespace).toString(); + const uuidAnalysis = chef.analyseUUID(uuidv5).toString(); - assert.strictEqual(uuidAnalysis, "UUID version: 3"); + assert.strictEqual(uuidAnalysis, "UUID version: 5"); }), it("Gzip, Gunzip", () => { From 68db8e93b70a5479e847f7529959e59562ce7571 Mon Sep 17 00:00:00 2001 From: victorlpgazolli Date: Tue, 21 Mar 2023 19:22:32 -0300 Subject: [PATCH 07/13] ref assert validation uuid tests --- tests/node/tests/operations.mjs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/node/tests/operations.mjs b/tests/node/tests/operations.mjs index 1685276c..9b8b0a23 100644 --- a/tests/node/tests/operations.mjs +++ b/tests/node/tests/operations.mjs @@ -583,48 +583,48 @@ Password: 282760`; it("Generate UUID v1", () => { const result = chef.generateUUID("", "v1").toString(); assert.ok(result); - assert.strictEqual(result.length, 36); + assert.equal(result.length, 36); }), it("Generate UUID v3", () => { const namespace = chef.generateUUID("", "v1").toString(); const result = chef.generateUUID("v3", "user input", namespace).toString(); assert.ok(result); - assert.strictEqual(result.length, 36); + assert.equal(result.length, 36); }), it("Generate UUID v4", () => { const result = chef.generateUUID("", "v4").toString(); assert.ok(result); - assert.strictEqual(result.length, 36); + assert.equal(result.length, 36); }), it("Generate UUID v5", () => { const namespace = chef.generateUUID("", "v1").toString(); const result = chef.generateUUID("v5", "user input", namespace).toString(); assert.ok(result); - assert.strictEqual(result.length, 36); + assert.equal(result.length, 36); }), it("Validate UUID v3 namespace", () => { const namespace = chef.generateUUID("", "v1").toString(); const firstResult = chef.generateUUID("v3", "user input", namespace).toString(); const secondResult = chef.generateUUID("v3", "user input", namespace).toString(); - assert.strictEqual(firstResult, secondResult); + assert.equal(firstResult, secondResult); }), it("Validate UUID v5 namespace", () => { const namespace = chef.generateUUID("", "v1").toString(); const firstResult = chef.generateUUID("v5", "user input", namespace).toString(); const secondResult = chef.generateUUID("v5", "user input", namespace).toString(); - assert.strictEqual(firstResult, secondResult); + assert.equal(firstResult, secondResult); }), it("Analyse UUID v1", () => { const uuidv1 = chef.generateUUID("", "v1").toString(); const uuidAnalysis = chef.analyseUUID(uuidv1).toString(); - assert.strictEqual(uuidAnalysis, "UUID version: 1"); + assert.equal(uuidAnalysis, "UUID version: 1"); }), it("Analyse UUID v3", () => { @@ -632,14 +632,14 @@ Password: 282760`; const uuidv3 = chef.generateUUID("v3", "user input", namespace).toString(); const uuidAnalysis = chef.analyseUUID(uuidv3).toString(); - assert.strictEqual(uuidAnalysis, "UUID version: 3"); + assert.equal(uuidAnalysis, "UUID version: 3"); }), it("Analyse UUID v4", () => { const uuidv4 = chef.generateUUID("", "v4").toString(); const uuidAnalysis = chef.analyseUUID(uuidv4).toString(); - assert.strictEqual(uuidAnalysis, "UUID version: 4"); + assert.equal(uuidAnalysis, "UUID version: 4"); }), it("Analyse UUID v5", () => { @@ -647,7 +647,7 @@ Password: 282760`; const uuidv5 = chef.generateUUID("v5", "user input", namespace).toString(); const uuidAnalysis = chef.analyseUUID(uuidv5).toString(); - assert.strictEqual(uuidAnalysis, "UUID version: 5"); + assert.equal(uuidAnalysis, "UUID version: 5"); }), it("Gzip, Gunzip", () => { From e0bdde89c43faafed0ca90d9c0d18fbd03baec51 Mon Sep 17 00:00:00 2001 From: victorlpgazolli Date: Tue, 21 Mar 2023 19:49:44 -0300 Subject: [PATCH 08/13] testing only class default value --- tests/node/tests/operations.mjs | 61 ++------------------------------- 1 file changed, 2 insertions(+), 59 deletions(-) diff --git a/tests/node/tests/operations.mjs b/tests/node/tests/operations.mjs index 9b8b0a23..42f05971 100644 --- a/tests/node/tests/operations.mjs +++ b/tests/node/tests/operations.mjs @@ -581,75 +581,18 @@ Password: 282760`; }), it("Generate UUID v1", () => { - const result = chef.generateUUID("", "v1").toString(); + const result = chef.generateUUID("", { version: "v1" }).toString(); assert.ok(result); assert.equal(result.length, 36); }), - it("Generate UUID v3", () => { - const namespace = chef.generateUUID("", "v1").toString(); - const result = chef.generateUUID("v3", "user input", namespace).toString(); - assert.ok(result); - assert.equal(result.length, 36); - }), - - it("Generate UUID v4", () => { - const result = chef.generateUUID("", "v4").toString(); - assert.ok(result); - assert.equal(result.length, 36); - }), - - it("Generate UUID v5", () => { - const namespace = chef.generateUUID("", "v1").toString(); - const result = chef.generateUUID("v5", "user input", namespace).toString(); - assert.ok(result); - assert.equal(result.length, 36); - }), - - it("Validate UUID v3 namespace", () => { - const namespace = chef.generateUUID("", "v1").toString(); - const firstResult = chef.generateUUID("v3", "user input", namespace).toString(); - const secondResult = chef.generateUUID("v3", "user input", namespace).toString(); - assert.equal(firstResult, secondResult); - }), - - it("Validate UUID v5 namespace", () => { - const namespace = chef.generateUUID("", "v1").toString(); - const firstResult = chef.generateUUID("v5", "user input", namespace).toString(); - const secondResult = chef.generateUUID("v5", "user input", namespace).toString(); - assert.equal(firstResult, secondResult); - }), - it("Analyse UUID v1", () => { - const uuidv1 = chef.generateUUID("", "v1").toString(); + const uuidv1 = chef.generateUUID("", { version: "v1" }).toString(); const uuidAnalysis = chef.analyseUUID(uuidv1).toString(); assert.equal(uuidAnalysis, "UUID version: 1"); }), - it("Analyse UUID v3", () => { - const namespace = chef.generateUUID("", "v1").toString(); - const uuidv3 = chef.generateUUID("v3", "user input", namespace).toString(); - const uuidAnalysis = chef.analyseUUID(uuidv3).toString(); - - assert.equal(uuidAnalysis, "UUID version: 3"); - }), - - it("Analyse UUID v4", () => { - const uuidv4 = chef.generateUUID("", "v4").toString(); - const uuidAnalysis = chef.analyseUUID(uuidv4).toString(); - - assert.equal(uuidAnalysis, "UUID version: 4"); - }), - - it("Analyse UUID v5", () => { - const namespace = chef.generateUUID("", "v1").toString(); - const uuidv5 = chef.generateUUID("v5", "user input", namespace).toString(); - const uuidAnalysis = chef.analyseUUID(uuidv5).toString(); - - assert.equal(uuidAnalysis, "UUID version: 5"); - }), - it("Gzip, Gunzip", () => { assert.strictEqual(chef.gunzip(chef.gzip("Down To The Wire")).toString(), "Down To The Wire"); }), From 457d28fc557ebce7fa8708cfd79427caef4c6d05 Mon Sep 17 00:00:00 2001 From: Bart van Andel Date: Thu, 3 Apr 2025 14:08:14 +0200 Subject: [PATCH 09/13] feat: support UUID v1, v3, v4, v5, v6, v7 - Add v6 and v7 as valid options - Add unit tests for generating and analyzing all supported versions --- src/core/operations/GenerateUUID.mjs | 4 ++-- tests/node/tests/operations.mjs | 20 ++++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/core/operations/GenerateUUID.mjs b/src/core/operations/GenerateUUID.mjs index cb2373d9..4b070d05 100644 --- a/src/core/operations/GenerateUUID.mjs +++ b/src/core/operations/GenerateUUID.mjs @@ -20,7 +20,7 @@ class GenerateUUID extends Operation { this.name = "Generate UUID"; this.module = "Crypto"; - this.description = "Generates an RFC 4122 compliant Universally Unique Identifier (UUID), also known as a Globally Unique Identifier (GUID).

A version 4 UUID relies on random numbers, in this case generated using uuid package"; + this.description = "Generates an RFC 9562 (formerly RFC 4122) compliant Universally Unique Identifier (UUID), also known as a Globally Unique Identifier (GUID).

A version 4 UUID relies on random numbers, in this case generated using uuid package"; this.infoURL = "https://wikipedia.org/wiki/Universally_unique_identifier"; this.inputType = "string"; this.outputType = "string"; @@ -29,7 +29,7 @@ class GenerateUUID extends Operation { name: "UUID Version", type: "option", value: [ - "v1", "v3", "v4", "v5" + "v1", "v3", "v4", "v5", "v6", "v7", ] }, { diff --git a/tests/node/tests/operations.mjs b/tests/node/tests/operations.mjs index 42f05971..ee4b1564 100644 --- a/tests/node/tests/operations.mjs +++ b/tests/node/tests/operations.mjs @@ -580,18 +580,18 @@ Password: 282760`; assert.strictEqual(result.toString().substr(0, 37), "-----BEGIN PGP PRIVATE KEY BLOCK-----"); }), - it("Generate UUID v1", () => { - const result = chef.generateUUID("", { version: "v1" }).toString(); + ...[1, 3, 4, 5, 6, 7].map(version => it(`Generate UUID v${version}`, () => { + const result = chef.generateUUID("", { "UUID version": `v${version}` }).toString(); assert.ok(result); - assert.equal(result.length, 36); - }), + assert.strictEqual(result.length, 36); + })), - it("Analyse UUID v1", () => { - const uuidv1 = chef.generateUUID("", { version: "v1" }).toString(); - const uuidAnalysis = chef.analyseUUID(uuidv1).toString(); - - assert.equal(uuidAnalysis, "UUID version: 1"); - }), + ...[1, 3, 4, 5, 6, 7].map(version => it(`Analyze UUID v${version}`, () => { + const uuid = chef.generateUUID("", { "UUID version": `v${version}` }).toString(); + const result = chef.analyseUUID(uuid).toString(); + const expected = `UUID version: ${version}`; + assert.strictEqual(result, expected); + })), it("Gzip, Gunzip", () => { assert.strictEqual(chef.gunzip(chef.gzip("Down To The Wire")).toString(), "Down To The Wire"); From de5b03f854df39cc7e4f0013ec87e731f92fa2c8 Mon Sep 17 00:00:00 2001 From: Bart van Andel Date: Thu, 3 Apr 2025 14:54:49 +0200 Subject: [PATCH 10/13] chore: fix class name for analyse UUID operation --- src/core/operations/AnalyseUUID.mjs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/core/operations/AnalyseUUID.mjs b/src/core/operations/AnalyseUUID.mjs index cde3c3cb..b3506017 100644 --- a/src/core/operations/AnalyseUUID.mjs +++ b/src/core/operations/AnalyseUUID.mjs @@ -4,17 +4,18 @@ * @license Apache-2.0 */ -import Operation from "../Operation.mjs"; import * as uuid from "uuid"; + +import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; /** - * Analyse hash operation + * Analyse UUID operation */ -class AnalyseHash extends Operation { +class AnalyseUUID extends Operation { /** - * AnalyseHash constructor + * AnalyseUUID constructor */ constructor() { super(); @@ -44,4 +45,4 @@ class AnalyseHash extends Operation { } -export default AnalyseHash; +export default AnalyseUUID; From 2cf3642493500a6b905e8de74ef7d4dfb21c04c8 Mon Sep 17 00:00:00 2001 From: Bart van Andel Date: Sat, 5 Apr 2025 22:49:54 +0200 Subject: [PATCH 11/13] fix: use UUID v4 by default, for backward compatibility --- src/core/operations/GenerateUUID.mjs | 1 + tests/node/tests/operations.mjs | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/src/core/operations/GenerateUUID.mjs b/src/core/operations/GenerateUUID.mjs index 4b070d05..89a5e05c 100644 --- a/src/core/operations/GenerateUUID.mjs +++ b/src/core/operations/GenerateUUID.mjs @@ -31,6 +31,7 @@ class GenerateUUID extends Operation { value: [ "v1", "v3", "v4", "v5", "v6", "v7", ] + defaultIndex: 2, }, { name: "UUID namespace (valid for v3 and v5)", diff --git a/tests/node/tests/operations.mjs b/tests/node/tests/operations.mjs index ee4b1564..ec55b768 100644 --- a/tests/node/tests/operations.mjs +++ b/tests/node/tests/operations.mjs @@ -593,6 +593,14 @@ Password: 282760`; assert.strictEqual(result, expected); })), + it("Generate UUID using defaults", () => { + const uuid = chef.generateUUID(); + assert.ok(uuid); + + const analysis = chef.analyseUUID(uuid).toString(); + assert.strictEqual(analysis, "UUID version: 4"); + }), + it("Gzip, Gunzip", () => { assert.strictEqual(chef.gunzip(chef.gzip("Down To The Wire")).toString(), "Down To The Wire"); }), From 575eade84d8dbc17b47fd3f9b1c09166c52befe1 Mon Sep 17 00:00:00 2001 From: Bart van Andel Date: Sat, 5 Apr 2025 22:51:59 +0200 Subject: [PATCH 12/13] fix: simplify UUID argument names, use hint for more info --- src/core/operations/GenerateUUID.mjs | 14 ++++++-------- tests/node/tests/operations.mjs | 4 ++-- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/core/operations/GenerateUUID.mjs b/src/core/operations/GenerateUUID.mjs index 89a5e05c..32360042 100644 --- a/src/core/operations/GenerateUUID.mjs +++ b/src/core/operations/GenerateUUID.mjs @@ -26,15 +26,15 @@ class GenerateUUID extends Operation { this.outputType = "string"; this.args = [ { - name: "UUID Version", + name: "Version", + hint: "UUID version", type: "option", - value: [ - "v1", "v3", "v4", "v5", "v6", "v7", - ] + value: ["v1", "v3", "v4", "v5", "v6", "v7"], defaultIndex: 2, }, { - name: "UUID namespace (valid for v3 and v5)", + name: "Namespace", + hint: "UUID namespace (UUID; valid for v3 and v5)", type: "string", value: "1b671a64-40d5-491e-99b0-da01ff1f3341" } @@ -51,9 +51,7 @@ class GenerateUUID extends Operation { const hasDesiredVersion = typeof uuid[version] === "function"; if (!hasDesiredVersion) throw new OperationError("Invalid UUID version"); - const versionThatRequiresNamespace = ["v3", "v5"]; - - const requiresNamespace = versionThatRequiresNamespace.includes(version); + const requiresNamespace = ["v3", "v5"].includes(version); if (!requiresNamespace) return uuid[version](); const hasValidNamespace = typeof namespace === "string" && uuid.validate(namespace); diff --git a/tests/node/tests/operations.mjs b/tests/node/tests/operations.mjs index ec55b768..022b0701 100644 --- a/tests/node/tests/operations.mjs +++ b/tests/node/tests/operations.mjs @@ -581,13 +581,13 @@ Password: 282760`; }), ...[1, 3, 4, 5, 6, 7].map(version => it(`Generate UUID v${version}`, () => { - const result = chef.generateUUID("", { "UUID version": `v${version}` }).toString(); + const result = chef.generateUUID("", { "version": `v${version}` }).toString(); assert.ok(result); assert.strictEqual(result.length, 36); })), ...[1, 3, 4, 5, 6, 7].map(version => it(`Analyze UUID v${version}`, () => { - const uuid = chef.generateUUID("", { "UUID version": `v${version}` }).toString(); + const uuid = chef.generateUUID("", { "version": `v${version}` }).toString(); const result = chef.analyseUUID(uuid).toString(); const expected = `UUID version: ${version}`; assert.strictEqual(result, expected); From a0ade265051ef126ce608fd1bfa0af92a87f58aa Mon Sep 17 00:00:00 2001 From: Bart van Andel Date: Sat, 5 Apr 2025 22:59:03 +0200 Subject: [PATCH 13/13] fix: improve UUID description - Link to uuid package at npmjs - Briefly explain supported UUID versions for generation --- src/core/operations/GenerateUUID.mjs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/core/operations/GenerateUUID.mjs b/src/core/operations/GenerateUUID.mjs index 32360042..21d063e3 100644 --- a/src/core/operations/GenerateUUID.mjs +++ b/src/core/operations/GenerateUUID.mjs @@ -20,7 +20,20 @@ class GenerateUUID extends Operation { this.name = "Generate UUID"; this.module = "Crypto"; - this.description = "Generates an RFC 9562 (formerly RFC 4122) compliant Universally Unique Identifier (UUID), also known as a Globally Unique Identifier (GUID).

A version 4 UUID relies on random numbers, in this case generated using uuid package"; + this.description = + "Generates an RFC 9562 (formerly RFC 4122) compliant Universally Unique Identifier (UUID), " + + "also known as a Globally Unique Identifier (GUID).
" + + "
" + + "We currently support generating the following UUID versions:
" + + "
    " + + "
  • v1: Timestamp-based
  • " + + "
  • v3: Namespace w/ MD5
  • " + + "
  • v4: Random (default)
  • " + + "
  • v5: Namespace w/ SHA-1
  • " + + "
  • v6: Timestamp, reordered
  • " + + "
  • v7: Unix Epoch time-based
  • " + + "
" + + "UUIDs are generated using the uuid package.
"; this.infoURL = "https://wikipedia.org/wiki/Universally_unique_identifier"; this.inputType = "string"; this.outputType = "string";