From b300ed87f389ef360245d80f3f1021d4e8ab1caf Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Sat, 4 Feb 2023 20:26:54 +0100 Subject: [PATCH] Fix returning ecdsa response for keys > 512 bits. In that case, TLV shall contain 81 length. Signed-off-by: Pol Henarejos --- src/openpgp/openpgp.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/openpgp/openpgp.c b/src/openpgp/openpgp.c index a91cd99..b8657ee 100644 --- a/src/openpgp/openpgp.c +++ b/src/openpgp/openpgp.c @@ -1210,15 +1210,20 @@ void make_rsa_response(mbedtls_rsa_context *rsa) { } void make_ecdsa_response(mbedtls_ecdsa_context *ecdsa) { + uint8_t pt[MBEDTLS_ECP_MAX_PT_LEN]; size_t plen = 0; - memcpy(res_APDU, "\x7f\x49\x00", 3); - res_APDU_size = 3; + mbedtls_ecp_point_write_binary(&ecdsa->grp, &ecdsa->Q, MBEDTLS_ECP_PF_UNCOMPRESSED, &plen, pt, sizeof(pt)); + res_APDU[res_APDU_size++] = 0x7f; + res_APDU[res_APDU_size++] = 0x49; + if (plen >= 128) + res_APDU[res_APDU_size++] = 0x81; + res_APDU[res_APDU_size++] = plen + (plen >= 128 ? 3 : 2); res_APDU[res_APDU_size++] = 0x86; - res_APDU[res_APDU_size++] = 0; - mbedtls_ecp_point_write_binary(&ecdsa->grp, &ecdsa->Q, MBEDTLS_ECP_PF_UNCOMPRESSED, &plen, res_APDU + res_APDU_size, 4096); + if (plen >= 128) + res_APDU[res_APDU_size++] = 0x81; + res_APDU[res_APDU_size++] = plen; + memcpy(res_APDU + res_APDU_size, pt, plen); res_APDU_size += plen; - res_APDU[4] = plen; - res_APDU[2] = plen + 2; } static int cmd_keypair_gen() {