qr: use larger guides for seedqr/totp scanning on jade plus
What changed, and why it matters
This commit changes the on-screen QR scanning frame size on the Jade Plus hardware wallet (which uses an ESP32-S3 processor) from small to large for seed backup, wallet import, and one-time-password (OTP) setup. It is a user-interface adjustment to make QR codes easier to scan on the larger-screen device. There is no security vulnerability here.
No security action required. Treat as a normal UI/UX improvement.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The patch adds conditional compilation (#ifdef CONFIG_IDF_TARGET_ESP32S3) so that jade_camera_scan_qr() is invoked with QR_GUIDES_LARGE instead of QR_GUIDES_SMALL on Jade Plus devices during mnemonic export verification, mnemonic QR import, and OTP QR registration. The function call and data flow are otherwise unchanged. No cryptographic, memory-safety, or access-control changes are present.
Changed components
main/process/mnemonic.cmain/process/register_otp.cInspect captured patch +12 / −0
diff --git a/main/process/mnemonic.c b/main/process/mnemonic.c
index 161f563..e6d8a6e 100644
--- a/main/process/mnemonic.c
+++ b/main/process/mnemonic.c
@@ -207,7 +207,11 @@ static bool mnemonic_export_qr(const char* mnemonic, bool* export_qr_verified)
// Verify QR by scanning it back
qr_data_t qr_data = { .len = 0 };
+#ifdef CONFIG_IDF_TARGET_ESP32S3
+ const qr_frame_guides_t qr_frame_guides = QR_GUIDES_LARGE;
+#else
const qr_frame_guides_t qr_frame_guides = QR_GUIDES_SMALL;
+#endif
jade_camera_scan_qr(&qr_data, "Scan QR to verify", qr_frame_guides, "blkstrm.com/seedqr");
if (qr_data.len == entropy_len && !memcmp(qr_data.data, entropy, entropy_len)) {
// QR Code scanned, and it matched expected entropy
@@ -1161,7 +1165,11 @@ static bool mnemonic_qr(char* mnemonic, const size_t mnemonic_len)
mnemonic[0] = '\0';
// We return 'true' if we scanned any string data at all
+#ifdef CONFIG_IDF_TARGET_ESP32S3
+ const qr_frame_guides_t qr_frame_guides = QR_GUIDES_LARGE;
+#else
const qr_frame_guides_t qr_frame_guides = QR_GUIDES_SMALL;
+#endif
const bool qr_scanned
= jade_camera_scan_qr(&qr_data, NULL, qr_frame_guides, "blkstrm.com/scanwallet") && qr_data.len > 0;
if (!qr_scanned) {
diff --git a/main/process/register_otp.c b/main/process/register_otp.c
index b834fd4..9e5a04c 100644
--- a/main/process/register_otp.c
+++ b/main/process/register_otp.c
@@ -349,7 +349,11 @@ bool register_otp_qr(void)
SENSITIVE_PUSH(&qr_data, sizeof(qr_data));
// Get URI from qr code scan
+#ifdef CONFIG_IDF_TARGET_ESP32S3
+ const qr_frame_guides_t qr_frame_guides = QR_GUIDES_LARGE;
+#else
const qr_frame_guides_t qr_frame_guides = QR_GUIDES_SMALL;
+#endif
if (!jade_camera_scan_qr(&qr_data, NULL, qr_frame_guides, "blkstrm.com/otp") || !qr_data.len) {
// User exit without scanning
JADE_LOGW("No qr code scanned");
Why this scored 18/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.