Zum Inhalt springen
ecdsa.com
C

Mbed TLS (TF-PSA-Crypto)

Mbed TLS 4.x, der TLS-Stack für Embedded-Systeme, dessen Kryptografie jetzt die PSA Crypto API ist: rohe r‖s-Signaturen bei ECDSA, deterministisches ECDSA als eigener Algorithmus und Schlüsselrichtlinien, die den Algorithmus pro Schlüssel festlegen.
Lizenz
Apache-2.0 OR GPL-2.0-or-later
Geprüfte Version
4.1.1 ·
Quellcode
github.com/Mbed-TLS/mbedtls
Dokumentation
mbed-tls.readthedocs.io/

Kompatibilität auf einen Blick

ECDSAPost-Quanten-Verfahren

ECDSA-Kurven
P-256P-384P-521secp256k1brainpoolP256r1brainpoolP384r1brainpoolP512r1
EdDSA
none
Formate öffentlicher Schlüssel
spki-dersec1-uncompressed

Mbed TLS 4 hat seine Kryptografie in TF-PSA-Crypto und die PSA Crypto API verlagert (psa_sign_message, psa_verify_message, psa_generate_key), dieselbe API, die auch Trusted Firmware von Arm verwendet. Die Fakten auf dieser Seite wurden mit dem Paket aus Alpine 3.24.2 geprüft, Mbed TLS 4.1.1 (upstream war bereits 4.2.0 erschienen); wie bei jeder Embedded-Bibliothek hängt der Funktionsumfang von der Build-Konfiguration ab.

Bei der Kodierung der Signatur unterscheidet sich Mbed TLS von Code, der von OpenSSL abstammt: PSA liefert die rohe r‖s-Form, auf P-256 also 64 Byte, kein DER. Signaturen für X.509, CMS oder einen OpenSSL-Verifizierer müssen in DER verpackt werden, und DER-Signaturen von diesen Gegenstellen müssen vor psa_verify_message entpackt werden, sonst meldet die Funktion PSA_ERROR_INVALID_SIGNATURE – denselben Status wie für eine gefälschte Signatur oder einen 3-Byte-Blob. Konvertiere mit dem Konverter DER ⇄ Raw.

Jeder Schlüssel trägt eine Richtlinie mit genau einem zulässigen Algorithmus; die Wahl zwischen PSA_ALG_ECDSA (zufällige Nonce) und PSA_ALG_DETERMINISTIC_ECDSA (RFC 6979 – der Testvektor des RFC wurde reproduziert) fällt also beim Erzeugen des Schlüssels, wie das Beispiel zeigt. s wird nicht normalisiert, und die Prüfung akzeptiert High-S. psa_sign_hash signiert einen vorab berechneten Digest.

Dieser Build signierte und prüfte mit P-256, P-384, P-521, secp256k1 und den Brainpool-r1-Kurven; P-224 war nicht verfügbar, und das Erzeugen eines Ed25519-Schlüssels wurde abgelehnt (PSA_ERROR_NOT_SUPPORTED). Die Post-Quanten-Unterstützung beschränkt sich auf die Prüfung hashbasierter Signaturen mit LMS (MBEDTLS_LMS_C); einen Schlüsseltyp für ML-KEM oder ML-DSA gibt es nicht, und der experimentelle ML-DSA-Treiber aus mldsa-native (TF_PSA_CRYPTO_PQCP_MLDSA_ENABLED) ist in der Konfiguration dieses Builds auskommentiert. Öffentliche Schlüssel werden über PSA als unkomprimierte Punkte im SEC1-Format exportiert und über die Schicht pk als SPKI-DER.

Fakten und die Prüfungen dahinter

Nichts im Folgenden ist aus einer Dokumentation abgeschrieben. Das Prüfskript content/libraries/verify/mbedtls/run.sh hat Mbed TLS (TF-PSA-Crypto) 4.1.1 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

    raw

    psa_sign_message gab auf P-256 64 Byte rohes r‖s zurück.

    Von der Prüfung aufgezeichnet
    fact ecdsa-signature-encoding = raw
    evidence ecdsa-signature-encoding: psa_sign_message returned 64 bytes
  • ECDSA-Nonce

    rfc6979-opt-in

    PSA_ALG_ECDSA verwendet eine zufällige Nonce; PSA_ALG_DETERMINISTIC_ECDSA reproduzierte RFC 6979, Anhang A.2.5.

    Von der Prüfung aufgezeichnet
    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 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 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

    hashes-message-or-digest

    psa_sign_message hasht; psa_sign_hash signiert einen Digest, und diese Signatur bestand die Prüfung mit psa_verify_message.

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

    returns-false

    Eine DER-Signatur, ein 3-Byte-Blob und eine gültige Signatur über andere Daten lieferten alle PSA_ERROR_INVALID_SIGNATURE (-149).

    Von der Prüfung aufgezeichnet
    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)
  • ECDSA-Kurven

    P-256P-384P-521secp256k1brainpoolP256r1brainpoolP384r1brainpoolP512r1

    Signieren und Prüfen funktionierten mit P-256, P-384, P-521, secp256k1 und brainpoolP256r1/P384r1/P512r1; das Erzeugen eines P-224-Schlüssels schlug in diesem Build fehl.

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

    none

    Das Erzeugen eines Ed25519-Schlüssels lieferte PSA_ERROR_NOT_SUPPORTED (-134).

    Von der Prüfung aufgezeichnet
    fact eddsa = none
    evidence eddsa: psa_generate_key for an Ed25519 key: status -134
  • Post-Quanten-Algorithmen

    LMS

    MBEDTLS_LMS_C ist aktiviert (Prüfung von LMS-Signaturen); ein PSA-Schlüsseltyp für ML-KEM oder ML-DSA ist nicht definiert, und der experimentelle Treiber aus mldsa-native wird nicht gebaut.

    Von der Prüfung aufgezeichnet
    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)
  • Formate öffentlicher Schlüssel

    spki-dersec1-uncompressed

    psa_export_public_key liefert den unkomprimierten Punkt im SEC1-Format mit 65 Byte; SPKI-DER wird über die Schicht pk geschrieben und geparst.

    Von der Prüfung aufgezeichnet
    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)

Verwendung

Erzeuge einen P-256-Schlüssel, dessen Richtlinie deterministisches ECDSA erlaubt, signiere eine Nachricht und prüfe die 64 Byte lange rohe Signatur.
#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;
}

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 mbedtls-dev=4.1.1-r0 >/dev/null
Befehl
cc -o usage usage.c -lmbedcrypto -ltfpsacrypto && ./usage
Ausgabe muss passen (regulärer Ausdruck)
signature bytes: 64, verified: 1

Bibliotheken