speculos 0.16.1.dev2__tar.gz → 0.16.1.dev6__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 (449) hide show
  1. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/CHANGELOG.md +8 -0
  2. {speculos-0.16.1.dev2/speculos.egg-info → speculos-0.16.1.dev6}/PKG-INFO +1 -1
  3. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/__version__.py +2 -2
  4. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/main.py +100 -65
  5. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/mcu/display.py +4 -3
  6. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/mcu/headless.py +13 -13
  7. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/mcu/ocr.py +3 -4
  8. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/mcu/screen.py +13 -12
  9. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/mcu/screen_text.py +1 -4
  10. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/mcu/seproxyhal.py +28 -28
  11. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/mcu/struct.py +0 -1
  12. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/resources/launcher +0 -0
  13. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6/speculos.egg-info}/PKG-INFO +1 -1
  14. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos.egg-info/SOURCES.txt +1 -0
  15. speculos-0.16.1.dev6/src/bolos/default.c +84 -0
  16. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/os.c +1 -0
  17. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/emulate.h +0 -9
  18. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/launcher.c +137 -15
  19. speculos-0.16.1.dev6/src/launcher.h +20 -0
  20. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/test_os_global_pin_is_validated.c +30 -0
  21. speculos-0.16.1.dev2/src/bolos/default.c +0 -56
  22. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/.clang-format +0 -0
  23. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/.codespell-ignore +0 -0
  24. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/.dockerignore +0 -0
  25. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/.github/workflows/continuous-integration-workflow.yml +0 -0
  26. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/.github/workflows/documentation.yml +0 -0
  27. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/.github/workflows/fast-checks.yml +0 -0
  28. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/.github/workflows/force-rebase.yml +0 -0
  29. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/.github/workflows/reusable_ragger_tests_latest_speculos.yml +0 -0
  30. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/.github/workflows/speculos-builder.yml +0 -0
  31. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/.gitignore +0 -0
  32. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/CMakeLists.txt +0 -0
  33. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/COPYING +0 -0
  34. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/COPYING.LESSER +0 -0
  35. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/Dockerfile +0 -0
  36. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/MANIFEST.in +0 -0
  37. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/Pipfile +0 -0
  38. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/Pipfile.lock +0 -0
  39. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/README.md +0 -0
  40. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/apps/README.md +0 -0
  41. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/apps/blue#btc#1.5#00000000.elf +0 -0
  42. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/apps/blue#ram-page#blue-2.2.5#00000000.elf +0 -0
  43. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/apps/btc-test.elf +0 -0
  44. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/apps/btc.elf +0 -0
  45. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/apps/nanos#btc#1.5#00000000.elf +0 -0
  46. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/apps/nanos#btc#1.6#29717f9c.elf +0 -0
  47. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/apps/nanos#btc#1.6#6bd0a5f8.elf +0 -0
  48. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/apps/nanos#btc#2.0#ce796c1b.elf +0 -0
  49. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/apps/nanos#btc#2.1#1c8db8da.elf +0 -0
  50. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/apps/nanos#btc-test#1.5#00000000.elf +0 -0
  51. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/apps/nanos#btc-test#1.6#29717f9c.elf +0 -0
  52. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/apps/nanos#btc-test#1.6#6bd0a5f8.elf +0 -0
  53. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/apps/nanos#btc-test#2.0#ce796c1b.elf +0 -0
  54. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/apps/nanos#btc-test#2.1#1c8db8da.elf +0 -0
  55. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/apps/nanosp#btc#1.0#a86c791b.elf +0 -0
  56. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/apps/nanosp#btc#1.0.3#17bf7619.elf +0 -0
  57. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/apps/nanosp#btc-test#1.0#a86c791b.elf +0 -0
  58. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/apps/nanosp#btc-test#1.0.3#17bf7619.elf +0 -0
  59. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/apps/nanox#btc#1.2#57272a0f.elf +0 -0
  60. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/apps/nanox#btc#2.0.2#1c8db8da.elf +0 -0
  61. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/apps/nanox#btc-test#2.0.2#1c8db8da.elf +0 -0
  62. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/build.Dockerfile +0 -0
  63. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/clang-armv7m.cmake +0 -0
  64. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/docker-compose.yml +0 -0
  65. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/docs/CNAME +0 -0
  66. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/docs/Makefile +0 -0
  67. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/docs/_static/screenshot-api-nanos-btc.png +0 -0
  68. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/docs/_static/screenshot-btc-nanos.png +0 -0
  69. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/docs/conf.py +0 -0
  70. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/docs/dev/ci.md +0 -0
  71. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/docs/dev/getting_started.md +0 -0
  72. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/docs/dev/index.rst +0 -0
  73. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/docs/dev/internals.md +0 -0
  74. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/docs/dev/tests.md +0 -0
  75. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/docs/index.rst +0 -0
  76. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/docs/installation/build.md +0 -0
  77. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/docs/installation/index.rst +0 -0
  78. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/docs/installation/wsl.md +0 -0
  79. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/docs/requirements.txt +0 -0
  80. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/docs/user/api.md +0 -0
  81. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/docs/user/automation.md +0 -0
  82. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/docs/user/clients.md +0 -0
  83. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/docs/user/debug.md +0 -0
  84. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/docs/user/docker.md +0 -0
  85. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/docs/user/index.rst +0 -0
  86. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/docs/user/macm1.md +0 -0
  87. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/docs/user/semihosting.md +0 -0
  88. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/docs/user/usage.md +0 -0
  89. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/gcc-arm.cmake +0 -0
  90. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/lgtm.yml +0 -0
  91. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/pyproject.toml +0 -0
  92. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/sdk/bolos_syscalls_1.2.h +0 -0
  93. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/sdk/bolos_syscalls_1.5.h +0 -0
  94. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/sdk/bolos_syscalls_1.6.h +0 -0
  95. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/sdk/bolos_syscalls_2.0.h +0 -0
  96. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/sdk/bolos_syscalls_blue_2.2.5.h +0 -0
  97. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/sdk/bolos_syscalls_lnsp.h +0 -0
  98. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/sdk/bolos_syscalls_unified_sdk.h +0 -0
  99. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/setup.cfg +0 -0
  100. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/setup.py +0 -0
  101. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/__init__.py +0 -0
  102. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/__main__.py +0 -0
  103. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/api/README.md +0 -0
  104. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/api/__init__.py +0 -0
  105. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/api/apdu.py +0 -0
  106. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/api/api.py +0 -0
  107. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/api/automation.py +0 -0
  108. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/api/button.py +0 -0
  109. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/api/events.py +0 -0
  110. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/api/finger.py +0 -0
  111. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/api/resources/apdu.schema +0 -0
  112. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/api/resources/button.schema +0 -0
  113. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/api/resources/finger.schema +0 -0
  114. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/api/resources/ticker.schema +0 -0
  115. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/api/restful.py +0 -0
  116. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/api/screenshot.py +0 -0
  117. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/api/static/index.html +0 -0
  118. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/api/static/swagger/README.md +0 -0
  119. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/api/static/swagger/favicon-16x16.png +0 -0
  120. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/api/static/swagger/favicon-32x32.png +0 -0
  121. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/api/static/swagger/index.html +0 -0
  122. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/api/static/swagger/swagger-ui-bundle.js +0 -0
  123. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/api/static/swagger/swagger-ui-standalone-preset.js +0 -0
  124. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/api/static/swagger/swagger-ui.css +0 -0
  125. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/api/static/swagger/swagger.json +0 -0
  126. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/api/swagger.py +0 -0
  127. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/api/swagger.yaml +0 -0
  128. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/api/ticker.py +0 -0
  129. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/api/web_interface.py +0 -0
  130. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/client.py +0 -0
  131. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/flex-api-level-cx-18.elf +0 -0
  132. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/flex-api-level-cx-19.elf +0 -0
  133. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/flex-api-level-cx-20.elf +0 -0
  134. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/flex-api-level-cx-21.elf +0 -0
  135. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/flex-api-level-cx-22.elf +0 -0
  136. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/nanos-cx-2.0.elf +0 -0
  137. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/nanos-cx-2.1.elf +0 -0
  138. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/nanosp-api-level-cx-1.elf +0 -0
  139. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/nanosp-api-level-cx-12.elf +0 -0
  140. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/nanosp-api-level-cx-18.elf +0 -0
  141. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/nanosp-api-level-cx-22.elf +0 -0
  142. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/nanosp-api-level-cx-5.elf +0 -0
  143. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/nanosp-cx-1.0.3.elf +0 -0
  144. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/nanosp-cx-1.0.elf +0 -0
  145. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/nanox-api-level-cx-1.elf +0 -0
  146. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/nanox-api-level-cx-12.elf +0 -0
  147. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/nanox-api-level-cx-18.elf +0 -0
  148. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/nanox-api-level-cx-22.elf +0 -0
  149. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/nanox-api-level-cx-5.elf +0 -0
  150. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/nanox-cx-2.0.2.elf +0 -0
  151. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/nanox-cx-2.0.elf +0 -0
  152. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/stax-api-level-cx-1.elf +0 -0
  153. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/stax-api-level-cx-10.elf +0 -0
  154. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/stax-api-level-cx-11.elf +0 -0
  155. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/stax-api-level-cx-12.elf +0 -0
  156. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/stax-api-level-cx-13.elf +0 -0
  157. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/stax-api-level-cx-14.elf +0 -0
  158. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/stax-api-level-cx-15.elf +0 -0
  159. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/stax-api-level-cx-20.elf +0 -0
  160. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/stax-api-level-cx-21.elf +0 -0
  161. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/stax-api-level-cx-22.elf +0 -0
  162. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/stax-api-level-cx-3.elf +0 -0
  163. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/stax-api-level-cx-5.elf +0 -0
  164. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/stax-api-level-cx-7.elf +0 -0
  165. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/stax-api-level-cx-8.elf +0 -0
  166. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/cxlib/stax-api-level-cx-9.elf +0 -0
  167. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/fonts/flex-fonts-18.bin +0 -0
  168. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/fonts/flex-fonts-19.bin +0 -0
  169. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/fonts/flex-fonts-20.bin +0 -0
  170. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/fonts/flex-fonts-21.bin +0 -0
  171. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/fonts/flex-fonts-22.bin +0 -0
  172. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/fonts/nanosp-fonts-18.bin +0 -0
  173. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/fonts/nanosp-fonts-22.bin +0 -0
  174. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/fonts/nanox-fonts-18.bin +0 -0
  175. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/fonts/nanox-fonts-22.bin +0 -0
  176. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/fonts/stax-fonts-1.bin +0 -0
  177. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/fonts/stax-fonts-10.bin +0 -0
  178. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/fonts/stax-fonts-11.bin +0 -0
  179. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/fonts/stax-fonts-12.bin +0 -0
  180. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/fonts/stax-fonts-13.bin +0 -0
  181. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/fonts/stax-fonts-14.bin +0 -0
  182. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/fonts/stax-fonts-15.bin +0 -0
  183. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/fonts/stax-fonts-20.bin +0 -0
  184. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/fonts/stax-fonts-21.bin +0 -0
  185. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/fonts/stax-fonts-22.bin +0 -0
  186. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/fonts/stax-fonts-3.bin +0 -0
  187. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/fonts/stax-fonts-5.bin +0 -0
  188. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/fonts/stax-fonts-7.bin +0 -0
  189. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/fonts/stax-fonts-8.bin +0 -0
  190. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/fonts/stax-fonts-9.bin +0 -0
  191. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/mcu/__init__.py +0 -0
  192. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/mcu/apdu.py +0 -0
  193. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/mcu/automation.py +0 -0
  194. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/mcu/automation_server.py +0 -0
  195. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/mcu/bagl.py +0 -0
  196. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/mcu/bagl_font.py +0 -0
  197. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/mcu/bagl_glyph.py +0 -0
  198. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/mcu/button_tcp.py +0 -0
  199. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/mcu/finger_tcp.py +0 -0
  200. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/mcu/icon.png +0 -0
  201. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/mcu/nbgl.py +0 -0
  202. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/mcu/readerror.py +0 -0
  203. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/mcu/resources/automation.schema +0 -0
  204. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/mcu/rle_custom.py +0 -0
  205. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/mcu/transport/__init__.py +0 -0
  206. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/mcu/transport/interface.py +0 -0
  207. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/mcu/transport/nfc.py +0 -0
  208. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/mcu/transport/usb.py +0 -0
  209. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/mcu/vnc.py +0 -0
  210. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/observer.py +0 -0
  211. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/resources/vnc_server +0 -0
  212. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos/resources_importer.py +0 -0
  213. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos.egg-info/dependency_links.txt +0 -0
  214. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos.egg-info/entry_points.txt +0 -0
  215. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos.egg-info/requires.txt +0 -0
  216. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/speculos.egg-info/top_level.txt +0 -0
  217. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/CMakeLists.txt +0 -0
  218. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/bagl.c +0 -0
  219. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/bagl.h +0 -0
  220. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx.c +0 -0
  221. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx.h +0 -0
  222. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_aes.c +0 -0
  223. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_aes.h +0 -0
  224. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_aes_sdk2.c +0 -0
  225. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_blake2.h +0 -0
  226. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_blake2b.c +0 -0
  227. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_bls.c +0 -0
  228. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_bls.h +0 -0
  229. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_bls_fp2.c +0 -0
  230. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_bls_g2.c +0 -0
  231. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_bn.c +0 -0
  232. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_common.h +0 -0
  233. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_crc.c +0 -0
  234. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_crc.h +0 -0
  235. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_curve25519.c +0 -0
  236. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_curve25519.h +0 -0
  237. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_ec.c +0 -0
  238. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_ec.h +0 -0
  239. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_ec_domain.c +0 -0
  240. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_ecpoint.c +0 -0
  241. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_ed25519.c +0 -0
  242. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_ed25519.h +0 -0
  243. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_hash.c +0 -0
  244. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_hash.h +0 -0
  245. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_hkdf.c +0 -0
  246. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_hkdf.h +0 -0
  247. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_hmac.c +0 -0
  248. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_hmac.h +0 -0
  249. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_math.c +0 -0
  250. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_math.h +0 -0
  251. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_montgomery.c +0 -0
  252. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_mpi.c +0 -0
  253. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_ripemd160.c +0 -0
  254. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_rng_rfc6979.c +0 -0
  255. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_rng_rfc6979.h +0 -0
  256. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_scc.c +0 -0
  257. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_sha256.c +0 -0
  258. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_sha3.c +0 -0
  259. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_sha512.c +0 -0
  260. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_twisted_edwards.c +0 -0
  261. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_utils.c +0 -0
  262. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_utils.h +0 -0
  263. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cx_weierstrass.c +0 -0
  264. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cxlib.c +0 -0
  265. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/cxlib.h +0 -0
  266. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/endorsement.c +0 -0
  267. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/endorsement.h +0 -0
  268. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/exception.h +0 -0
  269. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/fonts_info.c +0 -0
  270. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/nbgl.c +0 -0
  271. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/nbgl.h +0 -0
  272. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/nbgl_rle.c +0 -0
  273. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/nbgl_rle.h +0 -0
  274. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/os_1.2.c +0 -0
  275. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/os_1.5.c +0 -0
  276. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/os_1.6.c +0 -0
  277. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/os_2.0.c +0 -0
  278. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/os_bip32.c +0 -0
  279. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/os_bip32.h +0 -0
  280. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/os_eip2333.c +0 -0
  281. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/os_pki.c +0 -0
  282. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/os_pki.h +0 -0
  283. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/os_signature.c +0 -0
  284. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/os_signature.h +0 -0
  285. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/seproxyhal.c +0 -0
  286. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/touch.c +0 -0
  287. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/bolos/touch.h +0 -0
  288. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/emulate.c +0 -0
  289. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/emulate_1.2.c +0 -0
  290. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/emulate_1.5.c +0 -0
  291. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/emulate_1.6.c +0 -0
  292. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/emulate_2.0.c +0 -0
  293. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/emulate_blue_2.2.5.c +0 -0
  294. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/emulate_lnsp_1.0.c +0 -0
  295. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/emulate_unified_sdk.c +0 -0
  296. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/environment.c +0 -0
  297. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/environment.h +0 -0
  298. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/fonts.h +0 -0
  299. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/sdk.h +0 -0
  300. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/svc.c +0 -0
  301. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/svc.h +0 -0
  302. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/CMakeLists.txt +0 -0
  303. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursor.c +0 -0
  304. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursor.h +0 -0
  305. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/approved.h +0 -0
  306. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/bitcoin.h +0 -0
  307. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/blue.h +0 -0
  308. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/fabrice.h +0 -0
  309. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/frame_00.h +0 -0
  310. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/frame_01.h +0 -0
  311. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/frame_02.h +0 -0
  312. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/frame_03.h +0 -0
  313. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/frame_04.h +0 -0
  314. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/frame_05.h +0 -0
  315. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/frame_06.h +0 -0
  316. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/frame_07.h +0 -0
  317. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/frame_08.h +0 -0
  318. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/frame_09.h +0 -0
  319. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/frame_10.h +0 -0
  320. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/frame_11.h +0 -0
  321. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/frame_12.h +0 -0
  322. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/frame_13.h +0 -0
  323. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/frame_14.h +0 -0
  324. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/frame_15.h +0 -0
  325. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/frame_16.h +0 -0
  326. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/frame_17.h +0 -0
  327. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/frame_18.h +0 -0
  328. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/frame_19.h +0 -0
  329. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/frame_20.h +0 -0
  330. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/frame_21.h +0 -0
  331. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/pizza.h +0 -0
  332. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/star.h +0 -0
  333. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/sword.h +0 -0
  334. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/cursors/verynice.h +0 -0
  335. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/seccomp-bpf.h +0 -0
  336. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/src/vnc/vnc_server.c +0 -0
  337. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/CMakeLists.txt +0 -0
  338. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/CMakeLists.txt +0 -0
  339. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/blake2b_kat.data +0 -0
  340. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/groestl_224_long_msg.data +0 -0
  341. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/groestl_224_short_msg.data +0 -0
  342. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/groestl_256_long_msg.data +0 -0
  343. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/groestl_256_short_msg.data +0 -0
  344. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/groestl_384_long_msg.data +0 -0
  345. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/groestl_384_short_msg.data +0 -0
  346. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/groestl_512_long_msg.data +0 -0
  347. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/groestl_512_short_msg.data +0 -0
  348. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/hmac.data +0 -0
  349. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/keccak_224_long_msg.data +0 -0
  350. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/keccak_224_short_msg.data +0 -0
  351. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/keccak_256_long_msg.data +0 -0
  352. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/keccak_256_short_msg.data +0 -0
  353. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/keccak_384_long_msg.data +0 -0
  354. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/keccak_384_short_msg.data +0 -0
  355. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/keccak_512_long_msg.data +0 -0
  356. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/keccak_512_short_msg.data +0 -0
  357. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/sha224_long_msg.data +0 -0
  358. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/sha224_short_msg.data +0 -0
  359. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/sha256_long_msg.data +0 -0
  360. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/sha256_short_msg.data +0 -0
  361. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/sha384_long_msg.data +0 -0
  362. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/sha384_short_msg.data +0 -0
  363. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/sha3_224_long_msg.data +0 -0
  364. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/sha3_224_short_msg.data +0 -0
  365. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/sha3_256_long_msg.data +0 -0
  366. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/sha3_256_short_msg.data +0 -0
  367. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/sha3_384_long_msg.data +0 -0
  368. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/sha3_384_short_msg.data +0 -0
  369. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/sha3_512_long_msg.data +0 -0
  370. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/sha3_512_short_msg.data +0 -0
  371. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/sha512_long_msg.data +0 -0
  372. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/sha512_short_msg.data +0 -0
  373. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/shake128_long_msg.data +0 -0
  374. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/shake128_short_msg.data +0 -0
  375. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/shake128_variable_output.data +0 -0
  376. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/shake256_long_msg.data +0 -0
  377. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/shake256_short_msg.data +0 -0
  378. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/cavp/shake256_variable_output.data +0 -0
  379. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/hello.c +0 -0
  380. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/nist_cavp.c +0 -0
  381. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/nist_cavp.h +0 -0
  382. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/test_aes.c +0 -0
  383. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/test_bip32.c +0 -0
  384. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/test_blake2.c +0 -0
  385. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/test_bls.c +0 -0
  386. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/test_bn.c +0 -0
  387. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/test_crc16.c +0 -0
  388. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/test_ec.c +0 -0
  389. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/test_ecdh.c +0 -0
  390. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/test_ecdsa.c +0 -0
  391. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/test_ecpoint.c +0 -0
  392. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/test_eddsa.c +0 -0
  393. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/test_eip2333.c +0 -0
  394. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/test_endorsement.c +0 -0
  395. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/test_hmac.c +0 -0
  396. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/test_math.c +0 -0
  397. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/test_mpi_rng.c +0 -0
  398. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/test_rfc6979.c +0 -0
  399. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/test_ripemd.c +0 -0
  400. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/test_sha2.c +0 -0
  401. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/test_sha3.c +0 -0
  402. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/test_slip21.c +0 -0
  403. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/wycheproof/X25519.data +0 -0
  404. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/wycheproof/X448.data +0 -0
  405. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/wycheproof/ecdh_secp256k1.data +0 -0
  406. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/syscalls/wycheproof/eddsa.data +0 -0
  407. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/test_environment.c +0 -0
  408. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/utils.c +0 -0
  409. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/c/utils.h +0 -0
  410. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/__init__.py +0 -0
  411. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/api/__init__.py +0 -0
  412. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/api/resources/automation.json +0 -0
  413. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/api/test_api.py +0 -0
  414. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/apps/__init__.py +0 -0
  415. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/apps/resources/__init__.py +0 -0
  416. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/apps/resources/btc_getpubkey_blue.json +0 -0
  417. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/apps/resources/btc_getpubkey_blue.png +0 -0
  418. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/apps/resources/btc_getpubkey_nanos.json +0 -0
  419. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/apps/resources/btc_getpubkey_nanos.png +0 -0
  420. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/apps/resources/btc_getpubkey_nanosp.json +0 -0
  421. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/apps/resources/btc_getpubkey_nanosp.png +0 -0
  422. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/apps/resources/btc_getpubkey_nanox.json +0 -0
  423. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/apps/resources/btc_getpubkey_nanox.png +0 -0
  424. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/apps/test_btc.py +0 -0
  425. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/apps/test_btc_testnet.py +0 -0
  426. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/apps/test_ram_page.py +0 -0
  427. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/apps/test_vnc.py +0 -0
  428. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/conftest.py +0 -0
  429. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/mcu/__init__.py +0 -0
  430. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/mcu/resources/automation_invalid_action_args.json +0 -0
  431. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/mcu/resources/automation_invalid_action_name.json +0 -0
  432. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/mcu/resources/automation_invalid_rule_key.json +0 -0
  433. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/mcu/resources/automation_valid.json +0 -0
  434. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/mcu/test_automation.py +0 -0
  435. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/pytest.ini +0 -0
  436. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/test_resources_importer.py +0 -0
  437. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/unit/__init__.py +0 -0
  438. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/unit/test_client_Api.py +0 -0
  439. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tests/python/unit/test_client_SpeculosClient.py +0 -0
  440. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tools/clang-format.sh +0 -0
  441. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tools/cursor.py +0 -0
  442. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tools/debug.sh +0 -0
  443. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tools/gdbinit +0 -0
  444. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tools/gif-recorder.py +0 -0
  445. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tools/ledger-live-http-proxy.py +0 -0
  446. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tools/skins/handholding.png +0 -0
  447. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tools/skins/nano-blue.png +0 -0
  448. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tools/skins/unicorn.png +0 -0
  449. {speculos-0.16.1.dev2 → speculos-0.16.1.dev6}/tools/winamp.py +0 -0
