oscura 0.5.1__py3-none-any.whl → 0.7.0__py3-none-any.whl

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 (497) hide show
  1. oscura/__init__.py +169 -167
  2. oscura/analyzers/__init__.py +3 -0
  3. oscura/analyzers/classification.py +659 -0
  4. oscura/analyzers/digital/edges.py +325 -65
  5. oscura/analyzers/digital/quality.py +293 -166
  6. oscura/analyzers/digital/timing.py +260 -115
  7. oscura/analyzers/digital/timing_numba.py +334 -0
  8. oscura/analyzers/entropy.py +605 -0
  9. oscura/analyzers/eye/diagram.py +176 -109
  10. oscura/analyzers/eye/metrics.py +5 -5
  11. oscura/analyzers/jitter/__init__.py +6 -4
  12. oscura/analyzers/jitter/ber.py +52 -52
  13. oscura/analyzers/jitter/classification.py +156 -0
  14. oscura/analyzers/jitter/decomposition.py +163 -113
  15. oscura/analyzers/jitter/spectrum.py +80 -64
  16. oscura/analyzers/ml/__init__.py +39 -0
  17. oscura/analyzers/ml/features.py +600 -0
  18. oscura/analyzers/ml/signal_classifier.py +604 -0
  19. oscura/analyzers/packet/daq.py +246 -158
  20. oscura/analyzers/packet/parser.py +12 -1
  21. oscura/analyzers/packet/payload.py +50 -2110
  22. oscura/analyzers/packet/payload_analysis.py +361 -181
  23. oscura/analyzers/packet/payload_patterns.py +133 -70
  24. oscura/analyzers/packet/stream.py +84 -23
  25. oscura/analyzers/patterns/__init__.py +26 -5
  26. oscura/analyzers/patterns/anomaly_detection.py +908 -0
  27. oscura/analyzers/patterns/clustering.py +169 -108
  28. oscura/analyzers/patterns/clustering_optimized.py +227 -0
  29. oscura/analyzers/patterns/discovery.py +1 -1
  30. oscura/analyzers/patterns/matching.py +581 -197
  31. oscura/analyzers/patterns/pattern_mining.py +778 -0
  32. oscura/analyzers/patterns/periodic.py +121 -38
  33. oscura/analyzers/patterns/sequences.py +175 -78
  34. oscura/analyzers/power/conduction.py +1 -1
  35. oscura/analyzers/power/soa.py +6 -6
  36. oscura/analyzers/power/switching.py +250 -110
  37. oscura/analyzers/protocol/__init__.py +17 -1
  38. oscura/analyzers/protocols/base.py +6 -6
  39. oscura/analyzers/protocols/ble/__init__.py +38 -0
  40. oscura/analyzers/protocols/ble/analyzer.py +809 -0
  41. oscura/analyzers/protocols/ble/uuids.py +288 -0
  42. oscura/analyzers/protocols/can.py +257 -127
  43. oscura/analyzers/protocols/can_fd.py +107 -80
  44. oscura/analyzers/protocols/flexray.py +139 -80
  45. oscura/analyzers/protocols/hdlc.py +93 -58
  46. oscura/analyzers/protocols/i2c.py +247 -106
  47. oscura/analyzers/protocols/i2s.py +138 -86
  48. oscura/analyzers/protocols/industrial/__init__.py +40 -0
  49. oscura/analyzers/protocols/industrial/bacnet/__init__.py +33 -0
  50. oscura/analyzers/protocols/industrial/bacnet/analyzer.py +708 -0
  51. oscura/analyzers/protocols/industrial/bacnet/encoding.py +412 -0
  52. oscura/analyzers/protocols/industrial/bacnet/services.py +622 -0
  53. oscura/analyzers/protocols/industrial/ethercat/__init__.py +30 -0
  54. oscura/analyzers/protocols/industrial/ethercat/analyzer.py +474 -0
  55. oscura/analyzers/protocols/industrial/ethercat/mailbox.py +339 -0
  56. oscura/analyzers/protocols/industrial/ethercat/topology.py +166 -0
  57. oscura/analyzers/protocols/industrial/modbus/__init__.py +31 -0
  58. oscura/analyzers/protocols/industrial/modbus/analyzer.py +525 -0
  59. oscura/analyzers/protocols/industrial/modbus/crc.py +79 -0
  60. oscura/analyzers/protocols/industrial/modbus/functions.py +436 -0
  61. oscura/analyzers/protocols/industrial/opcua/__init__.py +21 -0
  62. oscura/analyzers/protocols/industrial/opcua/analyzer.py +552 -0
  63. oscura/analyzers/protocols/industrial/opcua/datatypes.py +446 -0
  64. oscura/analyzers/protocols/industrial/opcua/services.py +264 -0
  65. oscura/analyzers/protocols/industrial/profinet/__init__.py +23 -0
  66. oscura/analyzers/protocols/industrial/profinet/analyzer.py +441 -0
  67. oscura/analyzers/protocols/industrial/profinet/dcp.py +263 -0
  68. oscura/analyzers/protocols/industrial/profinet/ptcp.py +200 -0
  69. oscura/analyzers/protocols/jtag.py +180 -98
  70. oscura/analyzers/protocols/lin.py +219 -114
  71. oscura/analyzers/protocols/manchester.py +4 -4
  72. oscura/analyzers/protocols/onewire.py +253 -149
  73. oscura/analyzers/protocols/parallel_bus/__init__.py +20 -0
  74. oscura/analyzers/protocols/parallel_bus/centronics.py +92 -0
  75. oscura/analyzers/protocols/parallel_bus/gpib.py +137 -0
  76. oscura/analyzers/protocols/spi.py +192 -95
  77. oscura/analyzers/protocols/swd.py +321 -167
  78. oscura/analyzers/protocols/uart.py +267 -125
  79. oscura/analyzers/protocols/usb.py +235 -131
  80. oscura/analyzers/side_channel/power.py +17 -12
  81. oscura/analyzers/signal/__init__.py +15 -0
  82. oscura/analyzers/signal/timing_analysis.py +1086 -0
  83. oscura/analyzers/signal_integrity/__init__.py +4 -1
  84. oscura/analyzers/signal_integrity/sparams.py +2 -19
  85. oscura/analyzers/spectral/chunked.py +129 -60
  86. oscura/analyzers/spectral/chunked_fft.py +300 -94
  87. oscura/analyzers/spectral/chunked_wavelet.py +100 -80
  88. oscura/analyzers/statistical/checksum.py +376 -217
  89. oscura/analyzers/statistical/classification.py +229 -107
  90. oscura/analyzers/statistical/entropy.py +78 -53
  91. oscura/analyzers/statistics/correlation.py +407 -211
  92. oscura/analyzers/statistics/outliers.py +2 -2
  93. oscura/analyzers/statistics/streaming.py +30 -5
  94. oscura/analyzers/validation.py +216 -101
  95. oscura/analyzers/waveform/measurements.py +9 -0
  96. oscura/analyzers/waveform/measurements_with_uncertainty.py +31 -15
  97. oscura/analyzers/waveform/spectral.py +500 -228
  98. oscura/api/__init__.py +31 -5
  99. oscura/api/dsl/__init__.py +582 -0
  100. oscura/{dsl → api/dsl}/commands.py +43 -76
  101. oscura/{dsl → api/dsl}/interpreter.py +26 -51
  102. oscura/{dsl → api/dsl}/parser.py +107 -77
  103. oscura/{dsl → api/dsl}/repl.py +2 -2
  104. oscura/api/dsl.py +1 -1
  105. oscura/{integrations → api/integrations}/__init__.py +1 -1
  106. oscura/{integrations → api/integrations}/llm.py +201 -102
  107. oscura/api/operators.py +3 -3
  108. oscura/api/optimization.py +144 -30
  109. oscura/api/rest_server.py +921 -0
  110. oscura/api/server/__init__.py +17 -0
  111. oscura/api/server/dashboard.py +850 -0
  112. oscura/api/server/static/README.md +34 -0
  113. oscura/api/server/templates/base.html +181 -0
  114. oscura/api/server/templates/export.html +120 -0
  115. oscura/api/server/templates/home.html +284 -0
  116. oscura/api/server/templates/protocols.html +58 -0
  117. oscura/api/server/templates/reports.html +43 -0
  118. oscura/api/server/templates/session_detail.html +89 -0
  119. oscura/api/server/templates/sessions.html +83 -0
  120. oscura/api/server/templates/waveforms.html +73 -0
  121. oscura/automotive/__init__.py +8 -1
  122. oscura/automotive/can/__init__.py +10 -0
  123. oscura/automotive/can/checksum.py +3 -1
  124. oscura/automotive/can/dbc_generator.py +590 -0
  125. oscura/automotive/can/message_wrapper.py +121 -74
  126. oscura/automotive/can/patterns.py +98 -21
  127. oscura/automotive/can/session.py +292 -56
  128. oscura/automotive/can/state_machine.py +6 -3
  129. oscura/automotive/can/stimulus_response.py +97 -75
  130. oscura/automotive/dbc/__init__.py +10 -2
  131. oscura/automotive/dbc/generator.py +84 -56
  132. oscura/automotive/dbc/parser.py +6 -6
  133. oscura/automotive/dtc/data.json +17 -102
  134. oscura/automotive/dtc/database.py +2 -2
  135. oscura/automotive/flexray/__init__.py +31 -0
  136. oscura/automotive/flexray/analyzer.py +504 -0
  137. oscura/automotive/flexray/crc.py +185 -0
  138. oscura/automotive/flexray/fibex.py +449 -0
  139. oscura/automotive/j1939/__init__.py +45 -8
  140. oscura/automotive/j1939/analyzer.py +605 -0
  141. oscura/automotive/j1939/spns.py +326 -0
  142. oscura/automotive/j1939/transport.py +306 -0
  143. oscura/automotive/lin/__init__.py +47 -0
  144. oscura/automotive/lin/analyzer.py +612 -0
  145. oscura/automotive/loaders/blf.py +13 -2
  146. oscura/automotive/loaders/csv_can.py +143 -72
  147. oscura/automotive/loaders/dispatcher.py +50 -2
  148. oscura/automotive/loaders/mdf.py +86 -45
  149. oscura/automotive/loaders/pcap.py +111 -61
  150. oscura/automotive/uds/__init__.py +4 -0
  151. oscura/automotive/uds/analyzer.py +725 -0
  152. oscura/automotive/uds/decoder.py +140 -58
  153. oscura/automotive/uds/models.py +7 -1
  154. oscura/automotive/visualization.py +1 -1
  155. oscura/cli/analyze.py +348 -0
  156. oscura/cli/batch.py +142 -122
  157. oscura/cli/benchmark.py +275 -0
  158. oscura/cli/characterize.py +137 -82
  159. oscura/cli/compare.py +224 -131
  160. oscura/cli/completion.py +250 -0
  161. oscura/cli/config_cmd.py +361 -0
  162. oscura/cli/decode.py +164 -87
  163. oscura/cli/export.py +286 -0
  164. oscura/cli/main.py +115 -31
  165. oscura/{onboarding → cli/onboarding}/__init__.py +3 -3
  166. oscura/{onboarding → cli/onboarding}/help.py +80 -58
  167. oscura/{onboarding → cli/onboarding}/tutorials.py +97 -72
  168. oscura/{onboarding → cli/onboarding}/wizard.py +55 -36
  169. oscura/cli/progress.py +147 -0
  170. oscura/cli/shell.py +157 -135
  171. oscura/cli/validate_cmd.py +204 -0
  172. oscura/cli/visualize.py +158 -0
  173. oscura/convenience.py +125 -79
  174. oscura/core/__init__.py +4 -2
  175. oscura/core/backend_selector.py +3 -3
  176. oscura/core/cache.py +126 -15
  177. oscura/core/cancellation.py +1 -1
  178. oscura/{config → core/config}/__init__.py +20 -11
  179. oscura/{config → core/config}/defaults.py +1 -1
  180. oscura/{config → core/config}/loader.py +7 -5
  181. oscura/{config → core/config}/memory.py +5 -5
  182. oscura/{config → core/config}/migration.py +1 -1
  183. oscura/{config → core/config}/pipeline.py +99 -23
  184. oscura/{config → core/config}/preferences.py +1 -1
  185. oscura/{config → core/config}/protocol.py +3 -3
  186. oscura/{config → core/config}/schema.py +426 -272
  187. oscura/{config → core/config}/settings.py +1 -1
  188. oscura/{config → core/config}/thresholds.py +195 -153
  189. oscura/core/correlation.py +5 -6
  190. oscura/core/cross_domain.py +0 -2
  191. oscura/core/debug.py +9 -5
  192. oscura/{extensibility → core/extensibility}/docs.py +158 -70
  193. oscura/{extensibility → core/extensibility}/extensions.py +160 -76
  194. oscura/{extensibility → core/extensibility}/logging.py +1 -1
  195. oscura/{extensibility → core/extensibility}/measurements.py +1 -1
  196. oscura/{extensibility → core/extensibility}/plugins.py +1 -1
  197. oscura/{extensibility → core/extensibility}/templates.py +73 -3
  198. oscura/{extensibility → core/extensibility}/validation.py +1 -1
  199. oscura/core/gpu_backend.py +11 -7
  200. oscura/core/log_query.py +101 -11
  201. oscura/core/logging.py +126 -54
  202. oscura/core/logging_advanced.py +5 -5
  203. oscura/core/memory_limits.py +108 -70
  204. oscura/core/memory_monitor.py +2 -2
  205. oscura/core/memory_progress.py +7 -7
  206. oscura/core/memory_warnings.py +1 -1
  207. oscura/core/numba_backend.py +13 -13
  208. oscura/{plugins → core/plugins}/__init__.py +9 -9
  209. oscura/{plugins → core/plugins}/base.py +7 -7
  210. oscura/{plugins → core/plugins}/cli.py +3 -3
  211. oscura/{plugins → core/plugins}/discovery.py +186 -106
  212. oscura/{plugins → core/plugins}/lifecycle.py +1 -1
  213. oscura/{plugins → core/plugins}/manager.py +7 -7
  214. oscura/{plugins → core/plugins}/registry.py +3 -3
  215. oscura/{plugins → core/plugins}/versioning.py +1 -1
  216. oscura/core/progress.py +16 -1
  217. oscura/core/provenance.py +8 -2
  218. oscura/{schemas → core/schemas}/__init__.py +2 -2
  219. oscura/{schemas → core/schemas}/device_mapping.json +2 -8
  220. oscura/{schemas → core/schemas}/packet_format.json +4 -24
  221. oscura/{schemas → core/schemas}/protocol_definition.json +2 -12
  222. oscura/core/types.py +4 -0
  223. oscura/core/uncertainty.py +3 -3
  224. oscura/correlation/__init__.py +52 -0
  225. oscura/correlation/multi_protocol.py +811 -0
  226. oscura/discovery/auto_decoder.py +117 -35
  227. oscura/discovery/comparison.py +191 -86
  228. oscura/discovery/quality_validator.py +155 -68
  229. oscura/discovery/signal_detector.py +196 -79
  230. oscura/export/__init__.py +18 -8
  231. oscura/export/kaitai_struct.py +513 -0
  232. oscura/export/scapy_layer.py +801 -0
  233. oscura/export/wireshark/generator.py +1 -1
  234. oscura/export/wireshark/templates/dissector.lua.j2 +2 -2
  235. oscura/export/wireshark_dissector.py +746 -0
  236. oscura/guidance/wizard.py +207 -111
  237. oscura/hardware/__init__.py +19 -0
  238. oscura/{acquisition → hardware/acquisition}/__init__.py +4 -4
  239. oscura/{acquisition → hardware/acquisition}/file.py +2 -2
  240. oscura/{acquisition → hardware/acquisition}/hardware.py +7 -7
  241. oscura/{acquisition → hardware/acquisition}/saleae.py +15 -12
  242. oscura/{acquisition → hardware/acquisition}/socketcan.py +1 -1
  243. oscura/{acquisition → hardware/acquisition}/streaming.py +2 -2
  244. oscura/{acquisition → hardware/acquisition}/synthetic.py +3 -3
  245. oscura/{acquisition → hardware/acquisition}/visa.py +33 -11
  246. oscura/hardware/firmware/__init__.py +29 -0
  247. oscura/hardware/firmware/pattern_recognition.py +874 -0
  248. oscura/hardware/hal_detector.py +736 -0
  249. oscura/hardware/security/__init__.py +37 -0
  250. oscura/hardware/security/side_channel_detector.py +1126 -0
  251. oscura/inference/__init__.py +4 -0
  252. oscura/inference/active_learning/observation_table.py +4 -1
  253. oscura/inference/alignment.py +216 -123
  254. oscura/inference/bayesian.py +113 -33
  255. oscura/inference/crc_reverse.py +101 -55
  256. oscura/inference/logic.py +6 -2
  257. oscura/inference/message_format.py +342 -183
  258. oscura/inference/protocol.py +95 -44
  259. oscura/inference/protocol_dsl.py +180 -82
  260. oscura/inference/signal_intelligence.py +1439 -706
  261. oscura/inference/spectral.py +99 -57
  262. oscura/inference/state_machine.py +810 -158
  263. oscura/inference/stream.py +270 -110
  264. oscura/iot/__init__.py +34 -0
  265. oscura/iot/coap/__init__.py +32 -0
  266. oscura/iot/coap/analyzer.py +668 -0
  267. oscura/iot/coap/options.py +212 -0
  268. oscura/iot/lorawan/__init__.py +21 -0
  269. oscura/iot/lorawan/crypto.py +206 -0
  270. oscura/iot/lorawan/decoder.py +801 -0
  271. oscura/iot/lorawan/mac_commands.py +341 -0
  272. oscura/iot/mqtt/__init__.py +27 -0
  273. oscura/iot/mqtt/analyzer.py +999 -0
  274. oscura/iot/mqtt/properties.py +315 -0
  275. oscura/iot/zigbee/__init__.py +31 -0
  276. oscura/iot/zigbee/analyzer.py +615 -0
  277. oscura/iot/zigbee/security.py +153 -0
  278. oscura/iot/zigbee/zcl.py +349 -0
  279. oscura/jupyter/display.py +125 -45
  280. oscura/{exploratory → jupyter/exploratory}/__init__.py +8 -8
  281. oscura/{exploratory → jupyter/exploratory}/error_recovery.py +298 -141
  282. oscura/jupyter/exploratory/fuzzy.py +746 -0
  283. oscura/{exploratory → jupyter/exploratory}/fuzzy_advanced.py +258 -100
  284. oscura/{exploratory → jupyter/exploratory}/legacy.py +464 -242
  285. oscura/{exploratory → jupyter/exploratory}/parse.py +167 -145
  286. oscura/{exploratory → jupyter/exploratory}/recovery.py +119 -87
  287. oscura/jupyter/exploratory/sync.py +612 -0
  288. oscura/{exploratory → jupyter/exploratory}/unknown.py +299 -176
  289. oscura/jupyter/magic.py +4 -4
  290. oscura/{ui → jupyter/ui}/__init__.py +2 -2
  291. oscura/{ui → jupyter/ui}/formatters.py +3 -3
  292. oscura/{ui → jupyter/ui}/progressive_display.py +153 -82
  293. oscura/loaders/__init__.py +183 -67
  294. oscura/loaders/binary.py +88 -1
  295. oscura/loaders/chipwhisperer.py +153 -137
  296. oscura/loaders/configurable.py +208 -86
  297. oscura/loaders/csv_loader.py +458 -215
  298. oscura/loaders/hdf5_loader.py +278 -119
  299. oscura/loaders/lazy.py +87 -54
  300. oscura/loaders/mmap_loader.py +1 -1
  301. oscura/loaders/numpy_loader.py +253 -116
  302. oscura/loaders/pcap.py +226 -151
  303. oscura/loaders/rigol.py +110 -49
  304. oscura/loaders/sigrok.py +201 -78
  305. oscura/loaders/tdms.py +81 -58
  306. oscura/loaders/tektronix.py +291 -174
  307. oscura/loaders/touchstone.py +182 -87
  308. oscura/loaders/tss.py +456 -0
  309. oscura/loaders/vcd.py +215 -117
  310. oscura/loaders/wav.py +155 -68
  311. oscura/reporting/__init__.py +9 -0
  312. oscura/reporting/analyze.py +352 -146
  313. oscura/reporting/argument_preparer.py +69 -14
  314. oscura/reporting/auto_report.py +97 -61
  315. oscura/reporting/batch.py +131 -58
  316. oscura/reporting/chart_selection.py +57 -45
  317. oscura/reporting/comparison.py +63 -17
  318. oscura/reporting/content/executive.py +76 -24
  319. oscura/reporting/core_formats/multi_format.py +11 -8
  320. oscura/reporting/engine.py +312 -158
  321. oscura/reporting/enhanced_reports.py +949 -0
  322. oscura/reporting/export.py +86 -43
  323. oscura/reporting/formatting/numbers.py +69 -42
  324. oscura/reporting/html.py +139 -58
  325. oscura/reporting/index.py +137 -65
  326. oscura/reporting/output.py +158 -67
  327. oscura/reporting/pdf.py +67 -102
  328. oscura/reporting/plots.py +191 -112
  329. oscura/reporting/sections.py +88 -47
  330. oscura/reporting/standards.py +104 -61
  331. oscura/reporting/summary_generator.py +75 -55
  332. oscura/reporting/tables.py +138 -54
  333. oscura/reporting/templates/enhanced/protocol_re.html +525 -0
  334. oscura/sessions/__init__.py +14 -23
  335. oscura/sessions/base.py +3 -3
  336. oscura/sessions/blackbox.py +106 -10
  337. oscura/sessions/generic.py +2 -2
  338. oscura/sessions/legacy.py +783 -0
  339. oscura/side_channel/__init__.py +63 -0
  340. oscura/side_channel/dpa.py +1025 -0
  341. oscura/utils/__init__.py +15 -1
  342. oscura/utils/bitwise.py +118 -0
  343. oscura/{builders → utils/builders}/__init__.py +1 -1
  344. oscura/{comparison → utils/comparison}/__init__.py +6 -6
  345. oscura/{comparison → utils/comparison}/compare.py +202 -101
  346. oscura/{comparison → utils/comparison}/golden.py +83 -63
  347. oscura/{comparison → utils/comparison}/limits.py +313 -89
  348. oscura/{comparison → utils/comparison}/mask.py +151 -45
  349. oscura/{comparison → utils/comparison}/trace_diff.py +1 -1
  350. oscura/{comparison → utils/comparison}/visualization.py +147 -89
  351. oscura/{component → utils/component}/__init__.py +3 -3
  352. oscura/{component → utils/component}/impedance.py +122 -58
  353. oscura/{component → utils/component}/reactive.py +165 -168
  354. oscura/{component → utils/component}/transmission_line.py +3 -3
  355. oscura/{filtering → utils/filtering}/__init__.py +6 -6
  356. oscura/{filtering → utils/filtering}/base.py +1 -1
  357. oscura/{filtering → utils/filtering}/convenience.py +2 -2
  358. oscura/{filtering → utils/filtering}/design.py +169 -93
  359. oscura/{filtering → utils/filtering}/filters.py +2 -2
  360. oscura/{filtering → utils/filtering}/introspection.py +2 -2
  361. oscura/utils/geometry.py +31 -0
  362. oscura/utils/imports.py +184 -0
  363. oscura/utils/lazy.py +1 -1
  364. oscura/{math → utils/math}/__init__.py +2 -2
  365. oscura/{math → utils/math}/arithmetic.py +114 -48
  366. oscura/{math → utils/math}/interpolation.py +139 -106
  367. oscura/utils/memory.py +129 -66
  368. oscura/utils/memory_advanced.py +92 -9
  369. oscura/utils/memory_extensions.py +10 -8
  370. oscura/{optimization → utils/optimization}/__init__.py +1 -1
  371. oscura/{optimization → utils/optimization}/search.py +2 -2
  372. oscura/utils/performance/__init__.py +58 -0
  373. oscura/utils/performance/caching.py +889 -0
  374. oscura/utils/performance/lsh_clustering.py +333 -0
  375. oscura/utils/performance/memory_optimizer.py +699 -0
  376. oscura/utils/performance/optimizations.py +675 -0
  377. oscura/utils/performance/parallel.py +654 -0
  378. oscura/utils/performance/profiling.py +661 -0
  379. oscura/{pipeline → utils/pipeline}/base.py +1 -1
  380. oscura/{pipeline → utils/pipeline}/composition.py +1 -1
  381. oscura/{pipeline → utils/pipeline}/parallel.py +3 -2
  382. oscura/{pipeline → utils/pipeline}/pipeline.py +1 -1
  383. oscura/{pipeline → utils/pipeline}/reverse_engineering.py +412 -221
  384. oscura/{search → utils/search}/__init__.py +3 -3
  385. oscura/{search → utils/search}/anomaly.py +188 -58
  386. oscura/utils/search/context.py +294 -0
  387. oscura/{search → utils/search}/pattern.py +138 -10
  388. oscura/utils/serial.py +51 -0
  389. oscura/utils/storage/__init__.py +61 -0
  390. oscura/utils/storage/database.py +1166 -0
  391. oscura/{streaming → utils/streaming}/chunked.py +302 -143
  392. oscura/{streaming → utils/streaming}/progressive.py +1 -1
  393. oscura/{streaming → utils/streaming}/realtime.py +3 -2
  394. oscura/{triggering → utils/triggering}/__init__.py +6 -6
  395. oscura/{triggering → utils/triggering}/base.py +6 -6
  396. oscura/{triggering → utils/triggering}/edge.py +2 -2
  397. oscura/{triggering → utils/triggering}/pattern.py +2 -2
  398. oscura/{triggering → utils/triggering}/pulse.py +115 -74
  399. oscura/{triggering → utils/triggering}/window.py +2 -2
  400. oscura/utils/validation.py +32 -0
  401. oscura/validation/__init__.py +121 -0
  402. oscura/{compliance → validation/compliance}/__init__.py +5 -5
  403. oscura/{compliance → validation/compliance}/advanced.py +5 -5
  404. oscura/{compliance → validation/compliance}/masks.py +1 -1
  405. oscura/{compliance → validation/compliance}/reporting.py +127 -53
  406. oscura/{compliance → validation/compliance}/testing.py +114 -52
  407. oscura/validation/compliance_tests.py +915 -0
  408. oscura/validation/fuzzer.py +990 -0
  409. oscura/validation/grammar_tests.py +596 -0
  410. oscura/validation/grammar_validator.py +904 -0
  411. oscura/validation/hil_testing.py +977 -0
  412. oscura/{quality → validation/quality}/__init__.py +4 -4
  413. oscura/{quality → validation/quality}/ensemble.py +251 -171
  414. oscura/{quality → validation/quality}/explainer.py +3 -3
  415. oscura/{quality → validation/quality}/scoring.py +1 -1
  416. oscura/{quality → validation/quality}/warnings.py +4 -4
  417. oscura/validation/regression_suite.py +808 -0
  418. oscura/validation/replay.py +788 -0
  419. oscura/{testing → validation/testing}/__init__.py +2 -2
  420. oscura/{testing → validation/testing}/synthetic.py +5 -5
  421. oscura/visualization/__init__.py +9 -0
  422. oscura/visualization/accessibility.py +1 -1
  423. oscura/visualization/annotations.py +64 -67
  424. oscura/visualization/colors.py +7 -7
  425. oscura/visualization/digital.py +180 -81
  426. oscura/visualization/eye.py +236 -85
  427. oscura/visualization/interactive.py +320 -143
  428. oscura/visualization/jitter.py +587 -247
  429. oscura/visualization/layout.py +169 -134
  430. oscura/visualization/optimization.py +103 -52
  431. oscura/visualization/palettes.py +1 -1
  432. oscura/visualization/power.py +427 -211
  433. oscura/visualization/power_extended.py +626 -297
  434. oscura/visualization/presets.py +2 -0
  435. oscura/visualization/protocols.py +495 -181
  436. oscura/visualization/render.py +79 -63
  437. oscura/visualization/reverse_engineering.py +171 -124
  438. oscura/visualization/signal_integrity.py +460 -279
  439. oscura/visualization/specialized.py +190 -100
  440. oscura/visualization/spectral.py +670 -255
  441. oscura/visualization/thumbnails.py +166 -137
  442. oscura/visualization/waveform.py +150 -63
  443. oscura/workflows/__init__.py +3 -0
  444. oscura/{batch → workflows/batch}/__init__.py +5 -5
  445. oscura/{batch → workflows/batch}/advanced.py +150 -75
  446. oscura/workflows/batch/aggregate.py +531 -0
  447. oscura/workflows/batch/analyze.py +236 -0
  448. oscura/{batch → workflows/batch}/logging.py +2 -2
  449. oscura/{batch → workflows/batch}/metrics.py +1 -1
  450. oscura/workflows/complete_re.py +1144 -0
  451. oscura/workflows/compliance.py +44 -54
  452. oscura/workflows/digital.py +197 -51
  453. oscura/workflows/legacy/__init__.py +12 -0
  454. oscura/{workflow → workflows/legacy}/dag.py +4 -1
  455. oscura/workflows/multi_trace.py +9 -9
  456. oscura/workflows/power.py +42 -62
  457. oscura/workflows/protocol.py +82 -49
  458. oscura/workflows/reverse_engineering.py +351 -150
  459. oscura/workflows/signal_integrity.py +157 -82
  460. oscura-0.7.0.dist-info/METADATA +661 -0
  461. oscura-0.7.0.dist-info/RECORD +591 -0
  462. oscura/batch/aggregate.py +0 -300
  463. oscura/batch/analyze.py +0 -139
  464. oscura/dsl/__init__.py +0 -73
  465. oscura/exceptions.py +0 -59
  466. oscura/exploratory/fuzzy.py +0 -513
  467. oscura/exploratory/sync.py +0 -384
  468. oscura/exporters/__init__.py +0 -94
  469. oscura/exporters/csv.py +0 -303
  470. oscura/exporters/exporters.py +0 -44
  471. oscura/exporters/hdf5.py +0 -217
  472. oscura/exporters/html_export.py +0 -701
  473. oscura/exporters/json_export.py +0 -291
  474. oscura/exporters/markdown_export.py +0 -367
  475. oscura/exporters/matlab_export.py +0 -354
  476. oscura/exporters/npz_export.py +0 -219
  477. oscura/exporters/spice_export.py +0 -210
  478. oscura/search/context.py +0 -149
  479. oscura/session/__init__.py +0 -34
  480. oscura/session/annotations.py +0 -289
  481. oscura/session/history.py +0 -313
  482. oscura/session/session.py +0 -520
  483. oscura/workflow/__init__.py +0 -13
  484. oscura-0.5.1.dist-info/METADATA +0 -583
  485. oscura-0.5.1.dist-info/RECORD +0 -481
  486. /oscura/core/{config.py → config/legacy.py} +0 -0
  487. /oscura/{extensibility → core/extensibility}/__init__.py +0 -0
  488. /oscura/{extensibility → core/extensibility}/registry.py +0 -0
  489. /oscura/{plugins → core/plugins}/isolation.py +0 -0
  490. /oscura/{schemas → core/schemas}/bus_configuration.json +0 -0
  491. /oscura/{builders → utils/builders}/signal_builder.py +0 -0
  492. /oscura/{optimization → utils/optimization}/parallel.py +0 -0
  493. /oscura/{pipeline → utils/pipeline}/__init__.py +0 -0
  494. /oscura/{streaming → utils/streaming}/__init__.py +0 -0
  495. {oscura-0.5.1.dist-info → oscura-0.7.0.dist-info}/WHEEL +0 -0
  496. {oscura-0.5.1.dist-info → oscura-0.7.0.dist-info}/entry_points.txt +0 -0
  497. {oscura-0.5.1.dist-info → oscura-0.7.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,525 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>{{ title }}</title>
7
+ <script src="https://cdn.plot.ly/plotly-2.27.0.min.js"></script>
8
+ <style>
9
+ :root {
10
+ --bg-color: {{ theme.background_color }};
11
+ --text-color: {{ theme.text_color }};
12
+ --primary-color: {{ theme.primary_color }};
13
+ --secondary-color: {{ theme.secondary_color }};
14
+ --border-color: {{ theme.border_color }};
15
+ --code-bg: {{ theme.code_background }};
16
+ }
17
+
18
+ * {
19
+ box-sizing: border-box;
20
+ margin: 0;
21
+ padding: 0;
22
+ }
23
+
24
+ body {
25
+ font-family: 'Segoe UI', -apple-system, BlinkMacSystemFont, Roboto, sans-serif;
26
+ line-height: 1.6;
27
+ background-color: var(--bg-color);
28
+ color: var(--text-color);
29
+ padding: 0;
30
+ }
31
+
32
+ .container {
33
+ max-width: 1400px;
34
+ margin: 0 auto;
35
+ padding: 40px 20px;
36
+ }
37
+
38
+ /* Header */
39
+ .header {
40
+ background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
41
+ color: white;
42
+ padding: 60px 40px;
43
+ margin: -40px -20px 40px -20px;
44
+ box-shadow: 0 4px 6px rgba(0,0,0,0.1);
45
+ }
46
+
47
+ .header h1 {
48
+ font-size: 2.5rem;
49
+ margin-bottom: 10px;
50
+ font-weight: 600;
51
+ }
52
+
53
+ .header .meta {
54
+ opacity: 0.9;
55
+ font-size: 0.95rem;
56
+ }
57
+
58
+ /* Table of Contents */
59
+ .toc {
60
+ background: var(--code-bg);
61
+ border-left: 4px solid var(--primary-color);
62
+ padding: 20px;
63
+ margin: 30px 0;
64
+ border-radius: 4px;
65
+ }
66
+
67
+ .toc h2 {
68
+ margin-bottom: 15px;
69
+ font-size: 1.3rem;
70
+ }
71
+
72
+ .toc ul {
73
+ list-style: none;
74
+ }
75
+
76
+ .toc li {
77
+ margin: 8px 0;
78
+ }
79
+
80
+ .toc a {
81
+ color: var(--secondary-color);
82
+ text-decoration: none;
83
+ transition: color 0.2s;
84
+ }
85
+
86
+ .toc a:hover {
87
+ color: var(--primary-color);
88
+ text-decoration: underline;
89
+ }
90
+
91
+ /* Sections */
92
+ .section {
93
+ margin: 50px 0;
94
+ scroll-margin-top: 20px;
95
+ }
96
+
97
+ .section h2 {
98
+ color: var(--primary-color);
99
+ border-bottom: 3px solid var(--primary-color);
100
+ padding-bottom: 12px;
101
+ margin-bottom: 25px;
102
+ font-size: 1.8rem;
103
+ }
104
+
105
+ .section h3 {
106
+ color: var(--secondary-color);
107
+ margin-top: 30px;
108
+ margin-bottom: 15px;
109
+ font-size: 1.4rem;
110
+ }
111
+
112
+ /* Cards */
113
+ .card {
114
+ background: var(--code-bg);
115
+ border: 1px solid var(--border-color);
116
+ border-radius: 8px;
117
+ padding: 25px;
118
+ margin: 20px 0;
119
+ box-shadow: 0 2px 4px rgba(0,0,0,0.05);
120
+ }
121
+
122
+ .card-header {
123
+ font-weight: 600;
124
+ color: var(--primary-color);
125
+ margin-bottom: 15px;
126
+ font-size: 1.1rem;
127
+ }
128
+
129
+ /* Tables */
130
+ table {
131
+ width: 100%;
132
+ border-collapse: collapse;
133
+ margin: 20px 0;
134
+ background: white;
135
+ box-shadow: 0 2px 4px rgba(0,0,0,0.05);
136
+ }
137
+
138
+ th {
139
+ background: var(--primary-color);
140
+ color: white;
141
+ padding: 15px;
142
+ text-align: left;
143
+ font-weight: 600;
144
+ }
145
+
146
+ td {
147
+ padding: 12px 15px;
148
+ border-bottom: 1px solid var(--border-color);
149
+ }
150
+
151
+ tr:nth-child(even) {
152
+ background-color: rgba(0,0,0,0.02);
153
+ }
154
+
155
+ tr:hover {
156
+ background-color: rgba(0,0,0,0.05);
157
+ }
158
+
159
+ /* Badges */
160
+ .badge {
161
+ display: inline-block;
162
+ padding: 4px 12px;
163
+ border-radius: 12px;
164
+ font-size: 0.85rem;
165
+ font-weight: 600;
166
+ }
167
+
168
+ .badge-success {
169
+ background: #d4edda;
170
+ color: #155724;
171
+ }
172
+
173
+ .badge-warning {
174
+ background: #fff3cd;
175
+ color: #856404;
176
+ }
177
+
178
+ .badge-danger {
179
+ background: #f8d7da;
180
+ color: #721c24;
181
+ }
182
+
183
+ /* Warnings */
184
+ .warning {
185
+ background: #fff3cd;
186
+ border-left: 4px solid #ffc107;
187
+ padding: 15px;
188
+ margin: 15px 0;
189
+ border-radius: 4px;
190
+ }
191
+
192
+ .warning::before {
193
+ content: "⚠ ";
194
+ font-weight: bold;
195
+ }
196
+
197
+ /* Plots */
198
+ .plot-container {
199
+ margin: 30px 0;
200
+ padding: 20px;
201
+ background: white;
202
+ border-radius: 8px;
203
+ box-shadow: 0 2px 8px rgba(0,0,0,0.1);
204
+ }
205
+
206
+ .plot-title {
207
+ font-size: 1.2rem;
208
+ font-weight: 600;
209
+ margin-bottom: 15px;
210
+ color: var(--primary-color);
211
+ }
212
+
213
+ .plot-container img {
214
+ max-width: 100%;
215
+ height: auto;
216
+ display: block;
217
+ margin: 0 auto;
218
+ }
219
+
220
+ /* Artifacts List */
221
+ .artifacts-list {
222
+ list-style: none;
223
+ padding: 0;
224
+ }
225
+
226
+ .artifacts-list li {
227
+ background: var(--code-bg);
228
+ padding: 15px;
229
+ margin: 10px 0;
230
+ border-left: 4px solid var(--secondary-color);
231
+ border-radius: 4px;
232
+ }
233
+
234
+ .artifacts-list strong {
235
+ color: var(--primary-color);
236
+ }
237
+
238
+ /* Metrics Grid */
239
+ .metrics-grid {
240
+ display: grid;
241
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
242
+ gap: 20px;
243
+ margin: 20px 0;
244
+ }
245
+
246
+ .metric-card {
247
+ background: var(--code-bg);
248
+ padding: 20px;
249
+ border-radius: 8px;
250
+ text-align: center;
251
+ border: 1px solid var(--border-color);
252
+ }
253
+
254
+ .metric-value {
255
+ font-size: 2rem;
256
+ font-weight: 700;
257
+ color: var(--primary-color);
258
+ margin: 10px 0;
259
+ }
260
+
261
+ .metric-label {
262
+ font-size: 0.9rem;
263
+ color: var(--text-color);
264
+ opacity: 0.8;
265
+ }
266
+
267
+ /* Code blocks */
268
+ code {
269
+ background: var(--code-bg);
270
+ padding: 2px 6px;
271
+ border-radius: 3px;
272
+ font-family: 'Consolas', 'Monaco', monospace;
273
+ font-size: 0.9em;
274
+ }
275
+
276
+ /* Responsive */
277
+ @media (max-width: 768px) {
278
+ .header {
279
+ padding: 40px 20px;
280
+ }
281
+
282
+ .header h1 {
283
+ font-size: 2rem;
284
+ }
285
+
286
+ .section h2 {
287
+ font-size: 1.5rem;
288
+ }
289
+
290
+ .metrics-grid {
291
+ grid-template-columns: 1fr;
292
+ }
293
+ }
294
+
295
+ /* Print styles */
296
+ @media print {
297
+ .header {
298
+ background: white !important;
299
+ color: black !important;
300
+ box-shadow: none !important;
301
+ }
302
+
303
+ .toc {
304
+ display: none;
305
+ }
306
+
307
+ .section {
308
+ page-break-inside: avoid;
309
+ }
310
+ }
311
+ </style>
312
+ </head>
313
+ <body>
314
+ <div class="container">
315
+ <div class="header">
316
+ <h1>{{ title }}</h1>
317
+ <div class="meta">
318
+ {% if config.show_timestamps %}
319
+ <p>Generated: {{ generated_at|format_timestamp }}</p>
320
+ {% endif %}
321
+ <p>Author: {{ author }}</p>
322
+ <p>Report Type: Protocol Reverse Engineering</p>
323
+ </div>
324
+ </div>
325
+
326
+ {% if config.show_toc %}
327
+ <div class="toc">
328
+ <h2>Table of Contents</h2>
329
+ <ul>
330
+ <li><a href="#executive-summary">Executive Summary</a></li>
331
+ <li><a href="#protocol-spec">Protocol Specification</a></li>
332
+ {% if plots %}<li><a href="#visualizations">Visualizations</a></li>{% endif %}
333
+ {% if artifacts %}<li><a href="#artifacts">Generated Artifacts</a></li>{% endif %}
334
+ {% if partial_results %}<li><a href="#analysis">Detailed Analysis</a></li>{% endif %}
335
+ {% if warnings %}<li><a href="#warnings">Warnings</a></li>{% endif %}
336
+ </ul>
337
+ </div>
338
+ {% endif %}
339
+
340
+ <!-- Executive Summary -->
341
+ <div class="section" id="executive-summary">
342
+ <h2>Executive Summary</h2>
343
+ <div class="card">
344
+ <p>This report presents the results of automated protocol reverse engineering
345
+ performed by the Oscura framework. The analysis identified protocol characteristics,
346
+ decoded message structures, and generated working dissectors for further analysis.</p>
347
+ </div>
348
+
349
+ {% if confidence_score %}
350
+ <div class="metrics-grid">
351
+ <div class="metric-card">
352
+ <div class="metric-label">Overall Confidence</div>
353
+ <div class="metric-value">{{ (confidence_score * 100)|round(1) }}%</div>
354
+ {% if confidence_score >= 0.8 %}
355
+ <span class="badge badge-success">High</span>
356
+ {% elif confidence_score >= 0.6 %}
357
+ <span class="badge badge-warning">Medium</span>
358
+ {% else %}
359
+ <span class="badge badge-danger">Low</span>
360
+ {% endif %}
361
+ </div>
362
+
363
+ {% if execution_time %}
364
+ <div class="metric-card">
365
+ <div class="metric-label">Execution Time</div>
366
+ <div class="metric-value">{{ execution_time|round(1) }}s</div>
367
+ </div>
368
+ {% endif %}
369
+
370
+ {% if protocol_spec %}
371
+ <div class="metric-card">
372
+ <div class="metric-label">Fields Detected</div>
373
+ <div class="metric-value">{{ protocol_spec.fields|length }}</div>
374
+ </div>
375
+ {% endif %}
376
+
377
+ {% if artifacts %}
378
+ <div class="metric-card">
379
+ <div class="metric-label">Artifacts Generated</div>
380
+ <div class="metric-value">{{ artifacts|length }}</div>
381
+ </div>
382
+ {% endif %}
383
+ </div>
384
+ {% endif %}
385
+ </div>
386
+
387
+ <!-- Protocol Specification -->
388
+ {% if protocol_spec %}
389
+ <div class="section" id="protocol-spec">
390
+ <h2>Protocol Specification</h2>
391
+
392
+ <div class="card">
393
+ <div class="card-header">Overview</div>
394
+ <table>
395
+ <tr>
396
+ <th>Property</th>
397
+ <th>Value</th>
398
+ </tr>
399
+ <tr>
400
+ <td><strong>Protocol Name</strong></td>
401
+ <td>{{ protocol_spec.name }}</td>
402
+ </tr>
403
+ <tr>
404
+ <td><strong>Baud Rate</strong></td>
405
+ <td>{{ protocol_spec.baud_rate|format_number }} bps</td>
406
+ </tr>
407
+ <tr>
408
+ <td><strong>Frame Format</strong></td>
409
+ <td><code>{{ protocol_spec.frame_format }}</code></td>
410
+ </tr>
411
+ <tr>
412
+ <td><strong>Sync Pattern</strong></td>
413
+ <td><code>{{ protocol_spec.sync_pattern }}</code></td>
414
+ </tr>
415
+ <tr>
416
+ <td><strong>Frame Length</strong></td>
417
+ <td>{{ protocol_spec.frame_length or "Variable" }} bytes</td>
418
+ </tr>
419
+ <tr>
420
+ <td><strong>Checksum Type</strong></td>
421
+ <td>{{ protocol_spec.checksum_type or "None detected" }}</td>
422
+ </tr>
423
+ {% if protocol_spec.checksum_position %}
424
+ <tr>
425
+ <td><strong>Checksum Position</strong></td>
426
+ <td>Byte {{ protocol_spec.checksum_position }}</td>
427
+ </tr>
428
+ {% endif %}
429
+ <tr>
430
+ <td><strong>Detection Confidence</strong></td>
431
+ <td>{{ (protocol_spec.confidence * 100)|round(1) }}%</td>
432
+ </tr>
433
+ </table>
434
+ </div>
435
+
436
+ {% if protocol_spec.fields %}
437
+ <h3>Field Structure</h3>
438
+ <div class="card">
439
+ <table>
440
+ <thead>
441
+ <tr>
442
+ <th>Field Name</th>
443
+ <th>Offset (bytes)</th>
444
+ <th>Size (bytes)</th>
445
+ <th>Type</th>
446
+ </tr>
447
+ </thead>
448
+ <tbody>
449
+ {% for field in protocol_spec.fields %}
450
+ <tr>
451
+ <td><code>{{ field.name }}</code></td>
452
+ <td>{{ field.offset }}</td>
453
+ <td>{{ field.size }}</td>
454
+ <td>{{ field.type }}</td>
455
+ </tr>
456
+ {% endfor %}
457
+ </tbody>
458
+ </table>
459
+ </div>
460
+ {% endif %}
461
+ </div>
462
+ {% endif %}
463
+
464
+ <!-- Visualizations -->
465
+ {% if plots %}
466
+ <div class="section" id="visualizations">
467
+ <h2>Visualizations</h2>
468
+ {% for plot in plots %}
469
+ <div class="plot-container">
470
+ <div class="plot-title">{{ plot.title }}</div>
471
+ {% if plot.type == "embedded" %}
472
+ <img src="{{ plot.data }}" alt="{{ plot.title }}">
473
+ {% else %}
474
+ <img src="{{ plot.path }}" alt="{{ plot.title }}">
475
+ {% endif %}
476
+ </div>
477
+ {% endfor %}
478
+ </div>
479
+ {% endif %}
480
+
481
+ <!-- Generated Artifacts -->
482
+ {% if artifacts %}
483
+ <div class="section" id="artifacts">
484
+ <h2>Generated Artifacts</h2>
485
+ <div class="card">
486
+ <p>The following artifacts were generated and can be used for further analysis:</p>
487
+ <ul class="artifacts-list">
488
+ {% for artifact in artifacts %}
489
+ <li>
490
+ <strong>{{ artifact.name }}</strong><br>
491
+ <code>{{ artifact.path }}</code>
492
+ </li>
493
+ {% endfor %}
494
+ </ul>
495
+ </div>
496
+ </div>
497
+ {% endif %}
498
+
499
+ <!-- Detailed Analysis -->
500
+ {% if partial_results %}
501
+ <div class="section" id="analysis">
502
+ <h2>Detailed Analysis Results</h2>
503
+ {% for key, value in partial_results.items() %}
504
+ {% if key not in ['traces'] %}
505
+ <div class="card">
506
+ <div class="card-header">{{ key|replace('_', ' ')|title }}</div>
507
+ <p>{{ value }}</p>
508
+ </div>
509
+ {% endif %}
510
+ {% endfor %}
511
+ </div>
512
+ {% endif %}
513
+
514
+ <!-- Warnings -->
515
+ {% if warnings %}
516
+ <div class="section" id="warnings">
517
+ <h2>Warnings and Notes</h2>
518
+ {% for warning in warnings %}
519
+ <div class="warning">{{ warning }}</div>
520
+ {% endfor %}
521
+ </div>
522
+ {% endif %}
523
+ </div>
524
+ </body>
525
+ </html>
@@ -11,43 +11,34 @@ AnalysisSession and provide consistent interfaces for:
11
11
  - Domain-specific analysis methods
12
12
 
13
13
  Example - Generic Session:
14
+ >>> import oscura as osc
14
15
  >>> from oscura.sessions import GenericSession
15
- >>> from oscura.acquisition import FileSource
16
16
  >>>
17
- >>> session = GenericSession()
18
- >>> session.add_recording("test", FileSource("capture.wfm"))
17
+ >>> session = GenericSession(name="Analysis")
18
+ >>> trace = osc.load("capture.wfm")
19
+ >>> session.add_recording("test", trace)
19
20
  >>> results = session.analyze()
20
21
  >>> print(results["summary"]["test"]["mean"])
21
22
 
22
- Example - Domain-Specific Session:
23
- >>> from oscura.sessions import AnalysisSession
24
- >>> from oscura.acquisition import FileSource
23
+ Example - BlackBox Session (Protocol RE):
24
+ >>> from oscura.sessions import BlackBoxSession
25
25
  >>>
26
- >>> class CANSession(AnalysisSession):
27
- ... def analyze(self):
28
- ... # CAN-specific signal discovery
29
- ... return self.discover_signals()
30
- ...
31
- ... def discover_signals(self):
32
- ... # Extract CAN signals from recordings
33
- ... pass
34
- >>>
35
- >>> session = CANSession()
36
- >>> session.add_recording("baseline", FileSource("idle.blf"))
37
- >>> signals = session.analyze()
26
+ >>> session = BlackBoxSession(name="IoT Protocol RE")
27
+ >>> session.add_recording("baseline", osc.load("baseline.wfm"))
28
+ >>> session.add_recording("stimulus", osc.load("button.wfm"))
29
+ >>> diff = session.compare("baseline", "stimulus")
30
+ >>> print(f"Changed: {diff.changed_bytes} bytes")
38
31
 
39
32
  Pattern Decision Table:
40
33
  - Use GenericSession for general waveform analysis
41
- - Extend AnalysisSession for domain-specific workflows
42
- - Use existing session.Session for backward compatibility
34
+ - Use BlackBoxSession for unknown protocol reverse engineering
35
+ - Extend AnalysisSession for custom domain-specific workflows
43
36
 
44
37
  Architecture:
45
38
  Layer 3 (High-Level API) - User-Facing
46
39
  ├── AnalysisSession (ABC)
47
40
  │ ├── GenericSession
48
- │ ├── CANSession (Phase 1)
49
- │ ├── SerialSession (Phase 1)
50
- │ ├── BlackBoxSession (Phase 1)
41
+ │ ├── BlackBoxSession
51
42
  │ └── [Future domain sessions]
52
43
  └── [Workflows wrapping sessions]
53
44
 
oscura/sessions/base.py CHANGED
@@ -6,7 +6,7 @@ for domain-specific sessions (CAN, Serial, BlackBox, etc.).
6
6
 
7
7
  Example:
8
8
  >>> from oscura.sessions import AnalysisSession
9
- >>> from oscura.acquisition import FileSource, HardwareSource
9
+ >>> from oscura.hardware.acquisition import FileSource, HardwareSource
10
10
  >>>
11
11
  >>> # Domain-specific sessions extend AnalysisSession
12
12
  >>> class CANSession(AnalysisSession):
@@ -52,8 +52,8 @@ from pathlib import Path
52
52
  from typing import TYPE_CHECKING, Any
53
53
 
54
54
  if TYPE_CHECKING:
55
- from oscura.acquisition import Source
56
55
  from oscura.core.types import Trace
56
+ from oscura.hardware.acquisition import Source
57
57
 
58
58
 
59
59
  @dataclass
@@ -154,7 +154,7 @@ class AnalysisSession(ABC):
154
154
  ValueError: If name already exists.
155
155
 
156
156
  Example:
157
- >>> from oscura.acquisition import FileSource
157
+ >>> from oscura.hardware.acquisition import FileSource
158
158
  >>> session.add_recording("baseline", FileSource("idle.blf"))
159
159
  >>> session.add_recording("active", FileSource("running.blf"))
160
160
  """