oscura 0.5.0__py3-none-any.whl → 0.6.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 (513) 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/__init__.py +0 -48
  5. oscura/analyzers/digital/edges.py +325 -65
  6. oscura/analyzers/digital/extraction.py +0 -195
  7. oscura/analyzers/digital/quality.py +293 -166
  8. oscura/analyzers/digital/timing.py +260 -115
  9. oscura/analyzers/digital/timing_numba.py +334 -0
  10. oscura/analyzers/entropy.py +605 -0
  11. oscura/analyzers/eye/diagram.py +176 -109
  12. oscura/analyzers/eye/metrics.py +5 -5
  13. oscura/analyzers/jitter/__init__.py +6 -4
  14. oscura/analyzers/jitter/ber.py +52 -52
  15. oscura/analyzers/jitter/classification.py +156 -0
  16. oscura/analyzers/jitter/decomposition.py +163 -113
  17. oscura/analyzers/jitter/spectrum.py +80 -64
  18. oscura/analyzers/ml/__init__.py +39 -0
  19. oscura/analyzers/ml/features.py +600 -0
  20. oscura/analyzers/ml/signal_classifier.py +604 -0
  21. oscura/analyzers/packet/daq.py +246 -158
  22. oscura/analyzers/packet/parser.py +12 -1
  23. oscura/analyzers/packet/payload.py +50 -2110
  24. oscura/analyzers/packet/payload_analysis.py +361 -181
  25. oscura/analyzers/packet/payload_patterns.py +133 -70
  26. oscura/analyzers/packet/stream.py +84 -23
  27. oscura/analyzers/patterns/__init__.py +26 -5
  28. oscura/analyzers/patterns/anomaly_detection.py +908 -0
  29. oscura/analyzers/patterns/clustering.py +169 -108
  30. oscura/analyzers/patterns/clustering_optimized.py +227 -0
  31. oscura/analyzers/patterns/discovery.py +1 -1
  32. oscura/analyzers/patterns/matching.py +581 -197
  33. oscura/analyzers/patterns/pattern_mining.py +778 -0
  34. oscura/analyzers/patterns/periodic.py +121 -38
  35. oscura/analyzers/patterns/sequences.py +175 -78
  36. oscura/analyzers/power/conduction.py +1 -1
  37. oscura/analyzers/power/soa.py +6 -6
  38. oscura/analyzers/power/switching.py +250 -110
  39. oscura/analyzers/protocol/__init__.py +17 -1
  40. oscura/analyzers/protocols/__init__.py +1 -22
  41. oscura/analyzers/protocols/base.py +6 -6
  42. oscura/analyzers/protocols/ble/__init__.py +38 -0
  43. oscura/analyzers/protocols/ble/analyzer.py +809 -0
  44. oscura/analyzers/protocols/ble/uuids.py +288 -0
  45. oscura/analyzers/protocols/can.py +257 -127
  46. oscura/analyzers/protocols/can_fd.py +107 -80
  47. oscura/analyzers/protocols/flexray.py +139 -80
  48. oscura/analyzers/protocols/hdlc.py +93 -58
  49. oscura/analyzers/protocols/i2c.py +247 -106
  50. oscura/analyzers/protocols/i2s.py +138 -86
  51. oscura/analyzers/protocols/industrial/__init__.py +40 -0
  52. oscura/analyzers/protocols/industrial/bacnet/__init__.py +33 -0
  53. oscura/analyzers/protocols/industrial/bacnet/analyzer.py +708 -0
  54. oscura/analyzers/protocols/industrial/bacnet/encoding.py +412 -0
  55. oscura/analyzers/protocols/industrial/bacnet/services.py +622 -0
  56. oscura/analyzers/protocols/industrial/ethercat/__init__.py +30 -0
  57. oscura/analyzers/protocols/industrial/ethercat/analyzer.py +474 -0
  58. oscura/analyzers/protocols/industrial/ethercat/mailbox.py +339 -0
  59. oscura/analyzers/protocols/industrial/ethercat/topology.py +166 -0
  60. oscura/analyzers/protocols/industrial/modbus/__init__.py +31 -0
  61. oscura/analyzers/protocols/industrial/modbus/analyzer.py +525 -0
  62. oscura/analyzers/protocols/industrial/modbus/crc.py +79 -0
  63. oscura/analyzers/protocols/industrial/modbus/functions.py +436 -0
  64. oscura/analyzers/protocols/industrial/opcua/__init__.py +21 -0
  65. oscura/analyzers/protocols/industrial/opcua/analyzer.py +552 -0
  66. oscura/analyzers/protocols/industrial/opcua/datatypes.py +446 -0
  67. oscura/analyzers/protocols/industrial/opcua/services.py +264 -0
  68. oscura/analyzers/protocols/industrial/profinet/__init__.py +23 -0
  69. oscura/analyzers/protocols/industrial/profinet/analyzer.py +441 -0
  70. oscura/analyzers/protocols/industrial/profinet/dcp.py +263 -0
  71. oscura/analyzers/protocols/industrial/profinet/ptcp.py +200 -0
  72. oscura/analyzers/protocols/jtag.py +180 -98
  73. oscura/analyzers/protocols/lin.py +219 -114
  74. oscura/analyzers/protocols/manchester.py +4 -4
  75. oscura/analyzers/protocols/onewire.py +253 -149
  76. oscura/analyzers/protocols/parallel_bus/__init__.py +20 -0
  77. oscura/analyzers/protocols/parallel_bus/centronics.py +92 -0
  78. oscura/analyzers/protocols/parallel_bus/gpib.py +137 -0
  79. oscura/analyzers/protocols/spi.py +192 -95
  80. oscura/analyzers/protocols/swd.py +321 -167
  81. oscura/analyzers/protocols/uart.py +267 -125
  82. oscura/analyzers/protocols/usb.py +235 -131
  83. oscura/analyzers/side_channel/power.py +17 -12
  84. oscura/analyzers/signal/__init__.py +15 -0
  85. oscura/analyzers/signal/timing_analysis.py +1086 -0
  86. oscura/analyzers/signal_integrity/__init__.py +4 -1
  87. oscura/analyzers/signal_integrity/sparams.py +2 -19
  88. oscura/analyzers/spectral/chunked.py +129 -60
  89. oscura/analyzers/spectral/chunked_fft.py +300 -94
  90. oscura/analyzers/spectral/chunked_wavelet.py +100 -80
  91. oscura/analyzers/statistical/checksum.py +376 -217
  92. oscura/analyzers/statistical/classification.py +229 -107
  93. oscura/analyzers/statistical/entropy.py +78 -53
  94. oscura/analyzers/statistics/correlation.py +407 -211
  95. oscura/analyzers/statistics/outliers.py +2 -2
  96. oscura/analyzers/statistics/streaming.py +30 -5
  97. oscura/analyzers/validation.py +216 -101
  98. oscura/analyzers/waveform/measurements.py +9 -0
  99. oscura/analyzers/waveform/measurements_with_uncertainty.py +31 -15
  100. oscura/analyzers/waveform/spectral.py +500 -228
  101. oscura/api/__init__.py +31 -5
  102. oscura/api/dsl/__init__.py +582 -0
  103. oscura/{dsl → api/dsl}/commands.py +43 -76
  104. oscura/{dsl → api/dsl}/interpreter.py +26 -51
  105. oscura/{dsl → api/dsl}/parser.py +107 -77
  106. oscura/{dsl → api/dsl}/repl.py +2 -2
  107. oscura/api/dsl.py +1 -1
  108. oscura/{integrations → api/integrations}/__init__.py +1 -1
  109. oscura/{integrations → api/integrations}/llm.py +201 -102
  110. oscura/api/operators.py +3 -3
  111. oscura/api/optimization.py +144 -30
  112. oscura/api/rest_server.py +921 -0
  113. oscura/api/server/__init__.py +17 -0
  114. oscura/api/server/dashboard.py +850 -0
  115. oscura/api/server/static/README.md +34 -0
  116. oscura/api/server/templates/base.html +181 -0
  117. oscura/api/server/templates/export.html +120 -0
  118. oscura/api/server/templates/home.html +284 -0
  119. oscura/api/server/templates/protocols.html +58 -0
  120. oscura/api/server/templates/reports.html +43 -0
  121. oscura/api/server/templates/session_detail.html +89 -0
  122. oscura/api/server/templates/sessions.html +83 -0
  123. oscura/api/server/templates/waveforms.html +73 -0
  124. oscura/automotive/__init__.py +8 -1
  125. oscura/automotive/can/__init__.py +10 -0
  126. oscura/automotive/can/checksum.py +3 -1
  127. oscura/automotive/can/dbc_generator.py +590 -0
  128. oscura/automotive/can/message_wrapper.py +121 -74
  129. oscura/automotive/can/patterns.py +98 -21
  130. oscura/automotive/can/session.py +292 -56
  131. oscura/automotive/can/state_machine.py +6 -3
  132. oscura/automotive/can/stimulus_response.py +97 -75
  133. oscura/automotive/dbc/__init__.py +10 -2
  134. oscura/automotive/dbc/generator.py +84 -56
  135. oscura/automotive/dbc/parser.py +6 -6
  136. oscura/automotive/dtc/data.json +2763 -0
  137. oscura/automotive/dtc/database.py +2 -2
  138. oscura/automotive/flexray/__init__.py +31 -0
  139. oscura/automotive/flexray/analyzer.py +504 -0
  140. oscura/automotive/flexray/crc.py +185 -0
  141. oscura/automotive/flexray/fibex.py +449 -0
  142. oscura/automotive/j1939/__init__.py +45 -8
  143. oscura/automotive/j1939/analyzer.py +605 -0
  144. oscura/automotive/j1939/spns.py +326 -0
  145. oscura/automotive/j1939/transport.py +306 -0
  146. oscura/automotive/lin/__init__.py +47 -0
  147. oscura/automotive/lin/analyzer.py +612 -0
  148. oscura/automotive/loaders/blf.py +13 -2
  149. oscura/automotive/loaders/csv_can.py +143 -72
  150. oscura/automotive/loaders/dispatcher.py +50 -2
  151. oscura/automotive/loaders/mdf.py +86 -45
  152. oscura/automotive/loaders/pcap.py +111 -61
  153. oscura/automotive/uds/__init__.py +4 -0
  154. oscura/automotive/uds/analyzer.py +725 -0
  155. oscura/automotive/uds/decoder.py +140 -58
  156. oscura/automotive/uds/models.py +7 -1
  157. oscura/automotive/visualization.py +1 -1
  158. oscura/cli/analyze.py +348 -0
  159. oscura/cli/batch.py +142 -122
  160. oscura/cli/benchmark.py +275 -0
  161. oscura/cli/characterize.py +137 -82
  162. oscura/cli/compare.py +224 -131
  163. oscura/cli/completion.py +250 -0
  164. oscura/cli/config_cmd.py +361 -0
  165. oscura/cli/decode.py +164 -87
  166. oscura/cli/export.py +286 -0
  167. oscura/cli/main.py +115 -31
  168. oscura/{onboarding → cli/onboarding}/__init__.py +3 -3
  169. oscura/{onboarding → cli/onboarding}/help.py +80 -58
  170. oscura/{onboarding → cli/onboarding}/tutorials.py +97 -72
  171. oscura/{onboarding → cli/onboarding}/wizard.py +55 -36
  172. oscura/cli/progress.py +147 -0
  173. oscura/cli/shell.py +157 -135
  174. oscura/cli/validate_cmd.py +204 -0
  175. oscura/cli/visualize.py +158 -0
  176. oscura/convenience.py +125 -79
  177. oscura/core/__init__.py +4 -2
  178. oscura/core/backend_selector.py +3 -3
  179. oscura/core/cache.py +126 -15
  180. oscura/core/cancellation.py +1 -1
  181. oscura/{config → core/config}/__init__.py +20 -11
  182. oscura/{config → core/config}/defaults.py +1 -1
  183. oscura/{config → core/config}/loader.py +7 -5
  184. oscura/{config → core/config}/memory.py +5 -5
  185. oscura/{config → core/config}/migration.py +1 -1
  186. oscura/{config → core/config}/pipeline.py +99 -23
  187. oscura/{config → core/config}/preferences.py +1 -1
  188. oscura/{config → core/config}/protocol.py +3 -3
  189. oscura/{config → core/config}/schema.py +426 -272
  190. oscura/{config → core/config}/settings.py +1 -1
  191. oscura/{config → core/config}/thresholds.py +195 -153
  192. oscura/core/correlation.py +5 -6
  193. oscura/core/cross_domain.py +0 -2
  194. oscura/core/debug.py +9 -5
  195. oscura/{extensibility → core/extensibility}/docs.py +158 -70
  196. oscura/{extensibility → core/extensibility}/extensions.py +160 -76
  197. oscura/{extensibility → core/extensibility}/logging.py +1 -1
  198. oscura/{extensibility → core/extensibility}/measurements.py +1 -1
  199. oscura/{extensibility → core/extensibility}/plugins.py +1 -1
  200. oscura/{extensibility → core/extensibility}/templates.py +73 -3
  201. oscura/{extensibility → core/extensibility}/validation.py +1 -1
  202. oscura/core/gpu_backend.py +11 -7
  203. oscura/core/log_query.py +101 -11
  204. oscura/core/logging.py +126 -54
  205. oscura/core/logging_advanced.py +5 -5
  206. oscura/core/memory_limits.py +108 -70
  207. oscura/core/memory_monitor.py +2 -2
  208. oscura/core/memory_progress.py +7 -7
  209. oscura/core/memory_warnings.py +1 -1
  210. oscura/core/numba_backend.py +13 -13
  211. oscura/{plugins → core/plugins}/__init__.py +9 -9
  212. oscura/{plugins → core/plugins}/base.py +7 -7
  213. oscura/{plugins → core/plugins}/cli.py +3 -3
  214. oscura/{plugins → core/plugins}/discovery.py +186 -106
  215. oscura/{plugins → core/plugins}/lifecycle.py +1 -1
  216. oscura/{plugins → core/plugins}/manager.py +7 -7
  217. oscura/{plugins → core/plugins}/registry.py +3 -3
  218. oscura/{plugins → core/plugins}/versioning.py +1 -1
  219. oscura/core/progress.py +16 -1
  220. oscura/core/provenance.py +8 -2
  221. oscura/{schemas → core/schemas}/__init__.py +2 -2
  222. oscura/core/schemas/bus_configuration.json +322 -0
  223. oscura/core/schemas/device_mapping.json +182 -0
  224. oscura/core/schemas/packet_format.json +418 -0
  225. oscura/core/schemas/protocol_definition.json +363 -0
  226. oscura/core/types.py +4 -0
  227. oscura/core/uncertainty.py +3 -3
  228. oscura/correlation/__init__.py +52 -0
  229. oscura/correlation/multi_protocol.py +811 -0
  230. oscura/discovery/auto_decoder.py +117 -35
  231. oscura/discovery/comparison.py +191 -86
  232. oscura/discovery/quality_validator.py +155 -68
  233. oscura/discovery/signal_detector.py +196 -79
  234. oscura/export/__init__.py +18 -20
  235. oscura/export/kaitai_struct.py +513 -0
  236. oscura/export/scapy_layer.py +801 -0
  237. oscura/export/wireshark/README.md +15 -15
  238. oscura/export/wireshark/generator.py +1 -1
  239. oscura/export/wireshark/templates/dissector.lua.j2 +2 -2
  240. oscura/export/wireshark_dissector.py +746 -0
  241. oscura/guidance/wizard.py +207 -111
  242. oscura/hardware/__init__.py +19 -0
  243. oscura/{acquisition → hardware/acquisition}/__init__.py +4 -4
  244. oscura/{acquisition → hardware/acquisition}/file.py +2 -2
  245. oscura/{acquisition → hardware/acquisition}/hardware.py +7 -7
  246. oscura/{acquisition → hardware/acquisition}/saleae.py +15 -12
  247. oscura/{acquisition → hardware/acquisition}/socketcan.py +1 -1
  248. oscura/{acquisition → hardware/acquisition}/streaming.py +2 -2
  249. oscura/{acquisition → hardware/acquisition}/synthetic.py +3 -3
  250. oscura/{acquisition → hardware/acquisition}/visa.py +33 -11
  251. oscura/hardware/firmware/__init__.py +29 -0
  252. oscura/hardware/firmware/pattern_recognition.py +874 -0
  253. oscura/hardware/hal_detector.py +736 -0
  254. oscura/hardware/security/__init__.py +37 -0
  255. oscura/hardware/security/side_channel_detector.py +1126 -0
  256. oscura/inference/__init__.py +4 -0
  257. oscura/inference/active_learning/README.md +7 -7
  258. oscura/inference/active_learning/observation_table.py +4 -1
  259. oscura/inference/alignment.py +216 -123
  260. oscura/inference/bayesian.py +113 -33
  261. oscura/inference/crc_reverse.py +101 -55
  262. oscura/inference/logic.py +6 -2
  263. oscura/inference/message_format.py +342 -183
  264. oscura/inference/protocol.py +95 -44
  265. oscura/inference/protocol_dsl.py +180 -82
  266. oscura/inference/signal_intelligence.py +1439 -706
  267. oscura/inference/spectral.py +99 -57
  268. oscura/inference/state_machine.py +810 -158
  269. oscura/inference/stream.py +270 -110
  270. oscura/iot/__init__.py +34 -0
  271. oscura/iot/coap/__init__.py +32 -0
  272. oscura/iot/coap/analyzer.py +668 -0
  273. oscura/iot/coap/options.py +212 -0
  274. oscura/iot/lorawan/__init__.py +21 -0
  275. oscura/iot/lorawan/crypto.py +206 -0
  276. oscura/iot/lorawan/decoder.py +801 -0
  277. oscura/iot/lorawan/mac_commands.py +341 -0
  278. oscura/iot/mqtt/__init__.py +27 -0
  279. oscura/iot/mqtt/analyzer.py +999 -0
  280. oscura/iot/mqtt/properties.py +315 -0
  281. oscura/iot/zigbee/__init__.py +31 -0
  282. oscura/iot/zigbee/analyzer.py +615 -0
  283. oscura/iot/zigbee/security.py +153 -0
  284. oscura/iot/zigbee/zcl.py +349 -0
  285. oscura/jupyter/display.py +125 -45
  286. oscura/{exploratory → jupyter/exploratory}/__init__.py +8 -8
  287. oscura/{exploratory → jupyter/exploratory}/error_recovery.py +298 -141
  288. oscura/jupyter/exploratory/fuzzy.py +746 -0
  289. oscura/{exploratory → jupyter/exploratory}/fuzzy_advanced.py +258 -100
  290. oscura/{exploratory → jupyter/exploratory}/legacy.py +464 -242
  291. oscura/{exploratory → jupyter/exploratory}/parse.py +167 -145
  292. oscura/{exploratory → jupyter/exploratory}/recovery.py +119 -87
  293. oscura/jupyter/exploratory/sync.py +612 -0
  294. oscura/{exploratory → jupyter/exploratory}/unknown.py +299 -176
  295. oscura/jupyter/magic.py +4 -4
  296. oscura/{ui → jupyter/ui}/__init__.py +2 -2
  297. oscura/{ui → jupyter/ui}/formatters.py +3 -3
  298. oscura/{ui → jupyter/ui}/progressive_display.py +153 -82
  299. oscura/loaders/__init__.py +171 -63
  300. oscura/loaders/binary.py +88 -1
  301. oscura/loaders/chipwhisperer.py +153 -137
  302. oscura/loaders/configurable.py +208 -86
  303. oscura/loaders/csv_loader.py +458 -215
  304. oscura/loaders/hdf5_loader.py +278 -119
  305. oscura/loaders/lazy.py +87 -54
  306. oscura/loaders/mmap_loader.py +1 -1
  307. oscura/loaders/numpy_loader.py +253 -116
  308. oscura/loaders/pcap.py +226 -151
  309. oscura/loaders/rigol.py +110 -49
  310. oscura/loaders/sigrok.py +201 -78
  311. oscura/loaders/tdms.py +81 -58
  312. oscura/loaders/tektronix.py +291 -174
  313. oscura/loaders/touchstone.py +182 -87
  314. oscura/loaders/vcd.py +215 -117
  315. oscura/loaders/wav.py +155 -68
  316. oscura/reporting/__init__.py +9 -7
  317. oscura/reporting/analyze.py +352 -146
  318. oscura/reporting/argument_preparer.py +69 -14
  319. oscura/reporting/auto_report.py +97 -61
  320. oscura/reporting/batch.py +131 -58
  321. oscura/reporting/chart_selection.py +57 -45
  322. oscura/reporting/comparison.py +63 -17
  323. oscura/reporting/content/executive.py +76 -24
  324. oscura/reporting/core_formats/multi_format.py +11 -8
  325. oscura/reporting/engine.py +312 -158
  326. oscura/reporting/enhanced_reports.py +949 -0
  327. oscura/reporting/export.py +86 -43
  328. oscura/reporting/formatting/numbers.py +69 -42
  329. oscura/reporting/html.py +139 -58
  330. oscura/reporting/index.py +137 -65
  331. oscura/reporting/output.py +158 -67
  332. oscura/reporting/pdf.py +67 -102
  333. oscura/reporting/plots.py +191 -112
  334. oscura/reporting/sections.py +88 -47
  335. oscura/reporting/standards.py +104 -61
  336. oscura/reporting/summary_generator.py +75 -55
  337. oscura/reporting/tables.py +138 -54
  338. oscura/reporting/templates/enhanced/protocol_re.html +525 -0
  339. oscura/reporting/templates/index.md +13 -13
  340. oscura/sessions/__init__.py +14 -23
  341. oscura/sessions/base.py +3 -3
  342. oscura/sessions/blackbox.py +106 -10
  343. oscura/sessions/generic.py +2 -2
  344. oscura/sessions/legacy.py +783 -0
  345. oscura/side_channel/__init__.py +63 -0
  346. oscura/side_channel/dpa.py +1025 -0
  347. oscura/utils/__init__.py +15 -1
  348. oscura/utils/autodetect.py +1 -5
  349. oscura/utils/bitwise.py +118 -0
  350. oscura/{builders → utils/builders}/__init__.py +1 -1
  351. oscura/{comparison → utils/comparison}/__init__.py +6 -6
  352. oscura/{comparison → utils/comparison}/compare.py +202 -101
  353. oscura/{comparison → utils/comparison}/golden.py +83 -63
  354. oscura/{comparison → utils/comparison}/limits.py +313 -89
  355. oscura/{comparison → utils/comparison}/mask.py +151 -45
  356. oscura/{comparison → utils/comparison}/trace_diff.py +1 -1
  357. oscura/{comparison → utils/comparison}/visualization.py +147 -89
  358. oscura/{component → utils/component}/__init__.py +3 -3
  359. oscura/{component → utils/component}/impedance.py +122 -58
  360. oscura/{component → utils/component}/reactive.py +165 -168
  361. oscura/{component → utils/component}/transmission_line.py +3 -3
  362. oscura/{filtering → utils/filtering}/__init__.py +6 -6
  363. oscura/{filtering → utils/filtering}/base.py +1 -1
  364. oscura/{filtering → utils/filtering}/convenience.py +2 -2
  365. oscura/{filtering → utils/filtering}/design.py +169 -93
  366. oscura/{filtering → utils/filtering}/filters.py +2 -2
  367. oscura/{filtering → utils/filtering}/introspection.py +2 -2
  368. oscura/utils/geometry.py +31 -0
  369. oscura/utils/imports.py +184 -0
  370. oscura/utils/lazy.py +1 -1
  371. oscura/{math → utils/math}/__init__.py +2 -2
  372. oscura/{math → utils/math}/arithmetic.py +114 -48
  373. oscura/{math → utils/math}/interpolation.py +139 -106
  374. oscura/utils/memory.py +129 -66
  375. oscura/utils/memory_advanced.py +92 -9
  376. oscura/utils/memory_extensions.py +10 -8
  377. oscura/{optimization → utils/optimization}/__init__.py +1 -1
  378. oscura/{optimization → utils/optimization}/search.py +2 -2
  379. oscura/utils/performance/__init__.py +58 -0
  380. oscura/utils/performance/caching.py +889 -0
  381. oscura/utils/performance/lsh_clustering.py +333 -0
  382. oscura/utils/performance/memory_optimizer.py +699 -0
  383. oscura/utils/performance/optimizations.py +675 -0
  384. oscura/utils/performance/parallel.py +654 -0
  385. oscura/utils/performance/profiling.py +661 -0
  386. oscura/{pipeline → utils/pipeline}/base.py +1 -1
  387. oscura/{pipeline → utils/pipeline}/composition.py +11 -3
  388. oscura/{pipeline → utils/pipeline}/parallel.py +3 -2
  389. oscura/{pipeline → utils/pipeline}/pipeline.py +1 -1
  390. oscura/{pipeline → utils/pipeline}/reverse_engineering.py +412 -221
  391. oscura/{search → utils/search}/__init__.py +3 -3
  392. oscura/{search → utils/search}/anomaly.py +188 -58
  393. oscura/utils/search/context.py +294 -0
  394. oscura/{search → utils/search}/pattern.py +138 -10
  395. oscura/utils/serial.py +51 -0
  396. oscura/utils/storage/__init__.py +61 -0
  397. oscura/utils/storage/database.py +1166 -0
  398. oscura/{streaming → utils/streaming}/chunked.py +302 -143
  399. oscura/{streaming → utils/streaming}/progressive.py +1 -1
  400. oscura/{streaming → utils/streaming}/realtime.py +3 -2
  401. oscura/{triggering → utils/triggering}/__init__.py +6 -6
  402. oscura/{triggering → utils/triggering}/base.py +6 -6
  403. oscura/{triggering → utils/triggering}/edge.py +2 -2
  404. oscura/{triggering → utils/triggering}/pattern.py +2 -2
  405. oscura/{triggering → utils/triggering}/pulse.py +115 -74
  406. oscura/{triggering → utils/triggering}/window.py +2 -2
  407. oscura/utils/validation.py +32 -0
  408. oscura/validation/__init__.py +121 -0
  409. oscura/{compliance → validation/compliance}/__init__.py +5 -5
  410. oscura/{compliance → validation/compliance}/advanced.py +5 -5
  411. oscura/{compliance → validation/compliance}/masks.py +1 -1
  412. oscura/{compliance → validation/compliance}/reporting.py +127 -53
  413. oscura/{compliance → validation/compliance}/testing.py +114 -52
  414. oscura/validation/compliance_tests.py +915 -0
  415. oscura/validation/fuzzer.py +990 -0
  416. oscura/validation/grammar_tests.py +596 -0
  417. oscura/validation/grammar_validator.py +904 -0
  418. oscura/validation/hil_testing.py +977 -0
  419. oscura/{quality → validation/quality}/__init__.py +4 -4
  420. oscura/{quality → validation/quality}/ensemble.py +251 -171
  421. oscura/{quality → validation/quality}/explainer.py +3 -3
  422. oscura/{quality → validation/quality}/scoring.py +1 -1
  423. oscura/{quality → validation/quality}/warnings.py +4 -4
  424. oscura/validation/regression_suite.py +808 -0
  425. oscura/validation/replay.py +788 -0
  426. oscura/{testing → validation/testing}/__init__.py +2 -2
  427. oscura/{testing → validation/testing}/synthetic.py +5 -5
  428. oscura/visualization/__init__.py +9 -0
  429. oscura/visualization/accessibility.py +1 -1
  430. oscura/visualization/annotations.py +64 -67
  431. oscura/visualization/colors.py +7 -7
  432. oscura/visualization/digital.py +180 -81
  433. oscura/visualization/eye.py +236 -85
  434. oscura/visualization/interactive.py +320 -143
  435. oscura/visualization/jitter.py +587 -247
  436. oscura/visualization/layout.py +169 -134
  437. oscura/visualization/optimization.py +103 -52
  438. oscura/visualization/palettes.py +1 -1
  439. oscura/visualization/power.py +427 -211
  440. oscura/visualization/power_extended.py +626 -297
  441. oscura/visualization/presets.py +2 -0
  442. oscura/visualization/protocols.py +495 -181
  443. oscura/visualization/render.py +79 -63
  444. oscura/visualization/reverse_engineering.py +171 -124
  445. oscura/visualization/signal_integrity.py +460 -279
  446. oscura/visualization/specialized.py +190 -100
  447. oscura/visualization/spectral.py +670 -255
  448. oscura/visualization/thumbnails.py +166 -137
  449. oscura/visualization/waveform.py +150 -63
  450. oscura/workflows/__init__.py +3 -0
  451. oscura/{batch → workflows/batch}/__init__.py +5 -5
  452. oscura/{batch → workflows/batch}/advanced.py +150 -75
  453. oscura/workflows/batch/aggregate.py +531 -0
  454. oscura/workflows/batch/analyze.py +236 -0
  455. oscura/{batch → workflows/batch}/logging.py +2 -2
  456. oscura/{batch → workflows/batch}/metrics.py +1 -1
  457. oscura/workflows/complete_re.py +1144 -0
  458. oscura/workflows/compliance.py +44 -54
  459. oscura/workflows/digital.py +197 -51
  460. oscura/workflows/legacy/__init__.py +12 -0
  461. oscura/{workflow → workflows/legacy}/dag.py +4 -1
  462. oscura/workflows/multi_trace.py +9 -9
  463. oscura/workflows/power.py +42 -62
  464. oscura/workflows/protocol.py +82 -49
  465. oscura/workflows/reverse_engineering.py +351 -150
  466. oscura/workflows/signal_integrity.py +157 -82
  467. oscura-0.6.0.dist-info/METADATA +643 -0
  468. oscura-0.6.0.dist-info/RECORD +590 -0
  469. oscura/analyzers/digital/ic_database.py +0 -498
  470. oscura/analyzers/digital/timing_paths.py +0 -339
  471. oscura/analyzers/digital/vintage.py +0 -377
  472. oscura/analyzers/digital/vintage_result.py +0 -148
  473. oscura/analyzers/protocols/parallel_bus.py +0 -449
  474. oscura/batch/aggregate.py +0 -300
  475. oscura/batch/analyze.py +0 -139
  476. oscura/dsl/__init__.py +0 -73
  477. oscura/exceptions.py +0 -59
  478. oscura/exploratory/fuzzy.py +0 -513
  479. oscura/exploratory/sync.py +0 -384
  480. oscura/export/wavedrom.py +0 -430
  481. oscura/exporters/__init__.py +0 -94
  482. oscura/exporters/csv.py +0 -303
  483. oscura/exporters/exporters.py +0 -44
  484. oscura/exporters/hdf5.py +0 -217
  485. oscura/exporters/html_export.py +0 -701
  486. oscura/exporters/json_export.py +0 -338
  487. oscura/exporters/markdown_export.py +0 -367
  488. oscura/exporters/matlab_export.py +0 -354
  489. oscura/exporters/npz_export.py +0 -219
  490. oscura/exporters/spice_export.py +0 -210
  491. oscura/exporters/vintage_logic_csv.py +0 -247
  492. oscura/reporting/vintage_logic_report.py +0 -523
  493. oscura/search/context.py +0 -149
  494. oscura/session/__init__.py +0 -34
  495. oscura/session/annotations.py +0 -289
  496. oscura/session/history.py +0 -313
  497. oscura/session/session.py +0 -520
  498. oscura/visualization/digital_advanced.py +0 -718
  499. oscura/visualization/figure_manager.py +0 -156
  500. oscura/workflow/__init__.py +0 -13
  501. oscura-0.5.0.dist-info/METADATA +0 -407
  502. oscura-0.5.0.dist-info/RECORD +0 -486
  503. /oscura/core/{config.py → config/legacy.py} +0 -0
  504. /oscura/{extensibility → core/extensibility}/__init__.py +0 -0
  505. /oscura/{extensibility → core/extensibility}/registry.py +0 -0
  506. /oscura/{plugins → core/plugins}/isolation.py +0 -0
  507. /oscura/{builders → utils/builders}/signal_builder.py +0 -0
  508. /oscura/{optimization → utils/optimization}/parallel.py +0 -0
  509. /oscura/{pipeline → utils/pipeline}/__init__.py +0 -0
  510. /oscura/{streaming → utils/streaming}/__init__.py +0 -0
  511. {oscura-0.5.0.dist-info → oscura-0.6.0.dist-info}/WHEEL +0 -0
  512. {oscura-0.5.0.dist-info → oscura-0.6.0.dist-info}/entry_points.txt +0 -0
  513. {oscura-0.5.0.dist-info → oscura-0.6.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,643 @@
1
+ Metadata-Version: 2.4
2
+ Name: oscura
3
+ Version: 0.6.0
4
+ Summary: Unified hardware reverse engineering framework. Extract all information from any system through signals and data. Unknown protocol discovery, state machine extraction, CRC recovery, security analysis. 16+ protocols, IEEE-compliant measurements.
5
+ Project-URL: Homepage, https://github.com/oscura-re/oscura
6
+ Project-URL: Documentation, https://github.com/oscura-re/oscura/tree/main/docs
7
+ Project-URL: Repository, https://github.com/oscura-re/oscura
8
+ Project-URL: Changelog, https://github.com/oscura-re/oscura/blob/main/CHANGELOG.md
9
+ Project-URL: Issue Tracker, https://github.com/oscura-re/oscura/issues
10
+ Project-URL: Discussions, https://github.com/oscura-re/oscura/discussions
11
+ License-Expression: MIT
12
+ License-File: LICENSE
13
+ Keywords: automotive-protocols,can-bus,crc-recovery,device-replication,embedded-systems,exploitation,hardware-reverse-engineering,hardware-security,i2c,ieee-compliance,logic-analyzer,obd-ii,oscilloscope,protocol-analysis,protocol-decoder,protocol-inference,reverse-engineering,right-to-repair,security-research,signal-analysis,spectral-analysis,spi,state-machine-learning,uart,unknown-protocol,vulnerability-analysis,waveform-analysis
14
+ Classifier: Development Status :: 3 - Alpha
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: Intended Audience :: Information Technology
17
+ Classifier: Intended Audience :: Science/Research
18
+ Classifier: Intended Audience :: Telecommunications Industry
19
+ Classifier: License :: OSI Approved :: MIT License
20
+ Classifier: Operating System :: OS Independent
21
+ Classifier: Programming Language :: Python :: 3
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
24
+ Classifier: Topic :: Scientific/Engineering
25
+ Classifier: Topic :: Scientific/Engineering :: Information Analysis
26
+ Classifier: Topic :: Security
27
+ Classifier: Topic :: System :: Hardware
28
+ Classifier: Topic :: System :: Hardware :: Hardware Drivers
29
+ Classifier: Typing :: Typed
30
+ Requires-Python: >=3.12
31
+ Requires-Dist: click<9.0.0,>=8.1.0
32
+ Requires-Dist: dpkt<2.0.0,>=1.9.0
33
+ Requires-Dist: numpy<3.0.0,>=1.24.0
34
+ Requires-Dist: pyyaml<7.0.0,>=6.0
35
+ Requires-Dist: scipy<2.0.0,>=1.10.0
36
+ Requires-Dist: tm-data-types<1.0.0,>=0.3.0
37
+ Requires-Dist: tqdm<5.0.0,>=4.65.0
38
+ Provides-Extra: all
39
+ Requires-Dist: asammdf<9.0.0,>=8.0.0; extra == 'all'
40
+ Requires-Dist: cantools<40.0.0,>=39.4.0; extra == 'all'
41
+ Requires-Dist: check-jsonschema<1.0.0,>=0.29.0; extra == 'all'
42
+ Requires-Dist: coverage[toml]<8.0.0,>=7.0; extra == 'all'
43
+ Requires-Dist: cryptography<47.0.0,>=44.0.1; extra == 'all'
44
+ Requires-Dist: h5py<4.0.0,>=3.0.0; extra == 'all'
45
+ Requires-Dist: hypothesis<7.0.0,>=6.0.0; extra == 'all'
46
+ Requires-Dist: interrogate<2.0.0,>=1.7.0; extra == 'all'
47
+ Requires-Dist: ipython<9.0.0,>=8.0.0; extra == 'all'
48
+ Requires-Dist: jinja2<4.0.0,>=3.1; extra == 'all'
49
+ Requires-Dist: jupyter<2.0.0,>=1.0.0; extra == 'all'
50
+ Requires-Dist: matplotlib<4.0.0,>=3.7.0; extra == 'all'
51
+ Requires-Dist: mypy<2.0.0,>=1.0; extra == 'all'
52
+ Requires-Dist: nbconvert!=7.16.6,<8.0.0,>=7.0.0; extra == 'all'
53
+ Requires-Dist: networkx<4.0.0,>=3.0; extra == 'all'
54
+ Requires-Dist: nptdms<2.0.0,>=1.7.0; extra == 'all'
55
+ Requires-Dist: openpyxl<4.0.0,>=3.0.0; extra == 'all'
56
+ Requires-Dist: pandas<3.0.0,>=2.0.0; extra == 'all'
57
+ Requires-Dist: pre-commit<5.0.0,>=4.0.0; extra == 'all'
58
+ Requires-Dist: psutil<7.0.0,>=5.9.0; extra == 'all'
59
+ Requires-Dist: pyserial<4.0.0,>=3.5; extra == 'all'
60
+ Requires-Dist: pytest-asyncio<1.0.0,>=0.23.0; extra == 'all'
61
+ Requires-Dist: pytest-benchmark<6.0.0,>=4.0.0; extra == 'all'
62
+ Requires-Dist: pytest-cov<8.0.0,>=6.0; extra == 'all'
63
+ Requires-Dist: pytest-randomly<4.0.0,>=3.0; extra == 'all'
64
+ Requires-Dist: pytest-rerunfailures<17.0,>=16.0; extra == 'all'
65
+ Requires-Dist: pytest-split<1.0.0,>=0.10.0; extra == 'all'
66
+ Requires-Dist: pytest-timeout<3.0.0,>=2.3.0; extra == 'all'
67
+ Requires-Dist: pytest-xdist<4.0.0,>=3.0; extra == 'all'
68
+ Requires-Dist: pytest<10.0.0,>=8.0; extra == 'all'
69
+ Requires-Dist: python-can<5.0.0,>=4.4.0; extra == 'all'
70
+ Requires-Dist: python-pptx<1.0.0,>=0.6.21; extra == 'all'
71
+ Requires-Dist: pyvisa-py<1.0.0,>=0.7.0; extra == 'all'
72
+ Requires-Dist: pyvisa<2.0.0,>=1.13.0; extra == 'all'
73
+ Requires-Dist: pywavelets<2.0.0,>=1.0.0; extra == 'all'
74
+ Requires-Dist: rapidfuzz<4.0.0,>=3.0.0; extra == 'all'
75
+ Requires-Dist: reportlab<6.0.0,>=4.4.7; extra == 'all'
76
+ Requires-Dist: rigolwfm<2.0.0,>=1.0.0; extra == 'all'
77
+ Requires-Dist: ruff<1.0.0,>=0.8.0; extra == 'all'
78
+ Requires-Dist: scapy<3.0.0,>=2.5.0; extra == 'all'
79
+ Requires-Dist: scikit-learn<2.0.0,>=1.3.0; extra == 'all'
80
+ Requires-Dist: types-pyyaml<7.0.0,>=6.0; extra == 'all'
81
+ Requires-Dist: yamllint<2.0.0,>=1.35; extra == 'all'
82
+ Provides-Extra: analysis
83
+ Requires-Dist: networkx<4.0.0,>=3.0; extra == 'analysis'
84
+ Requires-Dist: pywavelets<2.0.0,>=1.0.0; extra == 'analysis'
85
+ Requires-Dist: scikit-learn<2.0.0,>=1.3.0; extra == 'analysis'
86
+ Provides-Extra: automotive
87
+ Requires-Dist: asammdf<9.0.0,>=8.0.0; extra == 'automotive'
88
+ Requires-Dist: cantools<40.0.0,>=39.4.0; extra == 'automotive'
89
+ Requires-Dist: python-can<5.0.0,>=4.4.0; extra == 'automotive'
90
+ Requires-Dist: scapy<3.0.0,>=2.5.0; extra == 'automotive'
91
+ Provides-Extra: dataframes
92
+ Requires-Dist: openpyxl<4.0.0,>=3.0.0; extra == 'dataframes'
93
+ Requires-Dist: pandas<3.0.0,>=2.0.0; extra == 'dataframes'
94
+ Provides-Extra: dev
95
+ Requires-Dist: check-jsonschema<1.0.0,>=0.29.0; extra == 'dev'
96
+ Requires-Dist: coverage[toml]<8.0.0,>=7.0; extra == 'dev'
97
+ Requires-Dist: hypothesis<7.0.0,>=6.0.0; extra == 'dev'
98
+ Requires-Dist: interrogate<2.0.0,>=1.7.0; extra == 'dev'
99
+ Requires-Dist: mypy<2.0.0,>=1.0; extra == 'dev'
100
+ Requires-Dist: pre-commit<5.0.0,>=4.0.0; extra == 'dev'
101
+ Requires-Dist: pytest-asyncio<1.0.0,>=0.23.0; extra == 'dev'
102
+ Requires-Dist: pytest-benchmark<6.0.0,>=4.0.0; extra == 'dev'
103
+ Requires-Dist: pytest-cov<8.0.0,>=6.0; extra == 'dev'
104
+ Requires-Dist: pytest-randomly<4.0.0,>=3.0; extra == 'dev'
105
+ Requires-Dist: pytest-rerunfailures<17.0,>=16.0; extra == 'dev'
106
+ Requires-Dist: pytest-split<1.0.0,>=0.10.0; extra == 'dev'
107
+ Requires-Dist: pytest-timeout<3.0.0,>=2.3.0; extra == 'dev'
108
+ Requires-Dist: pytest-xdist<4.0.0,>=3.0; extra == 'dev'
109
+ Requires-Dist: pytest<10.0.0,>=8.0; extra == 'dev'
110
+ Requires-Dist: ruff<1.0.0,>=0.8.0; extra == 'dev'
111
+ Requires-Dist: types-pyyaml<7.0.0,>=6.0; extra == 'dev'
112
+ Requires-Dist: yamllint<2.0.0,>=1.35; extra == 'dev'
113
+ Provides-Extra: fuzzy
114
+ Requires-Dist: rapidfuzz<4.0.0,>=3.0.0; extra == 'fuzzy'
115
+ Provides-Extra: hardware
116
+ Requires-Dist: pyserial<4.0.0,>=3.5; extra == 'hardware'
117
+ Requires-Dist: pyvisa-py<1.0.0,>=0.7.0; extra == 'hardware'
118
+ Requires-Dist: pyvisa<2.0.0,>=1.13.0; extra == 'hardware'
119
+ Provides-Extra: hdf5
120
+ Requires-Dist: h5py<4.0.0,>=3.0.0; extra == 'hdf5'
121
+ Provides-Extra: iot
122
+ Requires-Dist: cryptography<47.0.0,>=44.0.1; extra == 'iot'
123
+ Provides-Extra: jupyter
124
+ Requires-Dist: ipython<9.0.0,>=8.0.0; extra == 'jupyter'
125
+ Requires-Dist: jupyter<2.0.0,>=1.0.0; extra == 'jupyter'
126
+ Requires-Dist: nbconvert!=7.16.6,<8.0.0,>=7.0.0; extra == 'jupyter'
127
+ Provides-Extra: oscilloscopes
128
+ Requires-Dist: nptdms<2.0.0,>=1.7.0; extra == 'oscilloscopes'
129
+ Requires-Dist: rigolwfm<2.0.0,>=1.0.0; extra == 'oscilloscopes'
130
+ Provides-Extra: reporting
131
+ Requires-Dist: jinja2<4.0.0,>=3.1; extra == 'reporting'
132
+ Requires-Dist: matplotlib<4.0.0,>=3.7.0; extra == 'reporting'
133
+ Requires-Dist: python-pptx<1.0.0,>=0.6.21; extra == 'reporting'
134
+ Requires-Dist: reportlab<6.0.0,>=4.4.7; extra == 'reporting'
135
+ Provides-Extra: standard
136
+ Requires-Dist: jinja2<4.0.0,>=3.1; extra == 'standard'
137
+ Requires-Dist: matplotlib<4.0.0,>=3.7.0; extra == 'standard'
138
+ Requires-Dist: openpyxl<4.0.0,>=3.0.0; extra == 'standard'
139
+ Requires-Dist: pandas<3.0.0,>=2.0.0; extra == 'standard'
140
+ Requires-Dist: psutil<7.0.0,>=5.9.0; extra == 'standard'
141
+ Requires-Dist: python-pptx<1.0.0,>=0.6.21; extra == 'standard'
142
+ Requires-Dist: reportlab<6.0.0,>=4.4.7; extra == 'standard'
143
+ Provides-Extra: system
144
+ Requires-Dist: psutil<7.0.0,>=5.9.0; extra == 'system'
145
+ Provides-Extra: visualization
146
+ Requires-Dist: matplotlib<4.0.0,>=3.7.0; extra == 'visualization'
147
+ Description-Content-Type: text/markdown
148
+
149
+ # Oscura
150
+
151
+ **Workflow automation for hardware reverse engineering.** Stop juggling seven different tools to analyze one capture. Oscura chains specialized tools (sigrok, ChipWhisperer, scipy) into unified Python workflows—from oscilloscope files to Wireshark dissectors without manual conversions or context switching.
152
+
153
+ [![CI](https://github.com/oscura-re/oscura/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/oscura-re/oscura/actions/workflows/ci.yml)
154
+ [![Code Quality](https://github.com/oscura-re/oscura/actions/workflows/code-quality.yml/badge.svg?branch=main)](https://github.com/oscura-re/oscura/actions/workflows/code-quality.yml)
155
+ [![codecov](https://codecov.io/gh/oscura-re/oscura/graph/badge.svg)](https://codecov.io/gh/oscura-re/oscura)
156
+ [![PyPI version](https://img.shields.io/pypi/v/oscura)](https://pypi.org/project/oscura/)
157
+ [![Python 3.12+](https://img.shields.io/badge/python-3.12+-blue.svg)](https://www.python.org/downloads/)
158
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
159
+
160
+ ---
161
+
162
+ ## The Problem
163
+
164
+ Hardware reverse engineering means juggling specialized tools:
165
+
166
+ 1. Export oscilloscope waveforms (vendor-specific formats)
167
+ 2. Convert formats for analysis (sigrok, custom scripts)
168
+ 3. Decode protocols (PulseView, separate decoders)
169
+ 4. Infer unknown protocols (Netzob, manual analysis)
170
+ 5. Reverse checksums (CRC RevEng, separate tool)
171
+ 6. Generate documentation (manual Wireshark dissectors, DBC files)
172
+ 7. Repeat for each new capture
173
+
174
+ **Each step requires different tools, manual file conversions, and context switching.** Binary reverse engineering solved this decades ago with integrated platforms (Ghidra, radare2, IDA). Hardware RE remains fragmented.
175
+
176
+ ## The Solution
177
+
178
+ Oscura automates complete workflows in Python:
179
+
180
+ **What We Integrate:**
181
+
182
+ - Protocol decoding via [sigrok](https://sigrok.org/) (UART, SPI, I2C, CAN, etc.)
183
+ - Signal processing with scipy/numpy
184
+ - Side-channel trace formats (ChipWhisperer)
185
+ - Automotive protocols (cantools integration)
186
+
187
+ **What We Add:**
188
+
189
+ - **Hypothesis-driven RE workflows** with differential analysis and confidence scoring
190
+ - **Automatic Wireshark dissector generation** from inferred protocols
191
+ - **DBC file generation** from raw CAN captures (no manual signal definition)
192
+ - **Multi-format file loading** (Tektronix, Rigol, Sigrok, BLF, PCAP, ChipWhisperer)
193
+ - **CRC/checksum recovery** from message-checksum pairs
194
+ - **Unified Python API** eliminating tool-hopping and format conversions
195
+
196
+ **Value proposition:** Write one Python script instead of:
197
+
198
+ 1. Exporting from oscilloscope software (vendor GUI)
199
+ 2. Converting formats (sigrok-cli, custom scripts)
200
+ 3. Decoding protocols (PulseView manual selection)
201
+ 4. Inferring message formats (Netzob or manual)
202
+ 5. Recovering checksums (CRC RevEng separate invocation)
203
+ 6. Writing dissectors (manual Lua coding)
204
+ 7. Documenting findings (manual reports)
205
+
206
+ ---
207
+
208
+ ## Quick Start
209
+
210
+ ### Installation
211
+
212
+ ```bash
213
+ # Production use
214
+ pip install oscura
215
+
216
+ # Development (recommended - includes all features)
217
+ git clone https://github.com/oscura-re/oscura.git
218
+ cd oscura
219
+ ./scripts/setup.sh
220
+ ```
221
+
222
+ **Requirements:** Python 3.12+ | [Dependencies](pyproject.toml)
223
+
224
+ ### Workflow Examples
225
+
226
+ **Reverse engineer unknown protocol (differential analysis):**
227
+
228
+ ```python
229
+ from oscura.sessions import BlackBoxSession
230
+
231
+ # Create analysis session with hypothesis tracking
232
+ session = BlackBoxSession(name="IoT Device RE")
233
+
234
+ # Differential analysis: idle vs active states
235
+ session.add_recording("idle", "idle.bin")
236
+ session.add_recording("button_press", "button.bin")
237
+ diff = session.compare("idle", "button_press")
238
+
239
+ # Automatic field detection with confidence scoring
240
+ spec = session.generate_protocol_spec()
241
+ print(f"Identified {len(spec['fields'])} protocol fields")
242
+
243
+ # Export validated Wireshark dissector (Lua)
244
+ session.export_results("dissector", "protocol.lua")
245
+ ```
246
+
247
+ **Generate automotive DBC from raw CAN captures:**
248
+
249
+ ```python
250
+ from oscura.automotive.can import CANSession
251
+
252
+ session = CANSession(name="Vehicle RE")
253
+ session.add_recording("idle", "idle.blf")
254
+ session.add_recording("accelerate", "accel.blf")
255
+
256
+ # Statistical stimulus-response analysis
257
+ diff = session.compare("idle", "accelerate")
258
+ print(f"Changed CAN IDs: {diff.details['changed_ids']}")
259
+
260
+ # Generate DBC file (signal definitions inferred automatically)
261
+ session.export_dbc("vehicle.dbc") # Import into CANalyzer, Vehicle Spy, Wireshark
262
+ ```
263
+
264
+ **Recover CRC specification from unknown protocol:**
265
+
266
+ ```python
267
+ from oscura.inference.crc_reverse import CRCReverser
268
+
269
+ # Just 4 message-checksum pairs needed
270
+ messages = [b"\x01\x02\x03", b"\x04\x05\x06", b"\x07\x08\x09", b"\x0a\x0b\x0c"]
271
+ checksums = [0x12, 0x34, 0x56, 0x78]
272
+
273
+ # Recover complete CRC specification
274
+ reverser = CRCReverser(message_bits=8)
275
+ crc = reverser.find_crc(list(zip(messages, checksums)))
276
+
277
+ print(f"Polynomial: 0x{crc.polynomial:02X}")
278
+ print(f"Init: 0x{crc.init_value:02X}, XOR out: 0x{crc.xor_out:02X}")
279
+ print(f"Standard: {crc.standard_name or 'Custom'}") # Matches CRC-8, CRC-16, etc.
280
+ ```
281
+
282
+ **Auto-detect protocol from oscilloscope capture:**
283
+
284
+ ```python
285
+ import oscura as osc
286
+
287
+ # Load Tektronix/Rigol waveform
288
+ trace = osc.load("mystery_device.wfm")
289
+
290
+ # Statistical protocol detection (timing, voltage levels, bit patterns)
291
+ result = osc.auto_decode(trace)
292
+ print(f"Detected {result.protocol}: {len(result.frames)} frames decoded")
293
+ ```
294
+
295
+ [**6 working examples**](examples/) demonstrating core workflows and analysis patterns.
296
+
297
+ ---
298
+
299
+ ## Core Capabilities
300
+
301
+ ### Unique Contributions
302
+
303
+ | Capability | What We Provide | Why It Matters |
304
+ | ------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
305
+ | **Hypothesis-Driven RE** | BlackBoxSession with differential analysis, field detection, confidence scoring, audit trails | Systematic unknown protocol analysis vs manual guesswork |
306
+ | **DBC Auto-Generation** | Statistical CAN signal inference from captures → DBC export | Open-source alternative to Vector CANalyzer ($$$) |
307
+ | **Wireshark Dissector Generation** | Infer protocol → generate validated Lua dissector | End-to-end automation (others require manual YAML specs) |
308
+ | **Multi-Format File Loading** | Oscilloscopes (Tektronix WFM, Rigol), logic analyzers (Sigrok, VCD), automotive BLF | Eliminate format conversion steps |
309
+ | **Statistical Protocol Auto-Detect** | Waveform analysis (timing, voltage, patterns) → protocol identification | Goes beyond sigrok's signal name matching |
310
+ | **Unified Workflow API** | Single Python script: oscilloscope file → decode → infer → export dissector | Replace 7-tool chains with one script |
311
+ | **CRC Recovery** | Message-checksum pairs → polynomial, init, XOR out, reflection | Practical automation (CRC RevEng is more robust for edge cases) |
312
+ | **Automotive Security Analysis** | Stimulus-response correlation, hypothesis testing, UDS/OBD-II decoding | Research-focused (CANToolz covers security, python-can covers low-level) |
313
+ | **State Machine Extraction (Passive)** | RPNI algorithm for passive observation (vs Netzob's active L\* requiring oracle) | Different use case from existing tools |
314
+ | **Evidence-Based Discovery** | Confidence scoring, hypothesis tracking, statistical validation, reproducible audit trails | Scientific rigor for research publication |
315
+
316
+ ### Integration Capabilities
317
+
318
+ | Category | Implementation | Best Alternative |
319
+ | -------------------------- | --------------------------------------------------------------------------------------- | ------------------------------------------------------------------- |
320
+ | **Protocol Decoding** | Integrated sigrok decoders (UART, SPI, I2C, CAN, LIN, JTAG, etc.) via Python API | [sigrok](https://sigrok.org/) directly (100+ decoders) |
321
+ | **Side-Channel Analysis** | Load ChipWhisperer traces, basic DPA/CPA implementations | [ChipWhisperer](https://chipwhisperer.com/) (superior capabilities) |
322
+ | **Signal Processing** | IEEE-based measurements using scipy/numpy | [scipy.signal](https://docs.scipy.org/doc/scipy/reference/signal.html) directly or MATLAB |
323
+ | **CAN Parsing** | cantools integration for DBC parsing and message encoding | [cantools](https://github.com/cantools/cantools) + [python-can](https://python-can.readthedocs.io/) |
324
+ | **File Format Conversion** | Loaders for 13+ formats with unified API | Vendor software + manual export |
325
+
326
+ **Our philosophy:** Integrate best-in-class tools rather than reimplementing them. Add value through workflow automation and novel analysis methods.
327
+
328
+ ---
329
+
330
+ ## When to Use Oscura
331
+
332
+ **Choose Oscura when:**
333
+
334
+ - You need end-to-end workflows (capture → analysis → documentation) in Python
335
+ - You're reverse engineering unknown protocols with differential analysis
336
+ - You want DBC files generated from CAN captures without CANalyzer ($$$)
337
+ - You need Wireshark dissectors generated automatically from inferred protocols
338
+ - You're working with multiple oscilloscope/LA formats and want unified API
339
+ - You value reproducible research with hypothesis tracking and confidence scoring
340
+
341
+ **Use specialized tools directly when:**
342
+
343
+ - You only need protocol decoding → [sigrok](https://sigrok.org/) has 100+ decoders
344
+ - You're doing side-channel attacks → [ChipWhisperer](https://chipwhisperer.com/) is superior
345
+ - You only need signal processing → [scipy](https://scipy.org/)/MATLAB are more optimized
346
+ - You need the most robust CRC recovery → [CRC RevEng](https://reveng.sourceforge.io/) handles edge cases better
347
+ - You have vendor-specific needs → vendor tools have more format support
348
+
349
+ **Oscura's sweet spot:** Chaining multiple RE steps in scripted workflows with novel hypothesis-driven analysis.
350
+
351
+ ---
352
+
353
+ ## Where This Excels
354
+
355
+ ### Security Research
356
+
357
+ - **Protocol reverse engineering** with hypothesis tracking and validation
358
+ - **Automotive ECU security** via CAN stimulus-response analysis
359
+ - **Attack surface mapping** through state machine extraction
360
+ - **Cryptographic implementation validation** (use ChipWhisperer for attacks, Oscura for trace analysis workflows)
361
+
362
+ ### Right-to-Repair & Modernization
363
+
364
+ - **Document undocumented protocols** with generated Wireshark dissectors
365
+ - **Replicate vintage hardware** (1960s-present logic family auto-detection)
366
+ - **Overcome vendor lock-in** through protocol reverse engineering
367
+ - **Generate interoperable interfaces** without vendor cooperation
368
+
369
+ ### Academic Research
370
+
371
+ - **Reproducible workflows** with evidence tracking and audit trails
372
+ - **Statistical validation** with confidence scoring
373
+ - **IEEE-based measurements** for publishable results (181/1241/1459/2414)
374
+ - **22,000+ comprehensive tests, 80%+ coverage** ensure reliability
375
+
376
+ ### Industrial & Automotive
377
+
378
+ - **CAN bus security research** with open-source DBC generation
379
+ - **Signal integrity validation** for high-speed designs
380
+ - **Component characterization** without datasheets
381
+ - **Compliance testing** (EMC, automotive standards)
382
+
383
+ ---
384
+
385
+ ## Built On
386
+
387
+ Oscura integrates proven open-source tools:
388
+
389
+ | Component | What We Use | Why |
390
+ | ------------------- | ----------------------------------------------------------------------- | ------------------------------------------------------- |
391
+ | **Protocol Engine** | [sigrok](https://sigrok.org/) libsigrokdecode | 100+ mature, community-supported protocol decoders |
392
+ | **Signal Processing** | [scipy](https://scipy.org/)/[numpy](https://numpy.org/) | Industry-standard numerical computing |
393
+ | **Side-Channel Traces** | [ChipWhisperer](https://chipwhisperer.com/) formats | De facto standard for side-channel research |
394
+ | **CAN Protocols** | [cantools](https://github.com/cantools/cantools), [python-can](https://python-can.readthedocs.io/) | Robust CAN message parsing and encoding |
395
+ | **Testing** | [pytest](https://pytest.org/), [Hypothesis](https://hypothesis.readthedocs.io/) | Property-based testing for algorithm validation |
396
+ | **Type Safety** | [mypy](https://mypy-lang.org/) | Static type checking (strict mode) |
397
+
398
+ **Our contribution:** Unified API + novel hypothesis-driven RE workflows + format handling + export automation.
399
+
400
+ ---
401
+
402
+ ## Technical Foundation
403
+
404
+ ### Quality Metrics
405
+
406
+ Production-ready validation:
407
+
408
+ - **22,000+ comprehensive tests** with property-based validation (Hypothesis)
409
+ - **80%+ code coverage** with branch coverage enabled
410
+ - **Pre-commit hooks** (format, lint, type check) enforce consistency
411
+ - **Merge queue CI** prevents untested code from landing
412
+ - **Nightly stress tests** validate edge cases and memory usage
413
+ - **Security scanning** (Bandit, Safety) on every commit
414
+
415
+ View current metrics: [CI Dashboard](https://github.com/oscura-re/oscura/actions) | [Coverage Reports](https://codecov.io/gh/oscura-re/oscura)
416
+
417
+ ### Standards Implementation
418
+
419
+ We implement measurements based on IEEE specifications:
420
+
421
+ | Standard | Coverage | Hardware RE Relevance |
422
+ | --------------- | ---------------------------------------------- | ----------------------------------------------- |
423
+ | **IEEE 181** | Pulse timing, rise/fall, overshoot, duty cycle | Protocol physical layer validation |
424
+ | **IEEE 1241** | SNR, SINAD, THD, SFDR, ENOB | ADC characterization for side-channel analysis |
425
+ | **IEEE 1459** | Active/reactive power, harmonics, power factor | Power supply profiling, fault injection targets |
426
+ | **IEEE 2414** | TIE, period jitter, RJ/DJ decomposition, BER | Clock glitch detection, timing attack analysis |
427
+
428
+ ### Architecture Principles
429
+
430
+ Built for extensibility:
431
+
432
+ - **Type-safe**: MyPy strict mode, comprehensive type hints
433
+ - **Modular**: Protocol decoders, loaders, and analyzers are plug-and-play
434
+ - **Memory-efficient**: Lazy loading, memory-mapped files, chunked processing (TB-scale datasets)
435
+ - **Documented**: Google-style docstrings, 95% documentation coverage
436
+ - **Reproducible**: Hypothesis tracking, confidence scoring, full audit trails
437
+
438
+ ---
439
+
440
+ ## Learn By Doing
441
+
442
+ ### Working Examples
443
+
444
+ Core functionality demonstrated with working code:
445
+
446
+ - [Side-Channel Analysis](examples/side_channel_analysis_demo.py) - DPA/CPA attacks, trace analysis
447
+ - [ML Signal Classification](examples/ml_signal_classification_demo.py) - Machine learning for signal identification
448
+ - [Wireshark Dissector Generation](examples/export/wireshark_dissector_demo.py) - Auto-generate protocol dissectors
449
+ - [DBC File Generation](examples/automotive/dbc_generation_example.py) - CAN bus DBC export
450
+ - [LIN Bus Analysis](examples/automotive/lin_analysis_example.py) - LIN protocol decoding
451
+ - [Web Dashboard](examples/web_dashboard_example.py) - Interactive visualization
452
+
453
+ ### Run Your First Example
454
+
455
+ ```bash
456
+ # Install development dependencies
457
+ ./scripts/setup.sh
458
+
459
+ # Side-channel analysis demo
460
+ python examples/side_channel_analysis_demo.py
461
+
462
+ # ML signal classification
463
+ python examples/ml_signal_classification_demo.py
464
+ ```
465
+
466
+ [**Browse all examples**](examples/)
467
+
468
+ ---
469
+
470
+ ## Command-Line Interface
471
+
472
+ ```bash
473
+ # Signal characterization
474
+ oscura characterize capture.wfm
475
+
476
+ # Protocol decoding with auto-detection
477
+ oscura decode uart_capture.wfm --protocol uart --baud 115200
478
+
479
+ # Batch processing entire directories
480
+ oscura batch '*.wfm' --analysis characterize
481
+
482
+ # Differential analysis (compare baseline to modified)
483
+ oscura compare baseline.wfm modified.wfm
484
+
485
+ # Interactive REPL for exploration
486
+ oscura shell
487
+ ```
488
+
489
+ [**Full CLI reference**](docs/cli.md)
490
+
491
+ ---
492
+
493
+ ## Why This Exists
494
+
495
+ ### Legitimate Use Cases
496
+
497
+ Hardware reverse engineering serves critical needs across security, repair, modernization, and defense:
498
+
499
+ **Security Research:** Vulnerability discovery requires understanding how hardware actually works, not how vendors claim it works. Protocol reverse engineering reveals authentication bypasses. State machine analysis maps attack surfaces.
500
+
501
+ **Right-to-Repair:** Proprietary protocols and vendor lock-in prevent owners from fixing their own equipment. Reverse engineering restores agency. Open documentation enables interoperable replacements.
502
+
503
+ **Modernization:** Legacy systems run critical infrastructure but use obsolete components. Replication requires extracting specifications from working hardware when documentation is lost or was never public.
504
+
505
+ **National Defense:** Intelligence and threat assessment depend on understanding adversary capabilities. Forensic analysis of captured equipment requires comprehensive signal analysis and protocol decoding.
506
+
507
+ **Academic Research:** Understanding existing systems informs better designs. Teaching security requires demonstrating real vulnerabilities. Open tools advance the field collectively.
508
+
509
+ ### The Open Source Philosophy
510
+
511
+ We believe security through obscurity is a temporary business model at best and a vulnerability at worst. Real security comes from open scrutiny, not information hiding. Real value comes from services and expertise, not gatekeeping knowledge.
512
+
513
+ Vendors who hide protocol specifications aren't protecting trade secrets—they're preventing interoperability and limiting repair. We're building tools to level that playing field.
514
+
515
+ ### Join the Effort
516
+
517
+ Hardware reverse engineering requires diverse expertise: signal processing, protocol design, automotive systems, vintage computing, embedded security. No single person knows it all. **We need your knowledge.**
518
+
519
+ - Reverse engineered a proprietary protocol? Contribute the decoder.
520
+ - Built workflow automation techniques? Add them to the framework.
521
+ - Work with file formats we don't support? Write a loader.
522
+ - Found vulnerabilities using these tools? Share sanitized case studies.
523
+ - Teaching hardware security? Use Oscura and improve the documentation.
524
+
525
+ Every contribution pools our collective expertise and makes the next reverse engineering project easier for everyone.
526
+
527
+ ---
528
+
529
+ ## Getting Involved
530
+
531
+ ### Contributing
532
+
533
+ ```bash
534
+ # Clone and setup development environment
535
+ git clone https://github.com/oscura-re/oscura.git
536
+ cd oscura
537
+ ./scripts/setup.sh # Complete setup with hooks
538
+
539
+ # Run quality checks (required before commit)
540
+ ./scripts/check.sh # Linting, type checking, tests
541
+ ./scripts/test.sh # Full test suite with coverage
542
+
543
+ # Validate everything passes
544
+ python3 .claude/hooks/validate_all.py # Must show 5/5 passing
545
+ ```
546
+
547
+ **What We Need:**
548
+
549
+ | Contribution Type | Examples | Impact |
550
+ | ------------------------------ | ------------------------------------------------------------------ | ----------------------------------------------- |
551
+ | **Workflow Automation** | New analysis pipelines, export formats, integration scripts | Core value proposition |
552
+ | **File Format Loaders** | Oscilloscope/LA formats not yet supported | Eliminate conversion steps |
553
+ | **Inference Algorithms** | Better state machine learning, field detection, pattern discovery | Improve automatic analysis quality |
554
+ | **Protocol Decoders** | Proprietary protocols you've reversed | Enable others to analyze same systems |
555
+ | **Hardware Integration** | DAQ systems, instrument drivers, live capture workflows | Enable real-time analysis |
556
+ | **Real-World Validation** | Test on your captures, report issues | Ensure reliability across use cases |
557
+ | **Documentation & Case Studies** | Tutorials, sanitized RE workflows, academic papers using Oscura | Lower entry barrier, demonstrate capabilities |
558
+
559
+ [**Contributing Guide**](CONTRIBUTING.md) | [Architecture Documentation](docs/architecture/)
560
+
561
+ ### Community
562
+
563
+ - **Issues:** [GitHub Issues](https://github.com/oscura-re/oscura/issues) - Bug reports, feature requests
564
+ - **Discussions:** [GitHub Discussions](https://github.com/oscura-re/oscura/discussions) - Questions, ideas, collaboration
565
+ - **Security:** [SECURITY.md](SECURITY.md) - Responsible disclosure process
566
+
567
+ ---
568
+
569
+ ## Documentation
570
+
571
+ ### User Guides
572
+
573
+ - [Quick Start Guide](docs/guides/quick-start.md) - Installation and first steps
574
+ - [Black-Box Protocol Analysis](docs/guides/blackbox-analysis.md) - Unknown protocol RE workflow
575
+ - [Side-Channel Analysis](docs/guides/side-channel-analysis.md) - Using ChipWhisperer traces with Oscura
576
+ - [Hardware Acquisition](docs/guides/hardware-acquisition.md) - Direct instrument control
577
+ - [Complete Workflows](docs/guides/workflows.md) - End-to-end pipelines
578
+
579
+ ### API Reference
580
+
581
+ - [API Documentation](docs/api/) - Complete function reference
582
+ - [Session Management](docs/api/session-management.md) - Interactive analysis sessions
583
+ - [CLI Reference](docs/cli.md) - Command-line interface
584
+
585
+ ### Development
586
+
587
+ - [Architecture](docs/architecture/) - Design principles and patterns
588
+ - [Testing Guide](docs/testing/) - Test suite architecture
589
+ - [CHANGELOG](CHANGELOG.md) - Version history and migration guides
590
+
591
+ ---
592
+
593
+ ## Project Status
594
+
595
+ **Current Version:** [0.6.0](https://github.com/oscura-re/oscura/releases/latest) (2026-01-25)
596
+
597
+ **Active Development Areas:**
598
+
599
+ - Hypothesis-driven RE workflows and confidence scoring
600
+ - Automotive protocol analysis (CAN-FD, J1939, OBD-II, UDS)
601
+ - Unknown protocol inference (state machines, field detection, CRC recovery)
602
+ - Multi-format file loading and export automation
603
+ - Vintage computing support (retro logic families, IC identification, 1960s-present)
604
+
605
+ **Stability:** Production-ready for security research, right-to-repair, academic use. APIs may evolve as we add capabilities—breaking changes documented in [CHANGELOG](CHANGELOG.md).
606
+
607
+ [**Release History**](https://github.com/oscura-re/oscura/releases) | [**Roadmap Discussions**](https://github.com/oscura-re/oscura/discussions)
608
+
609
+ ---
610
+
611
+ ## Citation
612
+
613
+ If Oscura contributes to your research, please cite:
614
+
615
+ ```bibtex
616
+ @software{oscura2026,
617
+ title = {Oscura: Hardware Reverse Engineering Framework},
618
+ author = {Oscura Contributors},
619
+ year = {2026},
620
+ url = {https://github.com/oscura-re/oscura},
621
+ version = {0.6.0}
622
+ }
623
+ ```
624
+
625
+ **Machine-readable:** [CITATION.cff](CITATION.cff)
626
+
627
+ ---
628
+
629
+ ## Legal
630
+
631
+ **License:** [MIT License](LICENSE) - Permissive use, modification, distribution
632
+
633
+ **Disclaimer:** This framework is intended for legitimate security research, right-to-repair, academic study, and authorized testing. Users are responsible for compliance with applicable laws and regulations. Unauthorized access to systems or networks is illegal and unethical.
634
+
635
+ **Dependencies:** Built with Python, NumPy, SciPy, Matplotlib, Hypothesis. See [pyproject.toml](pyproject.toml) for complete dependency list.
636
+
637
+ **Supported by:** Security researchers, right-to-repair advocates, academic institutions, and the open source community.
638
+
639
+ ---
640
+
641
+ **Oscura** - _Illuminate what others obscure._
642
+
643
+ Hardware systems are black boxes by design, obscured through proprietary protocols, cryptographic obfuscation, and undocumented interfaces. Whether imposed by vendors, governments, or the passage of time—**we bring light to the darkness.** Join us in building the workflow automation framework that hardware reverse engineering deserves.