Skip to content

Commit 93e4039

Browse files
committed
Add ui and cpp tests
1 parent 0147743 commit 93e4039

32 files changed

Lines changed: 2297 additions & 259 deletions

app/src/borsh.c

Lines changed: 128 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323
parser_error_t read_u8(parser_context_t *ctx, uint8_t *val) {
2424
CHECK_INPUT(ctx);
2525
CHECK_INPUT(val);
26+
if (ctx->offset + OFFSET_U8 > ctx->buffer.len) {
27+
return parser_unexpected_buffer_end;
28+
}
2629
*val = *(uint8_t *)(ctx->buffer.ptr + ctx->offset);
2730
CTX_CHECK_AND_ADVANCE(ctx, OFFSET_U8);
2831
return parser_ok;
@@ -31,124 +34,162 @@ parser_error_t read_u8(parser_context_t *ctx, uint8_t *val) {
3134
parser_error_t read_u16(parser_context_t *ctx, uint16_t *val) {
3235
CHECK_INPUT(ctx);
3336
CHECK_INPUT(val);
34-
*val = *(uint16_t *)(ctx->buffer.ptr + ctx->offset);
37+
if (ctx->offset + OFFSET_U16 > ctx->buffer.len) {
38+
return parser_unexpected_buffer_end;
39+
}
40+
MEMCPY(val, ctx->buffer.ptr + ctx->offset, sizeof(uint16_t));
3541
CTX_CHECK_AND_ADVANCE(ctx, OFFSET_U16);
3642
return parser_ok;
3743
}
3844

3945
parser_error_t read_u32(parser_context_t *ctx, uint32_t *val) {
4046
CHECK_INPUT(ctx);
4147
CHECK_INPUT(val);
42-
*val = *(uint32_t *)(ctx->buffer.ptr + ctx->offset);
48+
if (ctx->offset + OFFSET_U32 > ctx->buffer.len) {
49+
return parser_unexpected_buffer_end;
50+
}
51+
MEMCPY(val, ctx->buffer.ptr + ctx->offset, sizeof(uint32_t));
4352
CTX_CHECK_AND_ADVANCE(ctx, OFFSET_U32);
4453
return parser_ok;
4554
}
4655

4756
parser_error_t read_u64(parser_context_t *ctx, uint64_t *val) {
4857
CHECK_INPUT(ctx);
4958
CHECK_INPUT(val);
50-
*val = *(uint64_t *)(ctx->buffer.ptr + ctx->offset);
59+
if (ctx->offset + OFFSET_U64 > ctx->buffer.len) {
60+
return parser_unexpected_buffer_end;
61+
}
62+
MEMCPY(val, ctx->buffer.ptr + ctx->offset, sizeof(uint64_t));
5163
CTX_CHECK_AND_ADVANCE(ctx, OFFSET_U64);
5264
return parser_ok;
5365
}
5466

55-
// void print_buffer(bytes_t *buffer, const char *title) {
56-
// #if defined(LEDGER_SPECIFIC)
57-
// ZEMU_LOGF(50, "%s\n", title);
58-
// char print[1000] = {0};
59-
// array_to_hexstr(print, sizeof(print), buffer->ptr, buffer->len);
60-
// ZEMU_LOGF(1000, "%s\n", print);
61-
// #else
62-
// printf("%s %d: ", title, buffer->len);
63-
// for (uint16_t i = 0; i < buffer->len; i++) {
64-
// printf("%02x", buffer->ptr[i]);
65-
// }
66-
// printf("\n");
67-
// #endif
68-
// }
67+
void print_buffer(bytes_t *buffer, const char *title) {
68+
#if defined(LEDGER_SPECIFIC)
69+
char print[1000] = {0};
70+
MEMCPY(print, title, strlen(title));
71+
ZEMU_LOGF(50, "%s\n", print);
72+
MEMZERO(print, sizeof(print));
73+
array_to_hexstr(print, sizeof(print), buffer->ptr, buffer->len);
74+
ZEMU_LOGF(1000, "%s\n", print);
75+
#else
76+
printf("%s %d: ", title, buffer->len);
77+
for (uint16_t i = 0; i < buffer->len; i++) {
78+
printf("%02x", buffer->ptr[i]);
79+
}
80+
printf("\n");
81+
#endif
82+
}
6983

70-
// void print_buffer_u8(bytes_t *buffer, const char *title) {
71-
// #if defined(LEDGER_SPECIFIC)
72-
// ZEMU_LOGF(50, "%s\n", title);
73-
// char print[1000] = {0};
74-
// array_to_hexstr(print, sizeof(print), buffer->ptr, buffer->len);
75-
// ZEMU_LOGF(1000, "%s\n", print);
76-
// #else
77-
// printf("%s %d: [", title, buffer->len);
78-
// for (uint16_t i = 0; i < buffer->len; i++) {
79-
// printf("%d, ", buffer->ptr[i]);
80-
// }
81-
// printf("]\n");
82-
// #endif
83-
// }
84+
void print_buffer_u8(bytes_t *buffer, const char *title) {
85+
#if defined(LEDGER_SPECIFIC)
86+
char print[1000] = {0};
87+
MEMCPY(print, title, strlen(title));
88+
ZEMU_LOGF(50, "%s\n", print);
89+
MEMZERO(print, sizeof(print));
90+
array_to_hexstr(print, sizeof(print), buffer->ptr, buffer->len);
91+
ZEMU_LOGF(1000, "%s\n", print);
92+
#else
93+
printf("%s %d: [", title, buffer->len);
94+
for (uint16_t i = 0; i < buffer->len; i++) {
95+
printf("%d, ", buffer->ptr[i]);
96+
}
97+
printf("]\n");
98+
#endif
99+
}
84100

85-
// void print_buffer_str(bytes_t *buffer, const char *title) {
86-
// #if defined(LEDGER_SPECIFIC)
87-
// ZEMU_LOGF(50, "%s\n", title);
88-
// char print[1000] = {0};
89-
// array_to_hexstr(print, sizeof(print), buffer->ptr, buffer->len);
90-
// ZEMU_LOGF(1000, "%s\n", print);
91-
// #else
92-
// uint8_t buff[1000] = {0};
93-
// memcpy(buff, buffer->ptr, buffer->len);
94-
// printf("%s %s\n", title, buff);
95-
// #endif
96-
// }
101+
void print_buffer_str(bytes_t *buffer, const char *title) {
102+
#if defined(LEDGER_SPECIFIC)
103+
char print[1000] = {0};
104+
MEMCPY(print, title, strlen(title));
105+
ZEMU_LOGF(50, "%s\n", print);
106+
MEMZERO(print, sizeof(print));
107+
array_to_hexstr(print, sizeof(print), buffer->ptr, buffer->len);
108+
ZEMU_LOGF(1000, "%s\n", print);
109+
#else
110+
uint8_t buff[1000] = {0};
111+
memcpy(buff, buffer->ptr, buffer->len);
112+
printf("%s %s\n", title, buff);
113+
#endif
114+
}
97115

98116
void print_string(const char *str) {
99117
#if defined(LEDGER_SPECIFIC)
100118
char print[1000] = {0};
101119
MEMCPY(print, str, strlen(str));
102-
ZEMU_LOGF(100, "%s\n", str);
120+
ZEMU_LOGF(100, "%s\n", print);
103121
#else
104-
printf("%s\n", str);
122+
// printf("%s\n", str);
105123
#endif
106124
}
107125

108-
// void print_string_title(const char *str, const char *title) {
109-
// #if defined(LEDGER_SPECIFIC)
110-
// ZEMU_LOGF(100, "%s: %s\n", title, str);
111-
// #else
112-
// printf("%s: %s\n", title, str);
113-
// #endif
114-
// }
126+
void print_string_title(const char *str, const char *title) {
127+
#if defined(LEDGER_SPECIFIC)
128+
char print[1000] = {0};
129+
MEMCPY(print, title, strlen(title));
130+
MEMCPY(print + strlen(title), str, strlen(str));
131+
ZEMU_LOGF(100, "%s\n", print);
132+
#else
133+
printf("%s: %s\n", title, str);
134+
#endif
135+
}
115136

116-
// void print_u8(const char *str, uint8_t val) {
117-
// #if defined(LEDGER_SPECIFIC)
118-
// ZEMU_LOGF(100, "%s: %d\n", str, val);
119-
// #else
120-
// printf("%s: %d\n", str, val);
121-
// #endif
122-
// }
137+
void print_u8(const char *str, uint8_t val) {
138+
#if defined(LEDGER_SPECIFIC)
139+
char print[1000] = {0};
140+
MEMCPY(print, str, strlen(str));
141+
MEMCPY(print + strlen(str), ": ", 2);
142+
MEMCPY(print + strlen(str) + 2, &val, sizeof(val));
143+
ZEMU_LOGF(100, "%s\n", print);
144+
#else
145+
printf("%s: %d\n", str, val);
146+
#endif
147+
}
123148

124-
// void print_u16(const char *str, uint16_t val) {
125-
// #if defined(LEDGER_SPECIFIC)
126-
// ZEMU_LOGF(100, "%s: %d\n", str, val);
127-
// #else
128-
// printf("%s: %d\n", str, val);
129-
// #endif
130-
// }
149+
void print_u16(const char *str, uint16_t val) {
150+
#if defined(LEDGER_SPECIFIC)
151+
char print[1000] = {0};
152+
MEMCPY(print, str, strlen(str));
153+
MEMCPY(print + strlen(str), ": ", 2);
154+
MEMCPY(print + strlen(str) + 2, &val, sizeof(val));
155+
ZEMU_LOGF(100, "%s\n", print);
156+
#else
157+
printf("%s: %d\n", str, val);
158+
#endif
159+
}
131160

132-
// void print_u32(const char *str, uint32_t val) {
133-
// #if defined(LEDGER_SPECIFIC)
134-
// ZEMU_LOGF(100, "%s: %d\n", str, val);
135-
// #else
136-
// printf("%s: %u\n", str, val);
137-
// #endif
138-
// }
161+
void print_u32(const char *str, uint32_t val) {
162+
#if defined(LEDGER_SPECIFIC)
163+
char print[1000] = {0};
164+
MEMCPY(print, str, strlen(str));
165+
MEMCPY(print + strlen(str), ": ", 2);
166+
MEMCPY(print + strlen(str) + 2, &val, sizeof(val));
167+
ZEMU_LOGF(100, "%s\n", print);
168+
#else
169+
printf("%s: %u\n", str, val);
170+
#endif
171+
}
139172

140-
// void print_u64(const char *str, uint64_t val) {
141-
// #if defined(LEDGER_SPECIFIC)
142-
// ZEMU_LOGF(100, "%s: %lu\n", str, val);
143-
// #else
144-
// printf("%s: %llu\n", str, val);
145-
// #endif
146-
// }
173+
void print_u64(const char *str, uint64_t val) {
174+
#if defined(LEDGER_SPECIFIC)
175+
char print[1000] = {0};
176+
MEMCPY(print, str, strlen(str));
177+
MEMCPY(print + strlen(str), ": ", 2);
178+
MEMCPY(print + strlen(str) + 2, &val, sizeof(val));
179+
ZEMU_LOGF(100, "%s\n", print);
180+
#else
181+
printf("%s: %llu\n", str, val);
182+
#endif
183+
}
147184

148-
// void print_u64_hex(const char *str, uint64_t val) {
149-
// #if defined(LEDGER_SPECIFIC)
150-
// ZEMU_LOGF(100, "%s: %lu\n", str, val);
151-
// #else
152-
// printf("%s: 0x%llx\n", str, val);
153-
// #endif
154-
// }
185+
void print_u64_hex(const char *str, uint64_t val) {
186+
#if defined(LEDGER_SPECIFIC)
187+
char print[1000] = {0};
188+
MEMCPY(print, str, strlen(str));
189+
MEMCPY(print + strlen(str), ": ", 2);
190+
MEMCPY(print + strlen(str) + 2, &val, sizeof(val));
191+
ZEMU_LOGF(100, "%s\n", print);
192+
#else
193+
printf("%s: 0x%llx\n", str, val);
194+
#endif
195+
}

app/src/borsh.h

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,16 @@ parser_error_t read_u32(parser_context_t *ctx, uint32_t *val);
3636
parser_error_t read_u64(parser_context_t *ctx, uint64_t *val);
3737

3838
// TODO: Remove these functions
39-
// void print_buffer(bytes_t *buffer, const char *title);
40-
// void print_buffer_str(bytes_t *buffer, const char *title);
41-
// void print_buffer_u8(bytes_t *buffer, const char *title);
39+
void print_buffer(bytes_t *buffer, const char *title);
40+
void print_buffer_str(bytes_t *buffer, const char *title);
41+
void print_buffer_u8(bytes_t *buffer, const char *title);
4242
void print_string(const char *str);
43-
// void print_string_title(const char *str, const char *title);
44-
// void print_u8(const char *str, uint8_t val);
45-
// void print_u16(const char *str, uint16_t val);
46-
// void print_u32(const char *str, uint32_t val);
47-
// void print_u64(const char *str, uint64_t val);
48-
// void print_u64_hex(const char *str, uint64_t val);
43+
void print_string_title(const char *str, const char *title);
44+
void print_u8(const char *str, uint8_t val);
45+
void print_u16(const char *str, uint16_t val);
46+
void print_u32(const char *str, uint32_t val);
47+
void print_u64(const char *str, uint64_t val);
48+
void print_u64_hex(const char *str, uint64_t val);
4949

5050
#ifdef __cplusplus
5151
}

app/src/common/actions.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@
1919
#include <stdint.h>
2020

2121
#include "apdu_codes.h"
22+
#include "borsh.h"
2223
#include "coin.h"
24+
#include "common_txdef.h"
2325
#include "crypto.h"
2426
#include "tx.h"
2527
#include "zxerror.h"
@@ -41,8 +43,8 @@ __Z_INLINE zxerr_t app_fill_address() {
4143
}
4244

4345
__Z_INLINE void app_sign() {
44-
const uint8_t *message = tx_get_buffer();
45-
const uint16_t messageLength = tx_get_buffer_length();
46+
const uint8_t *message = get_txn_raw();
47+
const uint16_t messageLength = get_txn_len() + CX_SHA256_SIZE;
4648

4749
const zxerr_t err = crypto_sign(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, message, messageLength);
4850

app/src/common/parser.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,14 @@ const char *parser_getMsgPackTypeDescription(uint8_t type);
2929
parser_error_t parser_parse(parser_context_t *ctx, const uint8_t *data, size_t dataLen, parser_tx_t *tx_obj);
3030

3131
//// verifies tx fields
32-
parser_error_t parser_validate(parser_context_t *ctx);
32+
parser_error_t parser_validate(parser_tx_t *txObj);
3333

3434
//// returns the number of items in the current parsing context
35-
parser_error_t parser_getNumItems(const parser_context_t *ctx, uint8_t *num_items);
35+
parser_error_t parser_getNumItems(const parser_tx_t *txObj, uint8_t *num_items);
3636

3737
// retrieves a readable output for each field / page
38-
parser_error_t parser_getItem(const parser_context_t *ctx, uint8_t displayIdx, char *outKey, uint16_t outKeyLen,
39-
char *outVal, uint16_t outValLen, uint8_t pageIdx, uint8_t *pageCount);
38+
parser_error_t parser_getItem(const parser_tx_t *txObj, uint8_t displayIdx, char *outKey, uint16_t outKeyLen, char *outVal,
39+
uint16_t outValLen, uint8_t pageIdx, uint8_t *pageCount);
4040

4141
#ifdef __cplusplus
4242
}

app/src/common/tx.c

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
#include "zxmacros.h"
2525

2626
#if defined(TARGET_NANOX) || defined(TARGET_NANOS2) || defined(TARGET_STAX) || defined(TARGET_FLEX)
27-
#define RAM_BUFFER_SIZE 8192
27+
#define RAM_BUFFER_SIZE 4096
2828
#define FLASH_BUFFER_SIZE 16384
2929
#elif defined(TARGET_NANOS)
3030
#define RAM_BUFFER_SIZE 256
@@ -44,8 +44,8 @@ storage_t NV_CONST N_appdata_impl __attribute__((aligned(64)));
4444
#define N_appdata (*(NV_VOLATILE storage_t *)PIC(&N_appdata_impl))
4545
#endif
4646

47-
static parser_tx_t tx_obj;
48-
static parser_context_t ctx_parsed_tx;
47+
static parser_tx_t tx_obj = {0};
48+
static parser_context_t ctx_parsed_tx = {0};
4949

5050
void tx_initialize() {
5151
buffering_init(ram_buffer, sizeof(ram_buffer), (uint8_t *)N_appdata.buffer, sizeof(N_appdata.buffer));
@@ -70,7 +70,7 @@ const char *tx_parse() {
7070
return parser_getErrorDescription(err);
7171
}
7272

73-
err = parser_validate(&ctx_parsed_tx);
73+
err = parser_validate(&tx_obj);
7474
CHECK_APP_CANARY()
7575

7676
if (err != parser_ok) {
@@ -83,7 +83,7 @@ const char *tx_parse() {
8383
void tx_parse_reset() { MEMZERO(&tx_obj, sizeof(tx_obj)); }
8484

8585
zxerr_t tx_getNumItems(uint8_t *num_items) {
86-
parser_error_t err = parser_getNumItems(&ctx_parsed_tx, num_items);
86+
parser_error_t err = parser_getNumItems(&tx_obj, num_items);
8787

8888
if (err != parser_ok) {
8989
return zxerr_unknown;
@@ -102,8 +102,7 @@ zxerr_t tx_getItem(int8_t displayIdx, char *outKey, uint16_t outKeyLen, char *ou
102102
return zxerr_no_data;
103103
}
104104

105-
parser_error_t err =
106-
parser_getItem(&ctx_parsed_tx, displayIdx, outKey, outKeyLen, outVal, outValLen, pageIdx, pageCount);
105+
parser_error_t err = parser_getItem(&tx_obj, displayIdx, outKey, outKeyLen, outVal, outValLen, pageIdx, pageCount);
107106

108107
// Convert error codes
109108
if (err == parser_no_data || err == parser_display_idx_out_of_range || err == parser_display_page_out_of_range)
@@ -113,3 +112,7 @@ zxerr_t tx_getItem(int8_t displayIdx, char *outKey, uint16_t outKeyLen, char *ou
113112

114113
return zxerr_ok;
115114
}
115+
116+
const uint8_t *get_txn_raw() { return tx_obj.unsigned_transaction_raw.buffer.ptr; }
117+
118+
uint16_t get_txn_len() { return tx_obj.unsigned_transaction_raw.buffer.len; }

app/src/common/tx.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,11 @@ zxerr_t tx_getNumItems(uint8_t *num_items);
5050
/// Gets an specific item from the transaction (including paging)
5151
zxerr_t tx_getItem(int8_t displayIdx, char *outKey, uint16_t outKeyLen, char *outValue, uint16_t outValueLen,
5252
uint8_t pageIdx, uint8_t *pageCount);
53+
54+
/// Get the transaction raw bytes
55+
/// \return
56+
const uint8_t *get_txn_raw();
57+
58+
/// Get the transaction length
59+
/// \return
60+
uint16_t get_txn_len();

0 commit comments

Comments
 (0)