proofmode 0.9.0

Capture, share, and preserve verifiable photos and videos
Documentation
use serde::{Deserialize, Serialize};

use super::error::SignError;

#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Platform {
    Ios,
    Android,
}

impl Platform {
    pub fn as_str(&self) -> &str {
        match self {
            Platform::Ios => "ios",
            Platform::Android => "android",
        }
    }
}

impl std::str::FromStr for Platform {
    type Err = SignError;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        match s.to_lowercase().as_str() {
            "ios" => Ok(Platform::Ios),
            "android" => Ok(Platform::Android),
            _ => Err(SignError::InvalidPlatform(format!(
                "Invalid platform: {}. Must be 'ios' or 'android'",
                s
            ))),
        }
    }
}

impl std::fmt::Display for Platform {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "{}", self.as_str())
    }
}

// Certificate Signing Models

#[derive(Debug, Deserialize)]
pub struct CertificateSigningRequest {
    pub csr: String,
    pub metadata: Option<CSRMetadata>,
}

#[derive(Debug, Deserialize, Serialize)]
pub struct CSRMetadata {
    pub device_id: Option<String>,
    pub app_version: Option<String>,
}

#[derive(Debug, Serialize)]
pub struct SignedCertificateResponse {
    pub certificate_id: String,
    pub certificate_chain: String,
    pub expires_at: chrono::DateTime<chrono::Utc>,
    pub serial_number: String,
}

// C2PA Signing Models

#[derive(Debug, Deserialize)]
pub struct C2PASigningRequest {
    pub claim: String,
    #[serde(default)]
    pub platform: String,
    pub client_data_hash: Option<String>,
    pub client_data_json: Option<String>,

    // iOS App Attest fields
    pub key_id: Option<String>,
    pub assertion: Option<String>,

    // Android Play Integrity fields
    #[serde(alias = "token")]
    pub device_id: Option<String>,
    pub integrity_token: Option<String>,
    pub nonce: Option<String>,
    pub package_name: Option<String>,

    // Android cryptographic request signing (for verified devices)
    pub counter: Option<i64>,
    pub timestamp: Option<i64>,
    pub request_signature: Option<String>,
}

#[derive(Debug, Serialize)]
pub struct C2PASigningResponse {
    pub signature: String,
}

#[derive(Debug, Serialize)]
pub struct IntegrityChallengeResponse {
    pub challenge: String,
    pub message: String,
}

// C2PA Configuration Models

#[derive(Debug, Serialize)]
pub struct C2PAConfiguration {
    pub algorithm: String,
    pub timestamp_url: String,
    pub signing_url: String,
    pub certificate_chain: String,
}