Aller au contenu
ecdsa.com
C

Mbed TLS (TF-PSA-Crypto)

Mbed TLS 4.x, la pile TLS embarquée dont la cryptographie passe désormais par l’API PSA Crypto : signatures ECDSA en r‖s brut, ECDSA déterministe sous forme d’algorithme distinct et politiques de clé qui fixent l’algorithme de chaque clé.
Licence
Apache-2.0 OR GPL-2.0-or-later
Version vérifiée
4.1.1 ·
Code source
github.com/Mbed-TLS/mbedtls
Documentation
mbed-tls.readthedocs.io/

Compatibilité en un coup d’œil

ECDSAPost-quantique

Courbes ECDSA
P-256P-384P-521secp256k1brainpoolP256r1brainpoolP384r1brainpoolP512r1
EdDSA
none
Formats de clé publique
spki-dersec1-uncompressed

Mbed TLS 4 a déplacé sa cryptographie dans TF-PSA-Crypto et l’API PSA Crypto (psa_sign_message, psa_verify_message, psa_generate_key), la même API que celle de Trusted Firmware d’Arm. Les faits présentés ici ont été vérifiés sur le paquet Alpine 3.24.2, Mbed TLS 4.1.1 (le projet amont en était à la 4.2.0) ; les fonctionnalités dépendent de la configuration du build, comme pour toute bibliothèque embarquée.

C’est l’encodage des signatures qui diffère du code dérivé d’OpenSSL : PSA renvoie la forme r‖s brute, 64 octets sur P-256, et non du DER. Les signatures destinées à X.509, à CMS ou à un vérificateur OpenSSL doivent être converties en DER, et les signatures DER provenant de ces pairs doivent être reconverties en r‖s brut avant psa_verify_message, qui renvoie sinon PSA_ERROR_INVALID_SIGNATURE, le même statut que pour une signature contrefaite ou un bloc de 3 octets. Convertissez-les avec le convertisseur DER ⇄ brut.

Chaque clé porte une politique qui n’autorise qu’un seul algorithme : le choix entre PSA_ALG_ECDSA (nonce aléatoire) et PSA_ALG_DETERMINISTIC_ECDSA (RFC 6979, dont le vecteur de test a été reproduit) se fait donc à la création de la clé, comme le montre l’exemple. s n’est pas normalisé et la vérification accepte high-S. psa_sign_hash signe un condensat précalculé.

