Packages
plinth
0.7.2
0.10.2
0.10.1
0.10.0
0.9.3
0.9.2
0.9.1
0.9.0
0.8.2
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.1
0.6.0
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.15
0.4.14
0.4.13
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.0
0.2.0
0.1.13
0.1.12
0.1.11
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
Bindings to Node.js and browser platform APIs
Current section
Files
Jump to
Current section
Files
src/plinth_browser_crypto_subtle_ffi.mjs
import { toBitArray } from "../gleam_stdlib/gleam.mjs"
import { Ok, Error } from "./gleam.mjs";
import * as mod from "./plinth/browser/crypto/subtle.mjs"
export async function digest(algorithm, data) {
try {
let hashed = await globalThis.crypto.subtle.digest(algorithm, data.rawBuffer);
return new Ok(toBitArray(new Uint8Array(hashed)))
} catch (error) {
return new Error(`${error}`)
}
}
export async function exportKey(format, key) {
try {
let exported = await globalThis.crypto.subtle.exportKey(format, key);
return new Ok(exported)
} catch (error) {
return new Error(`${error}`)
}
}
export async function exportJwk(key) {
try {
let exported = await globalThis.crypto.subtle.exportKey("jwk", key);
return new Ok(exported)
} catch (error) {
return new Error(`${error}`)
}
}
function generateKeyAlgorithm(algorithm) {
if (algorithm instanceof mod.RsaHashedKeyGenParams) {
return {
name: algorithm.name,
modulusLength: algorithm.modulus_length,
publicExponent: algorithm.public_exponent.rawBuffer,
hash: digestAlgorithm(algorithm.hash)
}
} else if (algorithm instanceof EcKeyGenParams) {
return {
name: algorithm.name,
namedCurve: algorithm.named_curve
}
}
}
function digestAlgorithm(hash) {
if (hash instanceof mod.SHA1) {
return "SHA-1"
} else if (hash instanceof mod.SHA256) {
return "SHA-256"
} else if (hash instanceof mod.SHA384) {
return "SHA-384"
} else if (hash instanceof mod.SHA512) {
return "SHA-512"
}
}
export async function generateKey(algorithm, extractable, keyUsages) {
try {
let { publicKey, privateKey } = await globalThis.crypto.subtle.generateKey(generateKeyAlgorithm(algorithm), extractable, keyUsages);
return new Ok([publicKey, privateKey])
} catch (error) {
return new Error(`${error}`)
}
}
export async function importKey(format, keyData, algorithm, extractable, keyUsages) {
try {
let imported = await globalThis.crypto.subtle.importKey(format, keyData.rawBuffer, algorithm, extractable, keyUsages);
return new Ok(imported)
} catch (error) {
return new Error(`${error}`)
}
}
export async function importJwk(keyData, algorithm, extractable, keyUsages) {
try {
let imported = await globalThis.crypto.subtle.importKey("jwk", keyData, algorithm, extractable, keyUsages);
return new Ok(imported)
} catch (error) {
return new Error(`${error}`)
}
}
export async function sign(algorithm, key, data) {
try {
let signed = await globalThis.crypto.subtle.sign(algorithm, key, data.rawBuffer);
return new Ok(toBitArray(new Uint8Array(signed)))
} catch (error) {
return new Error(`${error}`)
}
}
export async function verify(algorithm, key, signature, data) {
try {
let valid = await globalThis.crypto.subtle.verify(algorithm, key, signature.rawBuffer, data.rawBuffer);
return new Ok(valid)
} catch (error) {
return new Error(`${error}`)
}
}