speculos 0.7.2.dev2__tar.gz → 0.7.2.dev18__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (416) hide show
  1. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/.github/workflows/continuous-integration-workflow.yml +1 -1
  2. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/CHANGELOG.md +9 -1
  3. {speculos-0.7.2.dev2/speculos.egg-info → speculos-0.7.2.dev18}/PKG-INFO +6 -5
  4. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/Pipfile +1 -0
  5. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/Pipfile.lock +40 -7
  6. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/README.md +3 -3
  7. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/docs/user/usage.md +3 -2
  8. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/pyproject.toml +2 -1
  9. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/__version__.py +2 -2
  10. speculos-0.7.2.dev18/speculos/cxlib/flex-api-level-cx-18.elf +0 -0
  11. speculos-0.7.2.dev18/speculos/cxlib/nanosp-api-level-cx-18.elf +0 -0
  12. speculos-0.7.2.dev18/speculos/cxlib/nanox-api-level-cx-18.elf +0 -0
  13. speculos-0.7.2.dev18/speculos/fonts/flex-fonts-18.bin +0 -0
  14. speculos-0.7.2.dev18/speculos/fonts/nanosp-fonts-18.bin +0 -0
  15. speculos-0.7.2.dev18/speculos/fonts/nanox-fonts-18.bin +0 -0
  16. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/main.py +30 -40
  17. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/mcu/display.py +11 -6
  18. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/mcu/headless.py +1 -1
  19. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/mcu/nbgl.py +1 -1
  20. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/mcu/ocr.py +6 -2
  21. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/mcu/rle_custom.py +2 -3
  22. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/mcu/screen.py +1 -1
  23. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/mcu/screen_text.py +1 -1
  24. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/mcu/seproxyhal.py +7 -4
  25. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/mcu/struct.py +2 -0
  26. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/resources/launcher +0 -0
  27. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18/speculos.egg-info}/PKG-INFO +6 -5
  28. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos.egg-info/SOURCES.txt +6 -0
  29. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos.egg-info/requires.txt +1 -0
  30. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/bagl.c +1 -1
  31. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/fonts_info.c +37 -22
  32. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/nbgl.c +36 -3
  33. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/os.c +2 -1
  34. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/emulate_unified_sdk.c +3 -3
  35. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/fonts.h +7 -0
  36. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/launcher.c +31 -5
  37. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/sdk.h +4 -0
  38. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/.clang-format +0 -0
  39. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/.codespell-ignore +0 -0
  40. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/.dockerignore +0 -0
  41. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/.github/workflows/fast-checks.yml +0 -0
  42. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/.github/workflows/force-rebase.yml +0 -0
  43. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/.github/workflows/reusable_ragger_tests_latest_speculos.yml +0 -0
  44. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/.github/workflows/speculos-builder.yml +0 -0
  45. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/.gitignore +0 -0
  46. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/CMakeLists.txt +0 -0
  47. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/COPYING +0 -0
  48. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/COPYING.LESSER +0 -0
  49. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/Dockerfile +0 -0
  50. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/MANIFEST.in +0 -0
  51. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/apps/README.md +0 -0
  52. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/apps/blue#btc#1.5#00000000.elf +0 -0
  53. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/apps/blue#ram-page#blue-2.2.5#00000000.elf +0 -0
  54. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/apps/btc-test.elf +0 -0
  55. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/apps/btc.elf +0 -0
  56. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/apps/nanos#btc#1.5#00000000.elf +0 -0
  57. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/apps/nanos#btc#1.6#29717f9c.elf +0 -0
  58. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/apps/nanos#btc#1.6#6bd0a5f8.elf +0 -0
  59. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/apps/nanos#btc#2.0#ce796c1b.elf +0 -0
  60. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/apps/nanos#btc#2.1#1c8db8da.elf +0 -0
  61. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/apps/nanos#btc-test#1.5#00000000.elf +0 -0
  62. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/apps/nanos#btc-test#1.6#29717f9c.elf +0 -0
  63. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/apps/nanos#btc-test#1.6#6bd0a5f8.elf +0 -0
  64. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/apps/nanos#btc-test#2.0#ce796c1b.elf +0 -0
  65. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/apps/nanos#btc-test#2.1#1c8db8da.elf +0 -0
  66. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/apps/nanosp#btc#1.0#a86c791b.elf +0 -0
  67. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/apps/nanosp#btc#1.0.3#17bf7619.elf +0 -0
  68. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/apps/nanosp#btc-test#1.0#a86c791b.elf +0 -0
  69. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/apps/nanosp#btc-test#1.0.3#17bf7619.elf +0 -0
  70. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/apps/nanox#btc#1.2#57272a0f.elf +0 -0
  71. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/apps/nanox#btc#2.0.2#1c8db8da.elf +0 -0
  72. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/apps/nanox#btc-test#2.0.2#1c8db8da.elf +0 -0
  73. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/build.Dockerfile +0 -0
  74. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/clang-armv7m.cmake +0 -0
  75. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/docker-compose.yml +0 -0
  76. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/docs/CNAME +0 -0
  77. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/docs/_config.yml +0 -0
  78. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/docs/dev/ci.md +0 -0
  79. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/docs/dev/getting_started.md +0 -0
  80. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/docs/dev/index.md +0 -0
  81. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/docs/dev/internals.md +0 -0
  82. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/docs/dev/tests.md +0 -0
  83. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/docs/index.md +0 -0
  84. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/docs/installation/build.md +0 -0
  85. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/docs/installation/index.md +0 -0
  86. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/docs/installation/wsl.md +0 -0
  87. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/docs/screenshot-api-nanos-btc.png +0 -0
  88. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/docs/screenshot-btc-nanos.png +0 -0
  89. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/docs/user/api.md +0 -0
  90. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/docs/user/automation.md +0 -0
  91. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/docs/user/clients.md +0 -0
  92. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/docs/user/debug.md +0 -0
  93. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/docs/user/docker.md +0 -0
  94. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/docs/user/index.md +0 -0
  95. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/docs/user/macm1.md +0 -0
  96. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/docs/user/semihosting.md +0 -0
  97. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/gcc-arm.cmake +0 -0
  98. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/lgtm.yml +0 -0
  99. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/sdk/bolos_syscalls_1.2.h +0 -0
  100. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/sdk/bolos_syscalls_1.5.h +0 -0
  101. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/sdk/bolos_syscalls_1.6.h +0 -0
  102. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/sdk/bolos_syscalls_2.0.h +0 -0
  103. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/sdk/bolos_syscalls_blue_2.2.5.h +0 -0
  104. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/sdk/bolos_syscalls_lnsp.h +0 -0
  105. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/sdk/bolos_syscalls_unified_sdk.h +0 -0
  106. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/setup.cfg +0 -0
  107. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/setup.py +0 -0
  108. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/__init__.py +0 -0
  109. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/__main__.py +0 -0
  110. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/api/README.md +0 -0
  111. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/api/__init__.py +0 -0
  112. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/api/apdu.py +0 -0
  113. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/api/api.py +0 -0
  114. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/api/automation.py +0 -0
  115. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/api/button.py +0 -0
  116. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/api/events.py +0 -0
  117. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/api/finger.py +0 -0
  118. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/api/helpers.py +0 -0
  119. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/api/resources/apdu.schema +0 -0
  120. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/api/resources/button.schema +0 -0
  121. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/api/resources/finger.schema +0 -0
  122. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/api/resources/ticker.schema +0 -0
  123. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/api/restful.py +0 -0
  124. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/api/screenshot.py +0 -0
  125. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/api/static/index.html +0 -0
  126. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/api/static/swagger/README.md +0 -0
  127. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/api/static/swagger/favicon-16x16.png +0 -0
  128. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/api/static/swagger/favicon-32x32.png +0 -0
  129. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/api/static/swagger/index.html +0 -0
  130. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/api/static/swagger/swagger-ui-bundle.js +0 -0
  131. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/api/static/swagger/swagger-ui-standalone-preset.js +0 -0
  132. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/api/static/swagger/swagger-ui.css +0 -0
  133. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/api/static/swagger/swagger.json +0 -0
  134. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/api/swagger.py +0 -0
  135. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/api/swagger.yaml +0 -0
  136. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/api/ticker.py +0 -0
  137. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/api/web_interface.py +0 -0
  138. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/client.py +0 -0
  139. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/cxlib/nanos-cx-2.0.elf +0 -0
  140. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/cxlib/nanos-cx-2.1.elf +0 -0
  141. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/cxlib/nanosp-api-level-cx-1.elf +0 -0
  142. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/cxlib/nanosp-api-level-cx-12.elf +0 -0
  143. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/cxlib/nanosp-api-level-cx-5.elf +0 -0
  144. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/cxlib/nanosp-cx-1.0.3.elf +0 -0
  145. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/cxlib/nanosp-cx-1.0.elf +0 -0
  146. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/cxlib/nanox-api-level-cx-1.elf +0 -0
  147. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/cxlib/nanox-api-level-cx-12.elf +0 -0
  148. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/cxlib/nanox-api-level-cx-5.elf +0 -0
  149. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/cxlib/nanox-cx-2.0.2.elf +0 -0
  150. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/cxlib/nanox-cx-2.0.elf +0 -0
  151. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/cxlib/stax-api-level-cx-1.elf +0 -0
  152. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/cxlib/stax-api-level-cx-10.elf +0 -0
  153. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/cxlib/stax-api-level-cx-11.elf +0 -0
  154. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/cxlib/stax-api-level-cx-12.elf +0 -0
  155. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/cxlib/stax-api-level-cx-13.elf +0 -0
  156. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/cxlib/stax-api-level-cx-14.elf +0 -0
  157. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/cxlib/stax-api-level-cx-15.elf +0 -0
  158. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/cxlib/stax-api-level-cx-3.elf +0 -0
  159. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/cxlib/stax-api-level-cx-5.elf +0 -0
  160. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/cxlib/stax-api-level-cx-7.elf +0 -0
  161. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/cxlib/stax-api-level-cx-8.elf +0 -0
  162. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/cxlib/stax-api-level-cx-9.elf +0 -0
  163. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/fonts/stax-fonts-1.bin +0 -0
  164. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/fonts/stax-fonts-10.bin +0 -0
  165. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/fonts/stax-fonts-11.bin +0 -0
  166. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/fonts/stax-fonts-12.bin +0 -0
  167. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/fonts/stax-fonts-13.bin +0 -0
  168. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/fonts/stax-fonts-14.bin +0 -0
  169. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/fonts/stax-fonts-15.bin +0 -0
  170. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/fonts/stax-fonts-3.bin +0 -0
  171. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/fonts/stax-fonts-5.bin +0 -0
  172. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/fonts/stax-fonts-7.bin +0 -0
  173. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/fonts/stax-fonts-8.bin +0 -0
  174. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/fonts/stax-fonts-9.bin +0 -0
  175. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/mcu/__init__.py +0 -0
  176. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/mcu/apdu.py +0 -0
  177. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/mcu/automation.py +0 -0
  178. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/mcu/automation_server.py +0 -0
  179. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/mcu/bagl.py +0 -0
  180. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/mcu/bagl_font.py +0 -0
  181. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/mcu/bagl_glyph.py +0 -0
  182. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/mcu/button_tcp.py +0 -0
  183. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/mcu/finger_tcp.py +0 -0
  184. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/mcu/icon.png +0 -0
  185. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/mcu/readerror.py +0 -0
  186. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/mcu/resources/automation.schema +0 -0
  187. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/mcu/usb.py +0 -0
  188. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/mcu/vnc.py +0 -0
  189. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/observer.py +0 -0
  190. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos/resources/vnc_server +0 -0
  191. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos.egg-info/dependency_links.txt +0 -0
  192. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos.egg-info/entry_points.txt +0 -0
  193. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/speculos.egg-info/top_level.txt +0 -0
  194. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/CMakeLists.txt +0 -0
  195. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/bagl.h +0 -0
  196. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx.c +0 -0
  197. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx.h +0 -0
  198. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_aes.c +0 -0
  199. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_aes.h +0 -0
  200. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_aes_sdk2.c +0 -0
  201. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_blake2.h +0 -0
  202. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_blake2b.c +0 -0
  203. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_bls.c +0 -0
  204. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_bls.h +0 -0
  205. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_bls_fp2.c +0 -0
  206. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_bls_g2.c +0 -0
  207. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_bn.c +0 -0
  208. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_common.h +0 -0
  209. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_crc.c +0 -0
  210. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_crc.h +0 -0
  211. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_curve25519.c +0 -0
  212. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_curve25519.h +0 -0
  213. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_ec.c +0 -0
  214. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_ec.h +0 -0
  215. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_ec_domain.c +0 -0
  216. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_ecpoint.c +0 -0
  217. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_ed25519.c +0 -0
  218. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_ed25519.h +0 -0
  219. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_hash.c +0 -0
  220. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_hash.h +0 -0
  221. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_hkdf.c +0 -0
  222. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_hkdf.h +0 -0
  223. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_hmac.c +0 -0
  224. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_hmac.h +0 -0
  225. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_math.c +0 -0
  226. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_math.h +0 -0
  227. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_montgomery.c +0 -0
  228. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_mpi.c +0 -0
  229. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_ripemd160.c +0 -0
  230. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_rng_rfc6979.c +0 -0
  231. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_rng_rfc6979.h +0 -0
  232. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_scc.c +0 -0
  233. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_sha256.c +0 -0
  234. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_sha3.c +0 -0
  235. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_sha512.c +0 -0
  236. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_twisted_edwards.c +0 -0
  237. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_utils.c +0 -0
  238. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_utils.h +0 -0
  239. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cx_weierstrass.c +0 -0
  240. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cxlib.c +0 -0
  241. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/cxlib.h +0 -0
  242. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/default.c +0 -0
  243. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/endorsement.c +0 -0
  244. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/endorsement.h +0 -0
  245. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/exception.h +0 -0
  246. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/nbgl.h +0 -0
  247. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/nbgl_rle.c +0 -0
  248. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/nbgl_rle.h +0 -0
  249. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/os_1.2.c +0 -0
  250. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/os_1.5.c +0 -0
  251. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/os_1.6.c +0 -0
  252. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/os_2.0.c +0 -0
  253. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/os_bip32.c +0 -0
  254. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/os_bip32.h +0 -0
  255. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/os_eip2333.c +0 -0
  256. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/seproxyhal.c +0 -0
  257. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/touch.c +0 -0
  258. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/bolos/touch.h +0 -0
  259. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/emulate.c +0 -0
  260. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/emulate.h +0 -0
  261. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/emulate_1.2.c +0 -0
  262. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/emulate_1.5.c +0 -0
  263. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/emulate_1.6.c +0 -0
  264. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/emulate_2.0.c +0 -0
  265. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/emulate_blue_2.2.5.c +0 -0
  266. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/emulate_lnsp_1.0.c +0 -0
  267. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/environment.c +0 -0
  268. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/environment.h +0 -0
  269. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/svc.c +0 -0
  270. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/svc.h +0 -0
  271. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/CMakeLists.txt +0 -0
  272. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursor.c +0 -0
  273. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursor.h +0 -0
  274. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/approved.h +0 -0
  275. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/bitcoin.h +0 -0
  276. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/blue.h +0 -0
  277. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/fabrice.h +0 -0
  278. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/frame_00.h +0 -0
  279. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/frame_01.h +0 -0
  280. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/frame_02.h +0 -0
  281. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/frame_03.h +0 -0
  282. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/frame_04.h +0 -0
  283. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/frame_05.h +0 -0
  284. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/frame_06.h +0 -0
  285. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/frame_07.h +0 -0
  286. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/frame_08.h +0 -0
  287. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/frame_09.h +0 -0
  288. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/frame_10.h +0 -0
  289. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/frame_11.h +0 -0
  290. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/frame_12.h +0 -0
  291. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/frame_13.h +0 -0
  292. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/frame_14.h +0 -0
  293. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/frame_15.h +0 -0
  294. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/frame_16.h +0 -0
  295. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/frame_17.h +0 -0
  296. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/frame_18.h +0 -0
  297. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/frame_19.h +0 -0
  298. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/frame_20.h +0 -0
  299. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/frame_21.h +0 -0
  300. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/pizza.h +0 -0
  301. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/star.h +0 -0
  302. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/sword.h +0 -0
  303. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/cursors/verynice.h +0 -0
  304. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/seccomp-bpf.h +0 -0
  305. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/src/vnc/vnc_server.c +0 -0
  306. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/CMakeLists.txt +0 -0
  307. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/CMakeLists.txt +0 -0
  308. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/blake2b_kat.data +0 -0
  309. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/groestl_224_long_msg.data +0 -0
  310. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/groestl_224_short_msg.data +0 -0
  311. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/groestl_256_long_msg.data +0 -0
  312. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/groestl_256_short_msg.data +0 -0
  313. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/groestl_384_long_msg.data +0 -0
  314. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/groestl_384_short_msg.data +0 -0
  315. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/groestl_512_long_msg.data +0 -0
  316. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/groestl_512_short_msg.data +0 -0
  317. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/hmac.data +0 -0
  318. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/keccak_224_long_msg.data +0 -0
  319. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/keccak_224_short_msg.data +0 -0
  320. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/keccak_256_long_msg.data +0 -0
  321. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/keccak_256_short_msg.data +0 -0
  322. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/keccak_384_long_msg.data +0 -0
  323. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/keccak_384_short_msg.data +0 -0
  324. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/keccak_512_long_msg.data +0 -0
  325. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/keccak_512_short_msg.data +0 -0
  326. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/sha224_long_msg.data +0 -0
  327. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/sha224_short_msg.data +0 -0
  328. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/sha256_long_msg.data +0 -0
  329. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/sha256_short_msg.data +0 -0
  330. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/sha384_long_msg.data +0 -0
  331. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/sha384_short_msg.data +0 -0
  332. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/sha3_224_long_msg.data +0 -0
  333. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/sha3_224_short_msg.data +0 -0
  334. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/sha3_256_long_msg.data +0 -0
  335. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/sha3_256_short_msg.data +0 -0
  336. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/sha3_384_long_msg.data +0 -0
  337. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/sha3_384_short_msg.data +0 -0
  338. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/sha3_512_long_msg.data +0 -0
  339. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/sha3_512_short_msg.data +0 -0
  340. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/sha512_long_msg.data +0 -0
  341. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/sha512_short_msg.data +0 -0
  342. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/shake128_long_msg.data +0 -0
  343. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/shake128_short_msg.data +0 -0
  344. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/shake128_variable_output.data +0 -0
  345. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/shake256_long_msg.data +0 -0
  346. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/shake256_short_msg.data +0 -0
  347. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/cavp/shake256_variable_output.data +0 -0
  348. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/hello.c +0 -0
  349. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/nist_cavp.c +0 -0
  350. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/nist_cavp.h +0 -0
  351. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/test_aes.c +0 -0
  352. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/test_bip32.c +0 -0
  353. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/test_blake2.c +0 -0
  354. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/test_bls.c +0 -0
  355. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/test_bn.c +0 -0
  356. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/test_crc16.c +0 -0
  357. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/test_ec.c +0 -0
  358. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/test_ecdh.c +0 -0
  359. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/test_ecdsa.c +0 -0
  360. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/test_ecpoint.c +0 -0
  361. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/test_eddsa.c +0 -0
  362. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/test_eip2333.c +0 -0
  363. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/test_endorsement.c +0 -0
  364. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/test_hmac.c +0 -0
  365. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/test_math.c +0 -0
  366. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/test_mpi_rng.c +0 -0
  367. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/test_os_global_pin_is_validated.c +0 -0
  368. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/test_rfc6979.c +0 -0
  369. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/test_ripemd.c +0 -0
  370. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/test_sha2.c +0 -0
  371. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/test_sha3.c +0 -0
  372. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/test_slip21.c +0 -0
  373. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/wycheproof/X25519.data +0 -0
  374. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/wycheproof/X448.data +0 -0
  375. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/wycheproof/ecdh_secp256k1.data +0 -0
  376. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/syscalls/wycheproof/eddsa.data +0 -0
  377. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/test_environment.c +0 -0
  378. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/utils.c +0 -0
  379. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/c/utils.h +0 -0
  380. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/python/__init__.py +0 -0
  381. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/python/api/resources/automation.json +0 -0
  382. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/python/api/test_api.py +0 -0
  383. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/python/apps/__init__.py +0 -0
  384. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/python/apps/resources/__init__.py +0 -0
  385. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/python/apps/resources/btc_getpubkey_blue.json +0 -0
  386. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/python/apps/resources/btc_getpubkey_blue.png +0 -0
  387. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/python/apps/resources/btc_getpubkey_nanos.json +0 -0
  388. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/python/apps/resources/btc_getpubkey_nanos.png +0 -0
  389. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/python/apps/resources/btc_getpubkey_nanosp.json +0 -0
  390. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/python/apps/resources/btc_getpubkey_nanosp.png +0 -0
  391. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/python/apps/resources/btc_getpubkey_nanox.json +0 -0
  392. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/python/apps/resources/btc_getpubkey_nanox.png +0 -0
  393. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/python/apps/test_btc.py +0 -0
  394. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/python/apps/test_btc_testnet.py +0 -0
  395. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/python/apps/test_ram_page.py +0 -0
  396. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/python/apps/test_vnc.py +0 -0
  397. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/python/conftest.py +0 -0
  398. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/python/mcu/resources/automation_invalid_action_args.json +0 -0
  399. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/python/mcu/resources/automation_invalid_action_name.json +0 -0
  400. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/python/mcu/resources/automation_invalid_rule_key.json +0 -0
  401. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/python/mcu/resources/automation_valid.json +0 -0
  402. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/python/mcu/test_automation.py +0 -0
  403. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/python/pytest.ini +0 -0
  404. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/python/unit/__init__.py +0 -0
  405. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/python/unit/test_client_Api.py +0 -0
  406. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tests/python/unit/test_client_SpeculosClient.py +0 -0
  407. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tools/clang-format.sh +0 -0
  408. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tools/cursor.py +0 -0
  409. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tools/debug.sh +0 -0
  410. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tools/gdbinit +0 -0
  411. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tools/gif-recorder.py +0 -0
  412. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tools/ledger-live-http-proxy.py +0 -0
  413. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tools/skins/handholding.png +0 -0
  414. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tools/skins/nano-blue.png +0 -0
  415. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tools/skins/unicorn.png +0 -0
  416. {speculos-0.7.2.dev2 → speculos-0.7.2.dev18}/tools/winamp.py +0 -0
