aws-lc-rs は、Amazon による BoringSSL のフォークである AWS-LC を、ring をモデルにした API で公開しており、ほとんどの ring のコードはクレート名を変えるだけでコンパイルできます。rustls のデフォルトの暗号プロバイダーであり、FIPS 140-3 の認証(fips フィーチャー)やポスト量子アルゴリズムを必要とする Rust のサービスが採用するライブラリです。C ライブラリはビルド時にコンパイルされます。チェックでは、素の rust イメージでデフォルトのフィーチャーを使って 1.18.2 をビルドしました。
署名のエンコーディングは ring とまったく同じように動作します。*_FIXED 定数は 64 バイトの生の r‖s を生成・受理し、*_ASN1 定数は DER を扱います。生の署名は ASN1 の検証用定数では失敗しました。nonce はランダムで、s は正規化されず、検証は low-S と high-S のどちらも受け入れます。ring の P-256 と P-384 に加え、P-521 と secp256k1 でも、SHA-2 と SHA-3 の各バリアントで署名と検証ができます。
1.18.2 ではポスト量子アルゴリズムが安定版 API に含まれています(チェックは unstable フィーチャーなしでビルドしました)。aws_lc_rs::kem に ML-KEM-512、ML-KEM-768、ML-KEM-1024 が、aws_lc_rs::signature に ML-DSA-44、ML-DSA-65、ML-DSA-87 があり、サンプルではこれらを使っています。サンプルが出力するサイズ(ML-DSA-65 では公開鍵 1952 バイトと署名 3309 バイト、ML-KEM-768 では暗号文 1088 バイト)は、証明書、トークン、ハンドシェイクが運ばなければならない量です。ポスト量子署名ラボと KEM ラボでは、これらを従来のアルゴリズムと比較できます。
鍵の読み込みは ring より幅広く対応しています。ECDSA の鍵は PKCS#8、SEC1(RFC 5915)の DER、公開鍵付きの生のスカラーから、公開鍵は SPKI の DER と、圧縮・非圧縮の SEC1 の点から読み込めます。ring と異なり、Ed25519KeyPair::from_pkcs8 は OpenSSL が書き出す 48 バイトの PKCS#8 v1 形式を受け入れました。
FIXED/ASN1 の取り違えが疑われるときは DER ⇄ 生形式の変換ツールを、ハイブリッドのポスト量子鍵交換の設定には TLS 設定生成ツールを使ってください。