speculos 0.16.1.dev2__tar.gz → 0.16.1.dev4__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.dev4}/CHANGELOG.md +7 -0
  2. {speculos-0.16.1.dev2/speculos.egg-info → speculos-0.16.1.dev4}/PKG-INFO +1 -1
  3. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/__version__.py +2 -2
  4. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/main.py +78 -45
  5. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/resources/launcher +0 -0
  6. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4/speculos.egg-info}/PKG-INFO +1 -1
  7. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos.egg-info/SOURCES.txt +1 -0
  8. speculos-0.16.1.dev4/src/bolos/default.c +84 -0
  9. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/os.c +1 -0
  10. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/emulate.h +0 -9
  11. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/launcher.c +133 -11
  12. speculos-0.16.1.dev4/src/launcher.h +20 -0
  13. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/test_os_global_pin_is_validated.c +30 -0
  14. speculos-0.16.1.dev2/src/bolos/default.c +0 -56
  15. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/.clang-format +0 -0
  16. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/.codespell-ignore +0 -0
  17. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/.dockerignore +0 -0
  18. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/.github/workflows/continuous-integration-workflow.yml +0 -0
  19. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/.github/workflows/documentation.yml +0 -0
  20. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/.github/workflows/fast-checks.yml +0 -0
  21. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/.github/workflows/force-rebase.yml +0 -0
  22. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/.github/workflows/reusable_ragger_tests_latest_speculos.yml +0 -0
  23. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/.github/workflows/speculos-builder.yml +0 -0
  24. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/.gitignore +0 -0
  25. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/CMakeLists.txt +0 -0
  26. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/COPYING +0 -0
  27. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/COPYING.LESSER +0 -0
  28. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/Dockerfile +0 -0
  29. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/MANIFEST.in +0 -0
  30. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/Pipfile +0 -0
  31. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/Pipfile.lock +0 -0
  32. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/README.md +0 -0
  33. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/apps/README.md +0 -0
  34. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/apps/blue#btc#1.5#00000000.elf +0 -0
  35. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/apps/blue#ram-page#blue-2.2.5#00000000.elf +0 -0
  36. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/apps/btc-test.elf +0 -0
  37. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/apps/btc.elf +0 -0
  38. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/apps/nanos#btc#1.5#00000000.elf +0 -0
  39. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/apps/nanos#btc#1.6#29717f9c.elf +0 -0
  40. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/apps/nanos#btc#1.6#6bd0a5f8.elf +0 -0
  41. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/apps/nanos#btc#2.0#ce796c1b.elf +0 -0
  42. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/apps/nanos#btc#2.1#1c8db8da.elf +0 -0
  43. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/apps/nanos#btc-test#1.5#00000000.elf +0 -0
  44. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/apps/nanos#btc-test#1.6#29717f9c.elf +0 -0
  45. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/apps/nanos#btc-test#1.6#6bd0a5f8.elf +0 -0
  46. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/apps/nanos#btc-test#2.0#ce796c1b.elf +0 -0
  47. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/apps/nanos#btc-test#2.1#1c8db8da.elf +0 -0
  48. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/apps/nanosp#btc#1.0#a86c791b.elf +0 -0
  49. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/apps/nanosp#btc#1.0.3#17bf7619.elf +0 -0
  50. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/apps/nanosp#btc-test#1.0#a86c791b.elf +0 -0
  51. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/apps/nanosp#btc-test#1.0.3#17bf7619.elf +0 -0
  52. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/apps/nanox#btc#1.2#57272a0f.elf +0 -0
  53. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/apps/nanox#btc#2.0.2#1c8db8da.elf +0 -0
  54. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/apps/nanox#btc-test#2.0.2#1c8db8da.elf +0 -0
  55. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/build.Dockerfile +0 -0
  56. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/clang-armv7m.cmake +0 -0
  57. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/docker-compose.yml +0 -0
  58. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/docs/CNAME +0 -0
  59. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/docs/Makefile +0 -0
  60. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/docs/_static/screenshot-api-nanos-btc.png +0 -0
  61. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/docs/_static/screenshot-btc-nanos.png +0 -0
  62. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/docs/conf.py +0 -0
  63. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/docs/dev/ci.md +0 -0
  64. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/docs/dev/getting_started.md +0 -0
  65. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/docs/dev/index.rst +0 -0
  66. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/docs/dev/internals.md +0 -0
  67. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/docs/dev/tests.md +0 -0
  68. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/docs/index.rst +0 -0
  69. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/docs/installation/build.md +0 -0
  70. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/docs/installation/index.rst +0 -0
  71. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/docs/installation/wsl.md +0 -0
  72. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/docs/requirements.txt +0 -0
  73. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/docs/user/api.md +0 -0
  74. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/docs/user/automation.md +0 -0
  75. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/docs/user/clients.md +0 -0
  76. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/docs/user/debug.md +0 -0
  77. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/docs/user/docker.md +0 -0
  78. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/docs/user/index.rst +0 -0
  79. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/docs/user/macm1.md +0 -0
  80. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/docs/user/semihosting.md +0 -0
  81. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/docs/user/usage.md +0 -0
  82. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/gcc-arm.cmake +0 -0
  83. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/lgtm.yml +0 -0
  84. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/pyproject.toml +0 -0
  85. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/sdk/bolos_syscalls_1.2.h +0 -0
  86. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/sdk/bolos_syscalls_1.5.h +0 -0
  87. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/sdk/bolos_syscalls_1.6.h +0 -0
  88. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/sdk/bolos_syscalls_2.0.h +0 -0
  89. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/sdk/bolos_syscalls_blue_2.2.5.h +0 -0
  90. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/sdk/bolos_syscalls_lnsp.h +0 -0
  91. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/sdk/bolos_syscalls_unified_sdk.h +0 -0
  92. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/setup.cfg +0 -0
  93. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/setup.py +0 -0
  94. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/__init__.py +0 -0
  95. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/__main__.py +0 -0
  96. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/api/README.md +0 -0
  97. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/api/__init__.py +0 -0
  98. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/api/apdu.py +0 -0
  99. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/api/api.py +0 -0
  100. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/api/automation.py +0 -0
  101. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/api/button.py +0 -0
  102. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/api/events.py +0 -0
  103. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/api/finger.py +0 -0
  104. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/api/resources/apdu.schema +0 -0
  105. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/api/resources/button.schema +0 -0
  106. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/api/resources/finger.schema +0 -0
  107. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/api/resources/ticker.schema +0 -0
  108. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/api/restful.py +0 -0
  109. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/api/screenshot.py +0 -0
  110. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/api/static/index.html +0 -0
  111. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/api/static/swagger/README.md +0 -0
  112. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/api/static/swagger/favicon-16x16.png +0 -0
  113. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/api/static/swagger/favicon-32x32.png +0 -0
  114. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/api/static/swagger/index.html +0 -0
  115. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/api/static/swagger/swagger-ui-bundle.js +0 -0
  116. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/api/static/swagger/swagger-ui-standalone-preset.js +0 -0
  117. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/api/static/swagger/swagger-ui.css +0 -0
  118. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/api/static/swagger/swagger.json +0 -0
  119. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/api/swagger.py +0 -0
  120. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/api/swagger.yaml +0 -0
  121. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/api/ticker.py +0 -0
  122. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/api/web_interface.py +0 -0
  123. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/client.py +0 -0
  124. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/flex-api-level-cx-18.elf +0 -0
  125. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/flex-api-level-cx-19.elf +0 -0
  126. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/flex-api-level-cx-20.elf +0 -0
  127. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/flex-api-level-cx-21.elf +0 -0
  128. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/flex-api-level-cx-22.elf +0 -0
  129. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/nanos-cx-2.0.elf +0 -0
  130. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/nanos-cx-2.1.elf +0 -0
  131. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/nanosp-api-level-cx-1.elf +0 -0
  132. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/nanosp-api-level-cx-12.elf +0 -0
  133. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/nanosp-api-level-cx-18.elf +0 -0
  134. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/nanosp-api-level-cx-22.elf +0 -0
  135. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/nanosp-api-level-cx-5.elf +0 -0
  136. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/nanosp-cx-1.0.3.elf +0 -0
  137. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/nanosp-cx-1.0.elf +0 -0
  138. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/nanox-api-level-cx-1.elf +0 -0
  139. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/nanox-api-level-cx-12.elf +0 -0
  140. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/nanox-api-level-cx-18.elf +0 -0
  141. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/nanox-api-level-cx-22.elf +0 -0
  142. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/nanox-api-level-cx-5.elf +0 -0
  143. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/nanox-cx-2.0.2.elf +0 -0
  144. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/nanox-cx-2.0.elf +0 -0
  145. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/stax-api-level-cx-1.elf +0 -0
  146. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/stax-api-level-cx-10.elf +0 -0
  147. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/stax-api-level-cx-11.elf +0 -0
  148. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/stax-api-level-cx-12.elf +0 -0
  149. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/stax-api-level-cx-13.elf +0 -0
  150. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/stax-api-level-cx-14.elf +0 -0
  151. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/stax-api-level-cx-15.elf +0 -0
  152. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/stax-api-level-cx-20.elf +0 -0
  153. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/stax-api-level-cx-21.elf +0 -0
  154. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/stax-api-level-cx-22.elf +0 -0
  155. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/stax-api-level-cx-3.elf +0 -0
  156. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/stax-api-level-cx-5.elf +0 -0
  157. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/stax-api-level-cx-7.elf +0 -0
  158. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/stax-api-level-cx-8.elf +0 -0
  159. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/cxlib/stax-api-level-cx-9.elf +0 -0
  160. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/fonts/flex-fonts-18.bin +0 -0
  161. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/fonts/flex-fonts-19.bin +0 -0
  162. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/fonts/flex-fonts-20.bin +0 -0
  163. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/fonts/flex-fonts-21.bin +0 -0
  164. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/fonts/flex-fonts-22.bin +0 -0
  165. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/fonts/nanosp-fonts-18.bin +0 -0
  166. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/fonts/nanosp-fonts-22.bin +0 -0
  167. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/fonts/nanox-fonts-18.bin +0 -0
  168. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/fonts/nanox-fonts-22.bin +0 -0
  169. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/fonts/stax-fonts-1.bin +0 -0
  170. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/fonts/stax-fonts-10.bin +0 -0
  171. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/fonts/stax-fonts-11.bin +0 -0
  172. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/fonts/stax-fonts-12.bin +0 -0
  173. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/fonts/stax-fonts-13.bin +0 -0
  174. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/fonts/stax-fonts-14.bin +0 -0
  175. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/fonts/stax-fonts-15.bin +0 -0
  176. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/fonts/stax-fonts-20.bin +0 -0
  177. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/fonts/stax-fonts-21.bin +0 -0
  178. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/fonts/stax-fonts-22.bin +0 -0
  179. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/fonts/stax-fonts-3.bin +0 -0
  180. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/fonts/stax-fonts-5.bin +0 -0
  181. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/fonts/stax-fonts-7.bin +0 -0
  182. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/fonts/stax-fonts-8.bin +0 -0
  183. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/fonts/stax-fonts-9.bin +0 -0
  184. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/mcu/__init__.py +0 -0
  185. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/mcu/apdu.py +0 -0
  186. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/mcu/automation.py +0 -0
  187. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/mcu/automation_server.py +0 -0
  188. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/mcu/bagl.py +0 -0
  189. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/mcu/bagl_font.py +0 -0
  190. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/mcu/bagl_glyph.py +0 -0
  191. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/mcu/button_tcp.py +0 -0
  192. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/mcu/display.py +0 -0
  193. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/mcu/finger_tcp.py +0 -0
  194. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/mcu/headless.py +0 -0
  195. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/mcu/icon.png +0 -0
  196. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/mcu/nbgl.py +0 -0
  197. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/mcu/ocr.py +0 -0
  198. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/mcu/readerror.py +0 -0
  199. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/mcu/resources/automation.schema +0 -0
  200. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/mcu/rle_custom.py +0 -0
  201. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/mcu/screen.py +0 -0
  202. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/mcu/screen_text.py +0 -0
  203. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/mcu/seproxyhal.py +0 -0
  204. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/mcu/struct.py +0 -0
  205. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/mcu/transport/__init__.py +0 -0
  206. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/mcu/transport/interface.py +0 -0
  207. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/mcu/transport/nfc.py +0 -0
  208. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/mcu/transport/usb.py +0 -0
  209. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/mcu/vnc.py +0 -0
  210. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/observer.py +0 -0
  211. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/resources/vnc_server +0 -0
  212. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos/resources_importer.py +0 -0
  213. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos.egg-info/dependency_links.txt +0 -0
  214. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos.egg-info/entry_points.txt +0 -0
  215. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos.egg-info/requires.txt +0 -0
  216. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/speculos.egg-info/top_level.txt +0 -0
  217. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/CMakeLists.txt +0 -0
  218. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/bagl.c +0 -0
  219. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/bagl.h +0 -0
  220. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx.c +0 -0
  221. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx.h +0 -0
  222. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_aes.c +0 -0
  223. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_aes.h +0 -0
  224. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_aes_sdk2.c +0 -0
  225. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_blake2.h +0 -0
  226. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_blake2b.c +0 -0
  227. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_bls.c +0 -0
  228. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_bls.h +0 -0
  229. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_bls_fp2.c +0 -0
  230. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_bls_g2.c +0 -0
  231. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_bn.c +0 -0
  232. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_common.h +0 -0
  233. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_crc.c +0 -0
  234. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_crc.h +0 -0
  235. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_curve25519.c +0 -0
  236. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_curve25519.h +0 -0
  237. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_ec.c +0 -0
  238. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_ec.h +0 -0
  239. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_ec_domain.c +0 -0
  240. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_ecpoint.c +0 -0
  241. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_ed25519.c +0 -0
  242. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_ed25519.h +0 -0
  243. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_hash.c +0 -0
  244. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_hash.h +0 -0
  245. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_hkdf.c +0 -0
  246. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_hkdf.h +0 -0
  247. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_hmac.c +0 -0
  248. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_hmac.h +0 -0
  249. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_math.c +0 -0
  250. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_math.h +0 -0
  251. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_montgomery.c +0 -0
  252. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_mpi.c +0 -0
  253. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_ripemd160.c +0 -0
  254. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_rng_rfc6979.c +0 -0
  255. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_rng_rfc6979.h +0 -0
  256. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_scc.c +0 -0
  257. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_sha256.c +0 -0
  258. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_sha3.c +0 -0
  259. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_sha512.c +0 -0
  260. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_twisted_edwards.c +0 -0
  261. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_utils.c +0 -0
  262. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_utils.h +0 -0
  263. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cx_weierstrass.c +0 -0
  264. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cxlib.c +0 -0
  265. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/cxlib.h +0 -0
  266. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/endorsement.c +0 -0
  267. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/endorsement.h +0 -0
  268. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/exception.h +0 -0
  269. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/fonts_info.c +0 -0
  270. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/nbgl.c +0 -0
  271. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/nbgl.h +0 -0
  272. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/nbgl_rle.c +0 -0
  273. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/nbgl_rle.h +0 -0
  274. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/os_1.2.c +0 -0
  275. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/os_1.5.c +0 -0
  276. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/os_1.6.c +0 -0
  277. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/os_2.0.c +0 -0
  278. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/os_bip32.c +0 -0
  279. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/os_bip32.h +0 -0
  280. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/os_eip2333.c +0 -0
  281. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/os_pki.c +0 -0
  282. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/os_pki.h +0 -0
  283. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/os_signature.c +0 -0
  284. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/os_signature.h +0 -0
  285. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/seproxyhal.c +0 -0
  286. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/touch.c +0 -0
  287. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/bolos/touch.h +0 -0
  288. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/emulate.c +0 -0
  289. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/emulate_1.2.c +0 -0
  290. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/emulate_1.5.c +0 -0
  291. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/emulate_1.6.c +0 -0
  292. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/emulate_2.0.c +0 -0
  293. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/emulate_blue_2.2.5.c +0 -0
  294. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/emulate_lnsp_1.0.c +0 -0
  295. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/emulate_unified_sdk.c +0 -0
  296. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/environment.c +0 -0
  297. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/environment.h +0 -0
  298. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/fonts.h +0 -0
  299. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/sdk.h +0 -0
  300. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/svc.c +0 -0
  301. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/svc.h +0 -0
  302. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/CMakeLists.txt +0 -0
  303. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursor.c +0 -0
  304. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursor.h +0 -0
  305. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/approved.h +0 -0
  306. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/bitcoin.h +0 -0
  307. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/blue.h +0 -0
  308. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/fabrice.h +0 -0
  309. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/frame_00.h +0 -0
  310. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/frame_01.h +0 -0
  311. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/frame_02.h +0 -0
  312. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/frame_03.h +0 -0
  313. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/frame_04.h +0 -0
  314. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/frame_05.h +0 -0
  315. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/frame_06.h +0 -0
  316. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/frame_07.h +0 -0
  317. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/frame_08.h +0 -0
  318. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/frame_09.h +0 -0
  319. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/frame_10.h +0 -0
  320. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/frame_11.h +0 -0
  321. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/frame_12.h +0 -0
  322. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/frame_13.h +0 -0
  323. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/frame_14.h +0 -0
  324. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/frame_15.h +0 -0
  325. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/frame_16.h +0 -0
  326. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/frame_17.h +0 -0
  327. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/frame_18.h +0 -0
  328. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/frame_19.h +0 -0
  329. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/frame_20.h +0 -0
  330. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/frame_21.h +0 -0
  331. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/pizza.h +0 -0
  332. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/star.h +0 -0
  333. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/sword.h +0 -0
  334. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/cursors/verynice.h +0 -0
  335. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/seccomp-bpf.h +0 -0
  336. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/src/vnc/vnc_server.c +0 -0
  337. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/CMakeLists.txt +0 -0
  338. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/CMakeLists.txt +0 -0
  339. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/blake2b_kat.data +0 -0
  340. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/groestl_224_long_msg.data +0 -0
  341. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/groestl_224_short_msg.data +0 -0
  342. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/groestl_256_long_msg.data +0 -0
  343. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/groestl_256_short_msg.data +0 -0
  344. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/groestl_384_long_msg.data +0 -0
  345. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/groestl_384_short_msg.data +0 -0
  346. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/groestl_512_long_msg.data +0 -0
  347. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/groestl_512_short_msg.data +0 -0
  348. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/hmac.data +0 -0
  349. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/keccak_224_long_msg.data +0 -0
  350. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/keccak_224_short_msg.data +0 -0
  351. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/keccak_256_long_msg.data +0 -0
  352. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/keccak_256_short_msg.data +0 -0
  353. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/keccak_384_long_msg.data +0 -0
  354. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/keccak_384_short_msg.data +0 -0
  355. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/keccak_512_long_msg.data +0 -0
  356. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/keccak_512_short_msg.data +0 -0
  357. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/sha224_long_msg.data +0 -0
  358. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/sha224_short_msg.data +0 -0
  359. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/sha256_long_msg.data +0 -0
  360. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/sha256_short_msg.data +0 -0
  361. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/sha384_long_msg.data +0 -0
  362. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/sha384_short_msg.data +0 -0
  363. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/sha3_224_long_msg.data +0 -0
  364. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/sha3_224_short_msg.data +0 -0
  365. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/sha3_256_long_msg.data +0 -0
  366. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/sha3_256_short_msg.data +0 -0
  367. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/sha3_384_long_msg.data +0 -0
  368. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/sha3_384_short_msg.data +0 -0
  369. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/sha3_512_long_msg.data +0 -0
  370. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/sha3_512_short_msg.data +0 -0
  371. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/sha512_long_msg.data +0 -0
  372. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/sha512_short_msg.data +0 -0
  373. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/shake128_long_msg.data +0 -0
  374. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/shake128_short_msg.data +0 -0
  375. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/shake128_variable_output.data +0 -0
  376. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/shake256_long_msg.data +0 -0
  377. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/shake256_short_msg.data +0 -0
  378. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/cavp/shake256_variable_output.data +0 -0
  379. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/hello.c +0 -0
  380. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/nist_cavp.c +0 -0
  381. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/nist_cavp.h +0 -0
  382. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/test_aes.c +0 -0
  383. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/test_bip32.c +0 -0
  384. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/test_blake2.c +0 -0
  385. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/test_bls.c +0 -0
  386. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/test_bn.c +0 -0
  387. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/test_crc16.c +0 -0
  388. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/test_ec.c +0 -0
  389. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/test_ecdh.c +0 -0
  390. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/test_ecdsa.c +0 -0
  391. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/test_ecpoint.c +0 -0
  392. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/test_eddsa.c +0 -0
  393. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/test_eip2333.c +0 -0
  394. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/test_endorsement.c +0 -0
  395. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/test_hmac.c +0 -0
  396. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/test_math.c +0 -0
  397. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/test_mpi_rng.c +0 -0
  398. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/test_rfc6979.c +0 -0
  399. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/test_ripemd.c +0 -0
  400. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/test_sha2.c +0 -0
  401. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/test_sha3.c +0 -0
  402. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/test_slip21.c +0 -0
  403. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/wycheproof/X25519.data +0 -0
  404. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/wycheproof/X448.data +0 -0
  405. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/wycheproof/ecdh_secp256k1.data +0 -0
  406. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/syscalls/wycheproof/eddsa.data +0 -0
  407. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/test_environment.c +0 -0
  408. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/utils.c +0 -0
  409. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/c/utils.h +0 -0
  410. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/__init__.py +0 -0
  411. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/api/__init__.py +0 -0
  412. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/api/resources/automation.json +0 -0
  413. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/api/test_api.py +0 -0
  414. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/apps/__init__.py +0 -0
  415. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/apps/resources/__init__.py +0 -0
  416. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/apps/resources/btc_getpubkey_blue.json +0 -0
  417. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/apps/resources/btc_getpubkey_blue.png +0 -0
  418. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/apps/resources/btc_getpubkey_nanos.json +0 -0
  419. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/apps/resources/btc_getpubkey_nanos.png +0 -0
  420. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/apps/resources/btc_getpubkey_nanosp.json +0 -0
  421. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/apps/resources/btc_getpubkey_nanosp.png +0 -0
  422. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/apps/resources/btc_getpubkey_nanox.json +0 -0
  423. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/apps/resources/btc_getpubkey_nanox.png +0 -0
  424. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/apps/test_btc.py +0 -0
  425. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/apps/test_btc_testnet.py +0 -0
  426. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/apps/test_ram_page.py +0 -0
  427. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/apps/test_vnc.py +0 -0
  428. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/conftest.py +0 -0
  429. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/mcu/__init__.py +0 -0
  430. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/mcu/resources/automation_invalid_action_args.json +0 -0
  431. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/mcu/resources/automation_invalid_action_name.json +0 -0
  432. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/mcu/resources/automation_invalid_rule_key.json +0 -0
  433. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/mcu/resources/automation_valid.json +0 -0
  434. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/mcu/test_automation.py +0 -0
  435. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/pytest.ini +0 -0
  436. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/test_resources_importer.py +0 -0
  437. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/unit/__init__.py +0 -0
  438. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/unit/test_client_Api.py +0 -0
  439. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tests/python/unit/test_client_SpeculosClient.py +0 -0
  440. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tools/clang-format.sh +0 -0
  441. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tools/cursor.py +0 -0
  442. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tools/debug.sh +0 -0
  443. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tools/gdbinit +0 -0
  444. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tools/gif-recorder.py +0 -0
  445. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tools/ledger-live-http-proxy.py +0 -0
  446. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tools/skins/handholding.png +0 -0
  447. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tools/skins/nano-blue.png +0 -0
  448. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tools/skins/unicorn.png +0 -0
  449. {speculos-0.16.1.dev2 → speculos-0.16.1.dev4}/tools/winamp.py +0 -0
