Bouncy Castle は 2 つの役割を兼ねています。Signature、KeyPairGenerator、KEM に組み込まれる JCA プロバイダー(BC)と、JCA なしで動作する ECDSASigner などの軽量 API です。bcpkix は証明書、CMS、OCSP、そして JDK にいまだにない PEMParser を追加します。secp256k1、Brainpool、PGP、証明書を扱う JVM のコードの大半は、このライブラリに依存しています。
ECDSA のデフォルトは JDK と同じです。SHA256withECDSA はランダムな nonce で DER を生成し、s を正規化しないまま残します。検証は low-S と high-S のどちらも受け入れます。JDK と異なる動作は、アルゴリズム名で明示的に選んだときだけ有効になります。SHA256withPLAIN-ECDSA は JWS が求める 64 バイトの生の r‖s を生成し、SHA256withECDDSA は決定的に署名します。また、軽量 API の ECDSASigner に HMacDSAKCalculator を指定すると、RFC 6979 のテストベクトルを正確に再現できました。SunEC と同様に、生の署名を DER 用のアルゴリズムに渡すと、false を返さずに SignatureException がスローされます。
多くの開発者がこのライブラリを選ぶ理由は、対応する曲線の幅広さです。P-224〜P-521、secp256k1、Brainpool の r1 曲線のすべてで署名と検証ができ、Ed25519 と Ed448 にも対応しています。プロバイダーを登録したうえで、KeyPairGenerator.getInstance("EC", "BC") のように名前で指定してください。指定しないと JDK の SunEC が先に参照され、secp256k1 を拒否します。サンプルではこれを回避しています。
1.86 のポスト量子暗号への対応は、チェックしたライブラリの中で最も幅広いものです。BC プロバイダーでは javax.crypto.KEM 経由の ML-KEM、ML-DSA、SLH-DSA、LMS が、BCPQC では Falcon と XMSS が使えます。ポスト量子署名ラボでアルゴリズムを試し、PQ 証明書インスペクターでハイブリッド証明書を解析してください。
JcaPEMWriter は EC 秘密鍵を SEC1 の -----BEGIN EC PRIVATE KEY----- として書き出し、PEMParser はそれを PEMKeyPair として読み戻します。PKCS#8 を前提とするツールでは、先に鍵を変換する必要があります。PLAIN 署名と DER 署名を取り違えたときは、DER ⇄ 生形式の変換ツールが役立ちます。