Skip to content

Commit 3e4bcd7

Browse files
committed
Add version enum to tedge-p11-server connection frame
Signed-off-by: Marcel Guzik <[email protected]>
1 parent 29880ac commit 3e4bcd7

File tree

3 files changed

+51
-14
lines changed

3 files changed

+51
-14
lines changed

crates/extensions/tedge-p11-server/src/non_grpc/client.rs

+10-8
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ use tracing::debug;
99
use tracing::instrument;
1010
use tracing::trace;
1111

12+
use crate::connection::Payload;
13+
1214
use super::connection::Frame;
1315
use super::service::ChooseSchemeRequest;
1416
use super::service::SignRequest;
@@ -29,18 +31,18 @@ impl TedgeP11Client {
2931

3032
debug!("Connected to socket");
3133

32-
let request = Frame::ChooseSchemeRequest(ChooseSchemeRequest {
34+
let request = Frame::new(Payload::ChooseSchemeRequest(ChooseSchemeRequest {
3335
offered: offered
3436
.iter()
3537
.copied()
3638
.map(super::service::SignatureScheme)
3739
.collect::<Vec<_>>(),
38-
});
40+
}));
3941
connection.write_frame(&request)?;
4042

41-
let response = connection.read_frame()?;
43+
let response = connection.read_frame()?.payload;
4244

43-
let Frame::ChooseSchemeResponse(response) = response else {
45+
let Payload::ChooseSchemeResponse(response) = response else {
4446
bail!("protocol error: bad response, expected chose scheme");
4547
};
4648

@@ -58,14 +60,14 @@ impl TedgeP11Client {
5860
let mut connection = crate::connection::Connection::new(stream);
5961
debug!("Connected to socket");
6062

61-
let request = Frame::SignRequest(SignRequest {
63+
let request = Frame::new(Payload::SignRequest(SignRequest {
6264
to_sign: message.to_vec(),
63-
});
65+
}));
6466
connection.write_frame(&request)?;
6567

66-
let response = connection.read_frame()?;
68+
let response = connection.read_frame()?.payload;
6769

68-
let Frame::SignResponse(response) = response else {
70+
let Payload::SignResponse(response) = response else {
6971
bail!("protocol error: bad response, expected sign");
7072
};
7173

crates/extensions/tedge-p11-server/src/non_grpc/connection.rs

+34-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
//! A connection between tedge-p11-server and client that provides a way to send and receive frames.
2+
//!
3+
//! Because connecting to the UNIX socket is very cheap, we can use a simple approach of only
4+
//! sending one request/response per connection.
5+
16
use std::io::Read;
27
use std::io::Write;
38
use std::net::Shutdown;
@@ -20,6 +25,8 @@ impl Connection {
2025
Self { stream }
2126
}
2227

28+
/// Reads a frame and closes the reading half of the connection.
29+
///
2330
/// NOTE: can only be called once
2431
pub fn read_frame(&mut self) -> anyhow::Result<Frame> {
2532
let mut buf = Vec::new();
@@ -30,6 +37,8 @@ impl Connection {
3037
Ok(frame)
3138
}
3239

40+
/// Writes a frame and closes the writing half of the connection.
41+
///
3342
/// NOTE: can only be called once
3443
pub fn write_frame(&mut self, frame: &Frame) -> anyhow::Result<()> {
3544
let buf = postcard::to_allocvec(&frame)?;
@@ -42,7 +51,31 @@ impl Connection {
4251
}
4352

4453
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
45-
pub enum Frame {
54+
pub struct Frame {
55+
/// A version tag for possible future versions, currently ignored.
56+
// although i'm not sure if it's actually necessary now because we can always add it later if need be; it's because
57+
// we know that 1) we're having one connection/one call, so we read until EOF and know we have a valid message (so
58+
// don't have use a scheme like TLV) and 2) we can always add new fields
59+
pub version: Version,
60+
pub payload: Payload,
61+
}
62+
63+
impl Frame {
64+
pub fn new(payload: Payload) -> Self {
65+
Self {
66+
version: Version::Version1,
67+
payload,
68+
}
69+
}
70+
}
71+
72+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
73+
pub enum Version {
74+
Version1,
75+
}
76+
77+
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
78+
pub enum Payload {
4679
ChooseSchemeRequest(ChooseSchemeRequest),
4780
SignRequest(SignRequest),
4881
ChooseSchemeResponse(ChooseSchemeResponse),

crates/extensions/tedge-p11-server/src/non_grpc/server.rs

+7-5
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use tracing::info;
1111
use std::os::unix::net::UnixListener;
1212

1313
use super::connection::Connection;
14+
use super::connection::Payload;
1415

1516
pub struct P11SigningServer {
1617
config: CryptokiConfigDirect,
@@ -46,17 +47,18 @@ impl P11SigningServer {
4647
fn process(config: &CryptokiConfigDirect, mut connection: Connection) -> anyhow::Result<()> {
4748
let service = P11SignerService::new(config);
4849

49-
let request = connection.read_frame()?;
50+
let request = connection.read_frame()?.payload;
5051

5152
let response = match request {
52-
Frame::ChooseSchemeResponse { .. } | Frame::SignResponse { .. } => {
53+
Payload::ChooseSchemeResponse { .. } | Payload::SignResponse { .. } => {
5354
anyhow::bail!("protocol error")
5455
}
55-
Frame::ChooseSchemeRequest(request) => {
56-
Frame::ChooseSchemeResponse(service.choose_scheme(request))
56+
Payload::ChooseSchemeRequest(request) => {
57+
Payload::ChooseSchemeResponse(service.choose_scheme(request))
5758
}
58-
Frame::SignRequest(request) => Frame::SignResponse(service.sign(request)),
59+
Payload::SignRequest(request) => Payload::SignResponse(service.sign(request)),
5960
};
61+
let response = Frame::new(response);
6062

6163
connection.write_frame(&response)?;
6264

0 commit comments

Comments
 (0)