Skip to content

Commit 441c28c

Browse files
committed
Add usb_rx_helper buffer overflow testcase
1 parent 41924e4 commit 441c28c

File tree

3 files changed

+40
-2
lines changed

3 files changed

+40
-2
lines changed

lib/board/msg_dispatch.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ static void raw_dispatch(const MessagesMap_t *entry, uint8_t *msg, uint32_t msg_
260260
* OUTPUT
261261
* none
262262
*/
263-
static void usb_rx_helper(UsbMessage *msg, MessageMapType type)
263+
void usb_rx_helper(UsbMessage *msg, MessageMapType type)
264264
{
265265
static TrezorFrameHeaderFirst last_frame_header = { .id = 0xffff, .len = 0 };
266266
static uint8_t content_buf[MAX_FRAME_SIZE];

unittests/firmware/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
set(sources
22
ethereum.cpp
33
recovery.cpp
4-
storage.cpp)
4+
storage.cpp
5+
usb_rx.cpp)
56

67
include_directories(
78
${CMAKE_SOURCE_DIR}/include

unittests/firmware/usb_rx.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
extern "C" {
2+
#include "keepkey/board/msg_dispatch.h"
3+
#include "keepkey/board/usb_driver.h"
4+
#include "keepkey/firmware/fsm.h"
5+
}
6+
7+
#include "gtest/gtest.h"
8+
9+
extern "C" {
10+
void usb_rx_helper(UsbMessage *msg, MessageMapType type);
11+
}
12+
13+
TEST(USBRX, Overflow) {
14+
fsm_init();
15+
16+
UsbMessage msg;
17+
TrezorFrame *frame = (TrezorFrame *)(msg.message);
18+
TrezorFrameFragment *frame_fragment = (TrezorFrameFragment *)(msg.message);
19+
20+
msg.len = sizeof(msg.message);
21+
frame->usb_header.hid_type = '?';
22+
frame->header.pre1 = '#';
23+
frame->header.pre2 = '#';
24+
frame->header.id = __builtin_bswap16(MessageType_MessageType_Initialize);
25+
frame->header.len = __builtin_bswap32(0xffffffff);
26+
usb_rx_helper(&msg, NORMAL_MSG);
27+
28+
frame->header.pre1 = '0';
29+
frame->header.pre2 = '0';
30+
msg.len = 63;
31+
32+
for (unsigned i=0; i < 69273665; i++)
33+
usb_rx_helper(&msg, NORMAL_MSG);
34+
35+
// Boom!
36+
usb_rx_helper(&msg, NORMAL_MSG);
37+
}

0 commit comments

Comments
 (0)