Skip to main content

signedshot_validator/
error.rs

1//! Error types for the SignedShot validator.
2
3use 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>;