@@ -5,6 +5,14 @@ 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.17.0] 2025-03-14
9
+
10
+ ### Added
11
+
12
+ - `--save-nvram` and `--load-nvram` parameters that allow NVRAM testing
13
+ - destination boundaries verification for `nvm_write()`
14
+ - Make BAGL-based applications able to call NBGL-based libraries, or NBGL-based applications able to call BAGL-based libraries
15
+
8
16
  ## [0.16.0] 2025-03-05
9
17
 
10
18
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: speculos
3
- Version: 0.16.1.dev2
3
+ Version: 0.16.1.dev6
4
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
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '0.16.1.dev2'
21
- __version_tuple__ = version_tuple = (0, 16, 1, 'dev2')
20
+ __version__ = version = '0.16.1.dev6'
21
+ __version_tuple__ = version_tuple = (0, 16, 1, 'dev6')
@@ -14,6 +14,7 @@ import signal
14
14
  import socket
15
15
  import sys
16
16
  import threading
17
+ from dataclasses import dataclass
17
18
  from elftools.elf.elffile import ELFFile
18
19
  from ledgered.binary import LedgerBinaryApp
19
20
  from mnemonic import mnemonic
@@ -34,6 +35,25 @@ from .observer import BroadcastInterface
34
35
  from .resources_importer import resources
