signedshot_validator/
error.rs1use thiserror::Error;
4
5#[derive(Error, Debug)]
6pub enum ValidationError {
7 #[error("Failed to read sidecar file: {0}")]
8 SidecarReadError(#[from] std::io::Error),
9
10 #[error("Failed to parse sidecar JSON: {0}")]
11 SidecarParseError(#[from] serde_json::Error),
12
13 #[error("Invalid sidecar: {0}")]
14 InvalidSidecar(String),
15
16 #[error("Unsupported sidecar version: {0}")]
17 UnsupportedVersion(String),
18
19 #[error("Invalid JWT: {0}")]
20 InvalidJwt(String),
21
22 #[error("Failed to decode JWT: {0}")]
23 JwtDecodeError(String),
24
25 #[error("Failed to fetch JWKS: {0}")]
26 JwksFetchError(String),
27
28 #[error("Key not found: {0}")]
29 KeyNotFound(String),
30
31 #[error("Signature verification failed: {0}")]
32 SignatureError(String),
33
34 #[error("Media integrity missing")]
35 MediaIntegrityMissing,
36
37 #[error("Content hash mismatch: expected {expected}, got {actual}")]
38 ContentHashMismatch { expected: String, actual: String },
39
40 #[error("Media integrity signature verification failed: {0}")]
41 MediaIntegritySignatureError(String),
42
43 #[error(
44 "Capture ID mismatch: JWT has {jwt_capture_id}, media_integrity has {integrity_capture_id}"
45 )]
46 CaptureIdMismatch {
47 jwt_capture_id: String,
48 integrity_capture_id: String,
49 },
50
51 #[error("Invalid public key: {0}")]
52 InvalidPublicKey(String),
53
54 #[error("Device public key fingerprint mismatch: JWT has {jwt_fingerprint}, computed {computed_fingerprint}")]
55 DevicePublicKeyFingerprintMismatch {
56 jwt_fingerprint: String,
57 computed_fingerprint: String,
58 },
59}
60
61pub type Result<T> = std::result::Result<T, ValidationError>;