Network Security Services ist die Bibliothek hinter Firefox, Thunderbird und mehreren Linux-Systemkomponenten, darunter WebCrypto in Firefox. NSS arbeitet über PKCS#11: Schlüssel liegen in einem Token (im eingebauten Softoken oder auf einer Smartcard oder einem HSM), und alles, was darüber liegt, ruft die Funktionen PK11_* auf. Die Fakten auf dieser Seite wurden mit dem Paket aus Alpine 3.24.2 geprüft, NSS 3.124, initialisiert ohne Schlüsseldatenbank (NSS_NoDB_Init).
ECDSA hat zwei Schichten, die unterschiedliche Kodierungen erzeugen. SEC_SignData und VFY_VerifyData in cryptohi hashen die Nachricht und verwenden DER, die Form, die X.509, CMS und OpenSSL erwarten. PK11_Sign und PK11_Verify nehmen einen Digest entgegen und verwenden die rohe r‖s-Form, auf P-256 64 Byte. Beides zu vermischen ist der klassische Fehler mit NSS; konvertiere mit dem Konverter DER ⇄ Raw. PK11_Sign akzeptierte auf P-256 außerdem einen 64-Byte-Digest und signierte dessen erste 32 Byte; übergib also einen Digest, der zur Kurve passt.
Nonces sind zufällig – zwei Signaturen derselben Nachricht unterschieden sich –, und s wird nicht normalisiert; eine High-S-Signatur bestand die Prüfung. Signieren und Prüfen mit ECDSA und SHA-256 funktionierten mit einem P-384-Schlüssel, der Hash ist also nicht an die Kurve gebunden. Fehlschläge lassen sich unterscheiden: Nachdem VFY_VerifyData SECFailure zurückgegeben hat, meldet PORT_GetError() für eine rohe oder abgeschnittene Signatur SEC_ERROR_BAD_DER und für eine gültige Signatur über andere Daten SEC_ERROR_BAD_SIGNATURE.
Das Softoken erzeugte Schlüssel nur auf P-256, P-384 und P-521; P-224 und secp256k1 scheiterten mit SEC_ERROR_INVALID_KEY. Ed25519 funktioniert über CKM_EC_EDWARDS_KEY_PAIR_GEN und CKM_EDDSA, Ed448 nicht. Die Kapselung mit ML-KEM-768 besteht den Roundtrip (PK11_Encapsulate, PK11_Decapsulate), während die Header ML-DSA-Mechanismen deklarieren, die das Softoken in diesem Build nicht anbietet. Vergleiche das KEM mit dem ML-KEM-Tool.