kxfides 0.1.0

CLI for signing & verifying media with KX-Fides.
// cli/src/cmd_verify.rs

use anyhow::{bail, Context, Result};
use owo_colors::OwoColorize;
use std::path::Path;

use kx_fides_core::verify::verify_media;

use super::VerifyArgs;

pub fn run(args: VerifyArgs) -> Result<()> {
    let media = args.media;
    let manifest = args.manifest;

    if !Path::new(&media).exists() {
        bail!("media file not found: {}", media.display());
    }
    if !Path::new(&manifest).exists() {
        bail!("manifest file not found: {}", manifest.display());
    }

    let report = verify_media(&media, &manifest)
        .with_context(|| format!("verification failed for {}", media.display()))?;

    if report.ok && report.hash_match && report.signature_valid {
        println!(
            "{} {}",
            "✓ verified".green().bold(),
            media.display()
        );
        println!("{} {}", "hash match:".cyan(), report.hash_match);
        println!("{} {}", "signature valid:".cyan(), report.signature_valid);
        return Ok(());
    }

    // Print details then exit non-zero
    eprintln!(
        "{} {}",
        "✗ verification failed".red().bold(),
        media.display()
    );
    for msg in report.messages {
        eprintln!("  - {}", msg);
    }
    bail!("verification failed")
}