ssh_agent/proto/
public_key.rs

1use serde::{Deserialize, Serialize};
2use serde::de::{Deserializer, Error};
3use serde::ser::{Serializer, SerializeTuple};
4use super::error::ProtoError;
5use super::private_key::*;
6use super::key_type::{KeyType, KeyTypeEnum};
7
8pub type MpInt = Vec<u8>;
9
10#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)]
11pub struct RsaPublicKey {
12    pub e: MpInt,
13    pub n: MpInt
14}
15
16#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)]
17pub struct DssPublicKey {
18    pub p: MpInt,
19    pub q: MpInt,
20    pub g: MpInt,
21    pub y: MpInt
22}
23
24#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)]
25pub struct EcDsaPublicKey {
26    pub identifier: String,
27    pub q: MpInt
28}
29
30#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)]
31pub struct Ed25519PublicKey {
32    pub enc_a: Vec<u8>
33}
34
35#[derive(Clone, Debug, Eq, Hash, PartialEq)]
36pub enum PublicKey {
37    Dss(DssPublicKey),
38    Ed25519(Ed25519PublicKey),
39    Rsa(RsaPublicKey),
40    EcDsa(EcDsaPublicKey)
41}
42
43impl KeyType for RsaPublicKey {
44    const KEY_TYPE: &'static str = RsaPrivateKey::KEY_TYPE;
45}
46
47impl KeyType for DssPublicKey {
48    const KEY_TYPE: &'static str = DssPrivateKey::KEY_TYPE;
49}
50
51impl KeyType for Ed25519PublicKey {
52    const KEY_TYPE: &'static str = Ed25519PrivateKey::KEY_TYPE;
53}
54
55impl KeyType for EcDsaPublicKey {
56    const KEY_TYPE: &'static str = EcDsaPrivateKey::KEY_TYPE;
57    
58    fn key_type(&self) -> String {
59        format!("{}-{}", Self::KEY_TYPE, self.identifier)
60    }
61}
62
63impl From<PrivateKey> for PublicKey {
64    fn from(key: PrivateKey) -> Self {
65        match key {
66            PrivateKey::Dss(key) => PublicKey::Dss(DssPublicKey::from(key)),
67            PrivateKey::Ed25519(key) => PublicKey::Ed25519(Ed25519PublicKey::from(key)),
68            PrivateKey::Rsa(key) => PublicKey::Rsa(RsaPublicKey::from(key)),
69            PrivateKey::EcDsa(key) => PublicKey::EcDsa(EcDsaPublicKey::from(key)),
70        }
71    }
72}
73
74impl From<RsaPrivateKey> for RsaPublicKey {
75    fn from(key: RsaPrivateKey) -> Self {
76        Self {
77            e: key.e,
78            n: key.n
79        }
80    }
81}
82
83impl From<DssPrivateKey> for DssPublicKey {
84    fn from(key: DssPrivateKey) -> Self {
85        Self {
86            p: key.p,
87            q: key.q,
88            g: key.g,
89            y: key.y
90        }
91    }
92}
93
94impl From<EcDsaPrivateKey> for EcDsaPublicKey {
95    fn from(key: EcDsaPrivateKey) -> Self {
96        Self {
97            identifier: key.identifier,
98            q: key.q
99        }
100    }
101}
102
103impl From<Ed25519PrivateKey> for Ed25519PublicKey {
104    fn from(key: Ed25519PrivateKey) -> Self {
105        Self {
106            enc_a: key.enc_a
107        }
108    }
109}
110
111impl From<&PrivateKey> for PublicKey {
112    fn from(key: &PrivateKey) -> Self {
113        Self::from(key.clone())
114    }
115}
116
117impl From<&RsaPrivateKey> for RsaPublicKey {
118    fn from(key: &RsaPrivateKey) -> Self {
119        Self::from(key.clone())
120    }
121}
122
123impl From<&DssPrivateKey> for DssPublicKey {
124    fn from(key: &DssPrivateKey) -> Self {
125        Self::from(key.clone())
126    }
127}
128
129impl From<&EcDsaPrivateKey> for EcDsaPublicKey {
130    fn from(key: &EcDsaPrivateKey) -> Self {
131        Self::from(key.clone())
132    }
133}
134
135impl From<&Ed25519PrivateKey> for Ed25519PublicKey {
136    fn from(key: &Ed25519PrivateKey) -> Self {
137        Self::from(key.clone())
138    }
139}
140
141impl_key_type_enum_ser_de!(
142    PublicKey,
143    (PublicKey::Dss, DssPublicKey),
144    (PublicKey::Rsa, RsaPublicKey),
145    (PublicKey::EcDsa, EcDsaPublicKey),
146    (PublicKey::Ed25519, Ed25519PublicKey)
147);
148
149