From f00fe8cb166af45cf270b83638f9e0b4f8b1a754 Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Fri, 22 Apr 2022 20:37:44 +0200 Subject: [PATCH] Fix signature for ECDSA. OPENPGP requires the raw signature, without ASN1 transportation. Signed-off-by: Pol Henarejos --- src/openpgp/openpgp.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/openpgp/openpgp.c b/src/openpgp/openpgp.c index 66f4e15..16f9ff5 100644 --- a/src/openpgp/openpgp.c +++ b/src/openpgp/openpgp.c @@ -1056,12 +1056,22 @@ static int cmd_pso_sig() { return SW_CONDITIONS_NOT_SATISFIED(); size_t olen = 0; uint8_t buf[MBEDTLS_ECDSA_MAX_LEN]; - if (mbedtls_ecdsa_write_signature(&ctx, md, apdu.cmd_apdu_data, apdu.cmd_apdu_data_len, buf, MBEDTLS_ECDSA_MAX_LEN, &olen, random_gen, NULL) != 0) { + mbedtls_mpi ri, si; + mbedtls_mpi_init(&ri); + mbedtls_mpi_init(&si); + r = mbedtls_ecdsa_sign(&ctx.grp, &ri, &si, &ctx.d, apdu.cmd_apdu_data, apdu.cmd_apdu_data_len, random_gen, NULL); + if (r != 0) { + mbedtls_mpi_free(&ri); + mbedtls_mpi_free(&si); mbedtls_ecdsa_free(&ctx); return SW_EXEC_ERROR(); } - memcpy(res_APDU, buf, olen); - res_APDU_size = olen; + mbedtls_mpi_write_binary(&ri, res_APDU, mbedtls_mpi_size(&ri)); + res_APDU_size = mbedtls_mpi_size(&ri); + mbedtls_mpi_write_binary(&si, res_APDU+res_APDU_size, mbedtls_mpi_size(&si)); + res_APDU_size += mbedtls_mpi_size(&si); + mbedtls_mpi_free(&ri); + mbedtls_mpi_free(&si); mbedtls_ecdsa_free(&ctx); } return SW_OK();