1pub mod agent;
45pub mod aligned;
46pub mod arena;
47pub mod block;
48pub mod crypto;
49pub mod error;
50pub mod event;
51pub mod merkle;
52pub mod proof;
53pub mod rkyv_types;
54
55#[cfg(test)]
56mod proptest;
57
58pub use aligned::{AlignedHash, AlignedHashArray, CacheLinePadded, CACHE_LINE_SIZE};
60pub use arena::{BatchArena, CanonicalBytesArena, DEFAULT_ARENA_CAPACITY};
61pub use block::{
62 compute_events_root, compute_events_root_parallel, Block, BlockBuilder, BlockHash, BlockHeader,
63 SealerId,
64};
65pub use crypto::{
66 batch_verify, batch_verify_with_fallback, hash, hash_pair, BatchVerifyResult, Hash, PublicKey,
67 SecretKey, Sig,
68};
69pub use error::{Error, Result};
70pub use event::{
71 ActorId, ActorKind, AuditEvent, EventId, EventType, Outcome, ResourceId, ResourceKind,
72};
73pub use merkle::{compute_proof, compute_root_optimized, compute_roots_batch, verify_proof};
74pub use proof::{
75 BlockInclusionProof, ConsistencyProof, InclusionProof, MmrProof, Position, ProofNode,
76};
77
78pub use agent::{
80 ActionModifications, ActionOutcome, AgentAttestation, AgentAttestationBuilder, Alternative,
81 ApprovalContext, ApprovalDecision, ApprovalPolicy, ApprovalRequest, ApprovalRequestId,
82 ApprovalResponse, ApprovalStatus, AttestationError, AttestationRegistry, Attestor,
83 CancellationActor, Capability, CapabilityBuilder, CapabilityCheck, CapabilityConstraints,
84 CapabilityId, CapabilityKind, CapabilitySet, CapabilitySetId, CausalContext,
85 CausalContextBuilder, Confidence, CoordinatedAction, CoordinatedActionBuilder,
86 CoordinatedActionSpec, CoordinationEvent, CoordinationId, CoordinationMetrics,
87 CoordinationProtocol, CoordinationResult, CoordinationStatus, CoordinationType, Cost,
88 CrossSessionReference, DayOfWeek, Decision, DenialReason, DisputeStatus, DurationMs,
89 EmergencyAction, EmergencyEvent, EmergencyEventBuilder, EmergencyPriority, EmergencyResolution,
90 EmergencyTrigger, EscalationPolicy, Evidence, Factor, FailureHandling, Goal, GoalSource,
91 IdempotencyKey, IdempotencyRecord, ImpactAssessment, OutcomeAttestation,
92 OutcomeAttestationBuilder, OutcomeDispute, Participant, ParticipantRole, PostMortem,
93 PrincipalId, PrincipalKind, Priority, ProposedAction, ProposedActionBuilder, RateLimit,
94 ReasoningStep, ReasoningTrace, ReasoningTraceBuilder, RequiredCapability, Resolution,
95 ResourceScope, Responsibility, RuntimeAttestation, Session, SessionBuilder, SessionEndReason,
96 SessionId, SessionSummary, Severity, StepAction, SuspensionScope, Task, TaskDependency, TaskId,
97 TeeQuote, TeeType, TimeOfDay, TimeWindow, ToolAttestation, TraceId,
98};
99
100pub fn batch_verify_events(events: &[AuditEvent]) -> Result<()> {
110 if events.is_empty() {
111 return Ok(());
112 }
113
114 let canonical: Vec<Vec<u8>> = events.iter().map(|e| e.canonical_bytes()).collect();
116
117 let items: Vec<(&PublicKey, &[u8], &Sig)> = events
119 .iter()
120 .zip(canonical.iter())
121 .map(|(e, bytes)| (e.attester(), bytes.as_slice(), e.signature()))
122 .collect();
123
124 batch_verify(&items)
125}
126
127pub fn batch_verify_events_parallel(events: &[AuditEvent]) -> Result<()> {
137 use rayon::prelude::*;
138
139 if events.is_empty() {
140 return Ok(());
141 }
142
143 let canonical: Vec<Vec<u8>> = events.par_iter().map(|e| e.canonical_bytes()).collect();
145
146 let items: Vec<(&PublicKey, &[u8], &Sig)> = events
148 .iter()
149 .zip(canonical.iter())
150 .map(|(e, bytes)| (e.attester(), bytes.as_slice(), e.signature()))
151 .collect();
152
153 batch_verify(&items)
154}