@@ -5,6 +5,13 @@ 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-13
9
+
10
+ ### Added
11
+
12
+ - `--save-nvram` and `--load-nvram` parameters that allow NVRAM testing
13
+ - destination boundaries verification for `nvm_write()`
14
+
8
15
  ## [0.16.0] 2025-03-05
9
16
 
10
17
  ### 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.dev4
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.dev4'
21
+ __version_tuple__ = version_tuple = (0, 16, 1, 'dev4')
@@ -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,45 +99,53 @@ 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
151
  def run_qemu(s1: socket.socket, s2: socket.socket, args: argparse.Namespace, use_bagl: bool) -> int:
@@ -147,8 +176,9 @@ 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")
@@ -167,21 +197,22 @@ def run_qemu(s1: socket.socket, s2: socket.socket, args: argparse.Namespace, use
167
197
  app_path = getattr(args, 'app.elf')
168
198
  for lib in [f'main:{app_path}'] + args.library:
169
199
  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)
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
 
187
218
  if args.model == 'blue':
@@ -303,6 +334,8 @@ def main(prog=None) -> int:
303
334
  "left button, 'a' right, 's' both). Default: arrow keys")
304
335
  group.add_argument('--progressive', action='store_true', help='Enable step-by-step rendering of graphical elements')
