Skip to content

Commit 2e05d44

Browse files
authored
Apex support (#209)
* add apex device * bump version
1 parent b48490f commit 2e05d44

12 files changed

Lines changed: 139 additions & 97 deletions

File tree

app/ui/view.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ void view_spinner_show(const char *text);
134134

135135
void view_review_show_generic(review_type_e reviewKind, const char *title, const char *validate);
136136

137-
#if defined(TARGET_STAX) || defined(TARGET_FLEX)
137+
#if defined(TARGET_STAX) || defined(TARGET_FLEX) || defined(TARGET_APEX_P)
138138
typedef enum {
139139
EXPERT_MODE = 0,
140140
#ifdef APP_ACCOUNT_MODE_ENABLED
@@ -150,4 +150,4 @@ typedef enum {
150150
} settings_list_e;
151151

152152
void view_set_switch_subtext(settings_list_e switch_id, const char *subtext);
153-
#endif // TARGET_STAX || TARGET_FLEX
153+
#endif // TARGET_STAX || TARGET_FLEX || TARGET_APEX_P

app/ui/view_internal.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
#endif
3535
#define MAX_CHARS_SUBMSG_LINE 2048
3636
#define MAX_CHARS_HEXMESSAGE 160
37-
#elif defined(TARGET_STAX) || defined(TARGET_FLEX)
37+
#elif defined(TARGET_STAX) || defined(TARGET_FLEX) || defined(TARGET_APEX_P)
3838
#include "nbgl_use_case.h"
3939
#define MAX_LINES_PER_PAGE_REVIEW NB_MAX_LINES_IN_REVIEW
4040
#define MAX_CHARS_PER_KEY_LINE 64
@@ -121,7 +121,7 @@ static const char *shortcut_value = SHORTCUT_VALUE;
121121

122122
// FIXME: Wait to be fixed on SDK:
123123
// https://github.com/LedgerHQ/ledger-secure-sdk/blob/fe169b19c7445f2477c26035a827c22ba9f84964/lib_nbgl/include/nbgl_use_case.h#L59
124-
#if defined(TARGET_STAX) || defined(TARGET_FLEX)
124+
#if defined(TARGET_STAX) || defined(TARGET_FLEX) || defined(TARGET_APEX_P)
125125
#ifdef NB_MAX_DISPLAYED_PAIRS_IN_REVIEW
126126
#undef NB_MAX_DISPLAYED_PAIRS_IN_REVIEW
127127
#define NB_MAX_DISPLAYED_PAIRS_IN_REVIEW 6
@@ -130,7 +130,7 @@ static const char *shortcut_value = SHORTCUT_VALUE;
130130

131131
typedef struct {
132132
struct {
133-
#if defined(TARGET_STAX) || defined(TARGET_FLEX)
133+
#if defined(TARGET_STAX) || defined(TARGET_FLEX) || defined(TARGET_APEX_P)
134134
char *key;
135135
char *value;
136136
char keys[NB_MAX_DISPLAYED_PAIRS_IN_REVIEW][MAX_CHARS_PER_KEY_LINE];

app/ui/view_nbgl.c

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
#include "bolos_target.h"
1818

19-
#if defined(TARGET_STAX) || defined(TARGET_FLEX)
19+
#if defined(TARGET_STAX) || defined(TARGET_FLEX) || defined(TARGET_APEX_P)
2020

2121
#include "actions.h"
2222
#include "app_mode.h"
@@ -40,6 +40,20 @@ zxerr_t account_enabled();
4040
#define VERIFY_TITLE_LABEL_GENERIC "Verify operation"
4141
#define INFO_LIST_SIZE 4
4242
#define SETTING_CONTENTS_NB 1
43+
44+
// Define icon variables based on target platform
45+
#if defined(TARGET_STAX) || defined(TARGET_FLEX)
46+
#define C_IMPORTANT_CIRCLE_ICON C_Important_Circle_64px
47+
#define C_WARNING_ICON C_Warning_64px
48+
#define C_REVIEW_ICON C_Review_64px
49+
#define C_ICON C_icon_stax_64
50+
#elif defined(TARGET_APEX_P)
51+
#define C_IMPORTANT_CIRCLE_ICON C_Important_Circle_24px
52+
#define C_WARNING_ICON C_Warning_24px
53+
#define C_REVIEW_ICON C_Review_48px
54+
#define C_ICON C_icon_apex_p_48
55+
#endif
56+
4357
static const char HOME_TEXT[] =
4458
"This application enables\nsigning transactions on the\n" MENU_MAIN_APP_LINE1 " network";
4559

@@ -83,7 +97,7 @@ static void h_approve_internal(void) { h_approve(review_type); }
8397

8498
#ifdef TARGET_STAX
8599
#define MAX_INFO_LIST_ITEM_PER_PAGE 3
86-
#else // TARGET_FLEX
100+
#else // TARGET_FLEX || TARGET_APEX_P
87101
#define MAX_INFO_LIST_ITEM_PER_PAGE 2
88102
#endif
89103

@@ -175,22 +189,21 @@ void view_custom_error_show(const char *upper, const char *lower) {
175189
MEMZERO(viewdata.value, MAX_CHARS_PER_VALUE1_LINE);
176190
snprintf(viewdata.key, MAX_CHARS_PER_KEY_LINE, "%s", upper);
177191
snprintf(viewdata.value, MAX_CHARS_PER_VALUE1_LINE, "%s", lower);
178-
179-
nbgl_useCaseChoice(&C_Important_Circle_64px, viewdata.key, viewdata.value, "Ok", "", confirm_error);
192+
nbgl_useCaseChoice(&C_IMPORTANT_CIRCLE_ICON, viewdata.key, viewdata.value, "Ok", "", confirm_error);
180193
}
181194

182195
void view_blindsign_error_show() {
183-
nbgl_useCaseChoice(&C_Warning_64px, "This transaction cannot\nbe clear-signed",
196+
nbgl_useCaseChoice(&C_WARNING_ICON, "This transaction cannot\nbe clear-signed",
184197
"Enable blind signing in the\nsettings to sign this\ntransaction.", "Go to settings",
185198
"Reject Transaction", goto_settings);
186199
}
187200

188201
void view_error_show_impl() {
189-
nbgl_useCaseChoice(&C_Important_Circle_64px, viewdata.key, viewdata.value, "Ok", NULL, confirm_setting);
202+
nbgl_useCaseChoice(&C_IMPORTANT_CIRCLE_ICON, viewdata.key, viewdata.value, "Ok", NULL, confirm_setting);
190203
}
191204

192205
void view_settings_show_impl() {
193-
nbgl_useCaseHomeAndSettings(MENU_MAIN_APP_LINE1, &C_icon_stax_64, HOME_TEXT, 0, &settingContents, &infoList, NULL,
206+
nbgl_useCaseHomeAndSettings(MENU_MAIN_APP_LINE1, &C_ICON, HOME_TEXT, 0, &settingContents, &infoList, NULL,
194207
app_quit);
195208
}
196209

@@ -373,8 +386,8 @@ void view_idle_show_impl(__Z_UNUSED uint8_t item_idx, const char *statusString)
373386
infoList.infoContents = INFO_VALUES_PAGE;
374387
infoList.infoTypes = INFO_KEYS_PAGE;
375388

376-
nbgl_useCaseHomeAndSettings(MENU_MAIN_APP_LINE1, &C_icon_stax_64, home_text, INIT_HOME_PAGE, &settingContents,
377-
&infoList, NULL, app_quit);
389+
nbgl_useCaseHomeAndSettings(MENU_MAIN_APP_LINE1, &C_ICON, home_text, INIT_HOME_PAGE, &settingContents, &infoList,
390+
NULL, app_quit);
378391
}
379392

380393
void view_message_impl(const char *title, const char *message) {
@@ -402,7 +415,7 @@ static void review_configuration() {
402415
view_error_show();
403416
}
404417

405-
nbgl_useCaseChoice(&C_Important_Circle_64px, viewdata.key, viewdata.value, "Accept", "Reject", confirm_setting);
418+
nbgl_useCaseChoice(&C_IMPORTANT_CIRCLE_ICON, viewdata.key, viewdata.value, "Accept", "Reject", confirm_setting);
406419
}
407420

408421
static void config_useCaseAddressReview() {
@@ -440,7 +453,7 @@ static void config_useCaseAddressReview() {
440453
#else
441454
intro_message = ADDRESS_TEXT;
442455
#endif
443-
nbgl_useCaseAddressReview(viewdata.value, extraPagesPtr, &C_icon_stax_64, intro_message, NULL, reviewAddressChoice);
456+
nbgl_useCaseAddressReview(viewdata.value, extraPagesPtr, &C_ICON, intro_message, NULL, reviewAddressChoice);
444457
}
445458

446459
static nbgl_layoutTagValue_t *update_item_callback(uint8_t index) {
@@ -470,13 +483,12 @@ static void config_useCaseReview(nbgl_operationType_t type) {
470483
pairList.startIndex = 0;
471484

472485
if (app_mode_blindsign_required()) {
473-
nbgl_useCaseReviewBlindSigning(type, &pairList, &C_icon_stax_64,
486+
nbgl_useCaseReviewBlindSigning(type, &pairList, &C_ICON,
474487
(intro_message == NULL ? "Review transaction" : intro_message), intro_submessage,
475488
"Accept risk and sign transaction ?", NULL, reviewTransactionChoice);
476489
} else {
477-
nbgl_useCaseReview(type, &pairList, &C_icon_stax_64,
478-
(intro_message == NULL ? "Review transaction" : intro_message), intro_submessage,
479-
(approval_label_buf[0] != '\0' ? approval_label_buf : APPROVE_LABEL_NBGL),
490+
nbgl_useCaseReview(type, &pairList, &C_ICON, (intro_message == NULL ? "Review transaction" : intro_message),
491+
intro_submessage, (approval_label_buf[0] != '\0' ? approval_label_buf : APPROVE_LABEL_NBGL),
480492
reviewTransactionChoice);
481493
}
482494
}
@@ -494,13 +506,14 @@ static void config_useCaseMessageReview() {
494506
pairList.callback = update_item_callback;
495507
pairList.startIndex = 0;
496508
if (app_mode_blindsign_required()) {
497-
nbgl_useCaseReviewBlindSigning(TYPE_MESSAGE, &pairList, &C_Review_64px,
509+
nbgl_useCaseReviewBlindSigning(TYPE_MESSAGE, &pairList, &C_REVIEW_ICON,
498510
(intro_message == NULL ? "Review Message" : intro_message), NULL,
499511
"Accept risk and sign message ?", NULL, reviewMessageChoice);
500512
} else {
501-
nbgl_useCaseReview(
502-
TYPE_MESSAGE, &pairList, &C_Review_64px, (intro_message == NULL ? "Review Message" : intro_message), NULL,
503-
(approval_label_buf[0] != '\0' ? approval_label_buf : APPROVE_LABEL_NBGL_MSG), reviewMessageChoice);
513+
nbgl_useCaseReview(TYPE_MESSAGE, &pairList, &C_REVIEW_ICON,
514+
(intro_message == NULL ? "Review Message" : intro_message), intro_submessage,
515+
(approval_label_buf[0] != '\0' ? approval_label_buf : APPROVE_LABEL_NBGL_MSG),
516+
reviewMessageChoice);
504517
}
505518
}
506519

@@ -517,9 +530,8 @@ static void config_useCaseReviewLight(const char *title, const char *validate) {
517530
pairList.callback = update_item_callback;
518531
pairList.startIndex = 0;
519532

520-
nbgl_useCaseReviewLight(TYPE_OPERATION, &pairList, &C_icon_stax_64,
521-
(title == NULL ? VERIFY_TITLE_LABEL_GENERIC : title), NULL,
522-
(validate == NULL ? APPROVE_LABEL_NBGL_GENERIC : validate), reviewGenericChoice);
533+
nbgl_useCaseReviewLight(TYPE_OPERATION, &pairList, &C_ICON, (title == NULL ? VERIFY_TITLE_LABEL_GENERIC : title),
534+
NULL, (validate == NULL ? APPROVE_LABEL_NBGL_GENERIC : validate), reviewGenericChoice);
523535
}
524536

525537
void view_review_show_impl(unsigned int requireReply, const char *title, const char *validate) {
@@ -547,7 +559,7 @@ void view_review_show_impl(unsigned int requireReply, const char *title, const c
547559

548560
switch (review_type) {
549561
case REVIEW_UI:
550-
nbgl_useCaseReviewStart(&C_icon_stax_64, "Review configuration", NULL, CANCEL_LABEL, review_configuration,
562+
nbgl_useCaseReviewStart(&C_ICON, "Review configuration", NULL, CANCEL_LABEL, review_configuration,
551563
h_reject_internal);
552564
break;
553565
case REVIEW_ADDRESS: {

dockerized_build.mk

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,14 @@ DOCKER_BOLOS_SDKX = NANOX_SDK
3030
DOCKER_BOLOS_SDKS2 = NANOSP_SDK
3131
DOCKER_BOLOS_SDKST = STAX_SDK
3232
DOCKER_BOLOS_SDKFL = FLEX_SDK
33+
DOCKER_BOLOS_SDKAP = APEX_P_SDK
3334

3435
TARGET_S = nanos
3536
TARGET_X = nanox
3637
TARGET_S2 = nanos2
3738
TARGET_ST = stax
3839
TARGET_FL = flex
40+
TARGET_AP = apex_p
3941

4042
# Note: This is not an SSH key, and being public represents no risk
4143
SCP_PUBKEY=049bc79d139c70c83a4b19e8922e5ee3e0080bb14a2e8b0752aa42cda90a1463f689b0fa68c1c0246845c2074787b649d0d8a6c0b97d4607065eee3057bdf16b83
@@ -50,7 +52,7 @@ $(info TESTS_ZEMU_DIR : $(TESTS_ZEMU_DIR))
5052
$(info TESTS_JS_DIR : $(TESTS_JS_DIR))
5153
$(info TESTS_JS_PACKAGE : $(TESTS_JS_PACKAGE))
5254

53-
DOCKER_IMAGE_ZONDAX=zondax/ledger-app-builder:ledger-75354ba1678f81c283e4a7eca09c0524185c6281
55+
DOCKER_IMAGE_ZONDAX=zondax/ledger-app-builder:ledger-ca5b0e8ca6730a7d8ba36bae8942a9a7bb6dc7fb
5456
DOCKER_IMAGE_LEDGER=ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder:latest
5557

5658
ifdef INTERACTIVE
@@ -104,6 +106,7 @@ endif
104106
@$(MAKE) buildS2
105107
@$(MAKE) buildST
106108
@$(MAKE) buildFL
109+
@$(MAKE) buildAP
107110

108111
.PHONY: check_python
109112
check_python:
@@ -143,6 +146,10 @@ build_rustST:
143146
build_rustFL:
144147
$(call run_docker,$(DOCKER_BOLOS_SDKFL),$(TARGET_FL),make -j $(NPROC) rust)
145148

149+
.PHONY: build_rustAP
150+
build_rustAP:
151+
$(call run_docker,$(DOCKER_BOLOS_SDKAP),$(TARGET_AP),make -j $(NPROC) rust)
152+
146153
.PHONY: convert_icon
147154
convert_icon:
148155
@convert $(LEDGER_SRC)/tmp.gif -monochrome -size 16x16 -depth 1 $(LEDGER_SRC)/nanos_icon.gif
@@ -172,6 +179,10 @@ buildST:
172179
buildFL:
173180
$(call run_docker,$(DOCKER_BOLOS_SDKFL),$(TARGET_FL),make -j $(NPROC))
174181

182+
.PHONY: buildAP
183+
buildAP:
184+
$(call run_docker,$(DOCKER_BOLOS_SDKAP),$(TARGET_AP),make -j $(NPROC))
185+
175186
.PHONY: clean_output
176187
clean_output:
177188
@echo "Removing output files"
@@ -208,6 +219,10 @@ shellST:
208219
shellFL:
209220
$(call run_docker,$(DOCKER_BOLOS_SDKFL) -t,$(TARGET_FL),bash)
210221

222+
.PHONY: shellAP
223+
shellAP:
224+
$(call run_docker,$(DOCKER_BOLOS_SDKAP) -t,$(TARGET_AP),bash)
225+
211226
.PHONY: loadS
212227
loadS:
213228
${LEDGER_SRC}/pkg/installer_s.sh load
@@ -236,10 +251,19 @@ deleteST:
236251
loadFL:
237252
${LEDGER_SRC}/pkg/installer_flex.sh load
238253

254+
.PHONY: loadAP
255+
loadAP:
256+
${LEDGER_SRC}/pkg/installer_apex.sh load
257+
239258
.PHONY: deleteFL
240259
deleteFL:
241260
${LEDGER_SRC}/pkg/installer_flex.sh delete
242261

262+
.PHONY: deleteAP
263+
deleteAP:
264+
${LEDGER_SRC}/pkg/installer_apex.sh delete
265+
266+
243267
.PHONY: sizeS
244268
sizeS:
245269
$(CURDIR)/deps/ledger-zxlib/scripts/getSize.py nanos
@@ -260,6 +284,10 @@ sizeST:
260284
sizeFL:
261285
$(CURDIR)/deps/ledger-zxlib/scripts/getSize.py flex
262286

287+
.PHONY: sizeAP
288+
sizeAP:
289+
$(CURDIR)/deps/ledger-zxlib/scripts/getSize.py apex
290+
263291
.PHONY: show_info_recovery_mode
264292
show_info_recovery_mode:
265293
@echo "This command requires a Ledger Nano S in recovery mode. To go into recovery mode, follow:"

0 commit comments

Comments
 (0)