Skip to content
This repository has been archived by the owner on Feb 1, 2023. It is now read-only.

Commit

Permalink
Add some app settings (#117)
Browse files Browse the repository at this point in the history
* Add setting to enable blind signing

* Add a flags arg for SummaryItem display

* Add a SummaryItem display flag for long pubkeys

* Add setting for long pubkey display
  • Loading branch information
t-nelson authored Apr 22, 2020
1 parent fa45cd2 commit ef6e3f4
Show file tree
Hide file tree
Showing 10 changed files with 164 additions and 106 deletions.
9 changes: 8 additions & 1 deletion libsol/include/sol/transaction_summary.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,14 @@ extern char G_transaction_summary_title[TITLE_SIZE];
extern char G_transaction_summary_text[TEXT_BUFFER_LENGTH];

void transaction_summary_reset();
int transaction_summary_display_item(size_t item_index);
enum DisplayFlags {
DisplayFlagNone = 0,
DisplayFlagLongPubkeys = 1 << 0,
DisplayFlagAll = (
DisplayFlagLongPubkeys
),
};
int transaction_summary_display_item(size_t item_index, enum DisplayFlags flags);
int transaction_summary_finalize(
enum SummaryItemKind* item_kinds,
size_t* item_kinds_len
Expand Down
6 changes: 3 additions & 3 deletions libsol/message_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ static void process_message_body_and_sanity_check(const uint8_t* message, size_t
assert(transaction_summary_finalize(kinds, &num_kinds) == 0);
assert(num_kinds == expected_fields);
for (size_t i = 0; i < num_kinds; i++) {
assert(transaction_summary_display_item(i) == 0);
assert(transaction_summary_display_item(i, DisplayFlagNone) == 0);
}
}

Expand Down Expand Up @@ -639,7 +639,7 @@ void test_process_message_body_vote_update_node_v1_0_7() {
char expected[SUMMARY_LENGTH + 2 + SUMMARY_LENGTH + 1];
print_summary(bs58_expected, expected, sizeof(expected), SUMMARY_LENGTH, SUMMARY_LENGTH);

transaction_summary_display_item(1); // node id
transaction_summary_display_item(1, DisplayFlagNone); // node id
assert_string_equal(G_transaction_summary_text, expected);
}

Expand Down Expand Up @@ -672,7 +672,7 @@ void test_process_message_body_vote_update_node_v1_0_8() {
char expected[SUMMARY_LENGTH + 2 + SUMMARY_LENGTH + 1];
print_summary(bs58_expected, expected, sizeof(expected), SUMMARY_LENGTH, SUMMARY_LENGTH);

transaction_summary_display_item(1); // node id
transaction_summary_display_item(1, DisplayFlagNone); // node id
assert_string_equal(G_transaction_summary_text, expected);
}

Expand Down
4 changes: 2 additions & 2 deletions libsol/system_instruction_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -273,11 +273,11 @@ void test_process_system_transfer() {
assert(transaction_summary_finalize(kinds, &num_kinds) == 0);
assert(num_kinds == 4);

transaction_summary_display_item(0);
transaction_summary_display_item(0, DisplayFlagNone);
assert_string_equal(G_transaction_summary_text, "0.000000042 SOL");

// Fee-payer is sender
transaction_summary_display_item(3);
transaction_summary_display_item(3, DisplayFlagNone);
assert_string_equal(G_transaction_summary_text, "sender");
}

Expand Down
32 changes: 21 additions & 11 deletions libsol/transaction_summary.c
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,8 @@ int transaction_summary_set_fee_payer_string(const char* string) {
}

static int transaction_summary_update_display_for_item(
const SummaryItem* item
const SummaryItem* item,
enum DisplayFlags flags
) {
switch (item->kind) {
case SummaryItemNone:
Expand Down Expand Up @@ -198,14 +199,23 @@ static int transaction_summary_update_display_for_item(
tmp_buf,
sizeof(tmp_buf)
));
BAIL_IF(
print_summary(
tmp_buf,
G_transaction_summary_text,
BASE58_PUBKEY_SHORT,
SUMMARY_LENGTH,
SUMMARY_LENGTH
));
if (flags & DisplayFlagLongPubkeys) {
BAIL_IF(
print_string(
tmp_buf,
G_transaction_summary_text,
TEXT_BUFFER_LENGTH
));
} else {
BAIL_IF(
print_summary(
tmp_buf,
G_transaction_summary_text,
BASE58_PUBKEY_SHORT,
SUMMARY_LENGTH,
SUMMARY_LENGTH
));
}
break;
}
case SummaryItemHash:
Expand Down Expand Up @@ -236,7 +246,7 @@ static int transaction_summary_update_display_for_item(
return 0;
}

int transaction_summary_display_item(size_t item_index) {
int transaction_summary_display_item(size_t item_index, enum DisplayFlags flags) {
struct TransactionSummary* summary = &G_transaction_summary;
SummaryItem* item = NULL;
SummaryItem* maybe_item = &summary->primary;
Expand Down Expand Up @@ -284,7 +294,7 @@ int transaction_summary_display_item(size_t item_index) {
return 1;
}

return transaction_summary_update_display_for_item(item);
return transaction_summary_update_display_for_item(item, flags);
}

#define SET_IF_USED(item, item_kinds, index) \
Expand Down
56 changes: 34 additions & 22 deletions libsol/transaction_summary_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -148,30 +148,32 @@ void test_transaction_summary_update_display_for_item() {
SummaryItem item;

item.kind = SummaryItemNone;
assert(transaction_summary_update_display_for_item(&item) == 1);
assert(transaction_summary_update_display_for_item(&item, DisplayFlagNone) == 1);

summary_item_set_amount(&item, "amount", 42);
assert(transaction_summary_update_display_for_item(&item) == 0);
assert(transaction_summary_update_display_for_item(&item, DisplayFlagNone) == 0);
assert_transaction_summary_display("amount", "0.000000042 SOL");

summary_item_set_i64(&item, "i64", -42);
assert(transaction_summary_update_display_for_item(&item) == 0);
assert(transaction_summary_update_display_for_item(&item, DisplayFlagNone) == 0);
assert_transaction_summary_display("i64", "-42");

summary_item_set_u64(&item, "u64", 4242);
assert(transaction_summary_update_display_for_item(&item) == 0);
assert(transaction_summary_update_display_for_item(&item, DisplayFlagNone) == 0);
assert_transaction_summary_display("u64", "4242");

Pubkey pubkey;
memset(&pubkey, 0, sizeof(Pubkey));
summary_item_set_pubkey(&item, "pubkey", &pubkey);
assert(transaction_summary_update_display_for_item(&item) == 0);
assert(transaction_summary_update_display_for_item(&item, DisplayFlagNone) == 0);
assert_transaction_summary_display("pubkey", "1111111..1111111");
assert(transaction_summary_update_display_for_item(&item, DisplayFlagLongPubkeys) == 0);
assert_transaction_summary_display("pubkey", "11111111111111111111111111111111");

Hash hash;
memset(&hash, 0, sizeof(Hash));
summary_item_set_hash(&item, "hash", &hash);
assert(transaction_summary_update_display_for_item(&item) == 0);
assert(transaction_summary_update_display_for_item(&item, DisplayFlagNone) == 0);
assert_transaction_summary_display(
"hash",
"11111111111111111111111111111111"
Expand All @@ -180,12 +182,12 @@ void test_transaction_summary_update_display_for_item() {
uint8_t string_data[] = { 0x74, 0x65, 0x73, 0x74 };
SizedString sized_string = { sizeof(string_data), (char*)string_data };
summary_item_set_sized_string(&item, "sizedString", &sized_string);
assert(transaction_summary_update_display_for_item(&item) == 0);
assert(transaction_summary_update_display_for_item(&item, DisplayFlagNone) == 0);
assert_transaction_summary_display("sizedString", "test");

const char* string = "value";
summary_item_set_string(&item, "string", string);
assert(transaction_summary_update_display_for_item(&item) == 0);
assert(transaction_summary_update_display_for_item(&item, DisplayFlagNone) == 0);
assert_transaction_summary_display("string", "value");
}

Expand All @@ -194,18 +196,28 @@ void test_transaction_summary_update_display_for_item() {
SummaryItem* si; \
assert((si = transaction_summary_ ## item ## _item()) != NULL); \
summary_item_set_u64(si, #item, 42); \
assert(transaction_summary_display_item(item_index) == 0); \
assert( \
transaction_summary_display_item( \
item_index, \
DisplayFlagNone \
) == 0 \
); \
assert_transaction_summary_display(#item, "42"); \
} while (0)

#define display_item_test_helper_general_item(general_index) \
do { \
SummaryItem* si; \
const char* title = "general_" #general_index; \
assert((si = transaction_summary_general_item()) != NULL); \
summary_item_set_u64(si, title, 42); \
assert(transaction_summary_display_item(general_index + 1) == 0); \
assert_transaction_summary_display(title, "42"); \
#define display_item_test_helper_general_item(general_index) \
do { \
SummaryItem* si; \
const char* title = "general_" #general_index; \
assert((si = transaction_summary_general_item()) != NULL); \
summary_item_set_u64(si, title, 42); \
assert( \
transaction_summary_display_item( \
general_index + 1, \
DisplayFlagNone \
) == 0 \
); \
assert_transaction_summary_display(title, "42"); \
} while (0)

void test_transaction_summary_display_item() {
Expand Down Expand Up @@ -344,15 +356,15 @@ void test_repro_unrecognized_format_reverse_nav_hash_corruption_bug() {
assert(transaction_summary_finalize(kinds, &num_kinds) == 0);
assert(num_kinds == 3);

assert(transaction_summary_display_item(0) == 0);
assert(transaction_summary_display_item(0, DisplayFlagNone) == 0);
assert_transaction_summary_display(primary_title, primary_text);
assert(transaction_summary_display_item(1) == 0);
assert(transaction_summary_display_item(1, DisplayFlagNone) == 0);
assert_transaction_summary_display(message_hash_title, message_hash_text);
assert(transaction_summary_display_item(2) == 0);
assert(transaction_summary_display_item(2, DisplayFlagNone) == 0);
assert_transaction_summary_display(fee_payer_title, fee_payer_text);
assert(transaction_summary_display_item(1) == 0);
assert(transaction_summary_display_item(1, DisplayFlagNone) == 0);
assert_transaction_summary_display(message_hash_title, message_hash_text);
assert(transaction_summary_display_item(0) == 0);
assert(transaction_summary_display_item(0, DisplayFlagNone) == 0);
assert_transaction_summary_display(primary_title, primary_text);
}

Expand Down
18 changes: 16 additions & 2 deletions src/globals.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,23 @@ extern ux_state_t ux;
extern unsigned int ux_step;
extern unsigned int ux_step_count;

enum BlindSign {
BlindSignDisabled = 0,
BlindSignEnabled = 1,
};

enum PubkeyDisplay {
PubkeyDisplayLong = 0,
PubkeyDisplayShort = 1,
};

typedef struct AppSettings {
uint8_t allow_blind_sign;
uint8_t pubkey_display;
} AppSettings;

typedef struct internalStorage_t {
unsigned char dummy_setting_1;
unsigned char dummy_setting_2;
AppSettings settings;
uint8_t initialized;
} internalStorage_t;

Expand Down
10 changes: 4 additions & 6 deletions src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,8 @@ void handleApdu(volatile unsigned int *flags, volatile unsigned int *tx) {
switch (G_io_apdu_buffer[OFFSET_INS]) {
case INS_GET_APP_CONFIGURATION:
case INS_GET_APP_CONFIGURATION16:
G_io_apdu_buffer[0] = (N_storage.dummy_setting_1 ? 0x01 : 0x00);
G_io_apdu_buffer[1] = (N_storage.dummy_setting_2 ? 0x01 : 0x00);
G_io_apdu_buffer[0] = N_storage.settings.allow_blind_sign;
G_io_apdu_buffer[1] = N_storage.settings.pubkey_display;
G_io_apdu_buffer[2] = LEDGER_MAJOR_VERSION;
G_io_apdu_buffer[3] = LEDGER_MINOR_VERSION;
G_io_apdu_buffer[4] = LEDGER_PATCH_VERSION;
Expand Down Expand Up @@ -312,17 +312,15 @@ void app_exit(void) {
void nv_app_state_init(){
if (N_storage.initialized != 0x01) {
internalStorage_t storage;
storage.dummy_setting_1 = 0x00;
storage.dummy_setting_2 = 0x00;
storage.settings.allow_blind_sign = BlindSignDisabled;
storage.settings.pubkey_display = PubkeyDisplayLong;
storage.initialized = 0x01;
nvm_write(
(internalStorage_t*)&N_storage,
(void*)&storage,
sizeof(internalStorage_t)
);
}
dummy_setting_1 = N_storage.dummy_setting_1;
dummy_setting_2 = N_storage.dummy_setting_2;
}

__attribute__((section(".boot"))) int main(void) {
Expand Down
Loading

0 comments on commit ef6e3f4

Please sign in to comment.