Recursive AI

Changelog

All onecrypto docs

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 with Try forms. 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 AlgorithmNotSupportedException naming 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 by PathValidator against caller-supplied anchors) and TimeStampAuthority (RFC 3161/5816 handler with serial source, accuracy, policy selection and failure info), and OcspResponder (RFC 6960 handler: CA or delegated responder, byName/byKey, nonce, multi-request, preproduced responses, errors as statuses). Two-way with OpenSSL 3.5.9 ts, ocsp, verify and crl. 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.Chain holds the validator's report and the chain check 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 usable ISigningKey/IDecryptionKey/IAgreementKey, PKCS#7 certificate bags, PKCS#12 contents, OpenSSH keys, certificates and authorized_keys, from PEM or DER by a fixed decision table. A password callback is asked at most once per distinct secret. Bad input raises CryptoLoadException (or Crypto.TryLoad) with the formats considered. See docs/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 (with X509Certificate2 conversion both ways), CertificateSigningRequest, CertificateRevocationList (complete, delta and indirect), OcspRequest, OcspResponse, OcspBasicResponse and read-only AttributeCertificate, 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 through X509Signer; structured signature results. See docs/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 AlgorithmNotSupportedException naming the algorithm and platform, never the platform's own PlatformNotSupportedException; 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.