@@ -154,7 +154,7 @@ jobs:
154
154
  id: meta
155
155
  uses: docker/metadata-action@v4
156
156
  with:
157
- images: ledgerhq/speculos
157
+ images: ghcr.io/ledgerhq/speculos
158
158
  tags: |
159
159
  type=raw,value=${{ github.sha }}
160
160
  type=ref,event=branch
@@ -5,7 +5,15 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
- ## [0.7.1] - 2-24-02-26
8
+ ## [0.8.0] - 2024-04-03
9
+
10
+ ### Added
11
+
12
+ - NBGL support for non-Stax devices
13
+ - Add Flex support
14
+ - Add support of API_LEVEL_18 for NanoX, NanoS+ and Flex
15
+
16
+ ## [0.7.1] - 2024-02-26
9
17
 
10
18
  ### Fixed
11
19
 
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: speculos
3
- Version: 0.7.2.dev2
4
- Summary: Ledger Blue, Stax and Nano S/S+/X application emulator
3
+ Version: 0.7.2.dev18
4
+ Summary: Ledger Blue, Stax, Flex and Nano S/S+/X application emulator
5
5
  Author-email: Ledger <hello@ledger.fr>
6
6
  Project-URL: Homepage, https://github.com/LedgerHQ/speculos
7
7
  Project-URL: Bug Tracker, https://github.com/LedgerHQ/speculos/issues