Ce build a signé et vérifié avec P-256, P-384, P-521, secp256k1 et les courbes Brainpool r1 ; P-224 n’était pas disponible, et la génération de clés Ed25519 a été refusée (PSA_ERROR_NOT_SUPPORTED). La prise en charge post-quantique se limite à la vérification de signatures fondées sur le hachage LMS (MBEDTLS_LMS_C) ; il n’existe aucun type de clé ML-KEM ou ML-DSA, et le pilote ML-DSA expérimental issu de mldsa-native (TF_PSA_CRYPTO_PQCP_MLDSA_ENABLED) est commenté dans la configuration de ce build. Les clés publiques s’exportent via PSA en points SEC1 sous forme non compressée, et en SPKI DER via la couche pk.

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/mbedtls/run.sh a exécuté Mbed TLS (TF-PSA-Crypto) 4.1.1 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

    raw

    psa_sign_message a renvoyé 64 octets de r‖s brut sur P-256.

    Relevé par la vérification
    fact ecdsa-signature-encoding = raw
    evidence ecdsa-signature-encoding: psa_sign_message returned 64 bytes
  • Nonce ECDSA

    rfc6979-opt-in

    PSA_ALG_ECDSA utilise un nonce aléatoire ; PSA_ALG_DETERMINISTIC_ECDSA a reproduit l’annexe A.2.5 de la RFC 6979.

    Relevé par la vérification
    fact ecdsa-nonce = rfc6979-opt-in
    evidence ecdsa-nonce: PSA_ALG_ECDSA repeats: no; PSA_ALG_DETERMINISTIC_ECDSA reproduces the RFC 6979 A.2.5 r: yes (status 0)
  • 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 dont s a été remplacé par n − s a passé la vérification.

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

    hashes-message-or-digest

    psa_sign_message hache les données ; psa_sign_hash signe un condensat, et cette signature a passé la vérification avec psa_verify_message.

    Relevé par la vérification
    fact ecdsa-prehash = hashes-message-or-digest
  • Signature ECDSA mal formée

    returns-false

    Une signature DER, un bloc de 3 octets et une signature valide portant sur d’autres données ont tous renvoyé PSA_ERROR_INVALID_SIGNATURE (-149).

    Relevé par la vérification
    fact ecdsa-malformed-signature = returns-false
    evidence ecdsa-malformed-signature: psa_verify_message status: DER -149, 3 bytes -149, wrong message -149 (PSA_ERROR_INVALID_SIGNATURE = -149)
  • Courbes ECDSA

    P-256P-384P-521secp256k1brainpoolP256r1brainpoolP384r1brainpoolP512r1

    Signature et vérification réussies avec P-256, P-384, P-521, secp256k1 et brainpoolP256r1/P384r1/P512r1 ; la génération de clés P-224 a échoué dans ce build.

    Relevé par la vérification
    fact ecdsa-curves = P-256, P-384, P-521, secp256k1, brainpoolP256r1, brainpoolP384r1, brainpoolP512r1
  • EdDSA

    none

    La génération de clés Ed25519 a renvoyé PSA_ERROR_NOT_SUPPORTED (-134).

    Relevé par la vérification
    fact eddsa = none
    evidence eddsa: psa_generate_key for an Ed25519 key: status -134
  • Algorithmes post-quantiques

    LMS

    MBEDTLS_LMS_C est activé (vérification des signatures LMS) ; aucun type de clé PSA ML-KEM ou ML-DSA n’est défini, et le pilote expérimental mldsa-native n’est pas compilé.

    Relevé par la vérification
    fact pqc = LMS
    evidence pqc: MBEDTLS_LMS_C is enabled (LMS hash-based signature verification, <mbedtls/lms.h>)
    evidence pqc: no ML-DSA or ML-KEM PSA key type is defined in these headers
    evidence pqc: psa/crypto_config.h of this build: //#define TF_PSA_CRYPTO_PQCP_MLDSA_ENABLED;//#define TF_PSA_CRYPTO_PQCP_MLDSA_87_ENABLED (commented out = the experimental mldsa-native driver is not built)
  • Formats de clé publique

    spki-dersec1-uncompressed

    psa_export_public_key renvoie le point SEC1 de 65 octets sous forme non compressée ; le SPKI DER est écrit et analysé via la couche pk.

    Relevé par la vérification
    fact public-key-formats = spki-der, sec1-uncompressed
    evidence public-key-formats: psa_export_public_key returns 65 bytes starting 0x04 (an uncompressed SEC1 point)

Utilisation

Créer une clé P-256 dont la politique autorise l’ECDSA déterministe, signer un message et vérifier la signature brute de 64 octets.
#include <psa/crypto.h>
#include <stdio.h>

int main(void) {
    if (psa_crypto_init() != PSA_SUCCESS) return 1;
    /* The algorithm is part of the key policy: here deterministic ECDSA (RFC 6979) with SHA-256. */
    psa_algorithm_t alg = PSA_ALG_DETERMINISTIC_ECDSA(PSA_ALG_SHA_256);
    psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
    psa_set_key_type(&attr, PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1));
    psa_set_key_bits(&attr, 256);
    psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_SIGN_MESSAGE | PSA_KEY_USAGE_VERIFY_MESSAGE);
    psa_set_key_algorithm(&attr, alg);
    psa_key_id_t key;
    if (psa_generate_key(&attr, &key) != PSA_SUCCESS) return 1;

    const uint8_t msg[] = "order #1042 approved";
    uint8_t sig[PSA_SIGNATURE_MAX_SIZE];
    size_t sig_len;
    psa_sign_message(key, alg, msg, sizeof msg - 1, sig, sizeof sig, &sig_len);

    /* PSA signatures are raw r||s (64 bytes on P-256): wrap them in DER for X.509 or OpenSSL peers. */
    psa_status_t status = psa_verify_message(key, alg, msg, sizeof msg - 1, sig, sig_len);
    printf("signature bytes: %zu, verified: %d\n", sig_len, status == PSA_SUCCESS);
    psa_destroy_key(key);
    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 mbedtls-dev=4.1.1-r0 >/dev/null
Commande
cc -o usage usage.c -lmbedcrypto -ltfpsacrypto && ./usage
La sortie doit correspondre à cette expression régulière
signature bytes: 64, verified: 1

Bibliothèques