Bouncy Castle es dos cosas a la vez: un proveedor JCA (BC) que se integra en Signature, KeyPairGenerator y KEM, y API ligeras como ECDSASigner que funcionan sin la JCA. bcpkix añade certificados, CMS, OCSP y el PEMParser que el JDK sigue sin tener. La mayor parte del código de la JVM que trabaja con secp256k1, Brainpool, PGP o certificados depende de él.
Sus valores predeterminados de ECDSA coinciden con los del JDK: SHA256withECDSA produce DER con un nonce aleatorio y deja s sin normalizar, y la verificación acepta s en cualquiera de las dos mitades. Las diferencias están en nombres de algoritmo que hay que pedir expresamente. SHA256withPLAIN-ECDSA produce el r‖s en bruto de 64 bytes que espera JWS; SHA256withECDDSA firma de forma determinista, y el ECDSASigner ligero con un HMacDSAKCalculator reprodujo exactamente el vector de prueba del RFC 6979. Igual que con SunEC, una firma en bruto pasada al algoritmo DER lanza SignatureException en lugar de devolver false.
La cobertura de curvas es lo que trae aquí a la mayoría: con las curvas de P-224 a P-521, secp256k1 y las Brainpool r1 se firmó y se verificó, igual que con Ed25519 y Ed448. Registra el proveedor e indícalo por su nombre —KeyPairGenerator.getInstance("EC", "BC")—, porque, si no, se consulta primero el SunEC del JDK, que rechaza secp256k1, algo que el ejemplo evita.
La cobertura poscuántica de la 1.86 es la más amplia de las bibliotecas comprobadas: ML-KEM mediante javax.crypto.KEM, ML-DSA, SLH-DSA y LMS en el proveedor BC, y Falcon y XMSS en BCPQC. Prueba los algoritmos en la herramienta de firmas poscuánticas e inspecciona certificados híbridos con el inspector de certificados poscuánticos.
JcaPEMWriter escribe las claves privadas EC como SEC1 -----BEGIN EC PRIVATE KEY-----, que PEMParser vuelve a leer como un PEMKeyPair; las herramientas que esperan PKCS#8 necesitan que antes se convierta la clave. El conversor DER ⇄ en bruto ayuda cuando se confunden una firma PLAIN y una DER.