All notable changes are listed here. The format follows Keep a Changelog and versions follow Semantic Versioning.
Unreleased
0.1.0-preview.1 - 2026-11-01
First preview of RecursiveAI.OneCrypto, the core package. The API is not stable yet. This library has not been independently audited. What is tested, against what, and the documented deviations: docs/conformance.md.
Added
- ASN.1 (
RecursiveAI.OneCrypto.Asn1): BER, CER and DER readers over spans and streams (indefinite lengths in constant memory), DER and streaming BER writers, limits on by default, typed errors withTryforms. PEM (RFC 7468). - Primitives the platform lacks (
RecursiveAI.OneCrypto.Primitives): Ed25519 (with ctx and ph) and Ed448 (with ph), X25519 and X448; OCB3, EAX and AES key wrap; Argon2d/i/id, scrypt and bcrypt-pbkdf with cost limits; Camellia; CAST5, IDEA, Blowfish and Twofish for decryption only. Secret-handling code avoids secret-dependent branches and table indices. - Platform dispatch: the platform's own algorithms first; verify-only RSA and ECDSA, SHA-3/SHAKE and ChaCha20-Poly1305 fallbacks only where the platform has none; otherwise
AlgorithmNotSupportedExceptionnaming the algorithm and platform. A generated availability table per platform (docs/availability.md). - CMS (RFC 5652 and successors): SignedData, EnvelopedData, AuthEnvelopedData, AuthenticatedData, EncryptedData, DigestedData and CompressedData; every RecipientInfo form including KEMRecipientInfo with ML-KEM (preview); RSA PKCS#1 v1.5 and PSS, ECDSA, Ed25519, Ed448 and ML-DSA signers; countersignatures and ESS signing-certificate attributes; per-signer verification reports; decryption that fails closed; streaming sign, verify, encrypt and decrypt in constant memory with synchronous and asynchronous forms; two-phase signing (
PreparedSignedData). - PKCS#8 (plain and encrypted, PBES2 with PBKDF2 or scrypt), PKCS#12 read and write (PBMAC1 and the classic MAC; legacy PBEs read only), legacy PEM private keys, and OpenSSH public keys, private keys and certificates (
RecursiveAI.OneCrypto.Wire.Ssh). - Issuer side in core, as I/O-free handlers over the key interfaces with two-phase signing throughout:
CertificateAuthority(profiles as data: root, intermediate, TLS server/client, S/MIME, code signing, OCSP signing, time-stamping; issuance from a CSR or a key; unpredictable serials; AKI/SKI, AIA and CRL-DP; CRLs and delta CRLs with numbers, reasons and issuing distribution point; the TLS validity schedule of the CA/Browser Forum requirements),TimeStampRequest/TimeStampResponse/TstInfo,TimeStampVerifier(structured report per RFC 3161 rule, the authority's certificate validated byPathValidatoragainst caller-supplied anchors) andTimeStampAuthority(RFC 3161/5816 handler with serial source, accuracy, policy selection and failure info), andOcspResponder(RFC 6960 handler: CA or delegated responder, byName/byKey, nonce, multi-request, preproduced responses, errors as statuses). Two-way with OpenSSL 3.5.9ts,ocsp,verifyandcrl. Docs:docs/issuance.md,docs/tsp.md,docs/ocsp-responder.md. SignedDataVerifyOptions.Chain: each signer and countersigner of a SignedData is validated by the path validator, with the message's certificates, CRLs and OCSP responses as untrusted input;SignerReport.Chainholds the validator's report and thechaincheck summarises it.Crypto.Load: one call that takes bytes, a stream or a path and returns what a key or certificate file holds, typed (LoadedItems): certificates and chains, CRLs, certification requests, OCSP responses, public keys, private keys as usableISigningKey/IDecryptionKey/IAgreementKey, PKCS#7 certificate bags, PKCS#12 contents, OpenSSH keys, certificates andauthorized_keys, from PEM or DER by a fixed decision table. A password callback is asked at most once per distinct secret. Bad input raisesCryptoLoadException(orCrypto.TryLoad) with the formats considered. Seedocs/load.md.CryptoPolicy(Standard,Strict, dated SHA-1/MD5/RSA rules, explicit reference time, decisions with rule ids and references); key interfaces (ISigningKey,IDecryptionKey,IAgreementKey,IRsaKey) with in-memory, library-curve and operating-system backends (PrivateKey);SignatureSpec; serialisable two-phase signing (PreparedSignature) with two-phase certificates, requests and revocation lists. RSASSA-PSS certificates with any salt length or MGF1 hash now verify.- X.509 models in the root namespace, immutable and lossless over the received octets:
Certificate(withX509Certificate2conversion both ways),CertificateSigningRequest,CertificateRevocationList(complete, delta and indirect),OcspRequest,OcspResponse,OcspBasicResponseand read-onlyAttributeCertificate, with names (RFC 4514), general names, public keys and typed values for the RFC 5280 extensions; builders for certificates, requests, CRLs and OCSP messages that sign throughX509Signer; structured signature results. Seedocs/x509.md. - The RFC 5280 path builder and validator (
RecursiveAI.OneCrypto.Validation), as a preview: per-rule reports for every path tried, revocation from supplied CRLs and OCSP responses (offline is never "good"), validation at any instant, an opt-in server-authentication profile and an opt-in side-by-side report from the platform's chain engine. It has had an internal review; its follow-ups are still landing, so don't rely on it for trust decisions yet. - Platform gaps in AES-GCM, AES-CCM, named curves (for example Brainpool on macOS) and ML-KEM/ML-DSA keys now surface as
AlgorithmNotSupportedExceptionnaming the algorithm and platform, never the platform's ownPlatformNotSupportedException; the availability table lists AES-GCM and AES-CCM (macOS has no AES-CCM; AuthEnvelopedData defaults to AES-256-GCM and writes CCM only when asked). - Package metadata, package validation, NativeAOT and browser-wasm smoke apps, fuzz targets for every parser, and benchmarks against the managed libraries this one replaces.