305
336
  group.add_argument('--zoom', help='Display pixel size.', type=int, choices=range(1, 11))
337
+ group.add_argument('--load-nvram', action='store_true', help='Preload app NVRAM data from file beforehand')
338
+ group.add_argument('--save-nvram', action='store_true', help='Save app NVRAM data to file')
306
339
 
307
340
  if prog:
308
341
  parser.prog = prog
@@ -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.dev4
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
@@ -0,0 +1,84 @@
1
+ #include <err.h>
2
+ #include <stddef.h>
3
+ #include <stdio.h>
4
+ #include <sys/mman.h>
5
+
6
+ #include "emulate.h"
7
+ #include "launcher.h"
8
+
9
+ #define PAGE_SIZE 4096
10
+
11
+ unsigned long sys_os_global_pin_invalidate(void)
12
+ {
13
+ /* return void actually */
14
+ return 0;
15
+ }
16
+
17
+ /*
18
+ * TODO: ensure that source address is valid.
19
+ */
20
+ int sys_nvm_write(void *dst_addr, void *src_addr, size_t src_len)
21
+ {
22
+ ptrdiff_t diff;
23
+ size_t size;
24
+ void *p;
25
+
26
+ /* Checking the destination boundaries */
27
+ unsigned long app_nvram_offset =
28
+ get_app_nvram_address() - get_app_text_load_addr();
29
+ if ((dst_addr < get_memory_code_address() + app_nvram_offset) ||
30
+ (dst_addr + src_len >=
31
+ get_memory_code_address() + app_nvram_offset + get_app_nvram_size())) {
32
+ errx(1, "App NVRAM write attempt out of boundaries\n");
33
+ }
34
+ p = (void *)((unsigned long)dst_addr & (~(PAGE_SIZE - 1)));
35
+ diff = (ptrdiff_t)dst_addr - (ptrdiff_t)p;
36
+ size = src_len + diff;
37
+
38
+ if (mprotect(p, size, PROT_WRITE) != 0) {
39
+ err(1, "nvm_write: mprotect(PROT_WRITE)");
40
+ }
41
+
42
+ if (src_addr != NULL) {
43
+ memcpy(dst_addr, src_addr, src_len);
44
+ } else {
45
+ memset(dst_addr, 0, src_len);
46
+ }
47
+
48
+ if (mprotect(p, size, PROT_READ | PROT_EXEC) != 0) {
49
+ err(1, "nvm_write: mprotect(PROT_READ | PROT_EXEC)");
50
+ }
51
+
52
+ if (get_app_save_nvram()) {
53
+ /* Writing data to host file */
54
+ FILE *fptr = fopen(get_app_nvram_file_name(), "r+");
55
+ if (fptr == NULL) {
56
+ fptr = fopen(get_app_nvram_file_name(), "w");
57
+ if (fptr == NULL) {
58
+ err(1, "Failed to open the app NVRAM file %s\n",
59
+ get_app_nvram_file_name());
60
+ }
61
+ }
62
+ unsigned long data_offset =
63
+ dst_addr - (get_memory_code_address() + app_nvram_offset);
64
+ fseek(fptr, data_offset, SEEK_SET);
65
+ if (fwrite(src_addr, 1, src_len, fptr) != src_len) {
66
+ errx(1, "App NVRAM write attempt failed\n");
67
+ }
68
+ fclose(fptr);
69
+ }
70
+
71
+ /* XXX: this function return void */
72
+ return 0xdeadbeef;
73
+ }
74
+
75
+ int sys_nvm_erase(void *dst_addr, size_t src_len)
76
+ {
77
+ return sys_nvm_write(dst_addr, NULL, src_len);
78
+ }
79
+
80
+ int sys_nvm_erase_page(unsigned int page_adr __attribute__((unused)))
81
+ {
82
+ // TODO !
83
+ return 0;
84
+ }
@@ -4,6 +4,7 @@
4
4
 
