ssh_agent/proto/
public_key.rs1use 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