Zum Inhalt springen
ecdsa.com
C

wolfSSL (wolfCrypt)

Die Embedded-TLS-Bibliothek wolfSSL und die Kryptobibliothek wolfCrypt: DER-kodiertes ECDSA über einen Digest, den du selbst lieferst, ein Prüfaufruf mit getrenntem Rückgabecode und Prüfergebnis – und ein Funktionsumfang, der vollständig davon abhängt, wie die Bibliothek gebaut wurde.
Lizenz
GPL-3.0-only
Geprüfte Version
5.9.4 ·
Quellcode
github.com/wolfSSL/wolfssl
Dokumentation
www.wolfssl.com/documentation/manuals/wolfssl/

Kompatibilität auf einen Blick

ECDSAEdDSAPost-Quanten-Verfahren

ECDSA-Kurven
P-224P-256P-384P-521
EdDSA
Ed25519

wolfSSL zielt auf Embedded-Systeme und FIPS-Umgebungen, und fast alles ist eine Option zur Kompilierzeit: Kurven, EdDSA-Varianten, deterministische Nonces, Post-Quanten-Algorithmen und PEM-Unterstützung kommen und gehen mit den Flags von ./configure. Die Fakten auf dieser Seite beschreiben das Paket von wolfSSL 5.9.4 aus Alpine 3.24.2, gebaut mit HAVE_ECC, HAVE_ED25519, HAVE_CURVE25519 und WOLFSSL_HAVE_MLKEM, aber ohne HAVE_ED448, HAVE_DILITHIUM, Koblitz- oder Brainpool-Kurven und ohne WOLFSSL_ECDSA_DETERMINISTIC_K. Ein eigener Build kann sich in jedem dieser Punkte unterscheiden.

wc_ecc_sign_hash signiert einen Digest, den du berechnet hast, und gibt DER zurück; wc_ecc_verify_hash_ex nimmt für rohe Signaturen r und s als Ganzzahlen entgegen. Die Prüfung liefert zwei Ausgaben: Der Rückgabecode der Funktion sagt, ob sie ausgeführt werden konnte, und das Argument int *res enthält das Prüfergebnis. Eine rohe 64-Byte-Signatur, an wc_ecc_verify_hash übergeben, lieferte -171 (ECC ASN1 bad key data, invalid input) mit dem Prüfergebnis 0; Code, der nur den Rückgabecode oder nur das Prüfergebnis auswertet, behandelt einen der beiden Fälle falsch. Das Beispiel gibt beides aus.

In diesem Build sind Nonces zufällig (deterministisches Signieren nach RFC 6979 braucht WOLFSSL_ECDSA_DETERMINISTIC_K), s wird nicht normalisiert, und High-S-Signaturen bestehen die Prüfung. Die verfügbaren Kurven reichten von P-224 bis P-521; secp256k1 und Brainpool fehlen, sofern sie nicht aktiviert werden. Ed25519 funktioniert, und mit ML-KEM-768 gelangen Kapselung und Entkapselung über wc_MlKemKey_*; ML-DSA (Dilithium) ist in diesem Build nicht enthalten.

Schlüssel werden als DER ausgetauscht: wc_EccPublicKeyToDer schreibt SPKI und wc_EccKeyToDer einen ECPrivateKey im SEC1-Format; die Umwandlung in PEM (wc_DerToPem) ist verfügbar, weil das Paket WOLFSSL_DER_TO_PEM setzt. Das Alpine-Paket deklariert seine Lizenz als GPL-3.0-only; kommerzielle Lizenzen verkauft wolfSSL Inc. separat. Vergleiche Kodierungen mit denen anderer Stacks im Konverter DER ⇄ Raw.

Fakten und die Prüfungen dahinter