5
5
  #include "emulate.h"
6
6
  #include "environment.h"
7
+ #include "launcher.h"
7
8
  #include "svc.h"
8
9
 
9
10
  #define OS_SETTING_PLANEMODE_OLD 5
@@ -23,8 +23,6 @@ typedef struct try_context_s try_context_t;
23
23
  typedef struct cx_ecfp_256_public_key_s cx_ecfp_public_key_t;
24
24
  typedef struct cx_ecfp_256_private_key_s cx_ecfp_private_key_t;
25
25
 
26
- struct app_s;
27
-
28
26
  #define SEPH_FILENO 0 /* 0 is stdin fileno */
29
27
 
30
28
  #ifndef UNUSED
@@ -124,13 +122,6 @@ unsigned long sys_io_seph_send(const uint8_t *buffer, uint16_t length);
124
122
  unsigned long sys_io_seph_recv(uint8_t *buffer, uint16_t maxlength,
125
123
  unsigned int flags);
126
124
 
127
- void unload_running_app(bool unload_data);
128
- struct app_s *get_current_app(void);
129
- void save_current_context(struct sigcontext *sigcontext);
130
- void replace_current_context(struct sigcontext *sigcontext);
131
- int replace_current_code(struct app_s *app);
132
- int run_lib(char *name, unsigned long *parameters);
133
-
134
125
  unsigned long sys_try_context_set(try_context_t *context);
