From 173f4f5cfe44989060f96a38805fc8769cdf8719 Mon Sep 17 00:00:00 2001 From: static Date: Sat, 28 Dec 2024 18:33:30 +0900 Subject: [PATCH] =?UTF-8?q?pubKeyStore=EC=99=80=20privKeyStore=EB=A5=BC=20?= =?UTF-8?q?keyPairStore=EB=A1=9C=20=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/indexedDB.ts | 15 +++++++++------ src/lib/stores/key.ts | 3 +-- src/routes/(fullscreen)/key/generate/service.ts | 13 +++++++------ src/routes/api/key/register/+server.ts | 2 +- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/lib/indexedDB.ts b/src/lib/indexedDB.ts index 92553b0..ff0c29e 100644 --- a/src/lib/indexedDB.ts +++ b/src/lib/indexedDB.ts @@ -1,21 +1,21 @@ import { Dexie, type EntityTable } from "dexie"; -interface ClientKeyPair { +interface KeyPair { type: "publicKey" | "privateKey"; key: CryptoKey; } const keyStore = new Dexie("keyStore") as Dexie & { - clientKeyPairs: EntityTable; + keyPair: EntityTable; }; keyStore.version(1).stores({ - clientKeyPairs: "type", + keyPair: "type", }); export const getKeyPairFromIndexedDB = async () => { - const pubKey = await keyStore.clientKeyPairs.get("publicKey"); - const privKey = await keyStore.clientKeyPairs.get("privateKey"); + const pubKey = await keyStore.keyPair.get("publicKey"); + const privKey = await keyStore.keyPair.get("privateKey"); return { pubKey: pubKey?.key ?? null, privKey: privKey?.key ?? null, @@ -23,7 +23,10 @@ export const getKeyPairFromIndexedDB = async () => { }; export const storeKeyPairIntoIndexedDB = async (pubKey: CryptoKey, privKey: CryptoKey) => { - await keyStore.clientKeyPairs.bulkPut([ + if (!pubKey.extractable) throw new Error("Public key must be extractable"); + if (privKey.extractable) throw new Error("Private key must be non-extractable"); + + await keyStore.keyPair.bulkPut([ { type: "publicKey", key: pubKey }, { type: "privateKey", key: privKey }, ]); diff --git a/src/lib/stores/key.ts b/src/lib/stores/key.ts index 40458bb..f8dc6ac 100644 --- a/src/lib/stores/key.ts +++ b/src/lib/stores/key.ts @@ -1,4 +1,3 @@ import { writable } from "svelte/store"; -export const pubKeyStore = writable(null); -export const privKeyStore = writable(null); +export const keyPairStore = writable(null); diff --git a/src/routes/(fullscreen)/key/generate/service.ts b/src/routes/(fullscreen)/key/generate/service.ts index 7b869d4..8c38abc 100644 --- a/src/routes/(fullscreen)/key/generate/service.ts +++ b/src/routes/(fullscreen)/key/generate/service.ts @@ -1,5 +1,5 @@ import { storeKeyPairIntoIndexedDB } from "$lib/indexedDB"; -import { pubKeyStore, privKeyStore } from "$lib/stores"; +import { keyPairStore } from "$lib/stores"; type KeyType = "public" | "private"; @@ -42,12 +42,13 @@ const exportKeyToBase64 = async (key: CryptoKey, type: KeyType) => { export const generateKeyPair = async () => { const keyPair = await generateRSAKeyPair(); - const privKeySecure = await makeRSAKeyNonextractable(keyPair.privateKey, "private"); + const privKeySecured = await makeRSAKeyNonextractable(keyPair.privateKey, "private"); - pubKeyStore.set(keyPair.publicKey); - privKeyStore.set(privKeySecure); - - await storeKeyPairIntoIndexedDB(keyPair.publicKey, privKeySecure); + keyPairStore.set({ + publicKey: keyPair.publicKey, + privateKey: privKeySecured, + }); + await storeKeyPairIntoIndexedDB(keyPair.publicKey, privKeySecured); return { pubKeyBase64: await exportKeyToBase64(keyPair.publicKey, "public"), diff --git a/src/routes/api/key/register/+server.ts b/src/routes/api/key/register/+server.ts index 5c95af8..41888a8 100644 --- a/src/routes/api/key/register/+server.ts +++ b/src/routes/api/key/register/+server.ts @@ -18,5 +18,5 @@ export const POST: RequestHandler = async ({ request, cookies }) => { } await registerPubKey(userId, zodRes.data.pubKey); - return text("Public key registered"); + return text("Public key registered", { headers: { "Content-Type": "text/plain" } }); };