Zum Inhalt springen
ecdsa.com
Rust

aws-lc-rs

aws-lc-rs von AWS, eine ring-kompatible Rust-API über der C-Bibliothek AWS-LC: dieselben Kodierungskonstanten FIXED/ASN1 wie ring, dazu P-521, secp256k1, ML-KEM und ML-DSA in der stabilen API sowie ein optionaler Build nach FIPS 140-3.
Lizenz
ISC AND (Apache-2.0 OR ISC)
Geprüfte Version
1.18.2 ·
Quellcode
github.com/aws/aws-lc-rs
Dokumentation
docs.rs/aws-lc-rs/1.18.2/aws_lc_rs/

Kompatibilität auf einen Blick

ECDSAEdDSAPost-Quanten-Verfahren

ECDSA-Kurven
P-256P-384P-521secp256k1
EdDSA
Ed25519
Formate öffentlicher Schlüssel
spki-dersec1-uncompressedsec1-compressed
Formate privater Schlüssel
pkcs8-dersec1-derraw-scalar

aws-lc-rs stellt AWS-LC – Amazons Fork von BoringSSL – über eine API nach dem Vorbild von ring bereit, sodass sich der meiste ring-Code nach dem Ändern des Crate-Namens kompilieren lässt. aws-lc-rs ist der Standard-Kryptoprovider von rustls und die Bibliothek, zu der Rust-Dienste greifen, wenn sie eine Validierung nach FIPS 140-3 (Feature fips) oder Post-Quanten-Algorithmen brauchen. Die C-Bibliothek wird während des Builds kompiliert; für die Prüfung wurde 1.18.2 mit den Standard-Features im einfachen Image rust gebaut.

Die Signaturkodierungen funktionieren genau wie in ring: Die Konstanten *_FIXED erzeugen und akzeptieren 64 Byte rohes r‖s, die Konstanten *_ASN1 DER, und eine rohe Signatur scheiterte mit der ASN1-Prüfkonstante. Die Nonces sind zufällig, s wird nicht normalisiert, und die Prüfung akzeptiert beide Hälften (Low-S und High-S). Über P-256 und P-384 von ring hinaus signiert und prüft aws-lc-rs auch mit P-521 und secp256k1, jeweils mit Varianten für SHA-2 und SHA-3.

Post-Quanten-Algorithmen gehören in 1.18.2 zur stabilen API – für die Prüfung wurde ohne das Feature unstable gebaut: ML-KEM-512, ML-KEM-768 und ML-KEM-1024 in aws_lc_rs::kem sowie ML-DSA-44, ML-DSA-65 und ML-DSA-87 in aws_lc_rs::signature, die das Beispiel verwendet. Die Größen, die es ausgibt – ein öffentlicher Schlüssel mit 1.952 Byte und eine Signatur mit 3.309 Byte bei ML-DSA-65, ein Chiffrat mit 1.088 Byte bei ML-KEM-768 –, müssen Zertifikate, Tokens und Handshakes transportieren; der Playground für Post-Quanten-Signaturen und der KEM-Playground vergleichen sie mit klassischen Algorithmen.

Beim Laden von Schlüsseln ist aws-lc-rs vielseitiger als ring: ECDSA-Schlüssel lassen sich aus PKCS#8, SEC1-DER (RFC 5915) und einem rohen Skalar samt öffentlichem Schlüssel laden, öffentliche Schlüssel aus SPKI-DER und SEC1-Punkten, komprimiert oder nicht. Anders als in ring akzeptierte Ed25519KeyPair::from_pkcs8 hier die 48 Byte lange PKCS#8-v1-Form, die OpenSSL schreibt.

Nutze den Konverter DER ⇄ Raw, wenn du eine Verwechslung von FIXED und ASN1 vermutest, und den TLS-Konfigurationsgenerator für Einstellungen zum hybriden Post-Quanten-Schlüsselaustausch.

Fakten und die Prüfungen dahinter

