В Mbed TLS 4 криптография вынесена в TF-PSA-Crypto и PSA Crypto API (psa_sign_message, psa_verify_message, psa_generate_key) — тот же API, что использует Trusted Firmware от Arm. Факты на этой странице проверены на пакете Alpine 3.24.2 с Mbed TLS 4.1.1 (сам проект к тому времени выпустил 4.2.0); набор возможностей зависит от конфигурации сборки, как у любой библиотеки для встраиваемых систем.
От кода, производного от OpenSSL, библиотека отличается кодировкой подписи: PSA возвращает форму raw r‖s (64 байта на P-256), а не DER. Подписи для X.509, CMS или проверяющей стороны на OpenSSL нужно упаковать в DER, а подписи DER от этих сторон — распаковать перед вызовом psa_verify_message, иначе функция вернёт PSA_ERROR_INVALID_SIGNATURE, тот же статус, что и для поддельной подписи или 3-байтового фрагмента данных. Преобразуйте подписи конвертером DER ⇄ raw.
У каждого ключа есть политика с одним разрешённым алгоритмом, поэтому выбор между PSA_ALG_ECDSA (случайный nonce) и PSA_ALG_DETERMINISTIC_ECDSA (RFC 6979; тестовый вектор из RFC воспроизвёлся) делается при создании ключа, как показано в примере. s не нормализуется, а проверка принимает high-S. psa_sign_hash подписывает заранее вычисленный дайджест.
В этой сборке подпись и проверка работали на P-256, P-384, P-521, secp256k1 и кривых Brainpool r1; P-224 недоступна, а генерация ключа Ed25519 была отклонена (PSA_ERROR_NOT_SUPPORTED). Из постквантовых алгоритмов есть только проверка подписей на основе хеш-функций LMS (MBEDTLS_LMS_C); типов ключей ML-KEM и ML-DSA нет, а экспериментальный драйвер ML-DSA из mldsa-native (TF_PSA_CRYPTO_PQCP_MLDSA_ENABLED) в конфигурации этой сборки закомментирован. Открытые ключи экспортируются как несжатые точки SEC1 через PSA и как SPKI DER через слой pk.