Skip to main content

uselesskey_pgp_native/
lib.rs

1#![forbid(unsafe_code)]
2
3//! OpenPGP native adapters for uselesskey fixtures.
4//!
5//! Provides conversions to native `pgp` crate key types from
6//! `uselesskey-pgp` generated fixtures.
7
8use std::io::Cursor;
9
10use pgp::composed::{Deserializable, SignedPublicKey, SignedSecretKey};
11
12/// Conversion surface for OpenPGP native key types.
13pub trait PgpNativeExt {
14    /// Parse and return a native `SignedSecretKey`.
15    fn secret_key(&self) -> SignedSecretKey;
16
17    /// Parse and return a native `SignedPublicKey`.
18    fn public_key(&self) -> SignedPublicKey;
19
20    /// Parse and return an armored native secret key.
21    fn secret_key_armor(&self) -> SignedSecretKey;
22
23    /// Parse and return an armored native public key.
24    fn public_key_armor(&self) -> SignedPublicKey;
25}
26
27impl PgpNativeExt for uselesskey_pgp::PgpKeyPair {
28    fn secret_key(&self) -> SignedSecretKey {
29        SignedSecretKey::from_bytes(Cursor::new(self.private_key_binary()))
30            .expect("failed to parse uselesskey PGP private key bytes")
31    }
32
33    fn public_key(&self) -> SignedPublicKey {
34        SignedPublicKey::from_bytes(Cursor::new(self.public_key_binary()))
35            .expect("failed to parse uselesskey PGP public key bytes")
36    }
37
38    fn secret_key_armor(&self) -> SignedSecretKey {
39        let (key, _) = SignedSecretKey::from_armor_single(Cursor::new(self.private_key_armored()))
40            .expect("failed to parse armored uselesskey PGP private key");
41        key
42    }
43
44    fn public_key_armor(&self) -> SignedPublicKey {
45        let (key, _) = SignedPublicKey::from_armor_single(Cursor::new(self.public_key_armored()))
46            .expect("failed to parse armored uselesskey PGP public key");
47        key
48    }
49}
50
51#[cfg(test)]
52mod tests {
53    use pgp::types::KeyDetails;
54    use uselesskey_core::Factory;
55    use uselesskey_pgp::{PgpFactoryExt, PgpSpec};
56
57    use super::PgpNativeExt;
58
59    #[test]
60    fn parse_round_trip_binary_and_armor() {
61        let fx = Factory::random();
62        let keypair = fx.pgp("fixture", PgpSpec::ed25519());
63
64        assert_eq!(
65            keypair.fingerprint(),
66            keypair.secret_key().fingerprint().to_string()
67        );
68        assert_eq!(
69            keypair.fingerprint(),
70            keypair.secret_key_armor().fingerprint().to_string()
71        );
72        assert_eq!(
73            keypair.fingerprint(),
74            keypair.public_key().fingerprint().to_string()
75        );
76        assert_eq!(
77            keypair.fingerprint(),
78            keypair.public_key_armor().fingerprint().to_string()
79        );
80    }
81}