암호 관련 모듈 리팩토링

This commit is contained in:
static
2025-01-08 20:05:50 +09:00
parent 1307783de1
commit db900d8038
5 changed files with 15 additions and 17 deletions

View File

@@ -45,7 +45,7 @@ export const storeClientKey = async (key: CryptoKey, usage: ClientKeyUsage) => {
if (key.type !== "private") { if (key.type !== "private") {
throw new Error("Private key required"); throw new Error("Private key required");
} else if (key.extractable) { } else if (key.extractable) {
throw new Error("Private key must be non-extractable"); throw new Error("Private key must be nonextractable");
} }
break; break;
} }
@@ -58,7 +58,7 @@ export const getMasterKeys = async () => {
export const storeMasterKeys = async (keys: MasterKey[]) => { export const storeMasterKeys = async (keys: MasterKey[]) => {
if (keys.some(({ key }) => key.extractable)) { if (keys.some(({ key }) => key.extractable)) {
throw new Error("Master keys must be non-extractable"); throw new Error("Master keys must be nonextractable");
} }
await keyStore.masterKey.bulkPut(keys); await keyStore.masterKey.bulkPut(keys);
}; };

View File

@@ -27,14 +27,10 @@ export const generateDataKey = async () => {
}; };
}; };
const exportAESKey = async (key: CryptoKey) => {
return await window.crypto.subtle.exportKey("raw", key);
};
export const makeAESKeyNonextractable = async (key: CryptoKey) => { export const makeAESKeyNonextractable = async (key: CryptoKey) => {
return await window.crypto.subtle.importKey( return await window.crypto.subtle.importKey(
"raw", "raw",
await exportAESKey(key), await window.crypto.subtle.exportKey("raw", key),
key.algorithm, key.algorithm,
false, false,
key.usages, key.usages,
@@ -53,7 +49,7 @@ export const unwrapDataKey = async (dataKeyWrapped: string, masterKey: CryptoKey
masterKey, masterKey,
"AES-KW", "AES-KW",
"AES-GCM", "AES-GCM",
false, // Non-extractable false, // Nonextractable
["encrypt", "decrypt"], ["encrypt", "decrypt"],
), ),
}; };

View File

@@ -1,4 +1,4 @@
import { encodeToBase64, decodeFromBase64 } from "./util"; import { encodeString, encodeToBase64, decodeFromBase64 } from "./util";
export const generateEncryptionKeyPair = async () => { export const generateEncryptionKeyPair = async () => {
const keyPair = await window.crypto.subtle.generateKey( const keyPair = await window.crypto.subtle.generateKey(
@@ -123,21 +123,20 @@ export const verifySignature = async (
}; };
export const signMasterKeyWrapped = async ( export const signMasterKeyWrapped = async (
masterKeyVersion: number,
masterKeyWrapped: string, masterKeyWrapped: string,
masterKeyVersion: number,
signKey: CryptoKey, signKey: CryptoKey,
) => { ) => {
const serialized = JSON.stringify({ const serialized = JSON.stringify({
version: masterKeyVersion, version: masterKeyVersion,
key: masterKeyWrapped, key: masterKeyWrapped,
}); });
const serializedBuffer = new TextEncoder().encode(serialized); return encodeToBase64(await signMessage(encodeString(serialized), signKey));
return encodeToBase64(await signMessage(serializedBuffer, signKey));
}; };
export const verifyMasterKeyWrapped = async ( export const verifyMasterKeyWrapped = async (
masterKeyVersion: number,
masterKeyWrapped: string, masterKeyWrapped: string,
masterKeyVersion: number,
masterKeyWrappedSig: string, masterKeyWrappedSig: string,
verifyKey: CryptoKey, verifyKey: CryptoKey,
) => { ) => {
@@ -145,6 +144,9 @@ export const verifyMasterKeyWrapped = async (
version: masterKeyVersion, version: masterKeyVersion,
key: masterKeyWrapped, key: masterKeyWrapped,
}); });
const serializedBuffer = new TextEncoder().encode(serialized); return await verifySignature(
return await verifySignature(serializedBuffer, decodeFromBase64(masterKeyWrappedSig), verifyKey); encodeString(serialized),
decodeFromBase64(masterKeyWrappedSig),
verifyKey,
);
}; };

View File

@@ -52,8 +52,8 @@ export const requestMasterKeyDownload = async (decryptKey: CryptoKey, verifyKey:
state, state,
masterKey, masterKey,
isValid: await verifyMasterKeyWrapped( isValid: await verifyMasterKeyWrapped(
version,
masterKeyWrapped, masterKeyWrapped,
version,
masterKeyWrappedSig, masterKeyWrappedSig,
verifyKey, verifyKey,
), ),

View File

@@ -48,7 +48,7 @@ export const requestInitialMasterKeyRegistration = async (
) => { ) => {
const res = await callPostApi<InitialMasterKeyRegisterRequest>("/api/mek/register/initial", { const res = await callPostApi<InitialMasterKeyRegisterRequest>("/api/mek/register/initial", {
mek: masterKeyWrapped, mek: masterKeyWrapped,
mekSig: await signMasterKeyWrapped(1, masterKeyWrapped, signKey), mekSig: await signMasterKeyWrapped(masterKeyWrapped, 1, signKey),
}); });
return res.ok || res.status === 409; return res.ok || res.status === 409;
}; };