node-forge grew up as a JavaScript TLS implementation and is mostly used today for its PKI pieces: generating and parsing X.509 certificates and CSRs, reading and writing PKCS#12 bundles, RSA encryption and signatures, and an ASN.1 parser. It runs the same in browsers and Node.js and has no native code.
It has no elliptic-curve support beyond Ed25519. forge.pki exposes only rsa and ed25519, and the check confirmed the consequence: certificateFromPem() on an ECDSA certificate throws Cannot read public key. OID is not RSA., and publicKeyFromPem() on an EC public key throws Cannot read public key. Unknown OID. — even though the same bytes parse fine with forge's own ASN.1 reader. Code that inspects certificates from the wild meets ECDSA keys all the time and needs another parser for them; node:crypto's X509Certificate or the certificate decoder handle both key types.
For RSA it interoperates cleanly once the parameters match. PKCS#1 v1.5 and PSS signatures made by forge verified with node:crypto; PSS needs the digest, the MGF1 digest and the salt length to agree on both sides, and forge makes you name all three, as the sample does. Keys load from SPKI, PKCS#1 and certificate PEM, private keys from PKCS#8, encrypted PKCS#8, PKCS#1 and PKCS#12 — open bundles in the PFX inspector to see what they contain.
Ed25519 signatures from forge were byte-identical to node:crypto's for the same seed. Its private key is the 64-byte expanded form — the seed followed by the public key — so libraries that expect the 32-byte seed need only the first half.
Signature verification has a history of parser leniency, and one case is still open. Advisory GHSA-86w9-cpqp-85rv (CVE-2026-85393), published in September 2026 with no fixed release, reports that RSA PKCS#1 v1.5 verification in versions up to 1.4.0 ignores extra elements inside the DigestInfo's algorithm identifier, which makes signatures forgeable under keys with a small public exponent such as 3. The check reproduced the leniency: a correctly padded block with an extra element there verified in forge and was rejected by node:crypto. Until a fix ships, verify PKCS#1 v1.5 signatures with node:crypto or WebCrypto, and avoid RSA keys with exponent 3. 1.4.0 itself fixed the previous round — an extra field after the digest and non-canonical Ed25519 signatures were both rejected — and versions before 1.3.0 had earlier signature-forgery bugs (CVE-2022-24771, CVE-2022-24772).