35
36
 
36
37
 
38
+ @dataclass
39
+ class ElfInfo:
40
+ text_offset: int = 0
41
+ text_size: int = 0
42
+ stack_addr: int = 0
43
+ stack_size: int = 0
44
+ ram_addr: int = 0
45
+ ram_size: int = 0
46
+ text_addr: int = 0
47
+ svc_call_addr: int = 0
48
+ svc_cx_call_addr: int = 0
49
+ fonts_addr: int = 0
50
+ fonts_size: int = 0
51
+ app_nvram_addr: int = 0
52
+ app_nvram_size: int = 0
53
+ cx_ram_addr: int = 0
54
+ cx_ram_size: int = 0
55
+
56
+
37
57
  DEFAULT_SEED = ('glory promote mansion idle axis finger extra february uncover one trip resource lawn turtle enact '
38
58
  'monster seven myth punch hobby comfort wild raise skin')
39
59
 
@@ -51,26 +71,27 @@ def set_pdeath(sig):
51
71
 
52
72
 
53
73
  def get_elf_infos(app_path, use_bagl):
74
+ ei = ElfInfo()
54
75
  with open(app_path, 'rb') as fp:
55
76
  elf = ELFFile(fp)
56
- text = elf.get_section_by_name('.text')
77
+ text_section = elf.get_section_by_name('.text')
57
78
  for seg in elf.iter_segments():
