74 lines
2.2 KiB
TypeScript
74 lines
2.2 KiB
TypeScript
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) } }
|
|
);
|
|
}
|