openpgp-card/openpgp-card-examples/src/bin/decrypt.rs
2022-03-29 22:40:26 +02:00

49 lines
1.3 KiB
Rust

// SPDX-FileCopyrightText: 2021 Wiktor Kwapisiewicz <wiktor@metacode.biz>
// SPDX-License-Identifier: MIT OR Apache-2.0
use openpgp_card::OpenPgp;
use openpgp_card_pcsc::PcscBackend;
use openpgp_card_sequoia::card::Open;
use openpgp::parse::{stream::DecryptorBuilder, Parse};
use openpgp::policy::StandardPolicy;
use openpgp::Cert;
use sequoia_openpgp as openpgp;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let args = std::env::args().collect::<Vec<_>>();
if args.len() < 3 {
eprintln!("Usage: decrypt card-ident pin-file cert-file");
return Ok(());
}
let card_ident = &args[0];
let pin_file = &args[1];
let cert_file = &args[2];
let mut card = PcscBackend::open_by_ident(card_ident, None)?;
let mut pgp = OpenPgp::new(&mut card);
let mut open = Open::new(pgp.transaction()?)?;
let pin = std::fs::read(pin_file)?;
open.verify_user(&pin)?;
let mut user = open.user_card().unwrap();
let p = StandardPolicy::new();
let cert = Cert::from_file(cert_file)?;
let d = user.decryptor(&cert)?;
let stdin = std::io::stdin();
let mut stdout = std::io::stdout();
let db = DecryptorBuilder::from_reader(stdin)?;
let mut decryptor = db.with_policy(&p, None, d)?;
std::io::copy(&mut decryptor, &mut stdout)?;
Ok(())
}