58
79
  if seg['p_type'] != 'PT_LOAD':
59
80
  continue
60
- if seg.section_in_segment(text):
81
+ if seg.section_in_segment(text_section):
61
82
  text_seg = seg
62
83
  break
63
84
  else:
64
85
  raise RuntimeError("No program header with text section!")
65
- symtab = elf.get_section_by_name('.symtab')
66
- bss = elf.get_section_by_name('.bss')
67
- sh_offset = text_seg['p_offset']
68
- sh_size = text_seg['p_filesz']
69
- text_load_addr = text['sh_addr']
70
- stack = bss['sh_addr']
71
- sym_estack = symtab.get_symbol_by_name('_estack')
86
+ symtab_section = elf.get_section_by_name('.symtab')
87
+ bss_section = elf.get_section_by_name('.bss')
88
+ ei.text_offset = text_seg['p_offset']
89
+ ei.text_size = text_seg['p_filesz']
90
+ ei.text_addr = text_section['sh_addr']
91
+ ei.stack_addr = bss_section['sh_addr']
92
+ sym_estack = symtab_section.get_symbol_by_name('_estack')
72
93
  if sym_estack is None:
73
- sym_estack = symtab.get_symbol_by_name('END_STACK')
94
+ sym_estack = symtab_section.get_symbol_by_name('END_STACK')
74
95
  if sym_estack is None:
