Skip to content

Commit d07c4d9

Browse files
committed
add saga abstraction and update identity with protocol standard packet structure
1 parent 48d530d commit d07c4d9

16 files changed

Lines changed: 962 additions & 331 deletions

Cargo.lock

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/node/Cargo.toml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ publish = false
99
[dependencies]
1010
bytes = "*"
1111
rand = "*"
12+
rand_core = "*"
1213
async-trait = "*"
1314
futures = "*"
1415
tokio = { version = "1.48.0", features = ["full"] }
@@ -36,6 +37,8 @@ libp2p = { version = "0.56.0", features = [
3637
toml = "*"
3738
bon = "*"
3839
serde = { version = "*", features = ["derive"] }
40+
serde_json = "*"
41+
bincode = "*"
3942
tonic = "0.14.5"
4043
tonic-prost = "*"
4144
tonic-reflection = "*"
@@ -56,6 +59,8 @@ url = "*"
5659
nanoid = "*"
5760
hex = "*"
5861

62+
ed25519-dalek = { version = "2.1.0", features = ["rand_core"] }
63+
5964
[dev-dependencies]
6065
testcontainers = "*"
6166
tokio = { version = "1.48.0", features = ["macros", "rt-multi-thread"] }
@@ -121,7 +126,7 @@ path = "src/main.rs"
121126
required-features = ["malicious_relay"]
122127

123128
[features]
124-
default = ["client", "end_to_end"]
129+
default = ["relay", "end_to_end"]
125130
bootstrap = []
126131
client = []
127132
server = []

app/node/src/grpc.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ impl proto::node_server::Node for Server {
3030
let event = PeerId {
3131
completed: completed.to_owned()
3232
};
33-
let event = Event::new(event);
33+
let event = Event::from_any(event);
3434
self.sx.send(event).await
3535
.ok()
3636
.ok_or(tonic::Status::internal("unable to send event"))?;
@@ -67,7 +67,7 @@ impl proto::node_server::Node for Server {
6767
addr,
6868
completed: completed.to_owned()
6969
};
70-
let event: Event = Event::new(event);
70+
let event: Event = Event::from_any(event);
7171
self.sx.send(event).await
7272
.ok()
7373
.ok_or(tonic::Status::internal(format!("failed to send event")))?;

app/node/src/identity.rs

Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
use super::*;
2+
use ed25519_dalek::Signer as _;
3+
use ed25519::signature::Keypair as _;
4+
5+
#[derive(Debug)]
6+
#[derive(Clone)]
7+
#[derive(PartialEq)]
8+
#[derive(Eq)]
9+
#[derive(derive_more::Deref)]
10+
#[derive(derive_more::DerefMut)]
11+
pub struct SignedVerified {
12+
pk: PublicKey,
13+
#[deref]
14+
#[deref_mut]
15+
content: Vec<u8>
16+
}
17+
18+
impl SignedVerified {
19+
pub fn pk(&self) -> &PublicKey {
20+
&self.pk
21+
}
22+
23+
pub fn content(&self) -> &[u8] {
24+
&self.content
25+
}
26+
27+
pub fn unpack(self) -> (PublicKey, Unsigned) {
28+
let mg: Unsigned = self.content.into();
29+
(self.pk, mg)
30+
}
31+
}
32+
33+
impl TryFrom<SignedUnverified> for SignedVerified {
34+
type Error = Box<dyn std::error::Error>;
35+
36+
fn try_from(value: SignedUnverified) -> std::result::Result<Self, Self::Error> {
37+
let (sg, pk, mg) = value.unpack();
38+
39+
sg.verify(&mg, &pk)?;
40+
41+
let Unsigned(content) = mg;
42+
Ok(Self {
43+
pk: pk.to_owned(),
44+
content
45+
})
46+
}
47+
}
48+
49+
#[derive(Debug)]
50+
#[derive(Clone)]
51+
#[derive(PartialEq)]
52+
#[derive(Eq)]
53+
#[derive(serde::Serialize)]
54+
#[derive(serde::Deserialize)]
55+
#[derive(derive_more::Deref)]
56+
#[derive(derive_more::DerefMut)]
57+
#[serde(try_from = "Vec<u8>")]
58+
pub struct SignedUnverified(Vec<u8>);
59+
60+
impl SignedUnverified {
61+
pub fn verify(self) -> Result<SignedVerified> {
62+
self.try_into()
63+
}
64+
65+
pub fn unpack(self) -> (Signature, PublicKey, Unsigned) {
66+
let Self(mut bytes) = self;
67+
let mut mgpk: Vec<_> = bytes.split_off(64);
68+
let mg: Vec<_> = mgpk.split_off(32);
69+
let mg: Unsigned = mg.try_into().expect("unsigned content slice is guaranteed to be non-empty via constructors");
70+
let pk: [_; _] = mgpk.as_slice().try_into().expect("public key state corruption; must equal 32 bytes");
71+
let pk: PublicKey = pk.into();
72+
let sg: [_; _] = bytes.as_slice().try_into().expect("signature state corruption; remaining bytes must equal 64; guaranteed via constructors");
73+
let sg: Signature = sg.into();
74+
(sg, pk, mg)
75+
}
76+
}
77+
78+
impl From<(&Unsigned, &SecretKey)> for SignedUnverified {
79+
fn from(value: (&Unsigned, &SecretKey)) -> Self {
80+
let (Unsigned(mg), SecretKey(sk)) = value;
81+
let sk: ed25519_dalek::SigningKey = ed25519_dalek::SigningKey::from_bytes(&sk);
82+
let pk: [_; _] = sk.verifying_key().to_bytes();
83+
let sg: ed25519_dalek::Signature = sk.sign(&mg);
84+
let sg: [_; _] = sg.to_bytes();
85+
let capacity: usize = 64 + 32 + mg.len();
86+
87+
let mut bytes: Vec<_> = Vec::with_capacity(capacity);
88+
bytes.extend_from_slice(&sg);
89+
bytes.extend_from_slice(&pk);
90+
bytes.extend_from_slice(&mg);
91+
92+
Self(bytes)
93+
}
94+
}
95+
96+
impl TryFrom<Vec<u8>> for SignedUnverified {
97+
type Error = Box<dyn std::error::Error>;
98+
99+
fn try_from(value: Vec<u8>) -> std::result::Result<Self, Self::Error> {
100+
if value.len() <= 96 {
101+
return Err(<Box<dyn std::error::Error>>::from(String::from("signed message packet is too short")))
102+
}
103+
let content: &[_] = &value[96..];
104+
if content.is_empty() {
105+
return Err(<Box<dyn std::error::Error>>::from(String::from("signed message content cannot be empty")))
106+
}
107+
Ok(Self(value))
108+
}
109+
}
110+
111+
#[derive(Debug)]
112+
#[derive(Clone)]
113+
#[derive(PartialEq)]
114+
#[derive(Eq)]
115+
#[derive(serde::Serialize)]
116+
#[derive(serde::Deserialize)]
117+
#[derive(derive_more::Deref)]
118+
#[derive(derive_more::DerefMut)]
119+
#[serde(try_from = "Vec<u8>")]
120+
pub struct Unsigned(Vec<u8>);
121+
122+
impl Unsigned {
123+
pub fn sign(&self, sk: &SecretKey) -> SignedUnverified {
124+
(self, sk).into()
125+
}
126+
}
127+
128+
impl TryFrom<Vec<u8>> for Unsigned {
129+
type Error = Box<dyn std::error::Error>;
130+
131+
fn try_from(value: Vec<u8>) -> std::result::Result<Self, Self::Error> {
132+
if value.len() == 0 {
133+
return Err(<Box<dyn std::error::Error>>::from(String::from("message too short")))
134+
}
135+
Ok(Self(value))
136+
}
137+
}
138+
139+
#[derive(Debug)]
140+
#[derive(Clone)]
141+
#[derive(PartialEq)]
142+
#[derive(Eq)]
143+
#[derive(derive_more::From)]
144+
pub struct PublicKey([u8; 32]);
145+
146+
#[derive(Debug)]
147+
#[derive(Clone)]
148+
#[derive(PartialEq)]
149+
#[derive(Eq)]
150+
#[derive(derive_more::From)]
151+
pub struct SecretKey([u8; 32]);
152+
153+
#[derive(Debug)]
154+
#[derive(Clone)]
155+
#[derive(PartialEq)]
156+
#[derive(Eq)]
157+
#[derive(derive_more::From)]
158+
pub struct Signature([u8; 64]);
159+
160+
impl Signature {
161+
pub fn verify(&self, mg: &[u8], pk: &PublicKey) -> Result {
162+
let pk: ed25519_dalek::VerifyingKey = ed25519_dalek::VerifyingKey::from_bytes(&pk.0)?;
163+
let sg: ed25519_dalek::Signature = ed25519_dalek::Signature::from_bytes(&self.0);
164+
165+
pk.verify(mg, &sg)
166+
}
167+
}
168+
169+
#[derive(Debug)]
170+
#[derive(Clone)]
171+
#[derive(PartialEq)]
172+
#[derive(Eq)]
173+
#[derive(derive_more::From)]
174+
pub struct Pair((PublicKey, SecretKey));
175+
176+
impl Default for Pair {
177+
fn default() -> Self {
178+
let sk: ed25519_dalek::SigningKey = ed25519_dalek::SigningKey::generate(&mut rand_core::OsRng);
179+
let vk: ed25519_dalek::VerifyingKey = sk.verifying_key();
180+
let vk: [_; _] = vk.to_bytes();
181+
let pk: PublicKey = PublicKey::from(vk);
182+
let sk: [_; _] = sk.to_bytes();
183+
let sk: SecretKey = SecretKey::from(sk);
184+
185+
Self::from((pk, sk))
186+
}
187+
}
188+
189+
impl From<SecretKey> for Pair {
190+
fn from(value: SecretKey) -> Self {
191+
let SecretKey(bytes) = value;
192+
let sk: ed25519_dalek::SigningKey = ed25519_dalek::SigningKey::from_bytes(&bytes);
193+
let vk: ed25519_dalek::VerifyingKey = sk.verifying_key();
194+
let vk: [_; _] = vk.to_bytes();
195+
let pk: PublicKey = PublicKey::from(vk);
196+
let sk: [_; _] = sk.to_bytes();
197+
let sk: SecretKey = SecretKey::from(sk);
198+
199+
Self::from((pk, sk))
200+
}
201+
}

0 commit comments

Comments
 (0)