From 799e78d2e15ed4d40936984ec8b19d1104de15e2 Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Sun, 12 Jul 2026 20:41:48 +0200 Subject: [PATCH] Bounds-checks each encoded authenticated TLV and ISO padding before appending to the fixed secure-messaging input buffer. Signed-off-by: Pol Henarejos --- src/eac.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/eac.c b/src/eac.c index e7a1277..88c6c60 100644 --- a/src/eac.c +++ b/src/eac.c @@ -282,6 +282,10 @@ int sm_verify(void) { tlv_ctx_init(apdu.data, (uint16_t)apdu.nc, &ctxi); while (tlv_walk(&ctxi, &p, &tag, &tag_len, &tag_data)) { if (tag & 0x1) { + size_t encoded_len = 1 + tlv_format_len(tag_len, NULL) + tag_len; + if (encoded_len > sizeof(input) - input_len) { + return PICOKEYS_WRONG_LENGTH; + } input[input_len++] = (uint8_t)tag; uint8_t tlen = tlv_format_len(tag_len, input + input_len); input_len += tlen; @@ -298,8 +302,12 @@ int sm_verify(void) { return PICOKEYS_WRONG_DATA; } if (some_added) { + size_t padding_len = sm_blocksize - (input_len % sm_blocksize); + if (padding_len > sizeof(input) - input_len) { + return PICOKEYS_WRONG_LENGTH; + } input[input_len++] = 0x80; - input_len += (sm_blocksize - (input_len % sm_blocksize)); + input_len += padding_len - 1; } uint8_t signature[16]; r = sm_sign(input, input_len, signature);