75
96
  logger.error('failed to find _estack/END_STACK symbol')
76
97
  sys.exit(1)
@@ -78,48 +99,56 @@ def get_elf_infos(app_path, use_bagl):
78
99
 
79
100
  # Look for the symbols SVC_Call and SVC_cx_call
80
101
  # if they are found, save their addresses to patch them to replace the SYSCALL later
81
- svc_call_addr = 0
82
- svc_cx_call_addr = 0
83
- svc_call_symbol = symtab.get_symbol_by_name("SVC_Call")
102
+ svc_call_symbol = symtab_section.get_symbol_by_name("SVC_Call")
84
103
  if svc_call_symbol is not None:
85
- svc_call_addr = svc_call_symbol[0]['st_value'] & (~1)
86
- svc_cx_call_symbol = symtab.get_symbol_by_name("SVC_cx_call")
104
+ ei.svc_call_addr = svc_call_symbol[0]['st_value'] & (~1)
105
+ svc_cx_call_symbol = symtab_section.get_symbol_by_name("SVC_cx_call")
87
106
  if svc_cx_call_symbol is not None:
88
- svc_cx_call_addr = svc_cx_call_symbol[0]['st_value'] & (~1)
107
+ ei.svc_cx_call_addr = svc_cx_call_symbol[0]['st_value'] & (~1)
89
108
  # Check where are located fonts in .elf file (LNX/LNS+ with BAGL only)
90
109
  # (on apps using NBGL, fonts are loaded from a known location: STAX_FONTS_ARRAY_ADDR,
91
110
  # FLEX_FONTS_ARRAY_ADDR, NANOX_FONTS_ARRAY_ADDR or NANOSP_FONTS_ARRAY_ADDR)
92
- fonts_addr = 0
93
- fonts_size = 0
94
- bagl_fonts_symbol = symtab.get_symbol_by_name('C_bagl_fonts')
111
+ bagl_fonts_symbol = symtab_section.get_symbol_by_name('C_bagl_fonts')
95
112
  if bagl_fonts_symbol is not None:
96
- fonts_addr = bagl_fonts_symbol[0]['st_value']
97
- fonts_size = bagl_fonts_symbol[0]['st_size']
113
+ ei.fonts_addr = bagl_fonts_symbol[0]['st_value']
114
+ ei.fonts_size = bagl_fonts_symbol[0]['st_size']
98
115
  elif use_bagl:
99
116
  logger.info("Disabling OCR.")
100
117
 
101
- supp_ram = elf.get_section_by_name('.rfbss')
102
- ram_addr, ram_size = (supp_ram['sh_addr'], supp_ram['sh_size']) if supp_ram is not None else (0, 0)
103
- stack_size = estack - stack
104
- return sh_offset, sh_size, stack, stack_size, ram_addr, ram_size, text_load_addr, \
105
- svc_call_addr, svc_cx_call_addr, fonts_addr, fonts_size
118
+ # App NVRAM handling
119
+ nvram_data_symbol = symtab_section.get_symbol_by_name('_nvram_data')
120
+ # _envram for applications built with old SDK version
121
+ envram_data_symbol = symtab_section.get_symbol_by_name('_envram_data') \
122
+ or symtab_section.get_symbol_by_name('_envram')
123
+ if nvram_data_symbol is not None and envram_data_symbol is not None:
124
+ ei.app_nvram_addr = nvram_data_symbol[0]['st_value']
125
+ ei.app_nvram_size = envram_data_symbol[0]['st_value'] - nvram_data_symbol[0]['st_value']
126
+ else:
127
+ logger.info("The application does not use NVRAM.")
128
+
129
+ supp_ram_section = elf.get_section_by_name('.rfbss')
130
+ ei.ram_addr, ei.ram_size = \
131
+ (supp_ram_section['sh_addr'], supp_ram_section['sh_size']) if supp_ram_section is not None else (0, 0)
132
+ ei.stack_size = estack - ei.stack_addr
133
+ return ei
106
134
 
107
135
 
108
136
  def get_cx_infos(app_path):
137
+ ei = ElfInfo()
109
138
  with open(app_path, 'rb') as fp:
110
139
  elf = ELFFile(fp)
111
- text = elf.get_section_by_name('.text')
112
- cxram = elf.get_section_by_name('.cxram')
113
- sh_offset = text['sh_offset']
114
- sh_size = text['sh_size']
115
- sh_load = text['sh_addr']
116
- cx_ram_load = cxram["sh_addr"]
117
- cx_ram_size = cxram["sh_size"]
140
+ text_section = elf.get_section_by_name('.text')
141
+ cxram_section = elf.get_section_by_name('.cxram')
142
+ ei.text_offset = text_section['sh_offset']
143
+ ei.text_size = text_section['sh_size']
144
+ ei.text_addr = text_section['sh_addr']
145
+ ei.cx_ram_addr = cxram_section["sh_addr"]
146
+ ei.cx_ram_size = cxram_section["sh_size"]
118
147
 
119
- return sh_offset, sh_size, sh_load, cx_ram_size, cx_ram_load
148
+ return ei
120
149
 
121
150
 
122
- def run_qemu(s1: socket.socket, s2: socket.socket, args: argparse.Namespace, use_bagl: bool) -> int:
151
+ def run_qemu(s1: socket.socket, s2: socket.socket, args: argparse.Namespace) -> int:
123
152
  argv = ['qemu-arm-static']
124
153
 
125
154
  if args.debug:
