Aller au contenu
ecdsa.com
C

wolfSSL (wolfCrypt)

La bibliothèque TLS embarquée de wolfSSL et sa bibliothèque wolfCrypt : ECDSA en DER sur un condensat que vous fournissez, avec un appel de vérification dont le code de retour et le verdict sont distincts, et un ensemble de fonctionnalités qui dépend entièrement du build.
Licence
GPL-3.0-only
Version vérifiée
5.9.4 ·
Code source
github.com/wolfSSL/wolfssl
Documentation
www.wolfssl.com/documentation/manuals/wolfssl/

Compatibilité en un coup d’œil

ECDSAEdDSAPost-quantique

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

wolfSSL cible les systèmes embarqués et les déploiements FIPS, et presque tout y est une option de compilation : courbes, variantes d’EdDSA, nonces déterministes, algorithmes post-quantiques et prise en charge de PEM apparaissent ou disparaissent selon les options de ./configure. Les faits présentés ici décrivent le paquet Alpine 3.24.2 de wolfSSL 5.9.4, compilé avec HAVE_ECC, HAVE_ED25519, HAVE_CURVE25519 et WOLFSSL_HAVE_MLKEM, mais sans HAVE_ED448, sans HAVE_DILITHIUM, sans courbes Koblitz ou Brainpool et sans WOLFSSL_ECDSA_DETERMINISTIC_K. Un build personnalisé peut différer sur chacun de ces points.

wc_ecc_sign_hash signe un condensat que vous avez calculé et renvoie du DER ; wc_ecc_verify_hash_ex prend r et s sous forme d’entiers pour les signatures brutes. La vérification a deux sorties : le code de retour de la fonction indique si elle a pu s’exécuter, et l’argument int *res contient le verdict. Une signature brute de 64 octets passée à wc_ecc_verify_hash a renvoyé -171 (ECC ASN1 bad key data, invalid input) avec le verdict 0 ; un code qui ne contrôle que le code de retour, ou que le verdict, traite mal l’un des deux cas. L’exemple affiche les deux.

Avec ce build, les nonces sont aléatoires (la signature déterministe RFC 6979 nécessite WOLFSSL_ECDSA_DETERMINISTIC_K), s n’est pas normalisé et les signatures high-S passent la vérification. Les courbes vont de P-224 à P-521 ; secp256k1 et Brainpool sont absentes, sauf activation. Ed25519 fonctionne, et l’encapsulation comme la décapsulation ML-KEM-768 ont réussi via wc_MlKemKey_* ; ML-DSA (Dilithium) ne fait pas partie de ce build.

Les clés circulent en DER : wc_EccPublicKeyToDer écrit du SPKI et wc_EccKeyToDer une ECPrivateKey SEC1 ; la conversion PEM (wc_DerToPem) est disponible parce que le paquet définit WOLFSSL_DER_TO_PEM. Le paquet Alpine déclare la licence GPL-3.0-only ; des licences commerciales sont vendues séparément par wolfSSL Inc. Comparez les encodages avec ceux d’autres piles grâce au convertisseur DER ⇄ brut.

Les faits et les vérifications qui les fondent

Rien de ce qui suit n’est copié d’une documentation. La vérification content/libraries/verify/wolfssl/run.sh a exécuté wolfSSL (wolfCrypt) 5.9.4 dans l’image de conteneur alpine:3.24.2 le 20 octobre 2026 ; la page doit correspondre à ce que la vérification a affiché, et chaque fait cite les lignes en question.

  • Encodage des signatures ECDSA

    der

    wc_ecc_sign_hash renvoie du DER ; wc_ecc_verify_hash_ex vérifie r et s fournis sous forme d’entiers.

    Relevé par la vérification
    fact ecdsa-signature-encoding = der
    evidence ecdsa-signature-encoding: wc_ecc_verify_hash_ex with r and s as integers verifies: 1
  • Nonce ECDSA

    random

    Nonce aléatoire dans ce build, qui ne définit pas WOLFSSL_ECDSA_DETERMINISTIC_K.

    Relevé par la vérification
    fact ecdsa-nonce = random
    evidence ecdsa-nonce: this build lacks WOLFSSL_ECDSA_DETERMINISTIC_K, so RFC 6979 signing is not available
  • Low-S à la signature

    either

    s n’est pas normalisé : des valeurs high-S sont apparues parmi 64 signatures.

    Relevé par la vérification
    fact ecdsa-low-s-sign = either
  • High-S à la vérification

    accepts-high-s

    Une signature DER dont s a été remplacé par n − s a été vérifiée.

    Relevé par la vérification
    fact ecdsa-low-s-verify = accepts-high-s
  • Ce que l’appel de signature hache

    takes-digest

    wc_ecc_sign_hash et wc_ecc_verify_hash opèrent sur un condensat calculé par l’appelant.

    Relevé par la vérification
    fact ecdsa-prehash = takes-digest
    evidence ecdsa-prehash: wc_ecc_sign_hash and wc_ecc_verify_hash take a digest the caller computed
  • Signature ECDSA mal formée

    returns-error

    Une signature r‖s brute a fait renvoyer -171 (ECC ASN1 bad key data, invalid input) à wc_ecc_verify_hash, avec le verdict 0.

    Relevé par la vérification
    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
  • Courbes ECDSA

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

    P-224, P-256, P-384 et P-521 dans ce build ; la génération de clés secp256k1 et brainpoolP256r1 a échoué.

    Relevé par la vérification
    fact ecdsa-curves = P-224, P-256, P-384, P-521
  • EdDSA

    Ed25519

    Ed25519 ; HAVE_ED448 n’est pas défini dans ce build.

    Relevé par la vérification
    fact eddsa = Ed25519
    evidence eddsa: HAVE_ED448 is not set in this build
  • Algorithmes post-quantiques

    ML-KEM

    ML-KEM-768 a fonctionné en aller-retour via wc_MlKemKey_* ; HAVE_DILITHIUM (ML-DSA) n’est pas défini dans ce build.

    Relevé par la vérification
    fact pqc = ML-KEM
    evidence pqc: HAVE_DILITHIUM (ML-DSA) is not set in this build
  • Formats de clé publique

    spki-der

    wc_EccPublicKeyToDer et wc_EccPublicKeyDecode gèrent le SPKI DER, et la clé décodée a vérifié une signature.

    Relevé par la vérification
    fact public-key-formats = spki-der
  • Formats de clé privée

    sec1-der

    wc_EccKeyToDer écrit une ECPrivateKey SEC1 (121 octets pour P-256) que wc_EccPrivateKeyDecode relit.

    Relevé par la vérification
    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

Utilisation

Hacher, signer avec P-256 et vérifier, en affichant à la fois le code de retour et le verdict de la vérification.
#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;
}

Le banc de test des extraits de code exécute chaque exemple tel quel dans l’image de conteneur alpine:3.24.2, et l’exécution échoue si la sortie ne correspond pas.

Mise en place
apk add --no-cache -q build-base wolfssl-dev=5.9.4-r0 >/dev/null
Commande
cc -o usage usage.c -lwolfssl && ./usage
La sortie doit correspondre à cette expression régulière
rc: 0, verified: 1, DER starts with 0x30

Bibliothèques