Nichts im Folgenden ist aus einer Dokumentation abgeschrieben. Das Prüfskript content/libraries/verify/wolfssl/run.sh hat wolfSSL (wolfCrypt) 5.9.4 am 20. Oktober 2026 im Container-Image alpine:3.24.2 ausgeführt; die Seite muss mit seiner Ausgabe übereinstimmen, und jeder Fakt führt die zugehörigen Zeilen auf.

  • Kodierung von ECDSA-Signaturen

    der

    wc_ecc_sign_hash gibt DER zurück; wc_ecc_verify_hash_ex prüft r und s, übergeben als Ganzzahlen.

    Von der Prüfung aufgezeichnet
    fact ecdsa-signature-encoding = der
    evidence ecdsa-signature-encoding: wc_ecc_verify_hash_ex with r and s as integers verifies: 1
  • ECDSA-Nonce

    random

    Zufällige Nonce in diesem Build, dem WOLFSSL_ECDSA_DETERMINISTIC_K fehlt.

    Von der Prüfung aufgezeichnet
    fact ecdsa-nonce = random
    evidence ecdsa-nonce: this build lacks WOLFSSL_ECDSA_DETERMINISTIC_K, so RFC 6979 signing is not available
  • 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

    Eine DER-Signatur, in der s durch n − s ersetzt war, bestand die Prüfung.

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

    takes-digest

    wc_ecc_sign_hash und wc_ecc_verify_hash arbeiten mit einem Digest, den der Aufrufer berechnet hat.

    Von der Prüfung aufgezeichnet
    fact ecdsa-prehash = takes-digest
    evidence ecdsa-prehash: wc_ecc_sign_hash and wc_ecc_verify_hash take a digest the caller computed
  • Fehlerhafte ECDSA-Signatur

    returns-error

    Bei einer rohen r‖s-Signatur gab wc_ecc_verify_hash -171 (ECC ASN1 bad key data, invalid input) mit dem Prüfergebnis 0 zurück.

    Von der Prüfung aufgezeichnet
    fact ecdsa-malformed-signature = returns-error
    evidence ecdsa-malformed-signature: wc_ecc_verify_hash on raw r||s: return code -171 (ECC ASN1 bad key data, invalid input), result 0
  • ECDSA-Kurven

    P-224P-256P-384P-521

    P-224, P-256, P-384 und P-521 in diesem Build; das Erzeugen von Schlüsseln für secp256k1 und brainpoolP256r1 schlug fehl.

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

    Ed25519

    Ed25519; HAVE_ED448 ist in diesem Build nicht gesetzt.

    Von der Prüfung aufgezeichnet
    fact eddsa = Ed25519
    evidence eddsa: HAVE_ED448 is not set in this build
  • Post-Quanten-Algorithmen

    ML-KEM

    ML-KEM-768 bestand den Roundtrip über wc_MlKemKey_*; HAVE_DILITHIUM (ML-DSA) ist in diesem Build nicht gesetzt.

    Von der Prüfung aufgezeichnet
    fact pqc = ML-KEM
    evidence pqc: HAVE_DILITHIUM (ML-DSA) is not set in this build
  • Formate öffentlicher Schlüssel

    spki-der

    wc_EccPublicKeyToDer und wc_EccPublicKeyDecode verarbeiten SPKI-DER, und mit dem dekodierten Schlüssel bestand eine Signatur die Prüfung.

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

    sec1-der

    wc_EccKeyToDer schreibt einen ECPrivateKey im SEC1-Format (121 Byte bei P-256), den wc_EccPrivateKeyDecode wieder einliest.

    Von der Prüfung aufgezeichnet
    fact private-key-formats = sec1-der
    evidence private-key-formats: wc_EccKeyToDer writes a SEC1 ECPrivateKey of 121 bytes
    evidence private-key-formats: WOLFSSL_DER_TO_PEM is set in this build

Verwendung

Hashe, signiere mit P-256 und prüfe; ausgegeben werden sowohl der Rückgabecode als auch das Prüfergebnis.
#include <wolfssl/options.h>
#include <wolfssl/wolfcrypt/ecc.h>
#include <wolfssl/wolfcrypt/random.h>
#include <wolfssl/wolfcrypt/sha256.h>
#include <stdio.h>

int main(void) {
    WC_RNG rng;
    ecc_key key;
    unsigned char digest[32], sig[ECC_MAX_SIG_SIZE];
    word32 sig_len = sizeof sig;
    int verified = 0;
    const unsigned char msg[] = "order #1042 approved";

    wc_InitRng(&rng);
    wc_ecc_init(&key);
    wc_ecc_make_key_ex(&rng, 32, &key, ECC_SECP256R1);

    /* wolfCrypt signs a digest you computed and returns DER. */
    wc_Sha256Hash(msg, sizeof msg - 1, digest);
    wc_ecc_sign_hash(digest, sizeof digest, sig, &sig_len, &rng, &key);
    /* The return code says whether verification ran; "verified" holds the verdict. */
    int rc = wc_ecc_verify_hash(sig, sig_len, digest, sizeof digest, &verified, &key);
    printf("rc: %d, verified: %d, DER starts with 0x%02x\n", rc, verified, sig[0]);

    wc_ecc_free(&key);
    wc_FreeRng(&rng);
    return 0;
}

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

Einrichtung
apk add --no-cache -q build-base wolfssl-dev=5.9.4-r0 >/dev/null
Befehl
cc -o usage usage.c -lwolfssl && ./usage
Ausgabe muss passen (regulärer Ausdruck)
rc: 0, verified: 1, DER starts with 0x30

Bibliotheken