parlov-core
Shared types for HTTP oracle detection. Zero I/O, zero async — just data structures.
types
use parlov_core::{
ResponseSurface, ProbeDefinition, ProbeExchange, DifferentialSet,
OracleResult, Technique, Vector, NormativeStrength, Signal, SignalKind,
StrategyOutcome, EndpointVerdict, ContributingFinding,
ObservabilityStatus, BlockSummary, RequestAuthState,
ResponseClass, Applicability, SignalSurface,
};
ResponseSurface — one captured HTTP interaction:
pub struct ResponseSurface {
pub status: StatusCode,
pub headers: HeaderMap,
pub body: Bytes,
pub timing_ns: u64,
}
ProbeDefinition — one HTTP request to execute:
pub struct ProbeDefinition {
pub url: String,
pub method: Method,
pub headers: HeaderMap, pub body: Option<Bytes>,
}
ProbeExchange — paired request and response:
pub struct ProbeExchange {
pub request: ProbeDefinition,
pub response: ResponseSurface,
}
DifferentialSet — paired exchanges with technique context (replaces ProbeSet):
pub struct DifferentialSet {
pub baseline: Vec<ProbeExchange>,
pub probe: Vec<ProbeExchange>,
pub technique: Technique,
}
Technique — strategy metadata. Drives both probe construction and analyzer routing:
pub struct Technique {
pub id: &'static str,
pub name: &'static str,
pub oracle_class: OracleClass,
pub vector: Vector, pub strength: NormativeStrength, pub normalization_weight: Option<f32>, pub inverted_signal_weight: Option<f32>, pub method_relevant: bool, pub parser_relevant: bool, pub applicability: fn(&ResponseSurface, &ResponseSurface) -> Applicability, pub contradiction_surface: SignalSurface, }
Signal and SignalKind — typed observations from differential analysis:
pub struct Signal {
pub kind: SignalKind,
pub description: String,
}
OracleResult — the analysis output:
pub struct OracleResult {
pub class: OracleClass, pub verdict: OracleVerdict, pub severity: Option<Severity>, pub confidence: u8, pub impact_class: Option<ImpactClass>, pub reasons: Vec<ScoringReason>, pub label: Option<String>, pub leaks: Option<String>, pub rfc_basis: Option<String>, pub signals: Vec<Signal>, pub technique_id: Option<String>, pub vector: Option<Vector>, pub normative_strength: Option<NormativeStrength>, }
ImpactClass — leak severity classification:
pub enum ImpactClass { Low, Medium, High }
ScoringReason — audit trail entry for a scoring decision:
pub struct ScoringReason {
pub dimension: ScoringDimension, pub description: String,
}
All types derive Serialize and Deserialize with custom serde helpers for StatusCode, Method, and HeaderMap (the http crate types lack native serde support).
finding_id() — deterministic SHA-256 finding ID from technique, target, and status pair for cross-run deduplication.
use it
Build a differential set from captured HTTP exchanges:
use parlov_core::{
ProbeExchange, ProbeDefinition, ResponseSurface,
DifferentialSet, Technique, Vector, NormativeStrength,
};
use bytes::Bytes;
use http::{HeaderMap, Method, StatusCode};
let exchange = ProbeExchange {
request: ProbeDefinition {
url: "https://api.example.com/users/123".into(),
method: Method::GET,
headers: HeaderMap::new(),
body: None,
},
response: ResponseSurface {
status: StatusCode::FORBIDDEN,
headers: HeaderMap::new(),
body: Bytes::new(),
timing_ns: 12_500_000,
},
};
errors
use parlov_core::Error;
Four variants via thiserror: Http(String), Cli(String), Analysis(String), Serialization(serde_json::Error).
license
MIT OR Apache-2.0