@@ -26,6 +26,7 @@ Requires-Dist: pillow<11.0.0,>=8.0.0
26
26
  Requires-Dist: pyelftools<1.0,>=0.27
27
27
  Requires-Dist: pyqt5<6.0.0,>=5.15.2
28
28
  Requires-Dist: requests<3.0.0,>=2.25.1
29
+ Requires-Dist: ledgered>=0.6.2
29
30
  Provides-Extra: dev
30
31
  Requires-Dist: pytest; extra == "dev"
31
32
  Requires-Dist: pytest-cov; extra == "dev"
@@ -37,7 +38,7 @@ Requires-Dist: pytest-cov; extra == "dev"
37
38
 
38
39
  ![screenshot btc nano s](https://raw.githubusercontent.com/LedgerHQ/speculos/master/docs/screenshot-api-nanos-btc.png)
39
40
 
40
- The goal of this project is to emulate Ledger Nano S/S+, Nano X, Blue and Stax apps on
41
+ The goal of this project is to emulate Ledger Nano S/S+, Nano X, Blue, Flex and Stax apps on
41
42
  standard desktop computers, without any hardware device. More information can
42
43
  be found here in the
43
44
  [documentation website](https://ledgerhq.github.io/speculos) (or in the
@@ -99,7 +100,7 @@ PRINTF("display_value: %d\n", display_value);
99
100
 
100
101
  ### Watchdog
101
102
 
102
- NanoX and Stax devices use an internal watchdog enforcing usage of regular
103
+ NanoX, Flex and Stax devices use an internal watchdog enforcing usage of regular
103
104
  calls to `io_seproxyhal_io_heartbeat();`. This watchdog is not emulated on
104
105
  Speculos.
105
106
 
@@ -121,5 +122,5 @@ Speculos is not part of Ledger bug bounty program.
121
122
  ## Are you developing a Nano App as an external developer?
122
123
 
123
124
  For a smooth and quick integration:
124
- - Follow the developers documentation on the [Developer Portal](https://developers.ledger.com/docs/nano-app/introduction/) and
125
+ - Follow the developers documentation on the [Developer Portal](https://developers.ledger.com/docs/nano-app/introduction/) and
125
126
  - [Go on Discord](https://developers.ledger.com/discord-pro/) to chat with developer support and the developer community.
@@ -15,6 +15,7 @@ pillow = ">=8.0.0,<11.0.0"
15
15
  pyelftools = ">=0.27,<1.0"
16
16
  pyqt5 = ">=5.15.2,<6.0.0"
17
17
  requests = ">=2.25.1,<3.0.0"
18
+ ledgered = ">=0.6.2"
18
19
 
19
20
  [requires]
20
21
  python_version = "3.9"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "_meta": {
3
3
  "hash": {
4
- "sha256": "1d2d56fb3692fb2ee39ed3517d4534cfb462c4beee4f8d22fb0f844c55b79b28"
4
+ "sha256": "e18891c836ceeb31bd4015caa411c87e9802c861ea17f110c1737a566a67eb91"
5
5
  },
6
6
  "pipfile-spec": 6,
7
7
  "requires": {
@@ -185,6 +185,14 @@
185
185
  "markers": "python_version >= '3.5'",
186
186
  "version": "==3.6"
187
187
  },
188
+ "importlib-metadata": {
189
+ "hashes": [
190
+ "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570",
191
+ "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"
192
+ ],
193
+ "markers": "python_version < '3.10'",
194
+ "version": "==7.1.0"
195
+ },
188
196
  "itsdangerous": {
189
197
  "hashes": [
190
198
  "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44",
@@ -210,6 +218,15 @@
210
218
  "markers": "python_version >= '3.7'",
211
219
  "version": "==4.17.3"
212
220
  },
221
+ "ledgered": {
222
+ "hashes": [
223
+ "sha256:0c83cd3f844b9a322a3fbb656a04e706b61d37e65e0986387435a4a66b5765bd",
224
+ "sha256:f57d75bdc964a2fd53ce808ea4cd8192efc9d7712b5f5f4321bde18f3d46b111"
225
+ ],
226
+ "index": "pypi",
227
+ "markers": "python_version >= '3.7'",
228
+ "version": "==0.6.3"
229
+ },
213
230
  "markupsafe": {
214
231
  "hashes": [
215
232
  "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf",
@@ -362,11 +379,11 @@
362
379
  },
363
380
  "pyelftools": {
364
381
  "hashes": [
365
- "sha256:2fc92b0d534f8b081f58c7c370967379123d8e00984deb53c209364efd575b40",
366
- "sha256:544c3440eddb9a0dce70b6611de0b28163d71def759d2ed57a0d00118fc5da86"
382
+ "sha256:c774416b10310156879443b81187d182d8d9ee499660380e645918b50bc88f99",
383
+ "sha256:f52de7b3c7e8c64c8abc04a79a1cf37ac5fb0b8a49809827130b858944840607"
367
384
  ],
368
385
  "index": "pypi",
369
- "version": "==0.30"
386
+ "version": "==0.31"
370
387
  },
371
388
  "pyqt5": {
372
389
  "hashes": [
@@ -479,13 +496,21 @@
479
496
  "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
480
497
  "version": "==1.16.0"
481
498
  },
499
+ "toml": {
500
+ "hashes": [
501
+ "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b",
502
+ "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"
503
+ ],
504
+ "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
505
+ "version": "==0.10.2"
506
+ },
482
507
  "urllib3": {
483
508
  "hashes": [
484
- "sha256:051d961ad0c62a94e50ecf1af379c3aba230c66c710493493560c0c223c49f20",
485
- "sha256:ce3711610ddce217e6d113a2732fafad960a03fd0318c91faa79481e35c11224"
509
+ "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d",
510
+ "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"
486
511
  ],
487
512
  "markers": "python_version >= '3.8'",
488
- "version": "==2.2.0"
513
+ "version": "==2.2.1"
489
514
  },
490
515
  "werkzeug": {
491
516
  "hashes": [
@@ -494,6 +519,14 @@
494
519
  ],
495
520
  "markers": "python_version >= '3.8'",
496
521
  "version": "==3.0.1"
522
+ },
523
+ "zipp": {
524
+ "hashes": [
525
+ "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b",
526
+ "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"
527
+ ],
528
+ "markers": "python_version >= '3.8'",
529
+ "version": "==3.18.1"
497
530
  }
498
531
  },
499
532
  "develop": {}
@@ -5,7 +5,7 @@
5
5
 
6
6
  ![screenshot btc nano s](https://raw.githubusercontent.com/LedgerHQ/speculos/master/docs/screenshot-api-nanos-btc.png)
7
7
 
8
- The goal of this project is to emulate Ledger Nano S/S+, Nano X, Blue and Stax apps on
8
+ The goal of this project is to emulate Ledger Nano S/S+, Nano X, Blue, Flex and Stax apps on
9
9
  standard desktop computers, without any hardware device. More information can
10
10
  be found here in the
11
11
  [documentation website](https://ledgerhq.github.io/speculos) (or in the
@@ -67,7 +67,7 @@ PRINTF("display_value: %d\n", display_value);
67
67
 
68
68
  ### Watchdog
69
69
 
70
- NanoX and Stax devices use an internal watchdog enforcing usage of regular
70
+ NanoX, Flex and Stax devices use an internal watchdog enforcing usage of regular
71
71
  calls to `io_seproxyhal_io_heartbeat();`. This watchdog is not emulated on
72
72
  Speculos.
73
73
 
@@ -89,5 +89,5 @@ Speculos is not part of Ledger bug bounty program.
89
89
  ## Are you developing a Nano App as an external developer?
90
90
 
91
91
  For a smooth and quick integration:
92
- - Follow the developers documentation on the [Developer Portal](https://developers.ledger.com/docs/nano-app/introduction/) and
92
+ - Follow the developers documentation on the [Developer Portal](https://developers.ledger.com/docs/nano-app/introduction/) and
93
93
  - [Go on Discord](https://developers.ledger.com/discord-pro/) to chat with developer support and the developer community.
@@ -12,13 +12,14 @@ After having [installed the requirements and built](../installation/build.md) sp
12
12
 
13
13
  The docker image can also be used directly, as detailed in the specific [docker documentation page](docker.md).
14
14
 
15
- With applications built by recent SDKs, Speculos can automatically detect the targeted device. Otherwise, the Nano S is the default; the Nano X, Nano S+, Stax and Blue can be specified on the command line:
15
+ With applications built by recent SDKs, Speculos can automatically detect the targeted device. Otherwise, the Nano S is the default; the Nano X, Nano S+, Flex, Stax and Blue can be specified on the command line:
16
16
 
17
17
  ```shell
18
18
  ./speculos.py --model nanox apps/nanox#btc#2.0.2#1c8db8da.elf
19
19
  ./speculos.py --model nanosp apps/nanosp#btc#1.0.3#17bf7619.elf
20
20
  ./speculos.py --model blue --sdk 1.5 apps/blue#btc#1.5#00000000.elf
21
21
  ./speculos.py --model stax apps/btc.elf.elf
22
+ ./speculos.py --model flex apps/btc.elf.elf
22
23
  ```
23
24
 
24
25
  The last SDK version is automatically selected. However, a specific version
@@ -93,4 +94,4 @@ Launch the Bitcoin Testnet app, which requires the Bitcoin app:
93
94
 
94
95
  ## OCR
95
96
 
96
- OCR is available for NanoX, Nanos S+ and Stax with built in character recognition.
97
+ OCR is available for NanoX, Nanos S+, Flex and Stax with built in character recognition.
@@ -10,7 +10,7 @@ build-backend = "setuptools.build_meta"
10
10
  [project]
11
11
  name = "speculos"
12
12
  authors = [{name = "Ledger", email = "hello@ledger.fr"}]
13
- description = "Ledger Blue, Stax and Nano S/S+/X application emulator"
13
+ description = "Ledger Blue, Stax, Flex and Nano S/S+/X application emulator"
14
14
  classifiers = [
15
15
  "Programming Language :: Python :: 3",
16
16
  "Programming Language :: Python :: 3.8",
@@ -32,6 +32,7 @@ dependencies = [
32
32
  "pyelftools>=0.27,<1.0",
33
33
  "pyqt5>=5.15.2,<6.0.0",
34
34
  "requests>=2.25.1,<3.0.0",
35
+ "ledgered>=0.6.2",
35
36
  ]
36
37
  dynamic = ["version"]
37
38
 
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.7.2.dev2'
16
- __version_tuple__ = version_tuple = (0, 7, 2, 'dev2')
15
+ __version__ = version = '0.7.2.dev18'
16
+ __version_tuple__ = version_tuple = (0, 7, 2, 'dev18')
@@ -16,6 +16,7 @@ import sys
16
16
  import threading
17
17
  import pkg_resources
18
18
  from elftools.elf.elffile import ELFFile
19
+ from ledgered.binary import LedgerBinaryApp
19
20
  from mnemonic import mnemonic
20
21
  from typing import Optional, Type
21
22
 
@@ -48,28 +49,6 @@ def set_pdeath(sig):
48
49
  libc.prctl(PR_SET_PDEATHSIG, sig)
49
50
 
50
51
 
51
- ELF_METADATA_SECTIONS = [
52
- "target",
53
- "app_name",
54
- "app_version",
55
- "api_level"
56
- ]
57
-
58
-
59
- def get_elf_ledger_metadata(app_path):
60
- with open(app_path, 'rb') as fp:
61
- elf = ELFFile(fp)
62
- metadata = {}
63
- for section_name in ELF_METADATA_SECTIONS:
64
- section = elf.get_section_by_name(f"ledger.{section_name}")
65
- if section:
66
- metadata[section_name] = section.data().decode("utf-8").strip()
67
- if section_name == "target":
68
- if metadata[section_name] == "nanos2":
69
- metadata[section_name] = "nanosp"
70
- return metadata
71
-
72
-
73
52
  def get_elf_infos(app_path):
74
53
  with open(app_path, 'rb') as fp:
75
54
  elf = ELFFile(fp)
@@ -106,8 +85,9 @@ def get_elf_infos(app_path):
106
85
  svc_cx_call_symbol = symtab.get_symbol_by_name("SVC_cx_call")
107
86
  if svc_cx_call_symbol is not None:
108
87
  svc_cx_call_addr = svc_cx_call_symbol[0]['st_value'] & (~1)
109
- # Check where are located fonts in .elf file (LNX/LNS+ only)
110
- # (Stax fonts are loaded at a known location: STAX_FONTS_ARRAY_ADDR)
88
+ # Check where are located fonts in .elf file (LNX/LNS+ with BAGL only)
89
+ # (on apps using NBGL, fonts are loaded from a known location: STAX_FONTS_ARRAY_ADDR,
90
+ # FLEX_FONTS_ARRAY_ADDR, NANOX_FONTS_ARRAY_ADDR or NANOSP_FONTS_ARRAY_ADDR)
111
91
  fonts_addr = 0
112
92
  fonts_size = 0
113
93
  bagl_fonts_symbol = symtab.get_symbol_by_name('C_bagl_fonts')
@@ -139,7 +119,7 @@ def get_cx_infos(app_path):
139
119
  return sh_offset, sh_size, sh_load, cx_ram_size, cx_ram_load
140
120
 
141
121
 
142
- def run_qemu(s1: socket.socket, s2: socket.socket, args: argparse.Namespace) -> int:
122
+ def run_qemu(s1: socket.socket, s2: socket.socket, args: argparse.Namespace, use_bagl: bool) -> int:
143
123
  argv = ['qemu-arm-static']
144
124
 
145
125
  if args.debug:
@@ -170,7 +150,8 @@ def run_qemu(s1: socket.socket, s2: socket.socket, args: argparse.Namespace) ->
170
150
  else:
171
151
  logger.warn(f"Cx lib {cxlib_filepath} not found")
172
152
 
173
- if args.model == "stax":
153
+ # for NBGL apps, fonts binary file is mandatory
154
+ if not use_bagl:
174
155
  fonts_filepath = f"/fonts/{args.model}-fonts-{args.apiLevel}.bin"
175
156
  fonts = pkg_resources.resource_filename(__name__, fonts_filepath)
176
157
  if os.path.exists(fonts):
@@ -185,6 +166,7 @@ def run_qemu(s1: socket.socket, s2: socket.socket, args: argparse.Namespace) ->
185
166
  load_offset, load_size, stack, stack_size, ram_addr, ram_size, \
186
167
  text_load_addr, svc_call_address, svc_cx_call_address, \
187
168
  fonts_addr, fonts_size = get_elf_infos(lib_path)
169
+
188
170
  # Since binaries loaded as libs could also declare extra RAM page(s), collect them all
189
171
  if (ram_addr, ram_size) != (0, 0):
190
172
  arg = f'{ram_addr:#x}:{ram_size:#x}'
@@ -317,18 +299,25 @@ def main(prog=None) -> int:
317
299
 
318
300
  # Init model and api_level if not specified from app elf metadata
319
301
  app_path = getattr(args, 'app.elf')
320
- metadata = get_elf_ledger_metadata(app_path)
302
+ binary = LedgerBinaryApp(app_path)
321
303
  if not args.model:
322
- if "target" not in metadata:
304
+ if binary.sections.target is None:
323
305
  logger.error("Device model not detected from elf. Then it must be specified")
324
306
  sys.exit(1)
325
307
  else:
326
- args.model = metadata["target"]
308
+ args.model = "nanosp" if binary.sections.target == "nanos2" else binary.sections.target
327
309
  logger.warn(f"Device model detected from metadata: {args.model}")
328
310
 
311
+ # 'bagl' is the default value of the binary.sections.sdk_graphics. We need to
312
+ # manage the cases where it is NOT 'bagl' but the section does not exists yet
313
+ if args.model in ["stax", "flex"]:
314
+ use_bagl = False
315
+ else:
316
+ use_bagl = binary.sections.sdk_graphics == "bagl"
317
+
329
318
  if not args.apiLevel:
330
- if "api_level" in metadata:
331
- args.apiLevel = metadata["api_level"]
319
+ if binary.sections.api_level is not None:
320
+ args.apiLevel = binary.sections.api_level
332
321
  logger.warn(f"Api level detected from metadata: {args.apiLevel}")
333
322
 
334
323
  # Check args.apiLevel, 0 is an invalid value
@@ -338,8 +327,8 @@ def main(prog=None) -> int:
338
327
 
339
328
  # Set SPECULOS_DETECTED_APPNAME env variable for proper emulation.
340
329
  # See sys_os_registry_get_current_app_tag() for corresponding usage.
341
- app_name = metadata.get("app_name")
342
- app_version = metadata.get("app_version")
330
+ app_name = binary.sections.app_name
331
+ app_version = binary.sections.app_version
343
332
  if app_name and app_version:
344
333
  os.environ["SPECULOS_DETECTED_APPNAME"] = f"{app_name}:{app_version}"
345
334
 
@@ -352,8 +341,7 @@ def main(prog=None) -> int:
352
341
  lib_name = None
353
342
  lib_path = lib_arg
354
343
 
355
- metadata = get_elf_ledger_metadata(lib_path)
356
- elf_lib_name = metadata.get("app_name", None)
344
+ elf_lib_name = LedgerBinaryApp(lib_path).sections.app_name
357
345
 
358
346
  if lib_name is None:
359
347
  if elf_lib_name is None:
@@ -372,14 +360,14 @@ def main(prog=None) -> int:
372
360
 
373
361
  # Check model and api_level against all lib elf metadata
374
362
  for path in [app_path] + [x.split(":")[1] for x in args.library]:
375
- metadata = get_elf_ledger_metadata(path)
363
+ binary = LedgerBinaryApp(path)
376
364
 
377
- elf_model = metadata.get("target", args.model)
365
+ elf_model = ("nanosp" if binary.sections.target == "nanos2" else binary.sections.target) or args.model
378
366
  if args.model != elf_model:
379
367
  logger.error(f"Invalid model in {path} ({elf_model} vs {args.model})")
380
368
  sys.exit(1)
381
369
 
382
- elf_api_level = metadata.get("api_level", "0")
370
+ elf_api_level = binary.sections.api_level or "0"
383
371
  # Check args.apiLevel against elf api level. If elf api level == 0 (SDK master
384
372
  # reserved value) ignore it.
385
373
  if elf_api_level != "0" and args.apiLevel != elf_api_level:
@@ -473,13 +461,14 @@ def main(prog=None) -> int:
473
461
 
474
462
  s1, s2 = socket.socketpair()
475
463
 
476
- qemu_pid = run_qemu(s1, s2, args)
464
+ qemu_pid = run_qemu(s1, s2, args, use_bagl)
477
465
  s1.close()
478
466
 
479
467
  apdu = apdu_server.ApduServer(host="0.0.0.0", port=args.apdu_port)
480
468
  seph = seproxyhal.SeProxyHal(
481
469
  s2,
482
470
  model=args.model,
471
+ use_bagl=use_bagl,
483
472
  automation=automation_path,
484
473
  automation_server=automation_server,
485
474
  transport=args.usb)
@@ -507,6 +496,7 @@ def main(prog=None) -> int:
507
496
  "nanosp": 2,
508
497
  "blue": 1,
509
498
  "stax": 1,
499
+ "flex": 1
510
500
  }
511
501
  zoom = default_zoom.get(args.model)
512
502
 
@@ -519,7 +509,7 @@ def main(prog=None) -> int:
519
509
  apirun = ApiRunner(args.api_port)
520
510
 
521
511
  display_args = DisplayArgs(args.color, args.model, args.ontop, rendering,
522
- args.keymap, zoom, x, y)
512
+ args.keymap, zoom, x, y, use_bagl)
523
513
  server_args = ServerArgs(apdu, apirun, button, finger, seph, vnc)
524
514
  screen_notifier = ScreenNotifier(display_args, server_args)
525
515
 
@@ -74,6 +74,7 @@ class FrameBuffer:
74
74
  "nanox": 0xdddddd,
75
75
  "nanosp": 0xdddddd,
76
76
  "stax": 0xdddddd,
77
+ "flex": 0xdddddd,
77
78
  }
78
79
 
79
80
  def __init__(self, model: str):
@@ -92,7 +93,7 @@ class FrameBuffer:
92
93
  def check_color(self, color: int) -> int:
93
94
  # There are only 2 colors on the Nano S and the Nano X but the one
94
95
  # passed in argument isn't always valid. Fix it here.
95
- if self.model != 'stax':
96
+ if self.model != 'stax' and self.model != 'flex':
96
97
  if color != 0x000000:
97
98
  color = FrameBuffer.COLORS.get(self.model, color)
98
99
  return color
@@ -141,13 +142,13 @@ class FrameBuffer:
141
142
  self.screenshot_pixels.update(self.pixels)
142
143
 
143
144
  def update_public_screenshot(self) -> None:
144
- # Stax only
145
+ # Stax/Flex only
145
146
  # As we lazyly evaluate the published screenshot, we only flag the evaluation update as necessary
146
147
  self.recreate_public_screenshot = True
147
148
 
148
149
  @property
149
150
  def public_screenshot_value(self) -> bytes:
150
- # Stax only
151
+ # Stax/Flex only
151
152
  # Lazy calculation of the published screenshot, as it is a costly operation
152
153
  # and not necessary if no one tries to read the value
153
154
  if self.recreate_public_screenshot:
@@ -157,9 +158,9 @@ class FrameBuffer:
157
158
  return self._public_screenshot_value
158
159
 
159
160
  def get_public_screenshot(self) -> bytes:
160
- if self.model == "stax":
161
- # On Stax, we only make the screenshot public on the RESTFUL api when it is consistent with events
162
- # On top of this, take_screenshot is time consuming on stax, so we'll do as few as possible
161
+ if self.model == "stax" or self.model == "flex":
162
+ # On Stax/Flex, we only make the screenshot public on the RESTFUL api when it is consistent with events
163
+ # On top of this, take_screenshot is time consuming on stax/flex, so we'll do as few as possible
163
164
  # We return the value calculated last time update_public_screenshot was called
164
165
  return self.public_screenshot_value
165
166
  # On nano we have no knowledge of screen refreshes so we can't be scarce on publishes
@@ -243,6 +244,10 @@ class Display(ABC):
243
244
  def rendering(self):
244
245
  return self._display_args.rendering
245
246
 
247
+ @property
248
+ def use_bagl(self) -> bool:
249
+ return self._display_args.use_bagl
250
+
246
251
  @property
247
252
  @abstractmethod
248
253
  def gl(self) -> GraphicLibrary:
@@ -16,7 +16,7 @@ class Headless(Display):
16
16
 
17
17
  self.m = HeadlessPaintWidget(self.model, server.vnc)
18
18
  self._gl: GraphicLibrary
19
- if display.model != "stax":
19
+ if display.use_bagl:
20
20
  self._gl = bagl.Bagl(self.m, MODELS[self.model].screen_size, self.model)
21
21
  else:
22
22
  self._gl = nbgl.NBGL(self.m, MODELS[self.model].screen_size, self.model)
@@ -54,7 +54,7 @@ class NBGL(GraphicLibrary):
54
54
  self.logger = logging.getLogger("NBGL")
55
55
 
56
56
  def __assert_area(self, area) -> None:
57
- if area.y0 % 4 or area.height % 4:
57
+ if self.model == "stax" and (area.y0 % 4 or area.height % 4):
58
58
  raise AssertionError("X(%d) or height(%d) not 4 aligned " % (area.y0, area.height))
59
59
  if area.x0 > self.SCREEN_WIDTH or (area.x0+area.width) > self.SCREEN_WIDTH:
60
60
  raise AssertionError("left edge (%d) or right edge (%d) out of screen" % (area.x0, (area.x0 + area.width)))
@@ -120,14 +120,18 @@ class OCR:
120
120
  # Maximum space for a letter to be considered part of the same word
121
121
  MAX_BLANK_SPACE_NANO = 12
122
122
  MAX_BLANK_SPACE_STAX = 24
123
+ MAX_BLANK_SPACE_FLEX = 26
123
124
 
124
- def __init__(self, model: str):
125
+ def __init__(self, model: str, use_bagl: bool):
125
126
  self.events: List[TextEvent] = []
126
127
  # Store the model of the device
127
128
  self.model = model
129
+ self.use_bagl = use_bagl
128
130
  # Maximum space for a letter to be considered part of the same word
129
131
  if model == "stax":
130
132
  self.max_blank_space = OCR.MAX_BLANK_SPACE_STAX
133
+ elif model == "flex":
134
+ self.max_blank_space = OCR.MAX_BLANK_SPACE_FLEX
131
135
  else:
132
136
  self.max_blank_space = OCR.MAX_BLANK_SPACE_NANO
133
137
 
@@ -215,7 +219,7 @@ class OCR:
215
219
  For older SKD versions, legacy behaviour is used: parsing internal
216
220
  fonts to find a matching bitmap.
217
221
  """
218
- if self.model == "stax":
222
+ if not self.use_bagl:
219
223
  # Can be called via SephTag.NBGL_DRAW_IMAGE or SephTag.NBGL_DRAW_IMAGE_RLE
220
224
  # In both cases, data contains:
221
225
  # - area (sizeof(nbgl_area_t))
@@ -153,9 +153,8 @@ class RLECustomBase:
153
153
  if bits != 7:
154
154
  output += bytes([byte])
155
155
 
156
- nb_bytes = len(data)/8
157
- if len(data) % 8:
158
- nb_bytes += 1
156
+ nb_bytes = (len(data)+7)//8
157
+
159
158
  assert len(output) == nb_bytes
160
159
 
161
160
  return output
@@ -205,7 +205,7 @@ class Screen(Display):
205
205
  self.app = app
206
206
  self.app.set_screen(self)
207
207
  model = self._display_args.model
208
- if model != "stax":
208
+ if self.use_bagl:
209
209
  self._gl = bagl.Bagl(app.widget, MODELS[model].screen_size, model)
210
210
  else:
211
211
  self._gl = nbgl.NBGL(app.widget, MODELS[model].screen_size, model)
@@ -105,7 +105,7 @@ class TextScreen(Display):
105
105
 
106
106
  self.width, self.height = MODELS[display_args.model].screen_size
107
107
  self.m = TextWidget(self, display_args.model)
108
- if display_args.model != "stax":
108
+ if self.use_bagl:
109
109
  self._gl = bagl.Bagl(self.m, MODELS[display_args.model].screen_size, display_args.model)
110
110
  else:
111
111
  raise NotImplementedError("This display can not emulate NBGL OS yet")
@@ -245,6 +245,7 @@ class SeProxyHal(IODevice):
245
245
  def __init__(self,
246
246
  sock: socket,
247
247
  model: str,
248
+ use_bagl: bool,
248
249
  automation: Optional[Automation] = None,
249
250
  automation_server: Optional[BroadcastInterface] = None,
250
251
  transport: str = 'hid'):
@@ -265,7 +266,9 @@ class SeProxyHal(IODevice):
265
266
 
266
267
  self.usb = usb.USB(self.socket_helper.queue_packet, transport=transport)
267
268
 
268
- self.ocr = OCR(model)
269
+ self.ocr = OCR(model, use_bagl)
270
+
271
+ self.use_bagl = use_bagl
269
272
 
270
273
  # A list of callback methods when an APDU response is received
271
274
  self.apdu_callbacks: List[Callable[[bytes], None]] = []
@@ -326,10 +329,10 @@ class SeProxyHal(IODevice):
326
329
  screen.display.gl.update_screenshot()
327
330
  screen.display.gl.update_public_screenshot()
328
331
 
329
- if screen.display.model != "stax" and screen.display.screen_update():
332
+ if self.use_bagl and screen.display.screen_update():
330
333
  if screen.display.model in ["nanox", "nanosp"]:
331
334
  self.events += self.ocr.get_events()
332
- elif screen.display.model == "stax":
335
+ elif not self.use_bagl:
333
336
  self.events += self.ocr.get_events()
334
337
 
335
338
  # Apply automation rules after having received a GENERAL_STATUS_LAST_COMMAND tag. It allows the
@@ -418,7 +421,7 @@ class SeProxyHal(IODevice):
418
421
  elif tag == SephTag.NBGL_REFRESH:
419
422
  assert isinstance(screen.display.gl, NBGL)
420
423
  screen.display.gl.refresh(data)
421
- # Stax only
424
+ # Stax/Flex only
422
425
  # We have refreshed the screen, remember it for the next time we have SephTag.GENERAL_STATUS
423
426
  # then we'll perform a screen update and make public the resulting screenshot
424
427
  self.refreshed = True
@@ -18,6 +18,7 @@ MODELS: Dict[str, Model] = {
18
18
  'nanosp': Model('Nano SP', (128, 64), (5, 5), (10, 10)),
19
19
  'blue': Model('Blue', (320, 480), (13, 13), (26, 26)),
20
20
  'stax': Model('Stax', (400, 672), (13, 13), (26, 26)),
21
+ 'flex': Model('Flex', (480, 600), (13, 13), (26, 26)),
21
22
  }
22
23
 
23
24
 
@@ -31,6 +32,7 @@ class DisplayArgs:
31
32
  pixel_size: int
32
33
  x: Optional[int]
33
34
  y: Optional[int]
35
+ use_bagl: bool
34
36
 
35
37
 
36
38
  class ServerArgs(NamedTuple):