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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
mod curve25519;
pub mod ed25519;
mod chacha20_poly1305_openssh;
mod ecdh_sha2_nistp256;
pub mod rsa;
pub use curve25519::CURVE25519;
pub use ecdh_sha2_nistp256::EcdhP256;
pub use chacha20_poly1305_openssh::ChaCha20Poly1305;
use crate::packet::Data;
use crate::SshError;
pub type DH = dyn KeyExchange;
pub trait KeyExchange {
fn new() -> Result<Self, SshError> where Self: Sized;
fn get_public_key(&self) -> &[u8];
fn get_shared_secret(&self, puk: Vec<u8>) -> Result<Vec<u8>, SshError>;
}
pub type SIGN = dyn PublicKey;
pub trait PublicKey {
fn new() -> Self where Self: Sized;
fn verify_signature(&self, ks: &[u8], message: &[u8], sig: &[u8]) -> Result<bool, SshError>;
}
#[derive(Clone)]
pub struct H {
pub v_c: Vec<u8>,
pub v_s: Vec<u8>,
pub i_c: Vec<u8>,
pub i_s: Vec<u8>,
pub k_s: Vec<u8>,
pub q_c: Vec<u8>,
pub q_s: Vec<u8>,
pub k : Vec<u8>,
}
impl H {
pub fn new() -> Self {
H {
v_c: vec![],
v_s: vec![],
i_c: vec![],
i_s: vec![],
k_s: vec![],
q_c: vec![],
q_s: vec![],
k: vec![]
}
}
pub fn set_v_c(&mut self, vc: &str) {
let mut data = Data::new();
data.put_str(vc);
self.v_c = data.to_vec();
}
pub fn set_v_s(&mut self, vs: &str) {
let mut data = Data::new();
data.put_str(vs);
self.v_s = data.to_vec();
}
pub fn set_i_c(&mut self, ic: &[u8]) {
let mut data = Data::new();
data.put_bytes(ic);
self.i_c = data.to_vec();
}
pub fn set_i_s(&mut self, is: &[u8]) {
let mut data = Data::new();
data.put_bytes(is);
self.i_s = data.to_vec();
}
pub fn set_q_c(&mut self, qc: &[u8]) {
let mut data = Data::new();
data.put_bytes(qc);
self.q_c = data.to_vec();
}
pub fn set_q_s(&mut self, qs: &[u8]) {
let mut data = Data::new();
data.put_bytes(qs);
self.q_s = data.to_vec();
}
pub fn set_k_s(&mut self, ks: &[u8]) {
let mut data = Data::new();
data.put_bytes(ks);
self.k_s = data.to_vec();
}
pub fn set_k(&mut self, k: &[u8]) {
let mut data = Data::new();
data.mpint(k);
self.k = data.to_vec();
}
pub fn as_bytes(&mut self) -> Vec<u8> {
let mut v = vec![];
v.extend(& self.v_c);
v.extend(& self.v_s);
v.extend(& self.i_c);
v.extend(& self.i_s);
v.extend(& self.k_s);
v.extend(& self.q_c);
v.extend(& self.q_s);
v.extend(& self.k);
v
}
}