import type { ECDSA_PKCS8_P384_SignKey, ECDSA_P384_VerifyKey } from "./RawTypes.js"; import { encodePEM } from "./utils.js"; // 간편하게 저장하기 위해서 그냥! 매번 복잡한 일을 하도록 하자 const subtle = globalThis.crypto.subtle; export const curveName: EcKeyGenParams | EcKeyImportParams = { name: 'ECDSA', namedCurve: 'P-384' } export async function importSignKey(signKey: ECDSA_PKCS8_P384_SignKey, allowExport?: boolean): Promise { return await subtle.importKey('pkcs8', signKey, curveName, allowExport ?? false, ['sign']); } export async function importVerifyKeyRaw(verifyKey: ECDSA_P384_VerifyKey, allowExport?: boolean): Promise { return await subtle.importKey('raw', verifyKey, curveName, allowExport ?? false, ['verify']) } export async function exportVerifyKeyRaw(verifyKey: ECDSA_P384_VerifyKey): Promise{ const key = await importVerifyKeyRaw(verifyKey); return Buffer.from(await subtle.exportKey('raw', key)); } export async function importVerifyKey(verifyKey: ECDSA_P384_VerifyKey, allowExport?: boolean): Promise { return await subtle.importKey('spki', verifyKey, curveName, allowExport ?? false, ['verify']) } export async function genKey(): Promise<[ECDSA_PKCS8_P384_SignKey, ECDSA_P384_VerifyKey]> { const keyPair = await subtle.generateKey(curveName, true, ['sign', 'verify']); const signKey = subtle.exportKey('pkcs8', keyPair.privateKey); const verifyKey = subtle.exportKey('spki', keyPair.publicKey); return [Buffer.from(await signKey), Buffer.from(await verifyKey)]; } export async function pemFromVerifyKey(verifyKey: ECDSA_P384_VerifyKey): Promise { const subtleVerifyKey = await importVerifyKey(verifyKey, true); const spkiRaw = await subtle.exportKey('spki', subtleVerifyKey) return encodePEM(Buffer.from(spkiRaw), 'PUBLIC KEY'); } export function pemFromSignKey(signKey: ECDSA_PKCS8_P384_SignKey): string { return encodePEM(signKey, 'EC PRIVATE KEY'); } export async function verifyKeyFromSignKey(signKey: ECDSA_PKCS8_P384_SignKey): Promise { const subtleSignKey = await importSignKey(signKey, true); const jwk = await subtle.exportKey('jwk', subtleSignKey); delete jwk.d; delete jwk.dp; delete jwk.dq; delete jwk.q; delete jwk.qi; jwk.key_ops = ["verify"]; const subtleVerifyKey = await subtle.importKey('jwk', jwk, curveName, true, ['verify']); const verifyKey = await subtle.exportKey('spki', subtleVerifyKey); return Buffer.from(verifyKey); }