@@ -147,43 +176,55 @@ def run_qemu(s1: socket.socket, s2: socket.socket, args: argparse.Namespace, use
147
176
  cxlib_filepath = f"cxlib/{args.model}-cx-{args.sdk}.elf"
148
177
  cxlib = str(resources.files(__package__) / cxlib_filepath)
149
178
  if os.path.exists(cxlib):
150
- sh_offset, sh_size, sh_load, cx_ram_size, cx_ram_load = get_cx_infos(cxlib)
151
- cxlib_args = f'{cxlib}:{sh_offset:#x}:{sh_size:#x}:{sh_load:#x}:{cx_ram_size:#x}:{cx_ram_load:#x}'
179
+ ei = get_cx_infos(cxlib)
180
+ cxlib_args = f'{cxlib}:{ei.text_offset:#x}:{ei.text_size:#x}:{ei.text_addr:#x}'
181
+ cxlib_args += f':{ei.cx_ram_size:#x}:{ei.cx_ram_addr:#x}'
152
182
  argv += ['-c', cxlib_args]
153
183
  else:
154
184
  logger.warning(f"Cx lib {cxlib_filepath} not found")
155
185
 
156
- # for NBGL apps, fonts binary file is mandatory
157
- if not use_bagl:
158
- fonts_filepath = f"fonts/{args.model}-fonts-{args.apiLevel}.bin"
159
- fonts = str(resources.files(__package__) / fonts_filepath)
160
- if os.path.exists(fonts):
161
- argv += ['-f', fonts]
162
- else:
163
- logger.error(f"Fonts {fonts_filepath} not found")
164
- sys.exit(1)
186
+ only_bagl = True
187
+ # 'bagl' is the default value of the binary.sections.sdk_graphics. We need to
188
+ # manage the cases where it is NOT 'bagl' but the section does not exists yet
189
+ if args.model in ["stax", "flex"]:
190
+ only_bagl = False
165
191
 
166
192
  extra_ram = ''
167
193
  app_path = getattr(args, 'app.elf')
168
194
  for lib in [f'main:{app_path}'] + args.library:
169
195
  name, lib_path = lib.split(':')
170
- load_offset, load_size, stack, stack_size, ram_addr, ram_size, \
171
- text_load_addr, svc_call_address, svc_cx_call_address, \
172
- fonts_addr, fonts_size = get_elf_infos(lib_path, use_bagl)
196
+ binary = LedgerBinaryApp(lib_path)
197
+ use_bagl = binary.sections.sdk_graphics == "bagl"
198
+ if not use_bagl:
199
+ only_bagl = False
200
+ ei = get_elf_infos(lib_path, use_bagl)
173
201
 
174
202
  # Since binaries loaded as libs could also declare extra RAM page(s), collect them all
175
- if (ram_addr, ram_size) != (0, 0):
176
- arg = f'{ram_addr:#x}:{ram_size:#x}'
203
+ if (ei.ram_addr, ei.ram_size) != (0, 0):
204
+ arg = f'{ei.ram_addr:#x}:{ei.ram_size:#x}'
177
205
  if extra_ram and arg != extra_ram:
178
206
  logger.error("different extra RAM pages for main app and/or libraries!")
179
207
  sys.exit(1)
180
208
  extra_ram = arg
181
- lib_arg = f'{name}:{lib_path}:{load_offset:#x}:{load_size:#x}'
182
- lib_arg += f':{stack:#x}:{stack_size:#x}:{svc_call_address:#x}'
183
- lib_arg += f':{svc_cx_call_address:#x}:{text_load_addr:#x}'
184
- lib_arg += f':{fonts_addr:#x}:{fonts_size:#x}'
209
+ lib_arg = f'{name}:{lib_path}:{ei.text_offset:#x}:{ei.text_size:#x}'
210
+ lib_arg += f':{ei.stack_addr:#x}:{ei.stack_size:#x}:{ei.svc_call_addr:#x}'
211
+ lib_arg += f':{ei.svc_cx_call_addr:#x}:{ei.text_addr:#x}'
212
+ lib_arg += f':{ei.fonts_addr:#x}:{ei.fonts_size:#x}'
213
+ lib_arg += f':{ei.app_nvram_addr:#x}:{ei.app_nvram_size:#x}'
214
+ lib_arg += f':{1 if args.load_nvram else 0}'
215
+ lib_arg += f':{1 if args.save_nvram else 0}'
185
216
  argv.append(lib_arg)
186
217
 
218
+ # for NBGL apps, fonts binary file is mandatory
219
+ if not only_bagl:
220
+ fonts_filepath = f"fonts/{args.model}-fonts-{args.apiLevel}.bin"
221
+ fonts = str(resources.files(__package__) / fonts_filepath)
222
+ if os.path.exists(fonts):
223
+ argv += ['-f', fonts]
224
+ else:
225
+ logger.error(f"Fonts {fonts_filepath} not found")
226
+ sys.exit(1)
227
+
187
228
  if args.model == 'blue':
188
229
  if args.rampage:
189
230
  extra_ram = args.rampage
@@ -303,6 +344,8 @@ def main(prog=None) -> int:
303
344
  "left button, 'a' right, 's' both). Default: arrow keys")
304
345
  group.add_argument('--progressive', action='store_true', help='Enable step-by-step rendering of graphical elements')
305
346
  group.add_argument('--zoom', help='Display pixel size.', type=int, choices=range(1, 11))
347
+ group.add_argument('--load-nvram', action='store_true', help='Preload app NVRAM data from file beforehand')
348
+ group.add_argument('--save-nvram', action='store_true', help='Save app NVRAM data to file')
306
349
 
307
350
  if prog:
308
351
  parser.prog = prog
@@ -324,13 +367,6 @@ def main(prog=None) -> int:
324
367
  args.model = "nanosp" if binary.sections.target == "nanos2" else binary.sections.target
325
368
  logger.warning(f"Device model detected from metadata: {args.model}")
326
369
 
327
- # 'bagl' is the default value of the binary.sections.sdk_graphics. We need to
328
- # manage the cases where it is NOT 'bagl' but the section does not exists yet
329
- if args.model in ["stax", "flex"]:
330
- use_bagl = False
331
- else:
332
- use_bagl = binary.sections.sdk_graphics == "bagl"
333
-
334
370
  if not args.apiLevel:
335
371
  if binary.sections.api_level is not None:
336
372
  args.apiLevel = binary.sections.api_level
@@ -475,7 +511,7 @@ def main(prog=None) -> int:
475
511
 
476
512
  s1, s2 = socket.socketpair()
477
513
 
478
- qemu_pid = run_qemu(s1, s2, args, use_bagl)
514
+ qemu_pid = run_qemu(s1, s2, args)
479
515
  s1.close()
480
516
 
481
517
  # The `--transport` argument takes precedence over `--usb`
@@ -488,7 +524,6 @@ def main(prog=None) -> int:
488
524
  seph = seproxyhal.SeProxyHal(
489
525
  s2,
490
526
  args.model,
491
- use_bagl,
492
527
  automation_path,
493
528
  automation_server,
494
529
  transport_type,
@@ -530,7 +565,7 @@ def main(prog=None) -> int:
530
565
  apirun = ApiRunner(args.api_port)
531
566
 
532
567
  display_args = DisplayArgs(args.color, args.model, args.ontop, rendering,
533
- args.keymap, zoom, x, y, use_bagl)
568
+ args.keymap, zoom, x, y)
534
569
  server_args = ServerArgs(apdu, apirun, button, finger, seph, vnc)
535
570
  screen_notifier = ScreenNotifier(display_args, server_args)
536
571
 
@@ -259,12 +259,13 @@ class Display(ABC):
259
259
  return self._display_args.rendering
260
260
 
261
261
  @property
262
- def use_bagl(self) -> bool:
263
- return self._display_args.use_bagl
262
+ @abstractmethod
263
+ def nbgl_gl(self) -> GraphicLibrary:
264
+ pass
264
265
 
265
266
  @property
266
267
  @abstractmethod
267
- def gl(self) -> GraphicLibrary:
268
+ def bagl_gl(self) -> GraphicLibrary:
268
269
  pass
269
270
 
270
271
  @abstractmethod
@@ -15,32 +15,32 @@ class Headless(Display):
15
15
  super().__init__(display, server)
16
16
 
17
17
  self.m = HeadlessPaintWidget(self.model, server.vnc)
