File: keygen.rs

package info (click to toggle)
rust-openpgp-card-rpgp 0.3.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 392 kB
  • sloc: sh: 6; makefile: 2
file content (95 lines) | stat: -rw-r--r-- 2,695 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// SPDX-FileCopyrightText: Heiko Schaefer <heiko@schaefer.name>
// SPDX-License-Identifier: MIT OR Apache-2.0

#![allow(dead_code)]

use std::env;

use anyhow::Result;
use openpgp_card::state::Open;
use openpgp_card::Card;
use pgp::{Deserializable, SignedPublicKey};

use crate::cards::TestConfig;
use crate::util::{
    run_test, test_decrypt, test_keygen, test_print_algo_info, test_print_caps, test_reset,
    test_set_user_data, test_sign, TestResult,
};

mod cards;
mod util;

#[ignore]
#[test]
fn keygen() -> Result<()> {
    env_logger::init();

    let config = match env::var("TEST_CONFIG") {
        Ok(path) => TestConfig::load(&path)?,
        Err(_) => TestConfig::load("config/test-cards.toml")?, // fallback
    };

    let cards = config.into_cardapps();

    for card in cards {
        println!("** Run tests on card {} **", card.get_name());

        let mut c: Card<Open> = card.get_card()?;
        println!(" -> Card opened");
        let mut tx = c.transaction()?;
        println!("    started transaction");

        // println!("Get pubkey");
        // let _ = run_test(&mut tx, test_get_pub, &[])?;

        println!("Caps");
        let _ = run_test(&mut tx, test_print_caps, &[])?;
        // continue; // only print caps

        println!("Reset");
        let _ = run_test(&mut tx, test_reset, &[])?;

        println!("Algo info");
        let _ = run_test(&mut tx, test_print_algo_info, &[])?;

        // Set user data because keygen expects a name (for the user id)
        println!("Set user data");
        let _ = run_test(&mut tx, test_set_user_data, &[])?;

        let algos = {
            let config = card.get_config();
            if let Some(keygen) = &config.keygen {
                keygen.clone()
            } else {
                vec![]
            }
        };

        for algo in algos {
            println!("Generate key [{algo}]");

            let res = run_test(&mut tx, test_keygen, &[&algo])?;

            if let TestResult::Text(cert_str) = &res[0] {
                // sign
                print!("  Sign");
                let sign_out = run_test(&mut tx, test_sign, &[cert_str])?;
                println!(" {sign_out:x?}");

                // decrypt
                let (spk, _) = SignedPublicKey::from_string(cert_str)?;
                let ciphertext = util::encrypt_to("Hello world!\n", &spk)?;

                print!("  Decrypt");
                let dec_out = run_test(&mut tx, test_decrypt, &[cert_str, &ciphertext])?;
                println!(" {dec_out:x?}");
            } else {
                panic!("Didn't get back a Cert from test_keygen");
            };
        }

        println!();
    }

    Ok(())
}