summaryrefslogtreecommitdiffhomepage
path: root/packages/server/src
diff options
context:
space:
mode:
Diffstat (limited to 'packages/server/src')
-rw-r--r--packages/server/src/helpers/iso/index.ts1
-rw-r--r--packages/server/src/helpers/iso/isoCrypto.ts55
2 files changed, 56 insertions, 0 deletions
diff --git a/packages/server/src/helpers/iso/index.ts b/packages/server/src/helpers/iso/index.ts
index 5cb3bab..49f19e4 100644
--- a/packages/server/src/helpers/iso/index.ts
+++ b/packages/server/src/helpers/iso/index.ts
@@ -7,4 +7,5 @@
*/
export * as isoBase64URL from './isoBase64URL';
export * as isoCBOR from './isoCBOR';
+export * as isoCrypto from './isoCrypto';
export * as isoUint8Array from './isoUint8Array';
diff --git a/packages/server/src/helpers/iso/isoCrypto.ts b/packages/server/src/helpers/iso/isoCrypto.ts
new file mode 100644
index 0000000..69daf50
--- /dev/null
+++ b/packages/server/src/helpers/iso/isoCrypto.ts
@@ -0,0 +1,55 @@
+import { webcrypto } from 'node:crypto';
+
+/**
+ * Fill up the provided bytes array with random bytes equal to its length.
+ *
+ * @returns the same bytes array passed into the method
+ */
+export function getRandomValues(array: Uint8Array): Uint8Array {
+ if (globalThis.crypto) {
+ // We're in a browser-like runtime, use global Crypto
+ globalThis.crypto.getRandomValues(array);
+ } else {
+ // We're in Node, use Node's Crypto
+ webcrypto.getRandomValues(array);
+ }
+
+ return array;
+}
+
+/**
+ * Generate a digest of the provided data.
+ *
+ * @param data The data to generate a digest of
+ * @param algorithm Must be one of the following values:
+ * - `'SHA-1'`
+ * - `'SHA-256'`
+ * - `'SHA-384'`
+ * - `'SHA-512'`
+ */
+export async function digest(data: Uint8Array, algorithm: string): Promise<Uint8Array> {
+ algorithm = normalizeAlgorithm(algorithm);
+
+ let hashed: ArrayBuffer
+ if (globalThis.crypto) {
+ // We're in a browser-like runtime, use global Crypto
+ hashed = await globalThis.crypto.subtle.digest(algorithm, data);
+ } else {
+ // We're in Node, use Node's Crypto
+ hashed = await webcrypto.subtle.digest(algorithm, data);
+ }
+
+ return new Uint8Array(hashed);
+}
+
+/**
+ * Convert algorithms like "SHA1", "sha256", etc... into values like "SHA-1", "SHA-256", etc...
+ * that `.digest()` will accept
+ */
+function normalizeAlgorithm(algorithm: string): string {
+ if (/sha\d{1,3}/i.test(algorithm)) {
+ algorithm = algorithm.toUpperCase().replace('SHA', 'SHA-');
+ }
+
+ return algorithm;
+}