18
- self._gl: GraphicLibrary
19
- if display.use_bagl:
20
- self._gl = bagl.Bagl(self.m, MODELS[self.model].screen_size, self.model)
21
- else:
22
- self._gl = nbgl.NBGL(self.m, MODELS[self.model].screen_size, self.model)
18
+ self._bagl_gl: GraphicLibrary
19
+ self._nbgl_gl: GraphicLibrary
20
+ self._bagl_gl = bagl.Bagl(self.m, MODELS[self.model].screen_size, self.model)
21
+ self._nbgl_gl = nbgl.NBGL(self.m, MODELS[self.model].screen_size, self.model)
23
22
 
24
23
  @property
25
- def gl(self) -> GraphicLibrary:
26
- return self._gl
24
+ def bagl_gl(self):
25
+ return self._bagl_gl
26
+
27
+ @property
28
+ def nbgl_gl(self):
29
+ return self._nbgl_gl
27
30
 
28
31
  def display_status(self, data: bytes) -> List[TextEvent]:
29
- assert isinstance(self.gl, bagl.Bagl)
30
- ret = self.gl.display_status(data)
32
+ ret = self.bagl_gl.display_status(data)
31
33
  if MODELS[self.model].name == 'blue':
32
34
  self.screen_update() # Actually, this method doesn't work
33
35
  return ret
34
36
 
35
37
  def display_raw_status(self, data: bytes) -> None:
36
- assert isinstance(self.gl, bagl.Bagl)
37
- self.gl.display_raw_status(data)
38
+ self.bagl_gl.display_raw_status(data)
38
39
  if MODELS[self.model].name == 'blue':
39
40
  self.screen_update() # Actually, this method doesn't work
40
41
 
41
42
  def screen_update(self) -> bool:
42
- assert isinstance(self.gl, bagl.Bagl)
43
- return self.gl.refresh()
43
+ return self.bagl_gl.refresh()
44
44
 
45
45
 
46
46
  class HeadlessPaintWidget(FrameBuffer):
@@ -122,11 +122,10 @@ class OCR:
122
122
  MAX_BLANK_SPACE_STAX = 24
123
123
  MAX_BLANK_SPACE_FLEX = 26
124
124
 
125
- def __init__(self, model: str, use_bagl: bool):
125
+ def __init__(self, model: str):
126
126
  self.events: List[TextEvent] = []
127
127
  # Store the model of the device
128
128
  self.model = model
129
- self.use_bagl = use_bagl
130
129
  # Maximum space for a letter to be considered part of the same word
131
130
  if model == "stax":
132
131
  self.max_blank_space = OCR.MAX_BLANK_SPACE_STAX
@@ -212,14 +211,14 @@ class OCR:
212
211
  # create a new TextEvent if there are no events yet or if there is a new line
213
212
  self.events.append(TextEvent(char, x, y, w, h, False))
214
213
 
215
- def analyze_bitmap(self, data: bytes) -> None:
214
+ def analyze_bitmap(self, data: bytes, use_bagl: bool) -> None:
216
215
  """
217
216
  data contain information about the latest displayed bitmap.
218
217
  Since unified SDK, speculos added the displayed character to data.
219
218
  For older SKD versions, legacy behaviour is used: parsing internal
220
219
  fonts to find a matching bitmap.
221
220
  """
222
- if not self.use_bagl:
221
+ if not use_bagl:
223
222
  # Can be called via SephTag.NBGL_DRAW_IMAGE or SephTag.NBGL_DRAW_IMAGE_RLE
224
223
  # In both cases, data contains:
225
224
  # - area (sizeof(nbgl_area_t))
@@ -191,24 +191,27 @@ class Screen(Display):
191
191
  def __init__(self, display: DisplayArgs, server: ServerArgs) -> None:
192
192
  super().__init__(display, server)
193
193
  self.app: App
194
- self._gl: GraphicLibrary
194
+ self._bagl_gl: GraphicLibrary
195
+ self._nbgl_gl: GraphicLibrary
195
196
 
196
197
  def set_app(self, app: App) -> None:
197
198
  self.app = app
198
199
  self.app.set_screen(self)
199
200
  model = self._display_args.model
200
- if self.use_bagl:
201
- self._gl = bagl.Bagl(app.widget, MODELS[model].screen_size, model)
202
- else:
203
- self._gl = nbgl.NBGL(app.widget, MODELS[model].screen_size, model)
201
+ self._bagl_gl = bagl.Bagl(app.widget, MODELS[model].screen_size, model)
202
+ self._nbgl_gl = nbgl.NBGL(app.widget, MODELS[model].screen_size, model)
204
203
 
205
204
  @property
206
205
  def m(self) -> QWidget:
207
206
  return self.app.widget
208
207
 
209
208
  @property
210
- def gl(self):
211
- return self._gl
209
+ def bagl_gl(self):
210
+ return self._bagl_gl
211
+
212
+ @property
213
+ def nbgl_gl(self):
214
+ return self._nbgl_gl
212
215
 
213
216
  def _key_event(self, event: QKeyEvent, pressed) -> None:
214
217
  key = Qt.Key(event.key())
@@ -223,20 +226,18 @@ class Screen(Display):
223
226
  self.app.close()
224
227
 
225
228
  def display_status(self, data: bytes) -> List[TextEvent]:
226
- assert isinstance(self.gl, bagl.Bagl)
227
- ret = self.gl.display_status(data)
229
+ ret = self.bagl_gl.display_status(data)
228
230
  if MODELS[self.model].name == 'blue':
229
231
  self.screen_update() # Actually, this method doesn't work
230
232
  return ret
231
233
 
232
234
  def display_raw_status(self, data: bytes) -> None:
233
- assert isinstance(self.gl, bagl.Bagl)
234
- self.gl.display_raw_status(data)
235
+ self.bagl_gl.display_raw_status(data)
235
236
  if MODELS[self.model].name == 'blue':
236
237
  self.screen_update() # Actually, this method doesn't work
237
238
 
238
239
  def screen_update(self) -> bool:
239
- return self.gl.refresh()
240
+ return self.bagl_gl.refresh()
240
241
 
241
242
 
242
243
  class QtScreenNotifier(DisplayNotifier):
@@ -105,10 +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 self.use_bagl:
109
- self._gl = bagl.Bagl(self.m, MODELS[display_args.model].screen_size, display_args.model)
110
- else:
111
- raise NotImplementedError("This display can not emulate NBGL OS yet")
108
+ self._gl = bagl.Bagl(self.m, MODELS[display_args.model].screen_size, display_args.model)
112
109
 
113
110
  if display_args.keymap is not None:
114
111
  self.ARROW_KEYS = list(map(ord, display_args.keymap))
