| 34 | |
| 35 | impl Command for Verify { |
| 36 | fn run(&self) -> CliResult<()> { |
| 37 | let sig_bytes = BASE64.decode(self.signature.as_bytes()).map_err(|e| { |
| 38 | CliError::Internal(anyhow::anyhow!("Invalid signature encoding: {}", e)) |
| 39 | })?; |
| 40 | |
| 41 | if sig_bytes.len() != 64 { |
| 42 | return Err(CliError::Internal(anyhow::anyhow!( |
| 43 | "Invalid signature: expected 64 bytes, got {}", |
| 44 | sig_bytes.len() |
| 45 | ))); |
| 46 | } |
| 47 | |
| 48 | let mut sig_arr = [0u8; 64]; |
| 49 | sig_arr.copy_from_slice(&sig_bytes); |
| 50 | |
| 51 | let public_key = PublicKey::from_base32(&self.public_key) |
| 52 | .map_err(|e| CliError::Internal(anyhow::anyhow!("Invalid public key: {}", e)))?; |
| 53 | |
| 54 | let mut data = Vec::new(); |
| 55 | std::io::stdin() |
| 56 | .read_to_end(&mut data) |
| 57 | .map_err(|e| CliError::Internal(anyhow::anyhow!("Failed to read stdin: {}", e)))?; |
| 58 | |
| 59 | match public_key.verify(&data, &sig_arr) { |
| 60 | Ok(()) => { |
| 61 | eprintln!("Signature valid"); |
| 62 | std::process::exit(0); |
| 63 | } |
| 64 | Err(_) => { |
| 65 | eprintln!("Signature invalid"); |
| 66 | std::process::exit(1); |
| 67 | } |
| 68 | } |
| 69 | } |
| 70 | } |