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.
- oscura/__init__.py +169 -167
- oscura/analyzers/__init__.py +3 -0
- oscura/analyzers/classification.py +659 -0
- oscura/analyzers/digital/edges.py +325 -65
- oscura/analyzers/digital/quality.py +293 -166
- oscura/analyzers/digital/timing.py +260 -115
- oscura/analyzers/digital/timing_numba.py +334 -0
- oscura/analyzers/entropy.py +605 -0
- oscura/analyzers/eye/diagram.py +176 -109
- oscura/analyzers/eye/metrics.py +5 -5
- oscura/analyzers/jitter/__init__.py +6 -4
- oscura/analyzers/jitter/ber.py +52 -52
- oscura/analyzers/jitter/classification.py +156 -0
- oscura/analyzers/jitter/decomposition.py +163 -113
- oscura/analyzers/jitter/spectrum.py +80 -64
- oscura/analyzers/ml/__init__.py +39 -0
- oscura/analyzers/ml/features.py +600 -0
- oscura/analyzers/ml/signal_classifier.py +604 -0
- oscura/analyzers/packet/daq.py +246 -158
- oscura/analyzers/packet/parser.py +12 -1
- oscura/analyzers/packet/payload.py +50 -2110
- oscura/analyzers/packet/payload_analysis.py +361 -181
- oscura/analyzers/packet/payload_patterns.py +133 -70
- oscura/analyzers/packet/stream.py +84 -23
- oscura/analyzers/patterns/__init__.py +26 -5
- oscura/analyzers/patterns/anomaly_detection.py +908 -0
- oscura/analyzers/patterns/clustering.py +169 -108
- oscura/analyzers/patterns/clustering_optimized.py +227 -0
- oscura/analyzers/patterns/discovery.py +1 -1
- oscura/analyzers/patterns/matching.py +581 -197
- oscura/analyzers/patterns/pattern_mining.py +778 -0
- oscura/analyzers/patterns/periodic.py +121 -38
- oscura/analyzers/patterns/sequences.py +175 -78
- oscura/analyzers/power/conduction.py +1 -1
- oscura/analyzers/power/soa.py +6 -6
- oscura/analyzers/power/switching.py +250 -110
- oscura/analyzers/protocol/__init__.py +17 -1
- oscura/analyzers/protocols/base.py +6 -6
- oscura/analyzers/protocols/ble/__init__.py +38 -0
- oscura/analyzers/protocols/ble/analyzer.py +809 -0
- oscura/analyzers/protocols/ble/uuids.py +288 -0
- oscura/analyzers/protocols/can.py +257 -127
- oscura/analyzers/protocols/can_fd.py +107 -80
- oscura/analyzers/protocols/flexray.py +139 -80
- oscura/analyzers/protocols/hdlc.py +93 -58
- oscura/analyzers/protocols/i2c.py +247 -106
- oscura/analyzers/protocols/i2s.py +138 -86
- oscura/analyzers/protocols/industrial/__init__.py +40 -0
- oscura/analyzers/protocols/industrial/bacnet/__init__.py +33 -0
- oscura/analyzers/protocols/industrial/bacnet/analyzer.py +708 -0
- oscura/analyzers/protocols/industrial/bacnet/encoding.py +412 -0
- oscura/analyzers/protocols/industrial/bacnet/services.py +622 -0
- oscura/analyzers/protocols/industrial/ethercat/__init__.py +30 -0
- oscura/analyzers/protocols/industrial/ethercat/analyzer.py +474 -0
- oscura/analyzers/protocols/industrial/ethercat/mailbox.py +339 -0
- oscura/analyzers/protocols/industrial/ethercat/topology.py +166 -0
- oscura/analyzers/protocols/industrial/modbus/__init__.py +31 -0
- oscura/analyzers/protocols/industrial/modbus/analyzer.py +525 -0
- oscura/analyzers/protocols/industrial/modbus/crc.py +79 -0
- oscura/analyzers/protocols/industrial/modbus/functions.py +436 -0
- oscura/analyzers/protocols/industrial/opcua/__init__.py +21 -0
- oscura/analyzers/protocols/industrial/opcua/analyzer.py +552 -0
- oscura/analyzers/protocols/industrial/opcua/datatypes.py +446 -0
- oscura/analyzers/protocols/industrial/opcua/services.py +264 -0
- oscura/analyzers/protocols/industrial/profinet/__init__.py +23 -0
- oscura/analyzers/protocols/industrial/profinet/analyzer.py +441 -0
- oscura/analyzers/protocols/industrial/profinet/dcp.py +263 -0
- oscura/analyzers/protocols/industrial/profinet/ptcp.py +200 -0
- oscura/analyzers/protocols/jtag.py +180 -98
- oscura/analyzers/protocols/lin.py +219 -114
- oscura/analyzers/protocols/manchester.py +4 -4
- oscura/analyzers/protocols/onewire.py +253 -149
- oscura/analyzers/protocols/parallel_bus/__init__.py +20 -0
- oscura/analyzers/protocols/parallel_bus/centronics.py +92 -0
- oscura/analyzers/protocols/parallel_bus/gpib.py +137 -0
- oscura/analyzers/protocols/spi.py +192 -95
- oscura/analyzers/protocols/swd.py +321 -167
- oscura/analyzers/protocols/uart.py +267 -125
- oscura/analyzers/protocols/usb.py +235 -131
- oscura/analyzers/side_channel/power.py +17 -12
- oscura/analyzers/signal/__init__.py +15 -0
- oscura/analyzers/signal/timing_analysis.py +1086 -0
- oscura/analyzers/signal_integrity/__init__.py +4 -1
- oscura/analyzers/signal_integrity/sparams.py +2 -19
- oscura/analyzers/spectral/chunked.py +129 -60
- oscura/analyzers/spectral/chunked_fft.py +300 -94
- oscura/analyzers/spectral/chunked_wavelet.py +100 -80
- oscura/analyzers/statistical/checksum.py +376 -217
- oscura/analyzers/statistical/classification.py +229 -107
- oscura/analyzers/statistical/entropy.py +78 -53
- oscura/analyzers/statistics/correlation.py +407 -211
- oscura/analyzers/statistics/outliers.py +2 -2
- oscura/analyzers/statistics/streaming.py +30 -5
- oscura/analyzers/validation.py +216 -101
- oscura/analyzers/waveform/measurements.py +9 -0
- oscura/analyzers/waveform/measurements_with_uncertainty.py +31 -15
- oscura/analyzers/waveform/spectral.py +500 -228
- oscura/api/__init__.py +31 -5
- oscura/api/dsl/__init__.py +582 -0
- oscura/{dsl → api/dsl}/commands.py +43 -76
- oscura/{dsl → api/dsl}/interpreter.py +26 -51
- oscura/{dsl → api/dsl}/parser.py +107 -77
- oscura/{dsl → api/dsl}/repl.py +2 -2
- oscura/api/dsl.py +1 -1
- oscura/{integrations → api/integrations}/__init__.py +1 -1
- oscura/{integrations → api/integrations}/llm.py +201 -102
- oscura/api/operators.py +3 -3
- oscura/api/optimization.py +144 -30
- oscura/api/rest_server.py +921 -0
- oscura/api/server/__init__.py +17 -0
- oscura/api/server/dashboard.py +850 -0
- oscura/api/server/static/README.md +34 -0
- oscura/api/server/templates/base.html +181 -0
- oscura/api/server/templates/export.html +120 -0
- oscura/api/server/templates/home.html +284 -0
- oscura/api/server/templates/protocols.html +58 -0
- oscura/api/server/templates/reports.html +43 -0
- oscura/api/server/templates/session_detail.html +89 -0
- oscura/api/server/templates/sessions.html +83 -0
- oscura/api/server/templates/waveforms.html +73 -0
- oscura/automotive/__init__.py +8 -1
- oscura/automotive/can/__init__.py +10 -0
- oscura/automotive/can/checksum.py +3 -1
- oscura/automotive/can/dbc_generator.py +590 -0
- oscura/automotive/can/message_wrapper.py +121 -74
- oscura/automotive/can/patterns.py +98 -21
- oscura/automotive/can/session.py +292 -56
- oscura/automotive/can/state_machine.py +6 -3
- oscura/automotive/can/stimulus_response.py +97 -75
- oscura/automotive/dbc/__init__.py +10 -2
- oscura/automotive/dbc/generator.py +84 -56
- oscura/automotive/dbc/parser.py +6 -6
- oscura/automotive/dtc/data.json +17 -102
- oscura/automotive/dtc/database.py +2 -2
- oscura/automotive/flexray/__init__.py +31 -0
- oscura/automotive/flexray/analyzer.py +504 -0
- oscura/automotive/flexray/crc.py +185 -0
- oscura/automotive/flexray/fibex.py +449 -0
- oscura/automotive/j1939/__init__.py +45 -8
- oscura/automotive/j1939/analyzer.py +605 -0
- oscura/automotive/j1939/spns.py +326 -0
- oscura/automotive/j1939/transport.py +306 -0
- oscura/automotive/lin/__init__.py +47 -0
- oscura/automotive/lin/analyzer.py +612 -0
- oscura/automotive/loaders/blf.py +13 -2
- oscura/automotive/loaders/csv_can.py +143 -72
- oscura/automotive/loaders/dispatcher.py +50 -2
- oscura/automotive/loaders/mdf.py +86 -45
- oscura/automotive/loaders/pcap.py +111 -61
- oscura/automotive/uds/__init__.py +4 -0
- oscura/automotive/uds/analyzer.py +725 -0
- oscura/automotive/uds/decoder.py +140 -58
- oscura/automotive/uds/models.py +7 -1
- oscura/automotive/visualization.py +1 -1
- oscura/cli/analyze.py +348 -0
- oscura/cli/batch.py +142 -122
- oscura/cli/benchmark.py +275 -0
- oscura/cli/characterize.py +137 -82
- oscura/cli/compare.py +224 -131
- oscura/cli/completion.py +250 -0
- oscura/cli/config_cmd.py +361 -0
- oscura/cli/decode.py +164 -87
- oscura/cli/export.py +286 -0
- oscura/cli/main.py +115 -31
- oscura/{onboarding → cli/onboarding}/__init__.py +3 -3
- oscura/{onboarding → cli/onboarding}/help.py +80 -58
- oscura/{onboarding → cli/onboarding}/tutorials.py +97 -72
- oscura/{onboarding → cli/onboarding}/wizard.py +55 -36
- oscura/cli/progress.py +147 -0
- oscura/cli/shell.py +157 -135
- oscura/cli/validate_cmd.py +204 -0
- oscura/cli/visualize.py +158 -0
- oscura/convenience.py +125 -79
- oscura/core/__init__.py +4 -2
- oscura/core/backend_selector.py +3 -3
- oscura/core/cache.py +126 -15
- oscura/core/cancellation.py +1 -1
- oscura/{config → core/config}/__init__.py +20 -11
- oscura/{config → core/config}/defaults.py +1 -1
- oscura/{config → core/config}/loader.py +7 -5
- oscura/{config → core/config}/memory.py +5 -5
- oscura/{config → core/config}/migration.py +1 -1
- oscura/{config → core/config}/pipeline.py +99 -23
- oscura/{config → core/config}/preferences.py +1 -1
- oscura/{config → core/config}/protocol.py +3 -3
- oscura/{config → core/config}/schema.py +426 -272
- oscura/{config → core/config}/settings.py +1 -1
- oscura/{config → core/config}/thresholds.py +195 -153
- oscura/core/correlation.py +5 -6
- oscura/core/cross_domain.py +0 -2
- oscura/core/debug.py +9 -5
- oscura/{extensibility → core/extensibility}/docs.py +158 -70
- oscura/{extensibility → core/extensibility}/extensions.py +160 -76
- oscura/{extensibility → core/extensibility}/logging.py +1 -1
- oscura/{extensibility → core/extensibility}/measurements.py +1 -1
- oscura/{extensibility → core/extensibility}/plugins.py +1 -1
- oscura/{extensibility → core/extensibility}/templates.py +73 -3
- oscura/{extensibility → core/extensibility}/validation.py +1 -1
- oscura/core/gpu_backend.py +11 -7
- oscura/core/log_query.py +101 -11
- oscura/core/logging.py +126 -54
- oscura/core/logging_advanced.py +5 -5
- oscura/core/memory_limits.py +108 -70
- oscura/core/memory_monitor.py +2 -2
- oscura/core/memory_progress.py +7 -7
- oscura/core/memory_warnings.py +1 -1
- oscura/core/numba_backend.py +13 -13
- oscura/{plugins → core/plugins}/__init__.py +9 -9
- oscura/{plugins → core/plugins}/base.py +7 -7
- oscura/{plugins → core/plugins}/cli.py +3 -3
- oscura/{plugins → core/plugins}/discovery.py +186 -106
- oscura/{plugins → core/plugins}/lifecycle.py +1 -1
- oscura/{plugins → core/plugins}/manager.py +7 -7
- oscura/{plugins → core/plugins}/registry.py +3 -3
- oscura/{plugins → core/plugins}/versioning.py +1 -1
- oscura/core/progress.py +16 -1
- oscura/core/provenance.py +8 -2
- oscura/{schemas → core/schemas}/__init__.py +2 -2
- oscura/{schemas → core/schemas}/device_mapping.json +2 -8
- oscura/{schemas → core/schemas}/packet_format.json +4 -24
- oscura/{schemas → core/schemas}/protocol_definition.json +2 -12
- oscura/core/types.py +4 -0
- oscura/core/uncertainty.py +3 -3
- oscura/correlation/__init__.py +52 -0
- oscura/correlation/multi_protocol.py +811 -0
- oscura/discovery/auto_decoder.py +117 -35
- oscura/discovery/comparison.py +191 -86
- oscura/discovery/quality_validator.py +155 -68
- oscura/discovery/signal_detector.py +196 -79
- oscura/export/__init__.py +18 -8
- oscura/export/kaitai_struct.py +513 -0
- oscura/export/scapy_layer.py +801 -0
- oscura/export/wireshark/generator.py +1 -1
- oscura/export/wireshark/templates/dissector.lua.j2 +2 -2
- oscura/export/wireshark_dissector.py +746 -0
- oscura/guidance/wizard.py +207 -111
- oscura/hardware/__init__.py +19 -0
- oscura/{acquisition → hardware/acquisition}/__init__.py +4 -4
- oscura/{acquisition → hardware/acquisition}/file.py +2 -2
- oscura/{acquisition → hardware/acquisition}/hardware.py +7 -7
- oscura/{acquisition → hardware/acquisition}/saleae.py +15 -12
- oscura/{acquisition → hardware/acquisition}/socketcan.py +1 -1
- oscura/{acquisition → hardware/acquisition}/streaming.py +2 -2
- oscura/{acquisition → hardware/acquisition}/synthetic.py +3 -3
- oscura/{acquisition → hardware/acquisition}/visa.py +33 -11
- oscura/hardware/firmware/__init__.py +29 -0
- oscura/hardware/firmware/pattern_recognition.py +874 -0
- oscura/hardware/hal_detector.py +736 -0
- oscura/hardware/security/__init__.py +37 -0
- oscura/hardware/security/side_channel_detector.py +1126 -0
- oscura/inference/__init__.py +4 -0
- oscura/inference/active_learning/observation_table.py +4 -1
- oscura/inference/alignment.py +216 -123
- oscura/inference/bayesian.py +113 -33
- oscura/inference/crc_reverse.py +101 -55
- oscura/inference/logic.py +6 -2
- oscura/inference/message_format.py +342 -183
- oscura/inference/protocol.py +95 -44
- oscura/inference/protocol_dsl.py +180 -82
- oscura/inference/signal_intelligence.py +1439 -706
- oscura/inference/spectral.py +99 -57
- oscura/inference/state_machine.py +810 -158
- oscura/inference/stream.py +270 -110
- oscura/iot/__init__.py +34 -0
- oscura/iot/coap/__init__.py +32 -0
- oscura/iot/coap/analyzer.py +668 -0
- oscura/iot/coap/options.py +212 -0
- oscura/iot/lorawan/__init__.py +21 -0
- oscura/iot/lorawan/crypto.py +206 -0
- oscura/iot/lorawan/decoder.py +801 -0
- oscura/iot/lorawan/mac_commands.py +341 -0
- oscura/iot/mqtt/__init__.py +27 -0
- oscura/iot/mqtt/analyzer.py +999 -0
- oscura/iot/mqtt/properties.py +315 -0
- oscura/iot/zigbee/__init__.py +31 -0
- oscura/iot/zigbee/analyzer.py +615 -0
- oscura/iot/zigbee/security.py +153 -0
- oscura/iot/zigbee/zcl.py +349 -0
- oscura/jupyter/display.py +125 -45
- oscura/{exploratory → jupyter/exploratory}/__init__.py +8 -8
- oscura/{exploratory → jupyter/exploratory}/error_recovery.py +298 -141
- oscura/jupyter/exploratory/fuzzy.py +746 -0
- oscura/{exploratory → jupyter/exploratory}/fuzzy_advanced.py +258 -100
- oscura/{exploratory → jupyter/exploratory}/legacy.py +464 -242
- oscura/{exploratory → jupyter/exploratory}/parse.py +167 -145
- oscura/{exploratory → jupyter/exploratory}/recovery.py +119 -87
- oscura/jupyter/exploratory/sync.py +612 -0
- oscura/{exploratory → jupyter/exploratory}/unknown.py +299 -176
- oscura/jupyter/magic.py +4 -4
- oscura/{ui → jupyter/ui}/__init__.py +2 -2
- oscura/{ui → jupyter/ui}/formatters.py +3 -3
- oscura/{ui → jupyter/ui}/progressive_display.py +153 -82
- oscura/loaders/__init__.py +183 -67
- oscura/loaders/binary.py +88 -1
- oscura/loaders/chipwhisperer.py +153 -137
- oscura/loaders/configurable.py +208 -86
- oscura/loaders/csv_loader.py +458 -215
- oscura/loaders/hdf5_loader.py +278 -119
- oscura/loaders/lazy.py +87 -54
- oscura/loaders/mmap_loader.py +1 -1
- oscura/loaders/numpy_loader.py +253 -116
- oscura/loaders/pcap.py +226 -151
- oscura/loaders/rigol.py +110 -49
- oscura/loaders/sigrok.py +201 -78
- oscura/loaders/tdms.py +81 -58
- oscura/loaders/tektronix.py +291 -174
- oscura/loaders/touchstone.py +182 -87
- oscura/loaders/tss.py +456 -0
- oscura/loaders/vcd.py +215 -117
- oscura/loaders/wav.py +155 -68
- oscura/reporting/__init__.py +9 -0
- oscura/reporting/analyze.py +352 -146
- oscura/reporting/argument_preparer.py +69 -14
- oscura/reporting/auto_report.py +97 -61
- oscura/reporting/batch.py +131 -58
- oscura/reporting/chart_selection.py +57 -45
- oscura/reporting/comparison.py +63 -17
- oscura/reporting/content/executive.py +76 -24
- oscura/reporting/core_formats/multi_format.py +11 -8
- oscura/reporting/engine.py +312 -158
- oscura/reporting/enhanced_reports.py +949 -0
- oscura/reporting/export.py +86 -43
- oscura/reporting/formatting/numbers.py +69 -42
- oscura/reporting/html.py +139 -58
- oscura/reporting/index.py +137 -65
- oscura/reporting/output.py +158 -67
- oscura/reporting/pdf.py +67 -102
- oscura/reporting/plots.py +191 -112
- oscura/reporting/sections.py +88 -47
- oscura/reporting/standards.py +104 -61
- oscura/reporting/summary_generator.py +75 -55
- oscura/reporting/tables.py +138 -54
- oscura/reporting/templates/enhanced/protocol_re.html +525 -0
- oscura/sessions/__init__.py +14 -23
- oscura/sessions/base.py +3 -3
- oscura/sessions/blackbox.py +106 -10
- oscura/sessions/generic.py +2 -2
- oscura/sessions/legacy.py +783 -0
- oscura/side_channel/__init__.py +63 -0
- oscura/side_channel/dpa.py +1025 -0
- oscura/utils/__init__.py +15 -1
- oscura/utils/bitwise.py +118 -0
- oscura/{builders → utils/builders}/__init__.py +1 -1
- oscura/{comparison → utils/comparison}/__init__.py +6 -6
- oscura/{comparison → utils/comparison}/compare.py +202 -101
- oscura/{comparison → utils/comparison}/golden.py +83 -63
- oscura/{comparison → utils/comparison}/limits.py +313 -89
- oscura/{comparison → utils/comparison}/mask.py +151 -45
- oscura/{comparison → utils/comparison}/trace_diff.py +1 -1
- oscura/{comparison → utils/comparison}/visualization.py +147 -89
- oscura/{component → utils/component}/__init__.py +3 -3
- oscura/{component → utils/component}/impedance.py +122 -58
- oscura/{component → utils/component}/reactive.py +165 -168
- oscura/{component → utils/component}/transmission_line.py +3 -3
- oscura/{filtering → utils/filtering}/__init__.py +6 -6
- oscura/{filtering → utils/filtering}/base.py +1 -1
- oscura/{filtering → utils/filtering}/convenience.py +2 -2
- oscura/{filtering → utils/filtering}/design.py +169 -93
- oscura/{filtering → utils/filtering}/filters.py +2 -2
- oscura/{filtering → utils/filtering}/introspection.py +2 -2
- oscura/utils/geometry.py +31 -0
- oscura/utils/imports.py +184 -0
- oscura/utils/lazy.py +1 -1
- oscura/{math → utils/math}/__init__.py +2 -2
- oscura/{math → utils/math}/arithmetic.py +114 -48
- oscura/{math → utils/math}/interpolation.py +139 -106
- oscura/utils/memory.py +129 -66
- oscura/utils/memory_advanced.py +92 -9
- oscura/utils/memory_extensions.py +10 -8
- oscura/{optimization → utils/optimization}/__init__.py +1 -1
- oscura/{optimization → utils/optimization}/search.py +2 -2
- oscura/utils/performance/__init__.py +58 -0
- oscura/utils/performance/caching.py +889 -0
- oscura/utils/performance/lsh_clustering.py +333 -0
- oscura/utils/performance/memory_optimizer.py +699 -0
- oscura/utils/performance/optimizations.py +675 -0
- oscura/utils/performance/parallel.py +654 -0
- oscura/utils/performance/profiling.py +661 -0
- oscura/{pipeline → utils/pipeline}/base.py +1 -1
- oscura/{pipeline → utils/pipeline}/composition.py +1 -1
- oscura/{pipeline → utils/pipeline}/parallel.py +3 -2
- oscura/{pipeline → utils/pipeline}/pipeline.py +1 -1
- oscura/{pipeline → utils/pipeline}/reverse_engineering.py +412 -221
- oscura/{search → utils/search}/__init__.py +3 -3
- oscura/{search → utils/search}/anomaly.py +188 -58
- oscura/utils/search/context.py +294 -0
- oscura/{search → utils/search}/pattern.py +138 -10
- oscura/utils/serial.py +51 -0
- oscura/utils/storage/__init__.py +61 -0
- oscura/utils/storage/database.py +1166 -0
- oscura/{streaming → utils/streaming}/chunked.py +302 -143
- oscura/{streaming → utils/streaming}/progressive.py +1 -1
- oscura/{streaming → utils/streaming}/realtime.py +3 -2
- oscura/{triggering → utils/triggering}/__init__.py +6 -6
- oscura/{triggering → utils/triggering}/base.py +6 -6
- oscura/{triggering → utils/triggering}/edge.py +2 -2
- oscura/{triggering → utils/triggering}/pattern.py +2 -2
- oscura/{triggering → utils/triggering}/pulse.py +115 -74
- oscura/{triggering → utils/triggering}/window.py +2 -2
- oscura/utils/validation.py +32 -0
- oscura/validation/__init__.py +121 -0
- oscura/{compliance → validation/compliance}/__init__.py +5 -5
- oscura/{compliance → validation/compliance}/advanced.py +5 -5
- oscura/{compliance → validation/compliance}/masks.py +1 -1
- oscura/{compliance → validation/compliance}/reporting.py +127 -53
- oscura/{compliance → validation/compliance}/testing.py +114 -52
- oscura/validation/compliance_tests.py +915 -0
- oscura/validation/fuzzer.py +990 -0
- oscura/validation/grammar_tests.py +596 -0
- oscura/validation/grammar_validator.py +904 -0
- oscura/validation/hil_testing.py +977 -0
- oscura/{quality → validation/quality}/__init__.py +4 -4
- oscura/{quality → validation/quality}/ensemble.py +251 -171
- oscura/{quality → validation/quality}/explainer.py +3 -3
- oscura/{quality → validation/quality}/scoring.py +1 -1
- oscura/{quality → validation/quality}/warnings.py +4 -4
- oscura/validation/regression_suite.py +808 -0
- oscura/validation/replay.py +788 -0
- oscura/{testing → validation/testing}/__init__.py +2 -2
- oscura/{testing → validation/testing}/synthetic.py +5 -5
- oscura/visualization/__init__.py +9 -0
- oscura/visualization/accessibility.py +1 -1
- oscura/visualization/annotations.py +64 -67
- oscura/visualization/colors.py +7 -7
- oscura/visualization/digital.py +180 -81
- oscura/visualization/eye.py +236 -85
- oscura/visualization/interactive.py +320 -143
- oscura/visualization/jitter.py +587 -247
- oscura/visualization/layout.py +169 -134
- oscura/visualization/optimization.py +103 -52
- oscura/visualization/palettes.py +1 -1
- oscura/visualization/power.py +427 -211
- oscura/visualization/power_extended.py +626 -297
- oscura/visualization/presets.py +2 -0
- oscura/visualization/protocols.py +495 -181
- oscura/visualization/render.py +79 -63
- oscura/visualization/reverse_engineering.py +171 -124
- oscura/visualization/signal_integrity.py +460 -279
- oscura/visualization/specialized.py +190 -100
- oscura/visualization/spectral.py +670 -255
- oscura/visualization/thumbnails.py +166 -137
- oscura/visualization/waveform.py +150 -63
- oscura/workflows/__init__.py +3 -0
- oscura/{batch → workflows/batch}/__init__.py +5 -5
- oscura/{batch → workflows/batch}/advanced.py +150 -75
- oscura/workflows/batch/aggregate.py +531 -0
- oscura/workflows/batch/analyze.py +236 -0
- oscura/{batch → workflows/batch}/logging.py +2 -2
- oscura/{batch → workflows/batch}/metrics.py +1 -1
- oscura/workflows/complete_re.py +1144 -0
- oscura/workflows/compliance.py +44 -54
- oscura/workflows/digital.py +197 -51
- oscura/workflows/legacy/__init__.py +12 -0
- oscura/{workflow → workflows/legacy}/dag.py +4 -1
- oscura/workflows/multi_trace.py +9 -9
- oscura/workflows/power.py +42 -62
- oscura/workflows/protocol.py +82 -49
- oscura/workflows/reverse_engineering.py +351 -150
- oscura/workflows/signal_integrity.py +157 -82
- oscura-0.7.0.dist-info/METADATA +661 -0
- oscura-0.7.0.dist-info/RECORD +591 -0
- oscura/batch/aggregate.py +0 -300
- oscura/batch/analyze.py +0 -139
- oscura/dsl/__init__.py +0 -73
- oscura/exceptions.py +0 -59
- oscura/exploratory/fuzzy.py +0 -513
- oscura/exploratory/sync.py +0 -384
- oscura/exporters/__init__.py +0 -94
- oscura/exporters/csv.py +0 -303
- oscura/exporters/exporters.py +0 -44
- oscura/exporters/hdf5.py +0 -217
- oscura/exporters/html_export.py +0 -701
- oscura/exporters/json_export.py +0 -291
- oscura/exporters/markdown_export.py +0 -367
- oscura/exporters/matlab_export.py +0 -354
- oscura/exporters/npz_export.py +0 -219
- oscura/exporters/spice_export.py +0 -210
- oscura/search/context.py +0 -149
- oscura/session/__init__.py +0 -34
- oscura/session/annotations.py +0 -289
- oscura/session/history.py +0 -313
- oscura/session/session.py +0 -520
- oscura/workflow/__init__.py +0 -13
- oscura-0.5.1.dist-info/METADATA +0 -583
- oscura-0.5.1.dist-info/RECORD +0 -481
- /oscura/core/{config.py → config/legacy.py} +0 -0
- /oscura/{extensibility → core/extensibility}/__init__.py +0 -0
- /oscura/{extensibility → core/extensibility}/registry.py +0 -0
- /oscura/{plugins → core/plugins}/isolation.py +0 -0
- /oscura/{schemas → core/schemas}/bus_configuration.json +0 -0
- /oscura/{builders → utils/builders}/signal_builder.py +0 -0
- /oscura/{optimization → utils/optimization}/parallel.py +0 -0
- /oscura/{pipeline → utils/pipeline}/__init__.py +0 -0
- /oscura/{streaming → utils/streaming}/__init__.py +0 -0
- {oscura-0.5.1.dist-info → oscura-0.7.0.dist-info}/WHEEL +0 -0
- {oscura-0.5.1.dist-info → oscura-0.7.0.dist-info}/entry_points.txt +0 -0
- {oscura-0.5.1.dist-info → oscura-0.7.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,661 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: oscura
|
|
3
|
+
Version: 0.7.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
|
+
[](https://github.com/oscura-re/oscura/actions/workflows/ci.yml)
|
|
154
|
+
[](https://github.com/oscura-re/oscura/actions/workflows/code-quality.yml)
|
|
155
|
+
[](https://codecov.io/gh/oscura-re/oscura)
|
|
156
|
+
[](https://pypi.org/project/oscura/)
|
|
157
|
+
[](https://www.python.org/downloads/)
|
|
158
|
+
[](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
|
+
**[See demos/README.md](demos/README.md)** for 105+ comprehensive demonstrations organized by skill level.
|
|
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 Demonstrations
|
|
443
|
+
|
|
444
|
+
**105+ comprehensive demos** organized into 12 categories covering:
|
|
445
|
+
|
|
446
|
+
- **Data Loading** - All file format loaders (oscilloscopes, logic analyzers, automotive, scientific)
|
|
447
|
+
- **Basic Analysis** - Waveform measurements, digital analysis, spectral analysis, filtering
|
|
448
|
+
- **Protocol Decoding** - UART, SPI, I2C, CAN, LIN, FlexRay, JTAG, SWD, I2S, USB
|
|
449
|
+
- **Advanced Analysis** - Jitter, eye diagrams, power analysis, signal integrity, TDR
|
|
450
|
+
- **Domain Specific** - Automotive diagnostics, EMC compliance, side-channel analysis, IEEE 181 timing
|
|
451
|
+
- **Reverse Engineering** - CRC recovery, state machines, Wireshark dissectors, ML classification
|
|
452
|
+
- **Advanced Features** - Lazy loading, memory management, performance optimization, batch processing
|
|
453
|
+
- **Extensibility** - Custom analyzers, plugins, templates
|
|
454
|
+
- **Integration** - CI/CD, hardware, external tools, web dashboards
|
|
455
|
+
- **Export & Visualization** - All export formats, plotting, reporting
|
|
456
|
+
- **Complete Workflows** - End-to-end production pipelines
|
|
457
|
+
- **Standards Compliance** - IEEE 181/1241/1459/2414, automotive standards
|
|
458
|
+
|
|
459
|
+
### Comprehensive Demonstrations
|
|
460
|
+
|
|
461
|
+
**33+ in-depth demos** organized by skill level and domain:
|
|
462
|
+
|
|
463
|
+
- **[Getting Started](demos/README.md#beginner-path-2-4-hours)** - File loading, basic measurements, format export (Beginner, 2-4 hours)
|
|
464
|
+
- **[Protocol Decoding](demos/README.md#intermediate-path-6-10-hours)** - UART, SPI, I2C, Manchester, JTAG, USB, PCAP (Intermediate, 6-10 hours)
|
|
465
|
+
- **[Reverse Engineering](demos/README.md#advanced-path-12-20-hours)** - CRC recovery, state machines, Wireshark dissectors, automotive protocols (Advanced, 12-20 hours)
|
|
466
|
+
- **[Standards Compliance](demos/README.md#advanced-path-12-20-hours)** - IEEE 181/1241/1459/2414, CISPR 32, IEC 61000 (Advanced/Expert)
|
|
467
|
+
- **[Complete Workflows](demos/README.md#expert-path-20-40-hours)** - End-to-end production pipelines with ML inference (Expert, 20-40 hours)
|
|
468
|
+
|
|
469
|
+
**Categories**: Waveform Analysis | File I/O | Custom DAQ | Serial Protocols | Protocol Decoding | UDP Analysis | Protocol Inference | Automotive | Timing | Mixed Signal | Spectral | Jitter | Power | Signal Integrity | EMC | Signal RE | Advanced Inference | Complete Workflows
|
|
470
|
+
|
|
471
|
+
[**See full demo catalog with learning paths**](demos/README.md)
|
|
472
|
+
|
|
473
|
+
### Run Your First Demo
|
|
474
|
+
|
|
475
|
+
```bash
|
|
476
|
+
# Install development dependencies
|
|
477
|
+
./scripts/setup.sh
|
|
478
|
+
|
|
479
|
+
# Run your first demo
|
|
480
|
+
python demos/00_getting_started/00_hello_world.py
|
|
481
|
+
|
|
482
|
+
# Or try a specific topic
|
|
483
|
+
python demos/05_domain_specific/05_side_channel_basics.py
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
---
|
|
487
|
+
|
|
488
|
+
## Command-Line Interface
|
|
489
|
+
|
|
490
|
+
```bash
|
|
491
|
+
# Signal characterization
|
|
492
|
+
oscura characterize capture.wfm
|
|
493
|
+
|
|
494
|
+
# Protocol decoding with auto-detection
|
|
495
|
+
oscura decode uart_capture.wfm --protocol uart --baud 115200
|
|
496
|
+
|
|
497
|
+
# Batch processing entire directories
|
|
498
|
+
oscura batch '*.wfm' --analysis characterize
|
|
499
|
+
|
|
500
|
+
# Differential analysis (compare baseline to modified)
|
|
501
|
+
oscura compare baseline.wfm modified.wfm
|
|
502
|
+
|
|
503
|
+
# Interactive REPL for exploration
|
|
504
|
+
oscura shell
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
[**Full CLI reference**](docs/cli.md)
|
|
508
|
+
|
|
509
|
+
---
|
|
510
|
+
|
|
511
|
+
## Why This Exists
|
|
512
|
+
|
|
513
|
+
### Legitimate Use Cases
|
|
514
|
+
|
|
515
|
+
Hardware reverse engineering serves critical needs across security, repair, modernization, and defense:
|
|
516
|
+
|
|
517
|
+
**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.
|
|
518
|
+
|
|
519
|
+
**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.
|
|
520
|
+
|
|
521
|
+
**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.
|
|
522
|
+
|
|
523
|
+
**National Defense:** Intelligence and threat assessment depend on understanding adversary capabilities. Forensic analysis of captured equipment requires comprehensive signal analysis and protocol decoding.
|
|
524
|
+
|
|
525
|
+
**Academic Research:** Understanding existing systems informs better designs. Teaching security requires demonstrating real vulnerabilities. Open tools advance the field collectively.
|
|
526
|
+
|
|
527
|
+
### The Open Source Philosophy
|
|
528
|
+
|
|
529
|
+
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.
|
|
530
|
+
|
|
531
|
+
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.
|
|
532
|
+
|
|
533
|
+
### Join the Effort
|
|
534
|
+
|
|
535
|
+
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.**
|
|
536
|
+
|
|
537
|
+
- Reverse engineered a proprietary protocol? Contribute the decoder.
|
|
538
|
+
- Built workflow automation techniques? Add them to the framework.
|
|
539
|
+
- Work with file formats we don't support? Write a loader.
|
|
540
|
+
- Found vulnerabilities using these tools? Share sanitized case studies.
|
|
541
|
+
- Teaching hardware security? Use Oscura and improve the documentation.
|
|
542
|
+
|
|
543
|
+
Every contribution pools our collective expertise and makes the next reverse engineering project easier for everyone.
|
|
544
|
+
|
|
545
|
+
---
|
|
546
|
+
|
|
547
|
+
## Getting Involved
|
|
548
|
+
|
|
549
|
+
### Contributing
|
|
550
|
+
|
|
551
|
+
```bash
|
|
552
|
+
# Clone and setup development environment
|
|
553
|
+
git clone https://github.com/oscura-re/oscura.git
|
|
554
|
+
cd oscura
|
|
555
|
+
./scripts/setup.sh # Complete setup with hooks
|
|
556
|
+
|
|
557
|
+
# Run quality checks (required before commit)
|
|
558
|
+
./scripts/check.sh # Linting, type checking, tests
|
|
559
|
+
./scripts/test.sh # Full test suite with coverage
|
|
560
|
+
|
|
561
|
+
# Validate everything passes
|
|
562
|
+
python3 .claude/hooks/validate_all.py # Must show 5/5 passing
|
|
563
|
+
```
|
|
564
|
+
|
|
565
|
+
**What We Need:**
|
|
566
|
+
|
|
567
|
+
| Contribution Type | Examples | Impact |
|
|
568
|
+
| ------------------------------ | ------------------------------------------------------------------ | ----------------------------------------------- |
|
|
569
|
+
| **Workflow Automation** | New analysis pipelines, export formats, integration scripts | Core value proposition |
|
|
570
|
+
| **File Format Loaders** | Oscilloscope/LA formats not yet supported | Eliminate conversion steps |
|
|
571
|
+
| **Inference Algorithms** | Better state machine learning, field detection, pattern discovery | Improve automatic analysis quality |
|
|
572
|
+
| **Protocol Decoders** | Proprietary protocols you've reversed | Enable others to analyze same systems |
|
|
573
|
+
| **Hardware Integration** | DAQ systems, instrument drivers, live capture workflows | Enable real-time analysis |
|
|
574
|
+
| **Real-World Validation** | Test on your captures, report issues | Ensure reliability across use cases |
|
|
575
|
+
| **Documentation & Case Studies** | Tutorials, sanitized RE workflows, academic papers using Oscura | Lower entry barrier, demonstrate capabilities |
|
|
576
|
+
|
|
577
|
+
[**Contributing Guide**](CONTRIBUTING.md) | [Architecture Documentation](docs/developer-guide/architecture.md)
|
|
578
|
+
|
|
579
|
+
### Community
|
|
580
|
+
|
|
581
|
+
- **Issues:** [GitHub Issues](https://github.com/oscura-re/oscura/issues) - Bug reports, feature requests
|
|
582
|
+
- **Discussions:** [GitHub Discussions](https://github.com/oscura-re/oscura/discussions) - Questions, ideas, collaboration
|
|
583
|
+
- **Security:** [SECURITY.md](SECURITY.md) - Responsible disclosure process
|
|
584
|
+
|
|
585
|
+
---
|
|
586
|
+
|
|
587
|
+
## Documentation
|
|
588
|
+
|
|
589
|
+
### User Guides
|
|
590
|
+
|
|
591
|
+
- [Quick Start Guide](docs/guides/quick-start.md) - Installation and first steps
|
|
592
|
+
- [Black-Box Protocol Analysis](docs/guides/blackbox-analysis.md) - Unknown protocol RE workflow
|
|
593
|
+
- [Side-Channel Analysis](docs/guides/side-channel-analysis.md) - Using ChipWhisperer traces with Oscura
|
|
594
|
+
- [Hardware Acquisition](docs/guides/hardware-acquisition.md) - Direct instrument control
|
|
595
|
+
- [Complete Workflows](docs/guides/workflows.md) - End-to-end pipelines
|
|
596
|
+
|
|
597
|
+
### API Reference
|
|
598
|
+
|
|
599
|
+
- [API Documentation](docs/api/) - Complete function reference
|
|
600
|
+
- [Session Management](docs/api/session-management.md) - Interactive analysis sessions
|
|
601
|
+
- [CLI Reference](docs/cli.md) - Command-line interface
|
|
602
|
+
|
|
603
|
+
### Development
|
|
604
|
+
|
|
605
|
+
- [Architecture](docs/developer-guide/architecture.md) - Design principles and patterns
|
|
606
|
+
- [Testing Guide](docs/testing/) - Test suite architecture
|
|
607
|
+
- [CHANGELOG](CHANGELOG.md) - Version history and migration guides
|
|
608
|
+
|
|
609
|
+
---
|
|
610
|
+
|
|
611
|
+
## Project Status
|
|
612
|
+
|
|
613
|
+
**Current Version:** [0.6.0](https://github.com/oscura-re/oscura/releases/latest) (2026-01-25)
|
|
614
|
+
|
|
615
|
+
**Active Development Areas:**
|
|
616
|
+
|
|
617
|
+
- Hypothesis-driven RE workflows and confidence scoring
|
|
618
|
+
- Automotive protocol analysis (CAN-FD, J1939, OBD-II, UDS)
|
|
619
|
+
- Unknown protocol inference (state machines, field detection, CRC recovery)
|
|
620
|
+
- Multi-format file loading and export automation
|
|
621
|
+
- Vintage computing support (retro logic families, IC identification, 1960s-present)
|
|
622
|
+
|
|
623
|
+
**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).
|
|
624
|
+
|
|
625
|
+
[**Release History**](https://github.com/oscura-re/oscura/releases) | [**Roadmap Discussions**](https://github.com/oscura-re/oscura/discussions)
|
|
626
|
+
|
|
627
|
+
---
|
|
628
|
+
|
|
629
|
+
## Citation
|
|
630
|
+
|
|
631
|
+
If Oscura contributes to your research, please cite:
|
|
632
|
+
|
|
633
|
+
```bibtex
|
|
634
|
+
@software{oscura2026,
|
|
635
|
+
title = {Oscura: Hardware Reverse Engineering Framework},
|
|
636
|
+
author = {Oscura Contributors},
|
|
637
|
+
year = {2026},
|
|
638
|
+
url = {https://github.com/oscura-re/oscura},
|
|
639
|
+
version = {0.6.0}
|
|
640
|
+
}
|
|
641
|
+
```
|
|
642
|
+
|
|
643
|
+
**Machine-readable:** [CITATION.cff](CITATION.cff)
|
|
644
|
+
|
|
645
|
+
---
|
|
646
|
+
|
|
647
|
+
## Legal
|
|
648
|
+
|
|
649
|
+
**License:** [MIT License](LICENSE) - Permissive use, modification, distribution
|
|
650
|
+
|
|
651
|
+
**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.
|
|
652
|
+
|
|
653
|
+
**Dependencies:** Built with Python, NumPy, SciPy, Matplotlib, Hypothesis. See [pyproject.toml](pyproject.toml) for complete dependency list.
|
|
654
|
+
|
|
655
|
+
**Supported by:** Security researchers, right-to-repair advocates, academic institutions, and the open source community.
|
|
656
|
+
|
|
657
|
+
---
|
|
658
|
+
|
|
659
|
+
**Oscura** - _Illuminate what others obscure._
|
|
660
|
+
|
|
661
|
+
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.
|