@@ -253,7 +253,6 @@ class SeProxyHal(IODevice):
253
253
  def __init__(self,
254
254
  sock: socket,
255
255
  model: str,
256
- use_bagl: bool,
257
256
  automation: Optional[Automation] = None,
258
257
  automation_server: Optional[BroadcastInterface] = None,
259
258
  transport: TransportType = TransportType.HID,
@@ -264,7 +263,8 @@ class SeProxyHal(IODevice):
264
263
  self.automation = automation
265
264
  self.automation_server = automation_server
266
265
  self.events: List[TextEvent] = []
267
- self.refreshed = False
266
+ self.need_nbgl_refresh = False
267
+ self.is_last_draw_nbgl = False
268
268
  self.verbose = verbose
269
269
 
270
270
  self.status_event = threading.Event()
@@ -277,9 +277,7 @@ class SeProxyHal(IODevice):
277
277
 
278
278
  self.transport = build_transport(self.socket_helper.queue_packet, transport)
279
279
 
280
- self.ocr = OCR(model, use_bagl)
281
-
282
- self.use_bagl = use_bagl
280
+ self.ocr = OCR(model)
283
281
 
284
282
  # A list of callback methods when an APDU response is received
285
283
  self.apdu_callbacks: List[Callable[[bytes], None]] = []
@@ -333,17 +331,17 @@ class SeProxyHal(IODevice):
333
331
 
334
332
  if tag == SephTag.GENERAL_STATUS:
335
333
  if int.from_bytes(data[:2], 'big') == SephTag.GENERAL_STATUS_LAST_COMMAND:
336
- if self.refreshed:
337
- self.refreshed = False
334
+ if self.need_nbgl_refresh:
335
+ self.need_nbgl_refresh = False
338
336
 
339
337
  # Update the screenshot, we'll upload its associated events shortly
340
- screen.display.gl.update_screenshot()
341
- screen.display.gl.update_public_screenshot()
338
+ screen.display.nbgl_gl.update_screenshot()
339
+ screen.display.nbgl_gl.update_public_screenshot()
342
340
 
343
- if self.use_bagl and screen.display.screen_update():
341
+ if self.is_last_draw_nbgl is False and screen.display.screen_update():
344
342
  if screen.display.model in ["nanox", "nanosp"]:
345
343
  self.events += self.ocr.get_events()
346
- elif not self.use_bagl:
344
+ elif self.is_last_draw_nbgl:
347
345
  self.events += self.ocr.get_events()
348
346
 
349
347
  # Apply automation rules after having received a GENERAL_STATUS_LAST_COMMAND tag. It allows the
@@ -362,6 +360,7 @@ class SeProxyHal(IODevice):
362
360
  SephTag.DBG_SCREEN_DISPLAY_STATUS,
363
361
  SephTag.BAGL_DRAW_RECT]:
364
362
  self.logger.debug(f"DISPLAY_STATUS {data!r}")
363
+ self.is_last_draw_nbgl = False
365
364
  if screen.display.model not in ["nanox", "nanosp"] or tag == SephTag.BAGL_DRAW_RECT:
366
365
  events = screen.display.display_status(data)
367
366
  self.events += events
@@ -371,8 +370,9 @@ class SeProxyHal(IODevice):
371
370
  elif tag in [SephTag.SCREEN_DISPLAY_RAW_STATUS, SephTag.BAGL_DRAW_BITMAP]:
372
371
  self.logger.debug("SephTag.SCREEN_DISPLAY_RAW_STATUS")
373
372
  screen.display.display_raw_status(data)
373
+ self.is_last_draw_nbgl = False
374
374
  if screen.display.model in ["nanox", "nanosp"]:
375
- self.ocr.analyze_bitmap(data)
375
+ self.ocr.analyze_bitmap(data, True)
376
376
  if tag != SephTag.BAGL_DRAW_BITMAP:
377
377
  self.socket_helper.send_packet(SephTag.DISPLAY_PROCESSED_EVENT)
378
378
  if screen.display.rendering == RENDER_METHOD.PROGRESSIVE:
@@ -425,34 +425,34 @@ class SeProxyHal(IODevice):
425
425
  pass
426
426
 
427
427
  elif tag == SephTag.NBGL_DRAW_RECT:
428
- assert isinstance(screen.display.gl, NBGL)
429
- self.events += screen.display.gl.hal_draw_rect(data)
428
+ assert isinstance(screen.display.nbgl_gl, NBGL)
429
+ self.events += screen.display.nbgl_gl.hal_draw_rect(data)
430
430
 
431
431
  elif tag == SephTag.NBGL_REFRESH:
432
- assert isinstance(screen.display.gl, NBGL)
433
- screen.display.gl.refresh(data)
432
+ screen.display.nbgl_gl.refresh(data)
434
433
  # Stax/Flex only
435
- # We have refreshed the screen, remember it for the next time we have SephTag.GENERAL_STATUS
434
+ # We have need_nbgl_refresh the screen, remember it for the next time we have SephTag.GENERAL_STATUS
436
435
  # then we'll perform a screen update and make public the resulting screenshot
437
- self.refreshed = True
436
+ self.need_nbgl_refresh = True
437
+ self.is_last_draw_nbgl = True
438
438
 
439
439
  elif tag == SephTag.NBGL_DRAW_LINE:
440
- assert isinstance(screen.display.gl, NBGL)
441
- screen.display.gl.hal_draw_line(data)
440
+ assert isinstance(screen.display.nbgl_gl, NBGL)
441
+ screen.display.nbgl_gl.hal_draw_line(data)
442
442
 
443
443
  elif tag == SephTag.NBGL_DRAW_IMAGE:
444
- assert isinstance(screen.display.gl, NBGL)
445
- self.ocr.analyze_bitmap(data)
446
- screen.display.gl.hal_draw_image(data)
444
+ assert isinstance(screen.display.nbgl_gl, NBGL)
445
+ self.ocr.analyze_bitmap(data, False)
446
+ screen.display.nbgl_gl.hal_draw_image(data)
447
447
 
448
448
  elif tag == SephTag.NBGL_DRAW_IMAGE_RLE:
449
- assert isinstance(screen.display.gl, NBGL)
450
- self.ocr.analyze_bitmap(data)
451
- screen.display.gl.hal_draw_image_rle(data)
449
+ assert isinstance(screen.display.nbgl_gl, NBGL)
450
+ self.ocr.analyze_bitmap(data, False)
451
+ screen.display.nbgl_gl.hal_draw_image_rle(data)
452
452
 
453
453
  elif tag == SephTag.NBGL_DRAW_IMAGE_FILE:
454
- assert isinstance(screen.display.gl, NBGL)
455
- screen.display.gl.hal_draw_image_file(data)
454
+ assert isinstance(screen.display.nbgl_gl, NBGL)
455
+ screen.display.nbgl_gl.hal_draw_image_file(data)
456
456
 
457
457
  elif tag == SephTag.NFC_RAPDU:
458
458
  data = self.transport.handle_rapdu(data)
@@ -32,7 +32,6 @@ class DisplayArgs:
32
32
  pixel_size: int
33
33
  x: Optional[int]
34
34
  y: Optional[int]
35
- use_bagl: bool
36
35
 
37
36
 
38
37
  class ServerArgs(NamedTuple):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: speculos
3
- Version: 0.16.1.dev2
3
+ Version: 0.16.1.dev6
4
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
@@ -219,6 +219,7 @@ src/environment.c
219
219
  src/environment.h
220
220
  src/fonts.h
221
221
  src/launcher.c
222
+ src/launcher.h
222
223
  src/sdk.h
223
224
  src/svc.c
224
225
  src/svc.h