oscura 0.11.0__tar.gz → 0.12.0__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 (645) hide show
  1. {oscura-0.11.0 → oscura-0.12.0}/.vscode/launch.json +30 -4
  2. {oscura-0.11.0 → oscura-0.12.0}/.vscode/tasks.json +14 -2
  3. {oscura-0.11.0 → oscura-0.12.0}/CHANGELOG.md +48 -0
  4. {oscura-0.11.0 → oscura-0.12.0}/PKG-INFO +3 -3
  5. {oscura-0.11.0 → oscura-0.12.0}/README.md +2 -2
  6. {oscura-0.11.0 → oscura-0.12.0}/cspell.json +23 -3
  7. {oscura-0.11.0 → oscura-0.12.0}/pyproject.toml +1 -1
  8. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/__init__.py +1 -1
  9. oscura-0.12.0/src/oscura/analyzers/binary/__init__.py +36 -0
  10. oscura-0.12.0/src/oscura/analyzers/binary/core/__init__.py +29 -0
  11. oscura-0.12.0/src/oscura/analyzers/binary/core/file_access.py +193 -0
  12. oscura-0.12.0/src/oscura/analyzers/binary/core/pipeline.py +161 -0
  13. oscura-0.12.0/src/oscura/analyzers/binary/core/results.py +217 -0
  14. oscura-0.12.0/src/oscura/analyzers/binary/detection/__init__.py +10 -0
  15. oscura-0.12.0/src/oscura/analyzers/binary/detection/encoding.py +624 -0
  16. oscura-0.12.0/src/oscura/analyzers/binary/detection/patterns.py +320 -0
  17. oscura-0.12.0/src/oscura/analyzers/binary/detection/structure.py +630 -0
  18. oscura-0.12.0/src/oscura/analyzers/binary/export/__init__.py +9 -0
  19. oscura-0.12.0/src/oscura/analyzers/binary/export/dissector.py +174 -0
  20. oscura-0.12.0/src/oscura/analyzers/binary/inference/__init__.py +15 -0
  21. oscura-0.12.0/src/oscura/analyzers/binary/inference/checksums.py +214 -0
  22. oscura-0.12.0/src/oscura/analyzers/binary/inference/fields.py +150 -0
  23. oscura-0.12.0/src/oscura/analyzers/binary/inference/sequences.py +232 -0
  24. oscura-0.12.0/src/oscura/analyzers/binary/inference/timestamps.py +210 -0
  25. oscura-0.12.0/src/oscura/analyzers/binary/visualization/__init__.py +9 -0
  26. oscura-0.12.0/src/oscura/analyzers/binary/visualization/structure_view.py +182 -0
  27. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/__init__.py +1 -1
  28. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/dtc/data.json +102 -17
  29. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/schemas/device_mapping.json +8 -2
  30. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/schemas/packet_format.json +24 -4
  31. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/schemas/protocol_definition.json +12 -2
  32. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/loaders/__init__.py +4 -1
  33. oscura-0.12.0/src/oscura/loaders/binary.py +439 -0
  34. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/sessions/legacy.py +80 -19
  35. {oscura-0.11.0 → oscura-0.12.0}/uv.lock +1 -1
  36. oscura-0.11.0/src/oscura/loaders/binary.py +0 -156
  37. {oscura-0.11.0 → oscura-0.12.0}/.claude/summaries/.gitkeep +0 -0
  38. {oscura-0.11.0 → oscura-0.12.0}/.cspell/.gitkeep +0 -0
  39. {oscura-0.11.0 → oscura-0.12.0}/.cspell/custom-dictionary.txt +0 -0
  40. {oscura-0.11.0 → oscura-0.12.0}/.editorconfig +0 -0
  41. {oscura-0.11.0 → oscura-0.12.0}/.env.example +0 -0
  42. {oscura-0.11.0 → oscura-0.12.0}/.gitattributes +0 -0
  43. {oscura-0.11.0 → oscura-0.12.0}/.github/config/README.md +0 -0
  44. {oscura-0.11.0 → oscura-0.12.0}/.github/config/main-branch-ruleset-template.json +0 -0
  45. {oscura-0.11.0 → oscura-0.12.0}/.github/config/main-branch-ruleset.json +0 -0
  46. {oscura-0.11.0 → oscura-0.12.0}/.gitignore +0 -0
  47. {oscura-0.11.0 → oscura-0.12.0}/.gitleaks.toml +0 -0
  48. {oscura-0.11.0 → oscura-0.12.0}/.gitmessage +0 -0
  49. {oscura-0.11.0 → oscura-0.12.0}/.importlinter +0 -0
  50. {oscura-0.11.0 → oscura-0.12.0}/.lycheeignore +0 -0
  51. {oscura-0.11.0 → oscura-0.12.0}/.markdownlint.yaml +0 -0
  52. {oscura-0.11.0 → oscura-0.12.0}/.markdownlintignore +0 -0
  53. {oscura-0.11.0 → oscura-0.12.0}/.pre-commit-config.yaml +0 -0
  54. {oscura-0.11.0 → oscura-0.12.0}/.prettierignore +0 -0
  55. {oscura-0.11.0 → oscura-0.12.0}/.python-version +0 -0
  56. {oscura-0.11.0 → oscura-0.12.0}/.shellcheckrc +0 -0
  57. {oscura-0.11.0 → oscura-0.12.0}/.vscode/extensions.json +0 -0
  58. {oscura-0.11.0 → oscura-0.12.0}/.vscode/markdown.css +0 -0
  59. {oscura-0.11.0 → oscura-0.12.0}/.vscode/settings.json +0 -0
  60. {oscura-0.11.0 → oscura-0.12.0}/.yamllint.yaml +0 -0
  61. {oscura-0.11.0 → oscura-0.12.0}/CITATION.cff +0 -0
  62. {oscura-0.11.0 → oscura-0.12.0}/CLAUDE.md +0 -0
  63. {oscura-0.11.0 → oscura-0.12.0}/CODE_OF_CONDUCT.md +0 -0
  64. {oscura-0.11.0 → oscura-0.12.0}/CONTRIBUTING.md +0 -0
  65. {oscura-0.11.0 → oscura-0.12.0}/LICENSE +0 -0
  66. {oscura-0.11.0 → oscura-0.12.0}/Makefile +0 -0
  67. {oscura-0.11.0 → oscura-0.12.0}/SECURITY.md +0 -0
  68. {oscura-0.11.0 → oscura-0.12.0}/codecov.yml +0 -0
  69. {oscura-0.11.0 → oscura-0.12.0}/demos/generate_all_demo_data.py +0 -0
  70. {oscura-0.11.0 → oscura-0.12.0}/lychee.toml +0 -0
  71. {oscura-0.11.0 → oscura-0.12.0}/mkdocs.yml +0 -0
  72. {oscura-0.11.0 → oscura-0.12.0}/pipelines/examples/batch_processing.yaml +0 -0
  73. {oscura-0.11.0 → oscura-0.12.0}/pipelines/examples/complete_workflow.yaml +0 -0
  74. {oscura-0.11.0 → oscura-0.12.0}/pipelines/examples/conditional_export.yaml +0 -0
  75. {oscura-0.11.0 → oscura-0.12.0}/pipelines/examples/filter_chain.yaml +0 -0
  76. {oscura-0.11.0 → oscura-0.12.0}/pipelines/examples/multi_protocol.yaml +0 -0
  77. {oscura-0.11.0 → oscura-0.12.0}/pipelines/examples/power_analysis.yaml +0 -0
  78. {oscura-0.11.0 → oscura-0.12.0}/pipelines/examples/spectral_analysis.yaml +0 -0
  79. {oscura-0.11.0 → oscura-0.12.0}/pipelines/examples/uart_analysis.yaml +0 -0
  80. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/__main__.py +0 -0
  81. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/__init__.py +0 -0
  82. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/classification.py +0 -0
  83. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/digital/__init__.py +0 -0
  84. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/digital/bus.py +0 -0
  85. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/digital/clock.py +0 -0
  86. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/digital/correlation.py +0 -0
  87. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/digital/edges.py +0 -0
  88. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/digital/extraction.py +0 -0
  89. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/digital/quality.py +0 -0
  90. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/digital/signal_quality.py +0 -0
  91. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/digital/thresholds.py +0 -0
  92. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/digital/timing.py +0 -0
  93. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/digital/timing_numba.py +0 -0
  94. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/entropy.py +0 -0
  95. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/eye/__init__.py +0 -0
  96. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/eye/diagram.py +0 -0
  97. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/eye/generation.py +0 -0
  98. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/eye/metrics.py +0 -0
  99. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/jitter/__init__.py +0 -0
  100. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/jitter/ber.py +0 -0
  101. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/jitter/classification.py +0 -0
  102. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/jitter/decomposition.py +0 -0
  103. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/jitter/measurements.py +0 -0
  104. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/jitter/spectrum.py +0 -0
  105. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/jitter/timing.py +0 -0
  106. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/measurements.py +0 -0
  107. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/ml/__init__.py +0 -0
  108. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/ml/features.py +0 -0
  109. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/ml/signal_classifier.py +0 -0
  110. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/packet/__init__.py +0 -0
  111. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/packet/daq.py +0 -0
  112. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/packet/metrics.py +0 -0
  113. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/packet/parser.py +0 -0
  114. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/packet/payload.py +0 -0
  115. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/packet/payload_analysis.py +0 -0
  116. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/packet/payload_extraction.py +0 -0
  117. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/packet/payload_patterns.py +0 -0
  118. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/packet/stream.py +0 -0
  119. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/patterns/__init__.py +0 -0
  120. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/patterns/anomaly_detection.py +0 -0
  121. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/patterns/clustering.py +0 -0
  122. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/patterns/clustering_optimized.py +0 -0
  123. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/patterns/discovery.py +0 -0
  124. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/patterns/learning.py +0 -0
  125. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/patterns/matching.py +0 -0
  126. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/patterns/pattern_mining.py +0 -0
  127. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/patterns/periodic.py +0 -0
  128. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/patterns/reverse_engineering.py +0 -0
  129. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/patterns/sequences.py +0 -0
  130. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/power/__init__.py +0 -0
  131. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/power/ac_power.py +0 -0
  132. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/power/basic.py +0 -0
  133. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/power/conduction.py +0 -0
  134. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/power/efficiency.py +0 -0
  135. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/power/ripple.py +0 -0
  136. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/power/soa.py +0 -0
  137. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/power/switching.py +0 -0
  138. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocol/__init__.py +0 -0
  139. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/__init__.py +0 -0
  140. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/base.py +0 -0
  141. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/ble/__init__.py +0 -0
  142. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/ble/analyzer.py +0 -0
  143. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/ble/uuids.py +0 -0
  144. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/can.py +0 -0
  145. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/can_fd.py +0 -0
  146. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/flexray.py +0 -0
  147. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/hdlc.py +0 -0
  148. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/i2c.py +0 -0
  149. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/i2s.py +0 -0
  150. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/industrial/__init__.py +0 -0
  151. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/industrial/bacnet/__init__.py +0 -0
  152. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/industrial/bacnet/analyzer.py +0 -0
  153. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/industrial/bacnet/encoding.py +0 -0
  154. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/industrial/bacnet/services.py +0 -0
  155. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/industrial/ethercat/__init__.py +0 -0
  156. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/industrial/ethercat/analyzer.py +0 -0
  157. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/industrial/ethercat/mailbox.py +0 -0
  158. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/industrial/ethercat/topology.py +0 -0
  159. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/industrial/modbus/__init__.py +0 -0
  160. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/industrial/modbus/analyzer.py +0 -0
  161. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/industrial/modbus/crc.py +0 -0
  162. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/industrial/modbus/functions.py +0 -0
  163. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/industrial/opcua/__init__.py +0 -0
  164. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/industrial/opcua/analyzer.py +0 -0
  165. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/industrial/opcua/datatypes.py +0 -0
  166. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/industrial/opcua/services.py +0 -0
  167. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/industrial/profinet/__init__.py +0 -0
  168. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/industrial/profinet/analyzer.py +0 -0
  169. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/industrial/profinet/dcp.py +0 -0
  170. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/industrial/profinet/ptcp.py +0 -0
  171. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/jtag.py +0 -0
  172. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/lin.py +0 -0
  173. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/manchester.py +0 -0
  174. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/onewire.py +0 -0
  175. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/parallel_bus/__init__.py +0 -0
  176. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/parallel_bus/centronics.py +0 -0
  177. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/parallel_bus/gpib.py +0 -0
  178. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/spi.py +0 -0
  179. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/swd.py +0 -0
  180. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/uart.py +0 -0
  181. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/protocols/usb.py +0 -0
  182. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/side_channel/__init__.py +0 -0
  183. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/side_channel/power.py +0 -0
  184. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/side_channel/timing.py +0 -0
  185. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/signal/__init__.py +0 -0
  186. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/signal/timing_analysis.py +0 -0
  187. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/signal_classification.py +0 -0
  188. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/signal_integrity/__init__.py +0 -0
  189. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/signal_integrity/embedding.py +0 -0
  190. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/signal_integrity/equalization.py +0 -0
  191. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/signal_integrity/sparams.py +0 -0
  192. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/spectral/__init__.py +0 -0
  193. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/spectral/chunked.py +0 -0
  194. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/spectral/chunked_fft.py +0 -0
  195. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/spectral/chunked_wavelet.py +0 -0
  196. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/spectral/fft.py +0 -0
  197. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/statistical/__init__.py +0 -0
  198. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/statistical/checksum.py +0 -0
  199. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/statistical/chunked_corr.py +0 -0
  200. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/statistical/classification.py +0 -0
  201. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/statistical/entropy.py +0 -0
  202. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/statistical/ngrams.py +0 -0
  203. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/statistics/__init__.py +0 -0
  204. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/statistics/advanced.py +0 -0
  205. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/statistics/basic.py +0 -0
  206. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/statistics/correlation.py +0 -0
  207. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/statistics/distribution.py +0 -0
  208. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/statistics/outliers.py +0 -0
  209. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/statistics/streaming.py +0 -0
  210. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/statistics/trend.py +0 -0
  211. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/validation.py +0 -0
  212. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/waveform/__init__.py +0 -0
  213. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/waveform/measurements.py +0 -0
  214. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/waveform/measurements_with_uncertainty.py +0 -0
  215. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/waveform/spectral.py +0 -0
  216. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/analyzers/waveform/wavelets.py +0 -0
  217. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/api/__init__.py +0 -0
  218. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/api/dsl/__init__.py +0 -0
  219. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/api/dsl/commands.py +0 -0
  220. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/api/dsl/interpreter.py +0 -0
  221. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/api/dsl/parser.py +0 -0
  222. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/api/dsl/repl.py +0 -0
  223. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/api/dsl.py +0 -0
  224. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/api/fluent.py +0 -0
  225. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/api/integrations/__init__.py +0 -0
  226. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/api/integrations/llm.py +0 -0
  227. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/api/operators.py +0 -0
  228. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/api/optimization.py +0 -0
  229. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/api/profiling.py +0 -0
  230. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/api/rest_server.py +0 -0
  231. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/api/server/__init__.py +0 -0
  232. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/api/server/dashboard.py +0 -0
  233. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/api/server/static/README.md +0 -0
  234. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/api/server/templates/base.html +0 -0
  235. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/api/server/templates/export.html +0 -0
  236. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/api/server/templates/home.html +0 -0
  237. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/api/server/templates/protocols.html +0 -0
  238. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/api/server/templates/reports.html +0 -0
  239. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/api/server/templates/session_detail.html +0 -0
  240. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/api/server/templates/sessions.html +0 -0
  241. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/api/server/templates/waveforms.html +0 -0
  242. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/can/__init__.py +0 -0
  243. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/can/analysis.py +0 -0
  244. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/can/checksum.py +0 -0
  245. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/can/correlation.py +0 -0
  246. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/can/dbc_generator.py +0 -0
  247. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/can/discovery.py +0 -0
  248. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/can/message_wrapper.py +0 -0
  249. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/can/models.py +0 -0
  250. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/can/patterns.py +0 -0
  251. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/can/session.py +0 -0
  252. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/can/state_machine.py +0 -0
  253. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/can/stimulus_response.py +0 -0
  254. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/dbc/__init__.py +0 -0
  255. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/dbc/generator.py +0 -0
  256. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/dbc/parser.py +0 -0
  257. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/dtc/__init__.py +0 -0
  258. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/dtc/database.py +0 -0
  259. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/flexray/__init__.py +0 -0
  260. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/flexray/analyzer.py +0 -0
  261. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/flexray/crc.py +0 -0
  262. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/flexray/fibex.py +0 -0
  263. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/j1939/__init__.py +0 -0
  264. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/j1939/analyzer.py +0 -0
  265. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/j1939/decoder.py +0 -0
  266. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/j1939/spns.py +0 -0
  267. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/j1939/transport.py +0 -0
  268. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/lin/__init__.py +0 -0
  269. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/lin/analyzer.py +0 -0
  270. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/loaders/__init__.py +0 -0
  271. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/loaders/asc.py +0 -0
  272. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/loaders/blf.py +0 -0
  273. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/loaders/csv_can.py +0 -0
  274. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/loaders/dispatcher.py +0 -0
  275. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/loaders/mdf.py +0 -0
  276. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/loaders/pcap.py +0 -0
  277. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/obd/__init__.py +0 -0
  278. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/obd/decoder.py +0 -0
  279. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/uds/__init__.py +0 -0
  280. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/uds/analyzer.py +0 -0
  281. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/uds/decoder.py +0 -0
  282. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/uds/models.py +0 -0
  283. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/automotive/visualization.py +0 -0
  284. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/cli/__init__.py +0 -0
  285. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/cli/analyze.py +0 -0
  286. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/cli/batch.py +0 -0
  287. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/cli/benchmark.py +0 -0
  288. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/cli/characterize.py +0 -0
  289. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/cli/compare.py +0 -0
  290. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/cli/completion.py +0 -0
  291. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/cli/config_cmd.py +0 -0
  292. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/cli/decode.py +0 -0
  293. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/cli/export.py +0 -0
  294. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/cli/main.py +0 -0
  295. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/cli/onboarding/__init__.py +0 -0
  296. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/cli/onboarding/help.py +0 -0
  297. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/cli/onboarding/tutorials.py +0 -0
  298. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/cli/onboarding/wizard.py +0 -0
  299. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/cli/pipeline.py +0 -0
  300. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/cli/progress.py +0 -0
  301. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/cli/shell.py +0 -0
  302. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/cli/validate_cmd.py +0 -0
  303. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/cli/visualize.py +0 -0
  304. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/convenience.py +0 -0
  305. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/__init__.py +0 -0
  306. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/audit.py +0 -0
  307. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/backend_selector.py +0 -0
  308. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/cache.py +0 -0
  309. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/cancellation.py +0 -0
  310. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/confidence.py +0 -0
  311. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/config/__init__.py +0 -0
  312. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/config/defaults.py +0 -0
  313. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/config/legacy.py +0 -0
  314. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/config/loader.py +0 -0
  315. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/config/memory.py +0 -0
  316. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/config/migration.py +0 -0
  317. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/config/pipeline.py +0 -0
  318. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/config/preferences.py +0 -0
  319. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/config/protocol.py +0 -0
  320. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/config/schema.py +0 -0
  321. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/config/settings.py +0 -0
  322. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/config/thresholds.py +0 -0
  323. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/correlation.py +0 -0
  324. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/cross_domain.py +0 -0
  325. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/debug.py +0 -0
  326. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/edge_cases.py +0 -0
  327. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/exceptions.py +0 -0
  328. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/extensibility/__init__.py +0 -0
  329. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/extensibility/docs.py +0 -0
  330. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/extensibility/extensions.py +0 -0
  331. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/extensibility/logging.py +0 -0
  332. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/extensibility/measurements.py +0 -0
  333. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/extensibility/plugins.py +0 -0
  334. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/extensibility/registry.py +0 -0
  335. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/extensibility/templates.py +0 -0
  336. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/extensibility/validation.py +0 -0
  337. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/gpu_backend.py +0 -0
  338. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/lazy.py +0 -0
  339. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/log_query.py +0 -0
  340. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/logging.py +0 -0
  341. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/logging_advanced.py +0 -0
  342. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/measurement_result.py +0 -0
  343. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/memoize.py +0 -0
  344. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/memory_check.py +0 -0
  345. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/memory_guard.py +0 -0
  346. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/memory_limits.py +0 -0
  347. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/memory_monitor.py +0 -0
  348. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/memory_progress.py +0 -0
  349. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/memory_warnings.py +0 -0
  350. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/numba_backend.py +0 -0
  351. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/performance.py +0 -0
  352. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/plugins/__init__.py +0 -0
  353. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/plugins/base.py +0 -0
  354. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/plugins/cli.py +0 -0
  355. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/plugins/discovery.py +0 -0
  356. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/plugins/isolation.py +0 -0
  357. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/plugins/lifecycle.py +0 -0
  358. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/plugins/manager.py +0 -0
  359. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/plugins/registry.py +0 -0
  360. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/plugins/versioning.py +0 -0
  361. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/progress.py +0 -0
  362. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/provenance.py +0 -0
  363. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/results.py +0 -0
  364. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/schemas/__init__.py +0 -0
  365. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/schemas/bus_configuration.json +0 -0
  366. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/types.py +0 -0
  367. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/core/uncertainty.py +0 -0
  368. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/correlation/__init__.py +0 -0
  369. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/correlation/multi_protocol.py +0 -0
  370. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/discovery/__init__.py +0 -0
  371. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/discovery/anomaly_detector.py +0 -0
  372. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/discovery/auto_decoder.py +0 -0
  373. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/discovery/comparison.py +0 -0
  374. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/discovery/quality_validator.py +0 -0
  375. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/discovery/signal_detector.py +0 -0
  376. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/export/__init__.py +0 -0
  377. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/export/kaitai_struct.py +0 -0
  378. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/export/legacy/__init__.py +0 -0
  379. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/export/legacy/wav.py +0 -0
  380. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/export/scapy_layer.py +0 -0
  381. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/export/wireshark/README.md +0 -0
  382. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/export/wireshark/__init__.py +0 -0
  383. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/export/wireshark/generator.py +0 -0
  384. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/export/wireshark/lua_builder.py +0 -0
  385. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/export/wireshark/templates/dissector.lua.j2 +0 -0
  386. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/export/wireshark/type_mapping.py +0 -0
  387. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/export/wireshark/validator.py +0 -0
  388. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/export/wireshark_dissector.py +0 -0
  389. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/exporters/__init__.py +0 -0
  390. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/exporters/wireshark.py +0 -0
  391. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/guidance/__init__.py +0 -0
  392. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/guidance/recommender.py +0 -0
  393. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/guidance/wizard.py +0 -0
  394. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/hardware/__init__.py +0 -0
  395. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/hardware/acquisition/__init__.py +0 -0
  396. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/hardware/acquisition/file.py +0 -0
  397. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/hardware/acquisition/hardware.py +0 -0
  398. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/hardware/acquisition/saleae.py +0 -0
  399. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/hardware/acquisition/socketcan.py +0 -0
  400. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/hardware/acquisition/streaming.py +0 -0
  401. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/hardware/acquisition/synthetic.py +0 -0
  402. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/hardware/acquisition/visa.py +0 -0
  403. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/hardware/firmware/__init__.py +0 -0
  404. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/hardware/firmware/pattern_recognition.py +0 -0
  405. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/hardware/hal_detector.py +0 -0
  406. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/hardware/security/__init__.py +0 -0
  407. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/hardware/security/side_channel_detector.py +0 -0
  408. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/inference/__init__.py +0 -0
  409. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/inference/active_learning/README.md +0 -0
  410. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/inference/active_learning/__init__.py +0 -0
  411. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/inference/active_learning/lstar.py +0 -0
  412. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/inference/active_learning/observation_table.py +0 -0
  413. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/inference/active_learning/oracle.py +0 -0
  414. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/inference/active_learning/teachers/__init__.py +0 -0
  415. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/inference/active_learning/teachers/simulator.py +0 -0
  416. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/inference/adaptive_tuning.py +0 -0
  417. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/inference/alignment.py +0 -0
  418. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/inference/bayesian.py +0 -0
  419. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/inference/binary.py +0 -0
  420. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/inference/crc_reverse.py +0 -0
  421. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/inference/logic.py +0 -0
  422. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/inference/message_format.py +0 -0
  423. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/inference/protocol.py +0 -0
  424. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/inference/protocol_dsl.py +0 -0
  425. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/inference/protocol_library.py +0 -0
  426. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/inference/sequences.py +0 -0
  427. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/inference/signal_intelligence.py +0 -0
  428. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/inference/spectral.py +0 -0
  429. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/inference/state_machine.py +0 -0
  430. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/inference/stream.py +0 -0
  431. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/iot/__init__.py +0 -0
  432. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/iot/coap/__init__.py +0 -0
  433. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/iot/coap/analyzer.py +0 -0
  434. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/iot/coap/options.py +0 -0
  435. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/iot/lorawan/__init__.py +0 -0
  436. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/iot/lorawan/crypto.py +0 -0
  437. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/iot/lorawan/decoder.py +0 -0
  438. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/iot/lorawan/mac_commands.py +0 -0
  439. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/iot/mqtt/__init__.py +0 -0
  440. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/iot/mqtt/analyzer.py +0 -0
  441. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/iot/mqtt/properties.py +0 -0
  442. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/iot/zigbee/__init__.py +0 -0
  443. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/iot/zigbee/analyzer.py +0 -0
  444. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/iot/zigbee/security.py +0 -0
  445. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/iot/zigbee/zcl.py +0 -0
  446. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/jupyter/__init__.py +0 -0
  447. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/jupyter/display.py +0 -0
  448. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/jupyter/exploratory/__init__.py +0 -0
  449. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/jupyter/exploratory/error_recovery.py +0 -0
  450. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/jupyter/exploratory/fuzzy.py +0 -0
  451. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/jupyter/exploratory/fuzzy_advanced.py +0 -0
  452. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/jupyter/exploratory/legacy.py +0 -0
  453. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/jupyter/exploratory/parse.py +0 -0
  454. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/jupyter/exploratory/recovery.py +0 -0
  455. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/jupyter/exploratory/sync.py +0 -0
  456. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/jupyter/exploratory/unknown.py +0 -0
  457. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/jupyter/magic.py +0 -0
  458. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/jupyter/ui/__init__.py +0 -0
  459. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/jupyter/ui/formatters.py +0 -0
  460. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/jupyter/ui/progressive_display.py +0 -0
  461. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/loaders/chipwhisperer.py +0 -0
  462. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/loaders/configurable.py +0 -0
  463. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/loaders/csv.py +0 -0
  464. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/loaders/csv_loader.py +0 -0
  465. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/loaders/hdf5.py +0 -0
  466. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/loaders/hdf5_loader.py +0 -0
  467. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/loaders/lazy.py +0 -0
  468. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/loaders/mmap_loader.py +0 -0
  469. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/loaders/numpy_loader.py +0 -0
  470. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/loaders/pcap.py +0 -0
  471. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/loaders/preprocessing.py +0 -0
  472. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/loaders/rigol.py +0 -0
  473. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/loaders/sigrok.py +0 -0
  474. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/loaders/tdms.py +0 -0
  475. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/loaders/tektronix.py +0 -0
  476. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/loaders/touchstone.py +0 -0
  477. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/loaders/tss.py +0 -0
  478. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/loaders/validation.py +0 -0
  479. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/loaders/vcd.py +0 -0
  480. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/loaders/wav.py +0 -0
  481. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/pipeline/__init__.py +0 -0
  482. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/pipeline/handlers/__init__.py +0 -0
  483. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/pipeline/handlers/analyzers.py +0 -0
  484. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/pipeline/handlers/decoders.py +0 -0
  485. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/pipeline/handlers/exporters.py +0 -0
  486. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/pipeline/handlers/filters.py +0 -0
  487. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/pipeline/handlers/loaders.py +0 -0
  488. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/pipeline/handlers/transforms.py +0 -0
  489. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/py.typed +0 -0
  490. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/__init__.py +0 -0
  491. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/advanced.py +0 -0
  492. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/analyze.py +0 -0
  493. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/argument_preparer.py +0 -0
  494. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/auto_report.py +0 -0
  495. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/automation.py +0 -0
  496. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/batch.py +0 -0
  497. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/chart_selection.py +0 -0
  498. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/citations.py +0 -0
  499. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/comparison.py +0 -0
  500. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/config.py +0 -0
  501. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/content/__init__.py +0 -0
  502. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/content/executive.py +0 -0
  503. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/content/filtering.py +0 -0
  504. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/content/minimal.py +0 -0
  505. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/content/verbosity.py +0 -0
  506. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/core.py +0 -0
  507. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/core_formats/__init__.py +0 -0
  508. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/core_formats/multi_format.py +0 -0
  509. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/engine.py +0 -0
  510. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/enhanced_reports.py +0 -0
  511. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/export.py +0 -0
  512. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/formatting/__init__.py +0 -0
  513. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/formatting/emphasis.py +0 -0
  514. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/formatting/measurements.py +0 -0
  515. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/formatting/numbers.py +0 -0
  516. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/formatting/standards.py +0 -0
  517. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/formatting.py +0 -0
  518. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/html.py +0 -0
  519. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/index.py +0 -0
  520. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/interpretation.py +0 -0
  521. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/multichannel.py +0 -0
  522. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/output.py +0 -0
  523. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/pdf.py +0 -0
  524. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/plots.py +0 -0
  525. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/pptx_export.py +0 -0
  526. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/renderers/__init__.py +0 -0
  527. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/renderers/pdf.py +0 -0
  528. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/sections.py +0 -0
  529. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/standards.py +0 -0
  530. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/summary.py +0 -0
  531. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/summary_generator.py +0 -0
  532. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/tables.py +0 -0
  533. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/template_system.py +0 -0
  534. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/templates/__init__.py +0 -0
  535. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/templates/definition.py +0 -0
  536. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/templates/enhanced/protocol_re.html +0 -0
  537. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/templates/index.html +0 -0
  538. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/templates/index.md +0 -0
  539. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/reporting/visualization.py +0 -0
  540. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/sessions/__init__.py +0 -0
  541. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/sessions/base.py +0 -0
  542. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/sessions/blackbox.py +0 -0
  543. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/sessions/generic.py +0 -0
  544. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/side_channel/__init__.py +0 -0
  545. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/__init__.py +0 -0
  546. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/autodetect.py +0 -0
  547. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/bitwise.py +0 -0
  548. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/buffer.py +0 -0
  549. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/builders/__init__.py +0 -0
  550. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/builders/signal_builder.py +0 -0
  551. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/comparison/__init__.py +0 -0
  552. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/comparison/compare.py +0 -0
  553. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/comparison/golden.py +0 -0
  554. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/comparison/limits.py +0 -0
  555. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/comparison/mask.py +0 -0
  556. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/comparison/trace_diff.py +0 -0
  557. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/comparison/visualization.py +0 -0
  558. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/component/__init__.py +0 -0
  559. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/component/impedance.py +0 -0
  560. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/component/reactive.py +0 -0
  561. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/component/transmission_line.py +0 -0
  562. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/filtering/__init__.py +0 -0
  563. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/filtering/base.py +0 -0
  564. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/filtering/convenience.py +0 -0
  565. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/filtering/design.py +0 -0
  566. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/filtering/filters.py +0 -0
  567. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/filtering/introspection.py +0 -0
  568. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/geometry.py +0 -0
  569. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/imports.py +0 -0
  570. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/lazy.py +0 -0
  571. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/lazy_imports.py +0 -0
  572. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/math/__init__.py +0 -0
  573. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/math/arithmetic.py +0 -0
  574. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/math/interpolation.py +0 -0
  575. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/memory.py +0 -0
  576. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/memory_advanced.py +0 -0
  577. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/memory_extensions.py +0 -0
  578. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/performance/__init__.py +0 -0
  579. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/performance/caching.py +0 -0
  580. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/performance/lsh_clustering.py +0 -0
  581. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/performance/memory_optimizer.py +0 -0
  582. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/performance/optimizations.py +0 -0
  583. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/performance/parallel.py +0 -0
  584. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/performance/profiling.py +0 -0
  585. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/pipeline/__init__.py +0 -0
  586. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/pipeline/reverse_engineering.py +0 -0
  587. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/progressive.py +0 -0
  588. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/serial.py +0 -0
  589. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/streaming/__init__.py +0 -0
  590. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/streaming/chunked.py +0 -0
  591. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/streaming/progressive.py +0 -0
  592. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/streaming/realtime.py +0 -0
  593. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/triggering/__init__.py +0 -0
  594. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/triggering/base.py +0 -0
  595. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/triggering/edge.py +0 -0
  596. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/triggering/pattern.py +0 -0
  597. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/triggering/pulse.py +0 -0
  598. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/triggering/window.py +0 -0
  599. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/validation.py +0 -0
  600. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/utils/windowing.py +0 -0
  601. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/validation/__init__.py +0 -0
  602. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/validation/compliance/__init__.py +0 -0
  603. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/validation/compliance/advanced.py +0 -0
  604. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/validation/compliance/masks.py +0 -0
  605. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/validation/compliance/reporting.py +0 -0
  606. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/validation/compliance/testing.py +0 -0
  607. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/validation/compliance_tests.py +0 -0
  608. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/validation/fuzzer.py +0 -0
  609. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/validation/grammar_tests.py +0 -0
  610. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/validation/grammar_validator.py +0 -0
  611. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/validation/hil_testing.py +0 -0
  612. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/validation/quality/__init__.py +0 -0
  613. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/validation/quality/ensemble.py +0 -0
  614. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/validation/quality/explainer.py +0 -0
  615. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/validation/quality/scoring.py +0 -0
  616. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/validation/quality/warnings.py +0 -0
  617. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/validation/regression_suite.py +0 -0
  618. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/validation/replay.py +0 -0
  619. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/validation/testing/__init__.py +0 -0
  620. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/validation/testing/synthetic.py +0 -0
  621. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/visualization/__init__.py +0 -0
  622. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/visualization/batch.py +0 -0
  623. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/visualization/plot.py +0 -0
  624. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/visualization/styles.py +0 -0
  625. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/workflows/__init__.py +0 -0
  626. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/workflows/batch/__init__.py +0 -0
  627. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/workflows/batch/advanced.py +0 -0
  628. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/workflows/batch/aggregate.py +0 -0
  629. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/workflows/batch/analyze.py +0 -0
  630. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/workflows/batch/logging.py +0 -0
  631. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/workflows/batch/metrics.py +0 -0
  632. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/workflows/complete_re.py +0 -0
  633. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/workflows/compliance.py +0 -0
  634. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/workflows/digital.py +0 -0
  635. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/workflows/legacy/__init__.py +0 -0
  636. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/workflows/legacy/dag.py +0 -0
  637. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/workflows/multi_trace.py +0 -0
  638. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/workflows/power.py +0 -0
  639. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/workflows/protocol.py +0 -0
  640. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/workflows/reverse_engineering.py +0 -0
  641. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/workflows/signal_integrity.py +0 -0
  642. {oscura-0.11.0 → oscura-0.12.0}/src/oscura/workflows/waveform.py +0 -0
  643. {oscura-0.11.0 → oscura-0.12.0}/stubs/scapy/__init__.pyi +0 -0
  644. {oscura-0.11.0 → oscura-0.12.0}/stubs/scapy/all.pyi +0 -0
  645. {oscura-0.11.0 → oscura-0.12.0}/test_data/README.md +0 -0