135
126
  unsigned long sys_try_context_get(void);
136
127
 
@@ -15,6 +15,7 @@
15
15
  #include "emulate.h"
16
16
  #include "environment.h"
17
17
  #include "fonts.h"
18
+ #include "launcher.h"
18
19
  #include "svc.h"
19
20
 
20
21
  #define LOAD_ADDR ((void *)0x40000000)
@@ -28,6 +29,9 @@
28
29
  #define GIT_REVISION "00000000"
29
30
  #endif
30
31
 
32
+ #define STORAGE_APP_NAME_LEN 30
33
+ const char STORAGE_BACKUP[] = ".backup";
34
+
31
35
  struct elf_info_s {
32
36
  unsigned long load_offset;
33
37
  unsigned long load_size;
@@ -38,10 +42,15 @@ struct elf_info_s {
38
42
  unsigned long text_load_addr;
39
43
  unsigned long fonts_addr;
40
44
  unsigned long fonts_size;
45
+ unsigned long app_nvram_addr;
46
+ unsigned long app_nvram_size;
41
47
  };
42
48
 
43
49
  struct app_s {
44
50
  char *name;
51
+ char nvram_file_name[STORAGE_APP_NAME_LEN];
52
+ bool load_nvram;
53
+ bool save_nvram;
45
54
  int fd;
46
55
  struct elf_info_s elf;
47
56
  };
@@ -105,7 +114,8 @@ static struct app_s *search_app_by_name(char *name)
105
114
  }
