diff --git a/src/index.ts b/src/index.ts index 26070bb..3f41630 100644 --- a/src/index.ts +++ b/src/index.ts @@ -183,6 +183,14 @@ export class IntegrityMetadataSet { return this.#set.length; } + get strongestHashAlgorithms(): ReadonlyArray { + const strongestHashAlgorithms = this.strongest + .map(({ alg }) => alg as HashAlgorithm) + .filter(Boolean); + + return [...new Set(strongestHashAlgorithms)]; + } + join(separator = " "): string { return this.#set.map(String).join(separator); } diff --git a/test/integrity-metadata-set/strongest-hash-algorithms.js b/test/integrity-metadata-set/strongest-hash-algorithms.js new file mode 100644 index 0000000..26ec16f --- /dev/null +++ b/test/integrity-metadata-set/strongest-hash-algorithms.js @@ -0,0 +1,39 @@ +import assert from "node:assert"; +import { test } from "node:test"; +import { IntegrityMetadataSet } from "../../dist/index.js"; + +test("pick the strongest hash algorithms", function () { + const integrityMetadataSet = new IntegrityMetadataSet(` +sha256-MV9b23bQeMQ7isAGTkoBZGErH853yGk0W/yUx1iU7dM= +sha384-VbxVaw0v4Pzlgrpf4Huq//A1ZTY4x6wNVJTCpkwL6hzFczHHwSpFzbyn9MNKCJ7r +sha512-wVJ82JPBJHc9gRkRlwyP5uhX1t9dySJr2KFgYUwM2WOk3eorlLt9NgIe+dhl1c6ilKgt1JoLsmn1H256V/eUIQ== +`); + + assert.deepEqual(integrityMetadataSet.strongestHashAlgorithms, ["sha512"]); +}); + +test("if there are no supported algorithms, return the empty set", function () { + const integrityMetadataSet = new IntegrityMetadataSet(` +sha1-lDpwLQbzRZmu4fjajvn3KWAx1pk= +md5-bNNVbesNpUvKBgtMOUeYOQ== +`); + + assert.deepEqual(integrityMetadataSet.strongestHashAlgorithms, []); +}); + +test("custom getPrioritizedHashAlgorithm function can be used", function () { + const integrityMetadataSet = new IntegrityMetadataSet( + ` +sha256-MV9b23bQeMQ7isAGTkoBZGErH853yGk0W/yUx1iU7dM= +sha384-VbxVaw0v4Pzlgrpf4Huq//A1ZTY4x6wNVJTCpkwL6hzFczHHwSpFzbyn9MNKCJ7r +sha512-wVJ82JPBJHc9gRkRlwyP5uhX1t9dySJr2KFgYUwM2WOk3eorlLt9NgIe+dhl1c6ilKgt1JoLsmn1H256V/eUIQ== +`, + { + getPrioritizedHashAlgorithm() { + return "sha384"; + }, + }, + ); + + assert.deepEqual(integrityMetadataSet.strongestHashAlgorithms, ["sha384"]); +});