pub struct DataCodec { /* private fields */ }Expand description
Negotiated key material for exactly one endpoint-to-relay connection. Debug output intentionally never includes the secret.
Implementations§
Source§impl DataCodec
impl DataCodec
Sourcepub fn legacy(key: AesKeyType) -> Self
pub fn legacy(key: AesKeyType) -> Self
Wrap an existing legacy key without changing its wire encoding.
Examples found in repository?
examples/data_codec_bench.rs (line 13)
9fn measure(v2: bool, size: usize, iterations: usize) -> Result<f64, Box<dyn Error>> {
10 let codec = if v2 {
11 DataCodec::negotiate([42; 32], Some(2), HeaderProtocol::V2)?
12 } else {
13 DataCodec::legacy([42; 32])
14 };
15 if size == 0 {
16 let start = Instant::now();
17 for _ in 0..iterations {
18 black_box(black_box(codec).endpoint_codecs()?);
19 }
20 return Ok(start.elapsed().as_secs_f64() * 1e9 / iterations as f64);
21 }
22 let (_, mut writer) = codec.endpoint_codecs()?;
23 let (mut reader, _) = codec.relay_codecs()?;
24 let mut bytes = vec![42; size + 16];
25 let start = Instant::now();
26 for _ in 0..iterations {
27 let tag = writer
28 .encrypt(black_box(&mut bytes[..size]))
29 .map_err(|_| "encrypt failed")?;
30 bytes[size..].copy_from_slice(tag.as_ref());
31 black_box(
32 reader
33 .decrypt(black_box(&mut bytes))
34 .map_err(|_| "decrypt failed")?,
35 );
36 }
37 let elapsed = start.elapsed().as_secs_f64();
38 assert!(bytes[..size].iter().all(|&byte| byte == 42));
39 Ok(elapsed * 1e9 / iterations as f64)
40}Sourcepub fn from_response(
key: Option<AesKeyType>,
protocol: Option<u16>,
offered_v2: bool,
) -> Result<Option<Self>>
pub fn from_response( key: Option<AesKeyType>, protocol: Option<u16>, offered_v2: bool, ) -> Result<Option<Self>>
Validate an authenticated response. Unknown selections are errors and must never cause another connection in a weaker mode.
Sourcepub fn negotiate(
key: AesKeyType,
offer: Option<u16>,
header: HeaderProtocol,
) -> Result<Self>
pub fn negotiate( key: AesKeyType, offer: Option<u16>, header: HeaderProtocol, ) -> Result<Self>
Select only a capability received through authenticated control-v2.
Examples found in repository?
examples/data_codec_bench.rs (line 11)
9fn measure(v2: bool, size: usize, iterations: usize) -> Result<f64, Box<dyn Error>> {
10 let codec = if v2 {
11 DataCodec::negotiate([42; 32], Some(2), HeaderProtocol::V2)?
12 } else {
13 DataCodec::legacy([42; 32])
14 };
15 if size == 0 {
16 let start = Instant::now();
17 for _ in 0..iterations {
18 black_box(black_box(codec).endpoint_codecs()?);
19 }
20 return Ok(start.elapsed().as_secs_f64() * 1e9 / iterations as f64);
21 }
22 let (_, mut writer) = codec.endpoint_codecs()?;
23 let (mut reader, _) = codec.relay_codecs()?;
24 let mut bytes = vec![42; size + 16];
25 let start = Instant::now();
26 for _ in 0..iterations {
27 let tag = writer
28 .encrypt(black_box(&mut bytes[..size]))
29 .map_err(|_| "encrypt failed")?;
30 bytes[size..].copy_from_slice(tag.as_ref());
31 black_box(
32 reader
33 .decrypt(black_box(&mut bytes))
34 .map_err(|_| "decrypt failed")?,
35 );
36 }
37 let elapsed = start.elapsed().as_secs_f64();
38 assert!(bytes[..size].iter().all(|&byte| byte == 42));
39 Ok(elapsed * 1e9 / iterations as f64)
40}Sourcepub fn validate_offer(offer: Option<u16>, header: HeaderProtocol) -> Result<()>
pub fn validate_offer(offer: Option<u16>, header: HeaderProtocol) -> Result<()>
Reject unknown or unauthenticated selections before any setup response.
Sourcepub fn key(self) -> AesKeyType
pub fn key(self) -> AesKeyType
The per-leg secret sent inside the authenticated setup response.
Sourcepub fn protocol(self) -> Option<u16>
pub fn protocol(self) -> Option<u16>
Omit the field completely when interoperating with a legacy peer.
Sourcepub fn endpoint_codecs(self) -> Result<(Aes256GcmDeCodec, Aes256GcmEnCodec)>
pub fn endpoint_codecs(self) -> Result<(Aes256GcmDeCodec, Aes256GcmEnCodec)>
Receiving and sending codecs from the local endpoint’s perspective.
Examples found in repository?
examples/data_codec_bench.rs (line 18)
9fn measure(v2: bool, size: usize, iterations: usize) -> Result<f64, Box<dyn Error>> {
10 let codec = if v2 {
11 DataCodec::negotiate([42; 32], Some(2), HeaderProtocol::V2)?
12 } else {
13 DataCodec::legacy([42; 32])
14 };
15 if size == 0 {
16 let start = Instant::now();
17 for _ in 0..iterations {
18 black_box(black_box(codec).endpoint_codecs()?);
19 }
20 return Ok(start.elapsed().as_secs_f64() * 1e9 / iterations as f64);
21 }
22 let (_, mut writer) = codec.endpoint_codecs()?;
23 let (mut reader, _) = codec.relay_codecs()?;
24 let mut bytes = vec![42; size + 16];
25 let start = Instant::now();
26 for _ in 0..iterations {
27 let tag = writer
28 .encrypt(black_box(&mut bytes[..size]))
29 .map_err(|_| "encrypt failed")?;
30 bytes[size..].copy_from_slice(tag.as_ref());
31 black_box(
32 reader
33 .decrypt(black_box(&mut bytes))
34 .map_err(|_| "decrypt failed")?,
35 );
36 }
37 let elapsed = start.elapsed().as_secs_f64();
38 assert!(bytes[..size].iter().all(|&byte| byte == 42));
39 Ok(elapsed * 1e9 / iterations as f64)
40}Sourcepub fn relay_codecs(self) -> Result<(Aes256GcmDeCodec, Aes256GcmEnCodec)>
pub fn relay_codecs(self) -> Result<(Aes256GcmDeCodec, Aes256GcmEnCodec)>
Receiving and sending codecs from the relay’s perspective.
Examples found in repository?
examples/data_codec_bench.rs (line 23)
9fn measure(v2: bool, size: usize, iterations: usize) -> Result<f64, Box<dyn Error>> {
10 let codec = if v2 {
11 DataCodec::negotiate([42; 32], Some(2), HeaderProtocol::V2)?
12 } else {
13 DataCodec::legacy([42; 32])
14 };
15 if size == 0 {
16 let start = Instant::now();
17 for _ in 0..iterations {
18 black_box(black_box(codec).endpoint_codecs()?);
19 }
20 return Ok(start.elapsed().as_secs_f64() * 1e9 / iterations as f64);
21 }
22 let (_, mut writer) = codec.endpoint_codecs()?;
23 let (mut reader, _) = codec.relay_codecs()?;
24 let mut bytes = vec![42; size + 16];
25 let start = Instant::now();
26 for _ in 0..iterations {
27 let tag = writer
28 .encrypt(black_box(&mut bytes[..size]))
29 .map_err(|_| "encrypt failed")?;
30 bytes[size..].copy_from_slice(tag.as_ref());
31 black_box(
32 reader
33 .decrypt(black_box(&mut bytes))
34 .map_err(|_| "decrypt failed")?,
35 );
36 }
37 let elapsed = start.elapsed().as_secs_f64();
38 assert!(bytes[..size].iter().all(|&byte| byte == 42));
39 Ok(elapsed * 1e9 / iterations as f64)
40}Trait Implementations§
Auto Trait Implementations§
impl Freeze for DataCodec
impl RefUnwindSafe for DataCodec
impl Send for DataCodec
impl Sync for DataCodec
impl Unpin for DataCodec
impl UnsafeUnpin for DataCodec
impl UnwindSafe for DataCodec
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more