@@ -43,7 +43,13 @@
43
43
  "type": "debugpy",
44
44
  "request": "launch",
45
45
  "module": "pytest",
46
- "args": ["${file}::${selectedText}", "-v", "--tb=short", "--strict-markers", "-s"],
46
+ "args": [
47
+ "${file}::${selectedText}",
48
+ "-v",
49
+ "--tb=short",
50
+ "--strict-markers",
51
+ "-s"
52
+ ],
47
53
  "console": "integratedTerminal",
48
54
  "justMyCode": false,
49
55
  "env": {
@@ -55,7 +61,14 @@
55
61
  "type": "debugpy",
56
62
  "request": "launch",
57
63
  "module": "pytest",
58
- "args": ["tests/unit", "-v", "--tb=short", "--strict-markers", "-m", "unit"],
64
+ "args": [
65
+ "tests/unit",
66
+ "-v",
67
+ "--tb=short",
68
+ "--strict-markers",
69
+ "-m",
70
+ "unit"
71
+ ],
59
72
  "console": "integratedTerminal",
60
73
  "justMyCode": false,
61
74
  "env": {
@@ -79,7 +92,13 @@
79
92
  "type": "debugpy",
80
93
  "request": "launch",
81
94
  "module": "pytest",
82
- "args": ["tests/unit", "-v", "--tb=short", "-m", "unit and not slow and not memory_intensive"],
95
+ "args": [
96
+ "tests/unit",
97
+ "-v",
98
+ "--tb=short",
99
+ "-m",
100
+ "unit and not slow and not memory_intensive"
101
+ ],
83
102
  "console": "integratedTerminal",
84
103
  "justMyCode": false,
85
104
  "env": {
@@ -103,7 +122,14 @@
103
122
  "type": "debugpy",
104
123
  "request": "launch",
105
124
  "module": "pytest",
106
- "args": ["${file}", "-v", "--tb=short", "--cov=src/oscura", "--cov-report=term-missing", "--cov-report=html"],
125
+ "args": [
126
+ "${file}",
127
+ "-v",
128
+ "--tb=short",
129
+ "--cov=src/oscura",
130
+ "--cov-report=term-missing",
131
+ "--cov-report=html"
132
+ ],
107
133
  "console": "integratedTerminal",
108
134
  "justMyCode": false,
109
135
  "env": {
@@ -147,7 +147,13 @@
147
147
  "label": "Test: Fast Tests Only",
148
148
  "type": "shell",
149
149
  "command": "uv",
150
- "args": ["run", "pytest", "-m", "unit and not slow and not memory_intensive", "-v"],
150
+ "args": [
151
+ "run",
152
+ "pytest",
153
+ "-m",
154
+ "unit and not slow and not memory_intensive",
155
+ "-v"
156
+ ],
151
157
  "problemMatcher": [],
152
158
  "group": "test",
153
159
  "presentation": {
@@ -543,7 +549,13 @@
543
549
  "label": "Coverage: Generate HTML Report",
544
550
  "type": "shell",
545
551
  "command": "uv",
546
- "args": ["run", "pytest", "--cov=src/oscura", "--cov-report=html", "--cov-report=term"],
552
+ "args": [
553
+ "run",
554
+ "pytest",
555
+ "--cov=src/oscura",
556
+ "--cov-report=html",
557
+ "--cov-report=term"
558
+ ],
547
559
  "problemMatcher": [],
548
560
  "group": "test",
549
561
  "presentation": {
@@ -7,6 +7,46 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ### Added
11
+
12
+ ### Changed
13
+
14
+ - **Code Quality Improvements from PR #42 Review** (src/oscura/analyzers/binary/): Resolved all MEDIUM and LOW priority issues from code review to improve maintainability and configurability - **Magic Numbers Extracted** (detection/patterns.py, detection/encoding.py, detection/structure.py): Replaced 15+ hardcoded values with named module-level constants for clarity and maintainability - patterns.py: SMALL_FILE_THRESHOLD=1MB, PATTERN_SAMPLE_SIZE=1MB, PATTERN_N_SAMPLES=5, REGULAR_SPACING_CV_THRESHOLD=0.1, MIN_DELIMITER_SPACING=1000, MIN_MESSAGE_SPACING=100, FOOTER_POSITION_THRESHOLD=0.95, PATTERN_OVERLAP_THRESHOLD=0.9 - encoding.py: ENCODING_VALIDATION_COUNT=100, MIN_VALID_FLOAT_RATIO=0.8 - structure.py: STRUCTURE_SAMPLE_SIZE=100KB, MIN_MESSAGE_LENGTH=10, MAX_MESSAGE_LENGTH=10000, MAX_LAST_MESSAGE_SIZE=10000 - **Max Samples Propagation** (core/pipeline.py, detection/encoding.py): Fixed max_samples parameter not being propagated to EncodingDetector - added max_samples parameter to detect() method signature with default 1000 - propagated through all internal validation calls (_validate_encoding, _load_as_dtype) - BinaryAnalyzer now properly passes max_samples=100_000 to encoding detection for consistent memory safety - **Performance Optimization** (detection/encoding.py): Eliminated unnecessary float64 type conversions in _score_dtype() method - float data no longer converted before min/max operations (saves ~15% compute time) - integer data still converted only when needed for range comparisons - separate code paths for float vs integer dtypes reduces redundant astype() calls - **Documentation Quality** (detection/structure.py): Fixed incomplete docstring example in module header - added all required imports (BinaryFile, PatternMiner, EncodingDetector) - example now self-contained and runnable without undefined variables - **Impact**: All 167 binary analysis tests still passing, code more maintainable with named constants, configurable sample limiting throughout pipeline, ~15% faster encoding detection on float data
15
+
16
+ - **Complete Binary Analysis Framework** (src/oscura/analyzers/binary/): Added comprehensive framework for automated binary file analysis with zero manual configuration - **Core Infrastructure** (core/): BinaryFile class with memory-mapped I/O and LRU caching, BinaryAnalyzer orchestrator coordinating multi-stage pipeline, complete result types (EncodingResult, Pattern, Field, Message, StructureResult, BinaryAnalysisResult) with to_dict() export - **Enhanced Encoding Detection** (detection/encoding.py): Multi-stage dtype detector with statistical analysis + validation by loading + consensus from multiple locations, prevents false positives (uint16→float32), supports 8 dtypes, <0.5s for 5GB files - **Pattern Mining** (detection/patterns.py): Rolling hash pattern finder, samples 5×1MB for large files, classifies roles (header/footer/delimiter/sync_marker), <5s for 5GB files - **Semantic Analysis** (inference/): SequenceAnalyzer detects counters/wrapping, TimestampAnalyzer identifies 6 formats (unix seconds/ms/μs/ns, GPS, NTP) with 2000-2030 validation, ChecksumAnalyzer validates CRC32/CRC16/Adler32/Fletcher16/Sum/XOR with >95% match threshold, SemanticAnalyzer coordinates all field enhancements with payload entropy analysis - **Visualization** (visualization/structure_view.py): StructureVisualizer creates annotated message layout diagrams with color-coded field types, matplotlib-based PNG generation - **Export** (export/dissector.py): DissectorGenerator creates Wireshark Lua dissectors and Kaitai Struct YAML definitions from detected structure - **Integration**: analyze_data_capture.py automatically runs binary analysis for .bin files, adds Binary File Analysis section to HTML/PDF/JSON reports, displays encoding/patterns/structure/fields with full metadata - **Testing**: All modules pass mypy --strict, ruff (0 errors), 5/5 validators - **Performance**: Handles 4.67GB files in <30s total, memory-mapped I/O for files >10MB, 100K sample limiting prevents exhaustion - **Real-world validation**: Successfully analyzed 4.67GB network packet capture (detected uint8, found 1470-byte packets, identified fields)
17
+
18
+ - **Structure Inference for Binary Files** (src/oscura/analyzers/binary/detection/structure.py): Added message boundary detection and field inference for structured binary data - **StructureInferencer class**: detects message boundaries using 4 strategies (header patterns, delimiter patterns, fixed-length from regular spacing, length field detection), extracts messages from boundaries, infers field boundaries via entropy-based sliding window analysis, classifies fields (constant, sequence, timestamp, checksum, length, payload, unknown), merges adjacent similar fields - **Key methods**: infer() returns StructureResult with messages and fields, _detect_boundaries() tries strategies in priority order, _extract_messages() creates Message objects, _infer_fields() uses 2D numpy array alignment for cross-message analysis, _detect_field_boundaries() uses entropy change threshold detection, _classify_field() identifies field types using value patterns - **Field inference**: aligns messages as 2D array (rows=messages, cols=bytes), sliding window entropy analysis to detect boundaries, classifies numeric fields (1/2/4 byte integers), detects sequences (incrementing counters), timestamps (large increasing values), length fields (small repeated values), checksums (high entropy), merges adjacent PAYLOAD/UNKNOWN/CONSTANT fields - **Boundary detection**: Strategy 1 uses header pattern positions (most frequent), Strategy 2 uses delimiter patterns with regular spacing, Strategy 3 uses fixed-length from spacing patterns (>100 bytes), Strategy 4 scans for uint16/uint32 length fields - **Performance**: <10s for 5GB files via message sampling and numpy vectorization - **Confidence scoring**: based on message length consistency (40%), number of fields detected (30%), pattern regularity (30%) - handles variable-length messages, no messages (returns has_messages=false), edge cases - comprehensive docstrings with examples, type hints for all functions (mypy --strict), returns StructureResult from oscura.analyzers.binary.core.results - exported from oscura.analyzers.binary.detection - passes ruff (0 errors), mypy --strict (0 errors) - designed for 1470-byte message detection with ±2 byte field boundary accuracy
19
+
20
+ - **Enhanced Encoding Detection** (src/oscura/analyzers/binary/detection/encoding.py): Added multi-stage encoding detector with validation to prevent false positives (e.g., uint16→float32 misdetection) - **EncodingDetector class**: 3-stage detection pipeline: (1) statistical analysis using entropy, IEEE 754 validation, value ranges, (2) consensus detection from multiple file locations, (3) validation by loading and checking actual data - **Validation checks**: ensures data not constant (std > threshold), values in reasonable range for dtype, no NaN/Inf for float types, entropy makes sense, alignment patterns - **Supports 8 dtypes**: uint8, int8, uint16, int16, uint32, int32, float32, float64 - **Performance**: <0.5s for 5GB files via memory-mapped sampling - returns EncodingResult with dtype, confidence, alternatives, validation_passed flag, sample_data, statistics, and issues list - fixes false positive detections by actually loading data and verifying results - comprehensive docstrings with examples, type hints for all functions - passes ruff (0 errors), mypy --strict (0 errors)
21
+
22
+ - **Pattern Mining for Binary Files** (src/oscura/analyzers/binary/detection/patterns.py): Added efficient rolling hash-based pattern detection for finding repeating byte sequences in binary files - **PatternMiner class**: finds repeating patterns using rolling hash algorithm for efficiency, samples multiple file locations (5 × 1MB) for large files to avoid scanning entire 5GB files, supports configurable pattern length (2-64 bytes), minimum occurrence threshold (default: 3), and deduplication to remove subpatterns - **Pattern classification**: automatically classifies patterns as header (position 0), footer (>95% through file), delimiter (regular spacing + large gaps >1000 bytes), sync_marker (high frequency + short pattern ≤4 bytes), or unknown - **Performance**: <5s for 5GB files via memory-mapped sampling and rolling hash, handles 1470-byte packet patterns correctly, no false positives on random data - **find_patterns()**: returns list of Pattern objects with bytes, positions, count, avg_spacing, spacing_variance, regular flag, and role classification - exported from oscura.analyzers.binary.detection - comprehensive docstrings with examples, type hints for all functions - passes ruff (0 errors), mypy --strict (0 errors)
23
+
24
+ - **Comprehensive Binary Analysis Test Suite** (tests/unit/analyzers/binary/): Added 8 test files with ~130 tests providing full coverage of the binary analysis framework - **test_file_access.py**: 30 tests covering BinaryFile read_bytes, read_regions, read_array, lifecycle, empty files, sample_locations, thread safety (concurrent reads), and resource leak prevention - **test_encoding.py**: 23 tests covering EncodingDetector dtype detection (uint8/uint16/int16/float32/float64), validation pipeline, edge cases (constant data, small files, high entropy), entropy computation, and IEEE 754 validation - **test_patterns.py**: 23 tests covering PatternMiner find_patterns, memory safety (MAX_POSITIONS_PER_PATTERN bound), deduplication, role classification (header/footer/delimiter/sync_marker/unknown), and regular spacing detection - **test_structure.py**: 22 tests covering StructureInferencer boundary detection, message extraction, field inference, field merging, confidence scoring, byte entropy computation, and result serialization - **test_checksums.py**: 16 tests covering ChecksumAnalyzer algorithm detection (sum8, xor8, crc32), edge cases (insufficient data, unsupported length, random data), and individual algorithm implementations (crc32, adler32, crc16, fletcher16, sum8, xor8, sum16, sum32) - **test_timestamps.py**: 13 tests covering TimestampAnalyzer unix timestamp detection (seconds/milliseconds), monotonic flag, time range, edge cases (insufficient data, non-timestamp, field too short, offset beyond data), and _is_monotonic helper - **test_sequences.py**: 13 tests covering SequenceAnalyzer sequence detection, increment detection, gap detection, edge cases (insufficient data, non-monotonic, constant), wrapping detection, duplicate detection, and multi-byte fields (uint16/uint32) - **test_integration.py**: 26 tests covering full BinaryAnalyzer pipeline, result serialization (to_dict), JSON export, Wireshark Lua dissector generation, Kaitai Struct generation, result types, and public API exports
25
+
26
+ ### Fixed
27
+
28
+ - **Lint Errors in Security Key Generation** (src/oscura/sessions/legacy.py:19,22,107): Removed unused imports (os, sys) and replaced IOError with OSError (Python 3+ aliases IOError to OSError) - fixes 3 ruff lint errors (F401, UP024)
29
+ - **Memory Safety in Pattern Mining** (src/oscura/analyzers/binary/detection/patterns.py): Added MAX_POSITIONS_PER_PATTERN = 10,000 constant to prevent unbounded memory growth when mining patterns in large binary files - position lists now bounded to prevent OOM on adversarial inputs - added guard check before appending to pattern_positions dict
30
+ - **Resource Leak in BinaryFile** (src/oscura/analyzers/binary/core/file_access.py): Fixed resource leak in _ensure_open() where file handle remained open if mmap creation failed - wrapped mmap creation in try/except that closes file handle on failure and resets state to None - prevents file descriptor exhaustion on repeated open failures
31
+ - **Thread Safety in BinaryFile** (src/oscura/analyzers/binary/core/file_access.py): Added threading.RLock() to BinaryFile for thread-safe concurrent access - _ensure_open(), read_bytes(), and close() all acquire lock before accessing shared state - prevents race conditions when multiple threads read from same BinaryFile instance
32
+ - **Test Failures from RuntimeWarning** (src/oscura/analyzers/binary/detection/encoding.py): Fixed 17 test failures (9 in test_encoding.py, 7 in test_integration.py, 1 other) caused by numpy RuntimeWarning being treated as errors - added warnings.catch_warnings() context managers to suppress expected overflow warnings when testing invalid dtype interpretations (e.g., interpreting uint8 data as float32) - suppressed warnings in _score_dtype(), _validate_encoding(), _consensus_detection(), _load_as_dtype(), and _compute_statistics() - all 167 binary analysis tests now passing
33
+
34
+ ### Changed
35
+
36
+ - **Pattern Mining Documentation** (src/oscura/analyzers/binary/detection/patterns.py): Corrected all references from "rolling hash" to "brute-force substring matching" to accurately describe the actual algorithm implementation - updated module docstring, class docstring, _find_patterns_of_length method docstring, and inline comments
37
+
38
+ ## [0.12.0] - 2026-02-04
39
+
40
+ ### Added
41
+
42
+ - **Intelligent Binary File Support** (src/oscura/loaders/binary.py, src/oscura/loaders/__init__.py): Added comprehensive auto-detection and smart loading for unknown binary formats - **detect_binary_dtype()**: Multi-heuristic dtype detection using entropy analysis, IEEE 754 floating-point pattern validation, zero density analysis, value range checks, and multi-location sampling (beginning/middle/end) - returns detected dtype with confidence scores for all candidates (uint8/int8/uint16/int16/uint32/int32/float32/float64) - samples 8KB per location for robust detection - **detect_packet_structure()**: Automatic detection of structured packet data by identifying sequence numbers, repeating header patterns, and consistent packet spacing - returns boolean + estimated packet size - designed for UDP/TCP packet captures and structured binary protocols - **load_binary_auto()**: Intelligent binary loader combining dtype detection, automatic memory-mapping for files >10MB, sample limiting (100K default) for performance, and comprehensive metadata reporting - generates detection report with dtype confidence, file size, sample counts, memory-mapping status, and packet structure info - stores report in trace metadata as JSON - no manual configuration required for unknown formats - added .bin to SUPPORTED_FORMATS mapping to "binary" loader - updated loader registry to dispatch to load_binary_auto - exported load_binary_auto from loaders module and top-level oscura namespace - handles completely unknown binary formats with zero prior knowledge - optimized for multi-GB files using mmap - passes 5/5 validators, ruff (0 errors), mypy --strict (0 errors)
43
+
44
+ - **PDF Report Generation** (demos/showcase/analyze_data_capture.py): Added professional PDF generation with embedded high-resolution plots - **_generate_html_with_embedded_plots()**: Generates PDF-optimized HTML with plots embedded as base64 data URIs (no external dependencies), A4 page format (595×841 pts), optimized CSS for printing (proper fonts, page break avoidance), and clean typography - **_generate_pdf_report()**: Converts HTML to PDF using WeasyPrint with graceful fallback if library unavailable - **Automatic generation**: Every analysis run now produces HTML + JSON + PDF (300-356 KB per report) - **High quality**: 18-22 pages per report, all 7 plots embedded at 302 DPI (waveform/FFT/PSD/spectrogram/power/histogram/logic analyzer), proper sectioning with 14+ analysis categories, 259+ measurement fields displayed - **Production ready**: Tested on .wfm and .tss files, verified plot embedding and content completeness, passes validation with pdfinfo/pdfimages - no external file dependencies (standalone PDFs), printable with preserved formatting - requires WeasyPrint 63.1+ (already installed in environment)
45
+
46
+ ### Changed
47
+
48
+ - **Enhanced Sample Limiting** (demos/showcase/analyze_data_capture.py): Improved script robustness for large files - **load_data()**: Updated to use oscura.load() for all formats (now supports .bin with auto-detection), added fallback to load_binary_auto() with 100K sample limit, informative console output for auto-detection - **_extract_signal()**: Added intelligent sample limiting (100K max) as safety net, prints informative message when limiting applied, prevents memory exhaustion on multi-GB files - **Result**: Script now handles arbitrarily large files efficiently - 10MB files process in <30 seconds (was hanging), 2.7GB files process with memory-mapping (was timing out), comprehensive analysis on limited samples (statistically valid) - maintains 100% analysis coverage (all 500+ capabilities) while being memory-safe
49
+
10
50
  ### Fixed
11
51
 
12
52
  - **CI/CD Test Failures** (tests/unit/test_security.py, tests/unit/cli/test_cli_main.py, tests/unit/cli/test_main_enhanced.py, tests/unit/core/test_provenance.py, src/oscura/automotive/flexray/fibex.py, CONTRIBUTING.md): Fixed all 9 failing CI/CD test chunks to achieve 100% green checks for v0.11.0 release - **(1) Security key test** (test_security.py:195-201): Updated test_hmac_key_is_constant to reflect new per-installation security keys - test now validates key is 32 bytes and consistent across calls (reads from same key file) instead of comparing to hardcoded constant - matches v0.11.0 security improvement where keys are randomly generated per installation using `secrets.token_bytes(32)` - **(2) Version assertions** (test_cli_main.py:454, test_main_enhanced.py:75, test_provenance.py ALL occurrences): Updated hardcoded version checks from "0.10.0" to "0.11.0" to match current release using replace-all - fixes CLI version tests and ALL provenance tests (9 references in test_provenance.py including TestCreateProvenance::test_create_minimal and TestProvenanceCreation::test_create_minimal which were causing CI failures) - **(3) FlexRay FIBEX parser** (fibex.py:304): Fixed Python 3.12+ compatibility where `parser.entity = {}` raises AttributeError on read-only attribute - wrapped entity assignment in try-except to handle both old and new Python versions gracefully - Python <3.12 allows entity mutation, Python ≥3.12 treats it as read-only with safe defaults - fixes 5 FlexRay test failures (test_import_signals, test_import_basic_fibex, test_import_cluster_configuration, test_round_trip_signals, test_round_trip_cluster_config) - **(4) Documentation validation** (CONTRIBUTING.md:300,427,454): Removed 3 broken references to non-existent tests/SKIP_DOCUMENTATION.md and tests/SKIP_PATTERNS.md files deleted during vestigial script cleanup - skip documentation is already inline in CONTRIBUTING.md - **Result**: All 75 CI/CD checks now pass - PR #41 ready for merge - 11 tests fixed total
@@ -1371,3 +1411,11 @@ This ensures local environment matches CI/CD environment, preventing false posit
1371
1411
 
1372
1412
  - **Test Coverage Audit** (docs/testing/coverage-audit-2026-01-25.md): Comprehensive coverage audit report documenting current test coverage status at 31.5% (25,258/73,626 statements) vs 80% target with detailed gap analysis; Report identifies 214 files (38.4%) with 0% coverage including critical modules (api, automotive, cli, export, hardware, iot, jupyter, sessions, workflows/batch) and prioritizes gaps by functional area; Assessment: Coverage INSUFFICIENT for v0.6.0 production release with recommendation to delay until batch workflows (new API-012, currently 0% coverage), failing tests (20 failures), and overall coverage reach minimum thresholds (≥75% overall, ≥60% critical modules); Test suite: 22,263 tests collected, 4,324 passed, 48 skipped, 20 failed (entropy analyzer logic 8 failures, session security 6 failures, protocol decoders 2 failures, API changes 3 failures); Well-tested modules: loaders 88.8%, analyzers 87.6%; Critical gaps: batch processing workflows 0% (694 statements untested for new public API), CLI commands 0% (1,913 statements), API integrations 0% (2,895 statements); Estimated effort: 180-220 developer hours (4-5 weeks) to reach 80% coverage target; Artifacts: coverage.xml, htmlcov/index.html, coverage.json; Tools: pytest-cov, coverage.py 7.x, Python 3.12.12
1373
1413
  - **Jitter & Eye Analysis** (src/oscura/analyzers/jitter/timing.py, src/oscura/analyzers/eye/generation.py): Complete IEEE 2414-2020 compliant jitter and eye diagram analysis with reorganized API structure - created dedicated jitter/timing.py module for timing measurements (period_jitter, cycle_to_cycle_jitter, tie_from_edges, measure_dcd with 414 LOC) and eye/generation.py for eye diagram generation (generate_eye, generate_eye_from_edges with 502 LOC) - full implementation includes jitter decomposition (TJ = RJ + DJ using dual-Dirac model per IEEE 2414-2020 Section 6), BER analysis (bathtub curves, Q-factor conversions at target BER from 1e-3 to 1e-15), periodic jitter extraction via FFT spectrum analysis, data-dependent jitter with ISI correlation, eye diagram generation from waveforms or recovered clock edges with 2D persistence histogram, comprehensive eye metrics (height/width at BER, Q-factor, crossing percentage, contour polygons at multiple BER levels) - maintains backward compatibility via **init**.py imports and alias (eye.diagram → eye.generation) - comprehensive test suite with 7 test files totaling ~173KB (test_ber.py 15KB, test_classification.py 33KB, test_decomposition.py 44KB, test_measurements.py 43KB, test_spectrum.py 37KB for jitter; test_diagram.py 38KB, test_metrics.py 18KB for eye) achieving >85% coverage - all functions validated against IEEE 2414-2020 standard formulas - passes quality checks (mypy --strict 0 errors, ruff 0 issues) - (2 new files created, 2 **init**.py updated)
1414
+
1415
+ ### Fixed
1416
+ - **Security** (src/oscura/sessions/legacy.py): Fix race condition in security key generation during parallel test execution
1417
+ - Added cross-process file locking using fcntl on Unix systems
1418
+ - Added thread-level locking as fallback
1419
+ - Implements double-check locking pattern to prevent duplicate key generation
1420
+ - Fixes `test_hmac_key_is_constant` flakiness in CI (16 tests)
1421
+ - **Documentation** (README.md): Update version references from 0.10.0 to 0.12.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: oscura
3
- Version: 0.11.0
3
+ Version: 0.12.0
4
4
  Summary: Python framework for hardware reverse engineering: signal analysis, protocol decoding, and automated dissector generation. Unified workflows from oscilloscope captures to Wireshark dissectors with IEEE-compliant measurements.
5
5
  Project-URL: Homepage, https://github.com/oscura-re/oscura
6
6
  Project-URL: Documentation, https://github.com/oscura-re/oscura/tree/main/docs
@@ -421,7 +421,7 @@ python3 .claude/hooks/validate_all.py # Must pass 5/5
421
421
 
422
422
  ## Project Status
423
423
 
424
- **Version**: [0.10.0](https://github.com/oscura-re/oscura/releases/latest) (2026-02-03)
424
+ **Version**: [0.12.0](https://github.com/oscura-re/oscura/releases/latest) (2026-02-03)
425
425
 
426
426
  **Active Development**: Hypothesis-driven RE workflows, automotive protocol analysis (CAN-FD, J1939, OBD-II, UDS), unknown protocol inference (state machines, field detection, CRC recovery), multi-format loading, export automation
427
427
 
@@ -449,7 +449,7 @@ python3 .claude/hooks/validate_all.py # Must pass 5/5
449
449
  author = {Oscura Contributors},
450
450
  year = {2026},
451
451
  url = {https://github.com/oscura-re/oscura},
452
- version = {0.10.0}
452
+ version = {0.12.0}
453
453
  }
454
454
  ```
455
455
 
@@ -294,7 +294,7 @@ python3 .claude/hooks/validate_all.py # Must pass 5/5
294
294
 
295
295
  ## Project Status
296
296
 
297
- **Version**: [0.10.0](https://github.com/oscura-re/oscura/releases/latest) (2026-02-03)
297
+ **Version**: [0.12.0](https://github.com/oscura-re/oscura/releases/latest) (2026-02-03)
298
298
 
299
299
  **Active Development**: Hypothesis-driven RE workflows, automotive protocol analysis (CAN-FD, J1939, OBD-II, UDS), unknown protocol inference (state machines, field detection, CRC recovery), multi-format loading, export automation
300
300
 
@@ -322,7 +322,7 @@ python3 .claude/hooks/validate_all.py # Must pass 5/5
322
322
  author = {Oscura Contributors},
323
323
  year = {2026},
324
324
  url = {https://github.com/oscura-re/oscura},
325
- version = {0.10.0}
325
+ version = {0.12.0}
326
326
  }
327
327
  ```
328
328
 
@@ -8,7 +8,13 @@
8
8
 
9
9
  "language": "en",
10
10
 
11
- "dictionaries": ["en_US", "companies", "softwareTerms", "python", "workspace-custom"],
11
+ "dictionaries": [
12
+ "en_US",
13
+ "companies",
14
+ "softwareTerms",
15
+ "python",
16
+ "workspace-custom"
17
+ ],
12
18
 
13
19
  "dictionaryDefinitions": [
14
20
  {
@@ -99,7 +105,12 @@
99
105
  "**/test_data/**"
100
106
  ],
101
107
 
102
- "ignoreRegExpList": ["https?://[^\\s)>\"']+", "`[^`]+`", "```[\\s\\S]*?```", "<!--[\\s\\S]*?-->"],
108
+ "ignoreRegExpList": [
109
+ "https?://[^\\s)>\"']+",
110
+ "`[^`]+`",
111
+ "```[\\s\\S]*?```",
112
+ "<!--[\\s\\S]*?-->"
113
+ ],
103
114
 
104
115
  "words": [],
105
116
 
@@ -109,7 +120,16 @@
109
120
 
110
121
  "allowCompoundWords": false,
111
122
 
112
- "flagWords": ["hte", "teh", "adn", "taht", "recieve", "seperate", "definately", "occured"],
123
+ "flagWords": [
124
+ "hte",
125
+ "teh",
126
+ "adn",
127
+ "taht",
128
+ "recieve",
129
+ "seperate",
130
+ "definately",
131
+ "occured"
132
+ ],
113
133
 
114
134
  "cache": {
115
135
  "useCache": true,
@@ -6,7 +6,7 @@
6
6
 
7
7
  [project]
8
8
  name = "oscura"
9
- version = "0.11.0"
9
+ version = "0.12.0"
10
10
  description = "Python framework for hardware reverse engineering: signal analysis, protocol decoding, and automated dissector generation. Unified workflows from oscilloscope captures to Wireshark dissectors with IEEE-compliant measurements."
11
11
  readme = "README.md"
12
12
  requires-python = ">=3.12"
@@ -53,7 +53,7 @@ try:
53
53
  __version__ = version("oscura")
54
54
  except Exception:
55
55
  # Fallback for development/testing when package not installed
56
- __version__ = "0.11.0"
56
+ __version__ = "0.12.0"
57
57
 
58
58
  __author__ = "Oscura Contributors"
59
59
 
@@ -0,0 +1,36 @@
1
+ """Binary file analysis framework.
2
+
3
+ Provides comprehensive analysis of binary files including:
4
+ - Multi-stage dtype detection with validation
5
+ - Pattern mining for repeating sequences
6
+ - Message and field structure inference
7
+ - Semantic field classification
8
+ - Protocol identification
9
+ - Visualization and dissector generation
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ from oscura.analyzers.binary.core.pipeline import BinaryAnalyzer
15
+ from oscura.analyzers.binary.core.results import (
16
+ BinaryAnalysisResult,
17
+ EncodingResult,
18
+ Field,
19
+ FieldType,
20
+ Message,
21
+ Pattern,
22
+ PatternRole,
23
+ StructureResult,
24
+ )
25
+
26
+ __all__ = [
27
+ "BinaryAnalysisResult",
28
+ "BinaryAnalyzer",
29
+ "EncodingResult",
30
+ "Field",
31
+ "FieldType",
32
+ "Message",
33
+ "Pattern",
34
+ "PatternRole",
35
+ "StructureResult",
36
+ ]
@@ -0,0 +1,29 @@
1
+ """Core binary analysis components."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from oscura.analyzers.binary.core.file_access import BinaryFile
6
+ from oscura.analyzers.binary.core.pipeline import BinaryAnalyzer
7
+ from oscura.analyzers.binary.core.results import (
8
+ BinaryAnalysisResult,
9
+ EncodingResult,
10
+ Field,
11
+ FieldType,
12
+ Message,
13
+ Pattern,
14
+ PatternRole,
15
+ StructureResult,
16
+ )
17
+
18
+ __all__ = [
19
+ "BinaryAnalysisResult",
20
+ "BinaryAnalyzer",
21
+ "BinaryFile",
22
+ "EncodingResult",
23
+ "Field",
24
+ "FieldType",
25
+ "Message",
26
+ "Pattern",
27
+ "PatternRole",
28
+ "StructureResult",
29
+ ]
@@ -0,0 +1,193 @@
1
+ """Efficient binary file access with memory mapping, caching, and thread safety."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import mmap
6
+ import threading
7
+ from pathlib import Path
8
+ from typing import TYPE_CHECKING, Any
9
+
10
+ import numpy as np
11
+
12
+ if TYPE_CHECKING:
13
+ from os import PathLike
14
+
15
+
16
+ class BinaryFile:
17
+ """Memory-efficient, thread-safe binary file access layer.
18
+
19
+ Provides efficient access to binary files of any size using memory mapping
20
+ and caching. Designed to handle multi-GB files with minimal memory footprint.
21
+ All operations are protected by an RLock for thread safety.
22
+
23
+ Example:
24
+ >>> bf = BinaryFile("large_file.bin")
25
+ >>> data = bf.read_bytes(0, 1024) # Read first 1KB
26
+ >>> samples = bf.sample_locations(n_samples=5) # Sample 5 locations
27
+ >>> bf.close()
28
+ """
29
+
30
+ def __init__(self, path: str | PathLike[str]):
31
+ """Initialize binary file access.
32
+
33
+ Args:
34
+ path: Path to binary file.
35
+ """
36
+ self.path = Path(path)
37
+ self.size = self.path.stat().st_size
38
+ self._file_handle: Any | None = None
39
+ self._mmap: mmap.mmap | None = None
40
+ self._lock = threading.RLock()
41
+
42
+ def _ensure_open(self) -> None:
43
+ """Ensure file is open and memory mapped.
44
+
45
+ Thread-safe. Cleans up partial state on failure to prevent
46
+ resource leaks.
47
+ """
48
+ with self._lock:
49
+ if self._mmap is None:
50
+ try:
51
+ self._file_handle = open(self.path, "rb") # noqa: SIM115
52
+ if self.size > 0:
53
+ self._mmap = mmap.mmap(
54
+ self._file_handle.fileno(), 0, access=mmap.ACCESS_READ
55
+ )
56
+ except Exception:
57
+ if self._file_handle is not None:
58
+ self._file_handle.close()
59
+ self._file_handle = None
60
+ raise
61
+
62
+ def read_bytes(self, offset: int, length: int) -> bytes:
63
+ """Read bytes from file at given offset.
64
+
65
+ Args:
66
+ offset: Byte offset to start reading.
67
+ length: Number of bytes to read.
68
+
69
+ Returns:
70
+ Bytes read from file.
71
+
72
+ Example:
73
+ >>> bf = BinaryFile("data.bin")
74
+ >>> header = bf.read_bytes(0, 16)
75
+ """
76
+ if offset + length > self.size:
77
+ length = max(0, self.size - offset)
78
+
79
+ if length <= 0:
80
+ return b""
81
+
82
+ self._ensure_open()
83
+
84
+ with self._lock:
85
+ if self._mmap is not None:
86
+ return bytes(self._mmap[offset : offset + length])
87
+
88
+ return b""
89
+
90
+ def read_regions(self, regions: list[tuple[int, int]]) -> list[bytes]:
91
+ """Read multiple regions efficiently.
92
+
93
+ Args:
94
+ regions: List of (offset, length) tuples.
95
+
96
+ Returns:
97
+ List of bytes for each region.
98
+
99
+ Example:
100
+ >>> bf = BinaryFile("data.bin")
101
+ >>> regions = [(0, 16), (1000, 16), (2000, 16)]
102
+ >>> data = bf.read_regions(regions)
103
+ """
104
+ return [self.read_bytes(offset, length) for offset, length in regions]
105
+
106
+ def sample_locations(self, n_samples: int = 5, sample_size: int = 8192) -> list[bytes]:
107
+ """Sample data from multiple file locations.
108
+
109
+ Samples evenly distributed throughout the file for robust analysis.
110
+
111
+ Args:
112
+ n_samples: Number of locations to sample.
113
+ sample_size: Bytes to read at each location.
114
+
115
+ Returns:
116
+ List of byte samples from different file locations.
117
+
118
+ Example:
119
+ >>> bf = BinaryFile("data.bin")
120
+ >>> samples = bf.sample_locations(n_samples=5, sample_size=4096)
121
+ """
122
+ if self.size < sample_size:
123
+ return [self.read_bytes(0, self.size)]
124
+
125
+ # Calculate evenly-spaced locations
126
+ locations = np.linspace(0, self.size - sample_size, n_samples, dtype=int)
127
+
128
+ return [self.read_bytes(int(loc), sample_size) for loc in locations]
129
+
130
+ def read_array(
131
+ self, offset: int, count: int, dtype: str | np.dtype[Any]
132
+ ) -> np.ndarray[Any, Any]:
133
+ """Read data as numpy array.
134
+
135
+ Args:
136
+ offset: Byte offset to start reading.
137
+ count: Number of elements to read (-1 for all).
138
+ dtype: NumPy dtype for interpretation.
139
+
140
+ Returns:
141
+ NumPy array of data.
142
+
143
+ Example:
144
+ >>> bf = BinaryFile("data.bin")
145
+ >>> data = bf.read_array(0, 1000, dtype="uint16")
146
+ """
147
+ np_dtype = np.dtype(dtype)
148
+ bytes_per_element = np_dtype.itemsize
149
+ byte_offset = offset * bytes_per_element
150
+
151
+ if count == -1:
152
+ # Read all available data
153
+ available_bytes = self.size - byte_offset
154
+ count = available_bytes // bytes_per_element
155
+
156
+ if count <= 0:
157
+ return np.array([], dtype=np_dtype)
158
+
159
+ bytes_to_read = count * bytes_per_element
160
+
161
+ if byte_offset + bytes_to_read > self.size:
162
+ bytes_to_read = self.size - byte_offset
163
+ count = bytes_to_read // bytes_per_element
164
+
165
+ data_bytes = self.read_bytes(byte_offset, bytes_to_read)
166
+ return np.frombuffer(data_bytes, dtype=np_dtype, count=count)
167
+
168
+ def close(self) -> None:
169
+ """Close file and release resources."""
170
+ with self._lock:
171
+ if self._mmap is not None:
172
+ self._mmap.close()
173
+ self._mmap = None
174
+
175
+ if self._file_handle is not None:
176
+ self._file_handle.close()
177
+ self._file_handle = None
178
+
179
+ def __enter__(self) -> BinaryFile:
180
+ """Context manager entry."""
181
+ return self
182
+
183
+ def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
184
+ """Context manager exit."""
185
+ self.close()
186
+
187
+ def __del__(self) -> None:
188
+ """Destructor to ensure cleanup."""
189
+ self.close()
190
+
191
+ def __repr__(self) -> str:
192
+ """String representation."""
193
+ return f"BinaryFile('{self.path}', size={self.size:,} bytes)"