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
use crate::{
codec::stream_handle::StreamHandle, error::SecioError, exchange::KeyAgreement,
handshake::procedure::handshake, stream_cipher::Cipher, support, Digest, EphemeralPublicKey,
PublicKey, SecioKeyPair,
};
use futures::Future;
use tokio::prelude::{AsyncRead, AsyncWrite};
mod handshake_context;
#[rustfmt::skip]
#[allow(clippy::all)]
mod handshake_generated;
#[rustfmt::skip]
#[allow(clippy::all)]
#[allow(dead_code)]
mod handshake_generated_verifier;
pub(crate) mod handshake_struct;
mod procedure;
const MAX_FRAME_SIZE: usize = 1024 * 1024 * 8;
#[derive(Debug, Clone)]
pub struct Config {
pub(crate) key: SecioKeyPair,
pub(crate) agreements_proposal: Option<String>,
pub(crate) ciphers_proposal: Option<String>,
pub(crate) digests_proposal: Option<String>,
pub(crate) max_frame_length: usize,
}
impl Config {
pub fn new(key_pair: SecioKeyPair) -> Self {
Config {
key: key_pair,
agreements_proposal: None,
ciphers_proposal: None,
digests_proposal: None,
max_frame_length: MAX_FRAME_SIZE,
}
}
pub fn max_frame_length(mut self, size: usize) -> Self {
self.max_frame_length = size;
self
}
pub fn key_agreements<'a, I>(mut self, xs: I) -> Self
where
I: IntoIterator<Item = &'a KeyAgreement>,
{
self.agreements_proposal = Some(support::key_agreements_proposition(xs));
self
}
pub fn ciphers<'a, I>(mut self, xs: I) -> Self
where
I: IntoIterator<Item = &'a Cipher>,
{
self.ciphers_proposal = Some(support::ciphers_proposition(xs));
self
}
pub fn digests<'a, I>(mut self, xs: I) -> Self
where
I: IntoIterator<Item = &'a Digest>,
{
self.digests_proposal = Some(support::digests_proposition(xs));
self
}
pub fn handshake<T>(
self,
socket: T,
) -> impl Future<Item = (StreamHandle, PublicKey, EphemeralPublicKey), Error = SecioError>
where
T: AsyncRead + AsyncWrite + Send + 'static,
{
handshake(socket, self)
}
}