106
115
 
107
116
  /* open the app file */
108
- static int open_app(char *name, char *filename, struct elf_info_s *elf)
117
+ static int open_app(char *name, char *filename, struct elf_info_s *elf,
118
+ bool load_nvram, bool save_nvram)
109
119
  {
110
120
  int fd;
111
121
 
@@ -126,6 +136,14 @@ static int open_app(char *name, char *filename, struct elf_info_s *elf)
126
136
  }
127
137
 
128
138
  apps[napp].name = name;
139
+
140
+ size_t len = STORAGE_APP_NAME_LEN - 1;
141
+ strncat(apps[napp].nvram_file_name, name, len);
142
+ len -= strlen(name);
143
+ strncat(apps[napp].nvram_file_name, "_nvram.bin", len);
144
+ apps[napp].load_nvram = load_nvram;
145
+ apps[napp].save_nvram = save_nvram;
146
+
129
147
  apps[napp].fd = fd;
130
148
  apps[napp].elf.load_offset = elf->load_offset;
131
149
  apps[napp].elf.load_size = elf->load_size;
@@ -136,6 +154,8 @@ static int open_app(char *name, char *filename, struct elf_info_s *elf)
136
154
  apps[napp].elf.text_load_addr = elf->text_load_addr;
137
155
  apps[napp].elf.fonts_addr = elf->fonts_addr;
