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
use serde::{Deserialize, Serialize}; use serde::de::{Deserializer, Error}; use serde::ser::{Serializer, SerializeTuple}; use super::error::ProtoError; use super::key_type::{KeyType, KeyTypeEnum}; pub type MpInt = Vec<u8>; #[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)] pub struct DssPrivateKey { pub p: MpInt, pub q: MpInt, pub g: MpInt, pub y: MpInt, pub x: MpInt } #[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)] pub struct Ed25519PrivateKey { pub enc_a: Vec<u8>, pub k_enc_a: Vec<u8> } #[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)] pub struct RsaPrivateKey { pub n: MpInt, pub e: MpInt, pub d: MpInt, pub iqmp: MpInt, pub p: MpInt, pub q: MpInt } #[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)] pub struct EcDsaPrivateKey { pub identifier: String, pub q: MpInt, pub d: MpInt } #[derive(Clone, Debug, Eq, Hash, PartialEq)] pub enum PrivateKey { Dss(DssPrivateKey), Ed25519(Ed25519PrivateKey), Rsa(RsaPrivateKey), EcDsa(EcDsaPrivateKey) } impl KeyType for RsaPrivateKey { const KEY_TYPE: &'static str = "ssh-rsa"; } impl KeyType for DssPrivateKey { const KEY_TYPE: &'static str = "ssh-dss"; } impl KeyType for Ed25519PrivateKey { const KEY_TYPE: &'static str = "ssh-ed25519"; } impl KeyType for EcDsaPrivateKey { const KEY_TYPE: &'static str = "ecdsa-sha2"; fn key_type(&self) -> String { format!("{}-{}", Self::KEY_TYPE, self.identifier) } } impl_key_type_enum_ser_de!( PrivateKey, (PrivateKey::Dss, DssPrivateKey), (PrivateKey::Rsa, RsaPrivateKey), (PrivateKey::EcDsa, EcDsaPrivateKey), (PrivateKey::Ed25519, Ed25519PrivateKey) );