Packages
plinth
0.9.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 { Result$Ok, Result$Error, BitArray$BitArray } 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 Result$Ok(BitArray$BitArray(new Uint8Array(hashed)))
} catch (error) {
return Result$Error(`${error}`)
}
}
export async function exportKey(format, key) {
try {
let exported = await globalThis.crypto.subtle.exportKey(format, key);
return Result$Ok(BitArray$BitArray(new Uint8Array(exported)))
} catch (error) {
return Result$Error(`${error}`)
}
}
export async function exportJwk(key) {
try {
let exported = await globalThis.crypto.subtle.exportKey("jwk", key);
return Result$Ok(exported)
} catch (error) {
return Result$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 mod.EcKeyGenParams) {
return {
name: algorithm.name,
namedCurve: algorithm.named_curve
}
} else if (algorithm instanceof mod.Ed25519GenParams) {
return {
name: "Ed25519",
}
}
}
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 Result$Ok([publicKey, privateKey])
} catch (error) {
return Result$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 Result$Ok(imported)
} catch (error) {
return Result$Error(`${error}`)
}
}
export async function importJwk(keyData, algorithm, extractable, keyUsages) {
try {
let imported = await globalThis.crypto.subtle.importKey("jwk", keyData, algorithm, extractable, keyUsages);
return Result$Ok(imported)
} catch (error) {
return Result$Error(`${error}`)
}
}
export async function sign(algorithm, key, data) {
try {
let signed = await globalThis.crypto.subtle.sign(algorithm, key, data.rawBuffer);
return Result$Ok(BitArray$BitArray(new Uint8Array(signed)))
} catch (error) {
return Result$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 Result$Ok(valid)
} catch (error) {
return Result$Error(`${error}`)
}
}