138
156
  apps[napp].elf.fonts_size = elf->fonts_size;
157
+ apps[napp].elf.app_nvram_addr = elf->app_nvram_addr;
158
+ apps[napp].elf.app_nvram_size = elf->app_nvram_size;
139
159
 
140
160
  napp++;
141
161
 
@@ -153,11 +173,41 @@ static void reset_memory(bool unload_data)
153
173
  }
154
174
  }
155
175
 
176
+ void *get_memory_code_address(void)
177
+ {
178
+ return memory.code;
179
+ }
180
+
156
181
  struct app_s *get_current_app(void)
157
182
  {
158
183
  return current_app;
159
184
  }
160
185
 
186
+ char *get_app_nvram_file_name(void)
187
+ {
188
+ return current_app->nvram_file_name;
189
+ }
190
+
191
+ bool get_app_save_nvram(void)
192
+ {
193
+ return current_app->save_nvram;
194
+ }
195
+
196
+ unsigned long get_app_nvram_address(void)
197
+ {
198
+ return current_app->elf.app_nvram_addr;
199
+ }
200
+
201
+ unsigned long get_app_nvram_size(void)
202
+ {
203
+ return current_app->elf.app_nvram_size;
204
+ }
205
+
206
+ unsigned long get_app_text_load_addr(void)
207
+ {
208
+ return current_app->elf.text_load_addr;
209
+ }
210
+
161
211
  // On old versions of the SDK, functions SVC_Call and SVC_cx_call were inlined
162
212
  // In this case we can't look for the symbols in the elf to only patch the SVC_1
163
213
  // inside of these functions
@@ -402,6 +452,67 @@ static void *load_app(char *name)
402
452
  }
403
453
  }
404
454
 
