O Mbed TLS 4 transferiu a criptografia para o TF-PSA-Crypto e a PSA Crypto API (psa_sign_message, psa_verify_message, psa_generate_key), a mesma API usada pelo Trusted Firmware da Arm. Os fatos desta página foram verificados no pacote do Alpine 3.24.2, Mbed TLS 4.1.1 (o projeto original já estava na 4.2.0); os recursos dependem da configuração do build, como em toda biblioteca embarcada.
O que difere do código derivado do OpenSSL é a codificação da assinatura: a PSA retorna a forma r‖s bruta, 64 bytes na P-256, e não DER. Assinaturas destinadas a X.509, CMS ou a um verificador OpenSSL precisam ser empacotadas em DER, e as assinaturas DER vindas desses sistemas precisam ser desempacotadas antes de psa_verify_message, que, do contrário, retorna PSA_ERROR_INVALID_SIGNATURE — o mesmo status de uma assinatura forjada ou de um blob de 3 bytes. Converta com o conversor DER ⇄ bruto.
Cada chave carrega uma política com um único algoritmo permitido, então a escolha entre PSA_ALG_ECDSA (nonce aleatório) e PSA_ALG_DETERMINISTIC_ECDSA (RFC 6979 — o vetor de teste da RFC foi reproduzido) é feita na criação da chave, como mostra o exemplo. O s não é normalizado, e a verificação aceita high-S. psa_sign_hash assina um digest pré-calculado.
Este build assinou e verificou com P-256, P-384, P-521, secp256k1 e as curvas Brainpool r1; a P-224 não estava disponível, e a geração de chaves Ed25519 foi recusada (PSA_ERROR_NOT_SUPPORTED). O suporte pós-quântico se limita à verificação de LMS, um esquema de assinatura baseada em hash (MBEDTLS_LMS_C); não há tipo de chave ML-KEM nem ML-DSA, e o driver experimental de ML-DSA do mldsa-native (TF_PSA_CRYPTO_PQCP_MLDSA_ENABLED) está comentado na configuração deste build. As chaves públicas são exportadas pela PSA como pontos SEC1 na forma não comprimida e pela camada pk como SPKI DER.