Files
arkvault/src/routes/(fullscreen)/key/export/service.ts

62 lines
1.6 KiB
TypeScript

import { callAPI } from "$lib/hooks";
import { storeClientKey } from "$lib/indexedDB";
import { encodeToBase64, signRequest } from "$lib/modules/crypto";
import type { ClientKeys } from "$lib/stores";
export { requestTokenUpgrade } from "$lib/services/auth";
export { requestClientRegistration } from "$lib/services/key";
type ExportedKeyPairs = {
generator: "ArkVault";
exportedAt: Date;
} & {
version: 1;
encryptKey: string;
decryptKey: string;
signKey: string;
verifyKey: string;
};
export const exportClientKeys = (
encryptKeyBase64: string,
decryptKeyBase64: string,
signKeyBase64: string,
verifyKeyBase64: string,
) => {
return {
version: 1,
generator: "ArkVault",
exportedAt: new Date(),
encryptKey: encryptKeyBase64,
decryptKey: decryptKeyBase64,
signKey: signKeyBase64,
verifyKey: verifyKeyBase64,
} satisfies ExportedKeyPairs;
};
export const storeClientKeys = async (clientKeys: ClientKeys) => {
await storeClientKey(clientKeys.encryptKey, "encrypt");
await storeClientKey(clientKeys.decryptKey, "decrypt");
await storeClientKey(clientKeys.signKey, "sign");
await storeClientKey(clientKeys.verifyKey, "verify");
};
export const requestInitialMasterKeyRegistration = async (
masterKeyWrapped: ArrayBuffer,
signKey: CryptoKey,
) => {
const res = await callAPI("/api/mek/register/initial", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: await signRequest(
{
mek: encodeToBase64(masterKeyWrapped),
},
signKey,
),
});
return res.ok || res.status === 409;
};