455
+ // App NVRAM data update
456
+ unsigned long app_nvram_offset =
457
+ app->elf.app_nvram_addr - app->elf.text_load_addr;
458
+ memset(code + app_nvram_offset, 0, app->elf.app_nvram_size);
459
+ size_t preload_file_size = 0;
460
+
461
+ if (app->load_nvram) {
462
+ FILE *fptr = fopen(app->nvram_file_name, "rb");
463
+ if (fptr == NULL) {
464
+ warnx("App NVRAM file %s is absent\n", app->nvram_file_name);
465
+ goto error;
466
+ }
467
+ fseek(fptr, 0, SEEK_END);
468
+ long lSize = ftell(fptr);
469
+ rewind(fptr);
470
+
471
+ uint8_t *buffer = (uint8_t *)malloc(sizeof(uint8_t) * lSize);
472
+ if (buffer == NULL) {
473
+ warnx("Error to allocate memory for app nvram read\n");
474
+ fclose(fptr);
475
+ goto error;
476
+ }
477
+ preload_file_size = fread(buffer, 1, lSize, fptr);
478
+ if (preload_file_size != (size_t)lSize) {
479
+ warnx("App nvram file size mismatch\n");
480
+ free(buffer);
481
+ fclose(fptr);
482
+ goto error;
483
+ }
484
+
485
+ // The patch
486
+ memcpy(code + app_nvram_offset, buffer, preload_file_size);
487
+
488
+ free(buffer);
489
+ fclose(fptr);
490
+ }
491
+
492
+ if (app->save_nvram) {
493
+ /* Let's rename and thus backup the current file if present */
494
+ char backup_file_name[STORAGE_APP_NAME_LEN + sizeof(STORAGE_BACKUP)] = {
495
+ 0
496
+ };
497
+
498
+ strcpy(backup_file_name, app->nvram_file_name);
499
+ strcat(backup_file_name, STORAGE_BACKUP);
500
+ rename(app->nvram_file_name, backup_file_name);
501
+
502
+ if (preload_file_size > 0) {
503
+ /* Let's save the initial content to the new file */
504
+ FILE *fptr = fopen(app->nvram_file_name, "w");
505
+ if (fptr == NULL) {
506
+ err(1, "Failed to open the app NVRAM file %s\n", app->nvram_file_name);
507
+ }
508
+ if (fwrite(code + app_nvram_offset, 1, preload_file_size, fptr) !=
509
+ preload_file_size) {
510
+ errx(1, "App NVRAM write attempt failed\n");
511
+ }
512
+ fclose(fptr);
513
+ }
514
+ }
515
+
405
516
  if (mprotect(code, size, PROT_READ | PROT_EXEC) != 0) {
406
517
  warn("could not update mprotect in rx mode for app");
407
518
  goto error;
@@ -606,12 +717,15 @@ int run_lib(char *name, unsigned long *parameters)
606
717
  /*
607
718
  * Libraries are given with the following format:
608
719
  * name:path:load_offset:load_size. eg.
609
- * Bitcoin:apps/btc.elf:0x1000:0x9fc0:0x20001800:0x1800
720
+ * Bitcoin:apps/btc.elf:0x1000:0x9fc0:0x20001800:0x1800 ...
610
721
  */
611
- static char *parse_app_infos(char *arg, char **filename, struct elf_info_s *elf)
722
+ static char *parse_app_infos(char *arg, char **filename, struct elf_info_s *elf,
723
+ bool *load_nvram, bool *save_nvram)
612
724
  {
613
725
  char *libname;
614
726
  int ret;
727
+ int load_nvram_i = 0;
728
+ int save_nvram_i = 0;
615
729
 
616
730
  libname = strdup(arg);
617
731
  *filename = strdup(arg);
@@ -619,17 +733,22 @@ static char *parse_app_infos(char *arg, char **filename, struct elf_info_s *elf)
619
733
  err(1, "strdup");
620
734
  }
621
735
 
622
- ret = sscanf(
623
- arg, "%[^:]:%[^:]:0x%lx:0x%lx:0x%lx:0x%lx:0x%lx:0x%lx:0x%lx:0x%lx:0x%lx",
624
- libname, *filename, &elf->load_offset, &elf->load_size, &elf->stack_addr,
625
- &elf->stack_size, &elf->svc_call_addr, &elf->svc_cx_call_addr,
626
- &elf->text_load_addr, &elf->fonts_addr, &elf->fonts_size);
627
- if (ret != 11) {
736
+ ret = sscanf(arg,
737
+ "%[^:]:%[^:]:0x%lx:0x%lx:0x%lx:0x%lx:0x%lx:0x%lx:0x%lx:0x%lx:0x%"
738
+ "lx:0x%lx:0x%lx:%d:%d",
739
+ libname, *filename, &elf->load_offset, &elf->load_size,
740
+ &elf->stack_addr, &elf->stack_size, &elf->svc_call_addr,
741
+ &elf->svc_cx_call_addr, &elf->text_load_addr, &elf->fonts_addr,
742
+ &elf->fonts_size, &elf->app_nvram_addr, &elf->app_nvram_size,
743
+ &load_nvram_i, &save_nvram_i);
744
+ if (ret != 15) {
628
745
  warnx("failed to parse app infos (\"%s\", %d)", arg, ret);
629
746
  free(libname);
630
747
  free(*filename);
631
748
  return NULL;
632
749
  }
750
+ *load_nvram = ((load_nvram_i == 1) ? true : false);
751
+ *save_nvram = ((save_nvram_i == 1) ? true : false);
633
752
 
634
753
  return libname;
635
754
  }
@@ -638,15 +757,18 @@ static int load_apps(int argc, char *argv[])
638
757
  {
639
758
  char *filename, *libname;
640
759
  struct elf_info_s elf;
760
+ bool load_nvram = false;
761
+ bool save_nvram = false;
641
762
  int i;
642
763
 
643
764
  for (i = 0; i < argc; i++) {
644
- libname = parse_app_infos(argv[i], &filename, &elf);
765
+ libname =
766
+ parse_app_infos(argv[i], &filename, &elf, &load_nvram, &save_nvram);
645
767
  if (libname == NULL) {
646
768
  return -1;
647
769
  }
648
770
 
649
- if (open_app(libname, filename, &elf) != 0) {
771
+ if (open_app(libname, filename, &elf, load_nvram, save_nvram) != 0) {
650
772
  return -1;
651
773
  }
652
774
  }
@@ -0,0 +1,20 @@
1
+ #pragma once
2
+
3
+ #include <signal.h>
4
+ #include <stdbool.h>
5
+ #include <stddef.h>
6
+
7
+ struct app_s;
8
+
9
+ void unload_running_app(bool unload_data);
10
+ void *get_memory_code_address(void);
11
+ struct app_s *get_current_app(void);
12
+ char *get_app_nvram_file_name(void);
13
+ bool get_app_save_nvram(void);
14
+ unsigned long get_app_nvram_address(void);
15
+ unsigned long get_app_nvram_size(void);
16
+ unsigned long get_app_text_load_addr(void);
17
+ void save_current_context(struct sigcontext *sigcontext);
18
+ void replace_current_context(struct sigcontext *sigcontext);
19
+ int replace_current_code(struct app_s *app);
20
+ int run_lib(char *name, unsigned long *parameters);
@@ -22,11 +22,41 @@
22
22
  hw_model_t hw_model = MODEL_COUNT;
23
23
  sdk_version_t sdk_version = SDK_COUNT;
24
24
 
25
+ void *get_memory_code_address(void)
26
+ {
27
+ return NULL;
28
+ }
29
+
25
30
  struct app_s *get_current_app(void)
26
31
  {
27
32
  return NULL;
28
33
  }
29
34
 
35
+ char *get_app_nvram_file_name(void)
36
+ {
37
+ return NULL;
38
+ }
39
+
40
+ bool get_app_save_nvram(void)
41
+ {
42
+ return false;
43
+ }
44
+
45
+ unsigned long get_app_nvram_address(void)
46
+ {
47
+ return 0;
48
+ }
49
+
50
+ unsigned long get_app_nvram_size(void)
51
+ {
52
+ return 0;
53
+ }
54
+
55
+ unsigned long get_app_text_load_addr(void)
56
+ {
57
+ return 0;
58
+ }
59
+
30
60
  void unload_running_app(bool UNUSED(unload_data))
31
61
  {
32
62
  }