Nichts im Folgenden ist aus einer Dokumentation abgeschrieben. Das Prüfskript content/libraries/verify/aws-lc-rs/run.sh hat aws-lc-rs 1.18.2 am 20. Oktober 2026 im Container-Image rust:1.99.1-trixie ausgeführt; die Seite muss mit seiner Ausgabe übereinstimmen, und jeder Fakt führt die zugehörigen Zeilen auf.

  • Kodierung von ECDSA-Signaturen

    der-or-raw

    Die Konstanten *_FIXED signieren als 64 Byte rohes r‖s, die Konstanten *_ASN1 als DER; eine rohe Signatur bestand die Prüfung mit der ASN1-Konstante nicht.

    Von der Prüfung aufgezeichnet
    fact ecdsa-signature-encoding = der-or-raw
    evidence ecdsa-signature-encoding: FIXED signs 64 bytes; the same bytes verify under the ASN1 constant: false
  • ECDSA-Nonce

    random

    Zufällige Nonce: Zwei Signaturen derselben Nachricht unterscheiden sich.

    Von der Prüfung aufgezeichnet
    fact ecdsa-nonce = random
  • Low-S beim Signieren

    either

    s wird nicht normalisiert: Unter 64 Signaturen traten High-S-Werte auf.

    Von der Prüfung aufgezeichnet
    fact ecdsa-low-s-sign = either
  • High-S bei der Prüfung

    accepts-high-s

    Der FIXED-Verifizierer akzeptierte die Signatur, in der s durch n − s ersetzt war.

    Von der Prüfung aufgezeichnet
    fact ecdsa-low-s-verify = accepts-high-s
  • Was der Signaturaufruf hasht

    hashes-message

    Die Nachricht wird mit dem Algorithmus gehasht, den die Konstante nennt (Varianten mit SHA-2 oder SHA-3).

    Von der Prüfung aufgezeichnet
    fact ecdsa-prehash = hashes-message
  • Fehlerhafte ECDSA-Signatur

    returns-error

    Die Prüfung gibt bei fehlerhaften oder falschen Signaturen einen Fehlerwert zurück.

    Von der Prüfung aufgezeichnet
    fact ecdsa-malformed-signature = returns-error
  • ECDSA-Kurven

    P-256P-384P-521secp256k1

    Signieren und Prüfen funktionierten mit P-256, P-384, P-521 und secp256k1.

    Von der Prüfung aufgezeichnet
    fact ecdsa-curves = P-256, P-384, P-521, secp256k1
  • EdDSA

    Ed25519

    Ed25519.

    Von der Prüfung aufgezeichnet
    fact eddsa = Ed25519
  • Ed25519-Schlüssel in PKCS #8 v1

    accepted

    Ed25519KeyPair::from_pkcs8 akzeptierte einen 48 Byte langen Ed25519-Schlüssel in PKCS#8 v1, den ring ablehnt.

    Von der Prüfung aufgezeichnet
    fact ed25519-pkcs8-v1 = accepted
    evidence ed25519-pkcs8-v1: 48-byte PKCS#8 v1 Ed25519 key with from_pkcs8: Ok("ok")
  • Post-Quanten-Algorithmen

    ML-KEMML-DSA

    Kapselung und Entkapselung mit ML-KEM-512/768/1024 sowie Signieren und Prüfen mit ML-DSA-44/65/87 funktionierten, gebaut ohne das Feature unstable.

    Von der Prüfung aufgezeichnet
    fact pqc = ML-KEM, ML-DSA
    evidence pqc: ML-KEM-512/768/1024 via aws_lc_rs::kem; ML-DSA-44/65/87 via aws_lc_rs::signature
  • Formate öffentlicher Schlüssel

    spki-dersec1-uncompressedsec1-compressed

    SPKI als DER über ParsedPublicKey sowie SEC1-Punkte, komprimiert oder unkomprimiert.

    Von der Prüfung aufgezeichnet
    fact public-key-formats = spki-der, sec1-uncompressed, sec1-compressed
  • Formate privater Schlüssel

    pkcs8-dersec1-derraw-scalar

    PKCS#8 als DER, SEC1 (RFC 5915) als DER und ein roher Skalar zusammen mit seinem öffentlichen Schlüssel.

    Von der Prüfung aufgezeichnet
    fact private-key-formats = pkcs8-der, sec1-der, raw-scalar

Verwendung

Signiere und prüfe mit ML-DSA-65, führe eine ML-KEM-768-Kapselung durch und gib die Größen von Schlüssel, Signatur und Chiffrat aus.
use aws_lc_rs::kem::{DecapsulationKey, ML_KEM_768};
use aws_lc_rs::signature::{self, KeyPair, PqdsaKeyPair, UnparsedPublicKey};

fn main() {
    // ML-DSA-65 (FIPS 204) through the stable signature API.
    let key = PqdsaKeyPair::generate(&signature::ML_DSA_65_SIGNING).unwrap();
    let message = b"release v2.0 manifest";
    let mut sig = vec![0u8; signature::ML_DSA_65_SIGNING.signature_len()];
    let len = key.sign(message, &mut sig).unwrap();
    let ok = UnparsedPublicKey::new(&signature::ML_DSA_65, key.public_key().as_ref()).verify(message, &sig[..len]);
    println!("ML-DSA-65: public key {} bytes, signature {len} bytes, verified {}", key.public_key().as_ref().len(), ok.is_ok());

    // ML-KEM-768 (FIPS 203): the receiver publishes the encapsulation key.
    let receiver = DecapsulationKey::generate(&ML_KEM_768).unwrap();
    let (ciphertext, sender_secret) = receiver.encapsulation_key().unwrap().encapsulate().unwrap();
    let receiver_secret = receiver.decapsulate(ciphertext.as_ref().into()).unwrap();
    println!("ML-KEM-768: ciphertext {} bytes, shared secrets match {}", ciphertext.as_ref().len(), sender_secret.as_ref() == receiver_secret.as_ref());
}

Die Snippet-Testumgebung führt jedes Beispiel unverändert im Container-Image rust:1.99.1-trixie aus, und der Lauf schlägt fehl, wenn die Ausgabe nicht übereinstimmt.

Befehl
cargo run --quiet --release
Ausgabe muss passen (regulärer Ausdruck)
ML-DSA-65: public key 1952 bytes, signature 3309 bytes, verified true\nML-KEM-768: ciphertext 1088 bytes, shared secrets match true

Bibliotheken