Files
suaveplan/packages/security-stack/crypto/crypto-rsa/src/keys/parse.md
2026-05-27 23:47:53 +01:00

2.0 KiB

keys/parse

Purpose

Public dispatcher entry-point unifying the four key-format parsers (PKCS#1, SPKI, PKCS#8, JWK) under one ergonomic call. Selects the underlying parser via a format discriminator on the options object, matching the round-trip pattern used elsewhere in the crypto family.

Features

  • parseRsaPublicKey(input, { format: "pkcs1" | "spki" | "jwk" }).
  • parseRsaPrivateKey(input, { format: "pkcs1" | "pkcs8" | "jwk" }).
  • Binary formats accept Uint8Array; JWK accepts object / JSON string / UTF-8 bytes.
  • default branches surface CRYPTO_RSA.UNSUPPORTED_FORMAT so any future format added to the type union without a switch arm fails loudly.

Usage: Basic Example

import { parseRsaPublicKey } from "@suaveplan/crypto-rsa";

const key = parseRsaPublicKey(spkiBytes, { format: "spki" });

Usage: Advanced Example

import {
    parseRsaPrivateKey,
    parseRsaPublicKey,
} from "@suaveplan/crypto-rsa";

const fromPkcs8 = parseRsaPrivateKey(pkcs8Bytes, { format: "pkcs8" });
const fromJwk = parseRsaPrivateKey(jwkObject, { format: "jwk" });
const fromJsonJwk = parseRsaPrivateKey(jwkJsonString, { format: "jwk" });

API Reference

parseRsaPublicKey(input, options): RsaPublicKey

Throws CRYPTO_RSA.INVALID_KEY when a non-Uint8Array is passed for the binary formats.

parseRsaPrivateKey(input, options): RsaPrivateKey

Same input/error contract on the private side.

Implementation Notes

The dispatcher is exhaustive over the literal union via assertNeverFormat, which TypeScript verifies statically. Adding a new format requires both a new type member and a new switch arm — the compiler enforces both. This is the only safe way to evolve a discriminated dispatcher without silently falling through to a default branch.

The requireBytes helper is shared between the PKCS#1/SPKI/PKCS#8 paths because they all consume Uint8Array. JWK input is forwarded through the JWK parser which handles its own normalisation.