## @strpc 기존 RPC를 package화 ### @strpc/express express의 middleware + router 결함 ## @sammo 게임 전체 - server, client - gateway_server, gateway_client
62 lines
2.4 KiB
TypeScript
62 lines
2.4 KiB
TypeScript
|
|
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<CryptoKey> {
|
|
return await subtle.importKey('pkcs8', signKey, curveName, allowExport ?? false, ['sign']);
|
|
}
|
|
|
|
export async function importVerifyKeyRaw(verifyKey: ECDSA_P384_VerifyKey, allowExport?: boolean): Promise<CryptoKey> {
|
|
return await subtle.importKey('raw', verifyKey, curveName, allowExport ?? false, ['verify'])
|
|
}
|
|
|
|
export async function exportVerifyKeyRaw(verifyKey: ECDSA_P384_VerifyKey): Promise<Buffer>{
|
|
const key = await importVerifyKeyRaw(verifyKey);
|
|
return Buffer.from(await subtle.exportKey('raw', key));
|
|
}
|
|
|
|
export async function importVerifyKey(verifyKey: ECDSA_P384_VerifyKey, allowExport?: boolean): Promise<CryptoKey> {
|
|
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<string> {
|
|
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<ECDSA_P384_VerifyKey> {
|
|
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);
|
|
} |