pubKeyStore와 privKeyStore를 keyPairStore로 통합

This commit is contained in:
static
2024-12-28 18:33:30 +09:00
parent 7267e319b4
commit 173f4f5cfe
4 changed files with 18 additions and 15 deletions

View File

@@ -1,21 +1,21 @@
import { Dexie, type EntityTable } from "dexie"; import { Dexie, type EntityTable } from "dexie";
interface ClientKeyPair { interface KeyPair {
type: "publicKey" | "privateKey"; type: "publicKey" | "privateKey";
key: CryptoKey; key: CryptoKey;
} }
const keyStore = new Dexie("keyStore") as Dexie & { const keyStore = new Dexie("keyStore") as Dexie & {
clientKeyPairs: EntityTable<ClientKeyPair, "type">; keyPair: EntityTable<KeyPair, "type">;
}; };
keyStore.version(1).stores({ keyStore.version(1).stores({
clientKeyPairs: "type", keyPair: "type",
}); });
export const getKeyPairFromIndexedDB = async () => { export const getKeyPairFromIndexedDB = async () => {
const pubKey = await keyStore.clientKeyPairs.get("publicKey"); const pubKey = await keyStore.keyPair.get("publicKey");
const privKey = await keyStore.clientKeyPairs.get("privateKey"); const privKey = await keyStore.keyPair.get("privateKey");
return { return {
pubKey: pubKey?.key ?? null, pubKey: pubKey?.key ?? null,
privKey: privKey?.key ?? null, privKey: privKey?.key ?? null,
@@ -23,7 +23,10 @@ export const getKeyPairFromIndexedDB = async () => {
}; };
export const storeKeyPairIntoIndexedDB = async (pubKey: CryptoKey, privKey: CryptoKey) => { 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: "publicKey", key: pubKey },
{ type: "privateKey", key: privKey }, { type: "privateKey", key: privKey },
]); ]);

View File

@@ -1,4 +1,3 @@
import { writable } from "svelte/store"; import { writable } from "svelte/store";
export const pubKeyStore = writable<CryptoKey | null>(null); export const keyPairStore = writable<CryptoKeyPair | null>(null);
export const privKeyStore = writable<CryptoKey | null>(null);

View File

@@ -1,5 +1,5 @@
import { storeKeyPairIntoIndexedDB } from "$lib/indexedDB"; import { storeKeyPairIntoIndexedDB } from "$lib/indexedDB";
import { pubKeyStore, privKeyStore } from "$lib/stores"; import { keyPairStore } from "$lib/stores";
type KeyType = "public" | "private"; type KeyType = "public" | "private";
@@ -42,12 +42,13 @@ const exportKeyToBase64 = async (key: CryptoKey, type: KeyType) => {
export const generateKeyPair = async () => { export const generateKeyPair = async () => {
const keyPair = await generateRSAKeyPair(); const keyPair = await generateRSAKeyPair();
const privKeySecure = await makeRSAKeyNonextractable(keyPair.privateKey, "private"); const privKeySecured = await makeRSAKeyNonextractable(keyPair.privateKey, "private");
pubKeyStore.set(keyPair.publicKey); keyPairStore.set({
privKeyStore.set(privKeySecure); publicKey: keyPair.publicKey,
privateKey: privKeySecured,
await storeKeyPairIntoIndexedDB(keyPair.publicKey, privKeySecure); });
await storeKeyPairIntoIndexedDB(keyPair.publicKey, privKeySecured);
return { return {
pubKeyBase64: await exportKeyToBase64(keyPair.publicKey, "public"), pubKeyBase64: await exportKeyToBase64(keyPair.publicKey, "public"),

View File

@@ -18,5 +18,5 @@ export const POST: RequestHandler = async ({ request, cookies }) => {
} }
await registerPubKey(userId, zodRes.data.pubKey); await registerPubKey(userId, zodRes.data.pubKey);
return text("Public key registered"); return text("Public key registered", { headers: { "Content-Type": "text/plain" } });
}; };