import { CRYPTO_RSA_CODES, CryptoRsaError } from "../errors/errors.js"; import type { RsaJwk, RsaPrivateKey, RsaPrivateKeyFormat, RsaPublicKey, RsaPublicKeyFormat, } from "./keys.types.js"; import { serializeRsaPrivateKeyJwk, serializeRsaPublicKeyJwk, } from "./serialize-jwk.js"; import { serializeRsaPrivateKeyPkcs1 } from "./serialize-pkcs1-private.js"; import { serializeRsaPublicKeyPkcs1 } from "./serialize-pkcs1-public.js"; import { serializeRsaPrivateKeyPkcs8 } from "./serialize-pkcs8.js"; import { serializeRsaPublicKeySpki } from "./serialize-spki.js"; export interface SerializeRsaPublicKeyOptions { readonly format: RsaPublicKeyFormat; } export interface SerializeRsaPrivateKeyOptions { readonly format: RsaPrivateKeyFormat; } /** * Façade dispatcher for public-key serialisation. Returns `Uint8Array` for * binary formats (`pkcs1`, `spki`) and a structured `RsaJwk` object for the * JWK format. */ export function serializeRsaPublicKey( key: RsaPublicKey, options: SerializeRsaPublicKeyOptions ): Uint8Array | RsaJwk { switch (options.format) { case "pkcs1": return serializeRsaPublicKeyPkcs1(key); case "spki": return serializeRsaPublicKeySpki(key); case "jwk": return serializeRsaPublicKeyJwk(key); default: return assertNeverFormat(options.format); } } /** * Façade dispatcher for private-key serialisation. Returns `Uint8Array` for * binary formats (`pkcs1`, `pkcs8`) and a structured `RsaJwk` for JWK. */ export function serializeRsaPrivateKey( key: RsaPrivateKey, options: SerializeRsaPrivateKeyOptions ): Uint8Array | RsaJwk { switch (options.format) { case "pkcs1": return serializeRsaPrivateKeyPkcs1(key); case "pkcs8": return serializeRsaPrivateKeyPkcs8(key); case "jwk": return serializeRsaPrivateKeyJwk(key); default: return assertNeverFormat(options.format); } } function assertNeverFormat(value: never): never { throw new CryptoRsaError( CRYPTO_RSA_CODES.UNSUPPORTED_FORMAT, "error.crypto-rsa.unsupported-format.unknown", { context: { value: String(value) } } ); }