mirror of
https://github.com/kmc7468/arkvault.git
synced 2025-12-12 21:08:46 +00:00
암호 관련 모듈 리팩토링
This commit is contained in:
@@ -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);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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"],
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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,
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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,
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user