Skip to content

Commit 5775f10

Browse files
authored
Merge pull request #19 from Foundation-Devices/sdk-ql-identity
Refactor QL identity
2 parents f21aa22 + e7bff4e commit 5775f10

File tree

2 files changed

+68
-23
lines changed

2 files changed

+68
-23
lines changed

Justfile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Run clippy on all targets and features, treating warnings as errors
2+
clippy:
3+
cargo clippy --all-targets --all-features -- -D warnings

api/src/api/quantum_link.rs

Lines changed: 65 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::message::{EnvoyMessage, PassportMessage};
22
use anyhow::bail;
33
use bc_components::{EncapsulationScheme, PrivateKeys, PublicKeys, SignatureScheme, ARID};
4-
use bc_envelope::prelude::CBOR;
4+
use bc_envelope::prelude::{CBORCase, CBOR};
55
use bc_envelope::{Envelope, EventBehavior, Expression, ExpressionBehavior, Function};
66
use bc_xid::XIDDocument;
77
use flutter_rust_bridge::frb;
@@ -43,16 +43,13 @@ pub trait QuantumLink<C>: minicbor::Encode<C> {
4343
where
4444
Self: minicbor::Encode<()>,
4545
{
46-
let event: SealedEvent<Expression> = SealedEvent::new(
47-
QuantumLink::encode(self),
48-
ARID::new(),
49-
sender.xid_document.unwrap(),
50-
);
46+
let event: SealedEvent<Expression> =
47+
SealedEvent::new(QuantumLink::encode(self), ARID::new(), sender.xid_document);
5148
event
5249
.to_envelope(
5350
None,
5451
Some(&sender.private_keys.unwrap()),
55-
Some(&recipient.xid_document.unwrap()),
52+
Some(&recipient.xid_document),
5653
)
5754
.unwrap()
5855
}
@@ -91,24 +88,55 @@ pub trait QuantumLink<C>: minicbor::Encode<C> {
9188
#[frb(opaque)]
9289
pub struct QuantumLinkIdentity {
9390
pub private_keys: Option<PrivateKeys>,
94-
pub public_keys: Option<PublicKeys>,
95-
pub xid_document: Option<XIDDocument>,
91+
pub xid_document: XIDDocument,
9692
}
9793

98-
pub fn generate_identity() -> QuantumLinkIdentity {
99-
let (signing_private_key, signing_public_key) = SignatureScheme::MLDSA44.keypair();
100-
let (encapsulation_private_key, encapsulation_public_key) =
101-
EncapsulationScheme::MLKEM512.keypair();
94+
impl QuantumLinkIdentity {
95+
pub fn generate() -> Self {
96+
let (signing_private_key, signing_public_key) = SignatureScheme::MLDSA44.keypair();
97+
let (encapsulation_private_key, encapsulation_public_key) =
98+
EncapsulationScheme::MLKEM512.keypair();
99+
100+
let private_keys = PrivateKeys::with_keys(signing_private_key, encapsulation_private_key);
101+
let public_keys = PublicKeys::new(signing_public_key, encapsulation_public_key);
102102

103-
let private_keys = PrivateKeys::with_keys(signing_private_key, encapsulation_private_key);
104-
let public_keys = PublicKeys::new(signing_public_key, encapsulation_public_key);
103+
let xid_document = XIDDocument::new(public_keys.clone());
104+
105+
QuantumLinkIdentity {
106+
private_keys: Some(private_keys),
107+
xid_document,
108+
}
109+
}
105110

106-
let xid_document = XIDDocument::new(public_keys.clone());
111+
pub fn to_bytes(&self) -> anyhow::Result<Vec<u8>> {
112+
let mut map = bc_envelope::prelude::Map::new();
113+
map.insert(CBOR::from("xid_document"), self.clone().xid_document);
114+
if self.private_keys.is_some() {
115+
map.insert(
116+
CBOR::from("private_keys"),
117+
self.clone().private_keys.unwrap(),
118+
);
119+
}
107120

108-
QuantumLinkIdentity {
109-
private_keys: Some(private_keys),
110-
public_keys: Some(public_keys),
111-
xid_document: Some(xid_document),
121+
Ok(CBOR::from(map).to_cbor_data())
122+
}
123+
124+
pub fn from_bytes(bytes: &[u8]) -> anyhow::Result<Self> {
125+
let cbor = CBOR::try_from_data(bytes)
126+
.ok()
127+
.ok_or_else(|| anyhow::anyhow!("Invalid CBOR"))?;
128+
let case = cbor.into_case();
129+
130+
let CBORCase::Map(map) = case else {
131+
return Err(anyhow::anyhow!("Invalid CBOR case"));
132+
};
133+
134+
Ok(QuantumLinkIdentity {
135+
xid_document: map
136+
.get("xid_document")
137+
.ok_or_else(|| anyhow::anyhow!("xid_document not found"))?,
138+
private_keys: map.get("private_keys"),
139+
})
112140
}
113141
}
114142

@@ -118,7 +146,7 @@ mod tests {
118146
use crate::api::quantum_link::QuantumLink;
119147
use crate::fx::ExchangeRate;
120148
use crate::message::EnvoyMessage;
121-
use crate::quantum_link::generate_identity;
149+
use crate::quantum_link::QuantumLinkIdentity;
122150

123151
#[test]
124152
fn test_encode_decode_quantumlink_message() {
@@ -142,8 +170,8 @@ mod tests {
142170

143171
#[test]
144172
fn test_seal_unseal_quantumlink_message() {
145-
let envoy = generate_identity();
146-
let passport = generate_identity();
173+
let envoy = QuantumLinkIdentity::generate();
174+
let passport = QuantumLinkIdentity::generate();
147175

148176
let fx_rate = ExchangeRate::new("USD", 0.85);
149177
let original_message = EnvoyMessage {
@@ -166,4 +194,18 @@ mod tests {
166194
// Assert that the original and decoded messages are the same
167195
assert_eq!(fx_rate.rate(), fx_rate_decoded.rate());
168196
}
197+
198+
#[test]
199+
fn test_serialize_ql_identity() {
200+
let identity = QuantumLinkIdentity::generate();
201+
let bytes = identity.to_bytes().unwrap();
202+
203+
let deserialized_identity = QuantumLinkIdentity::from_bytes(bytes.as_slice()).unwrap();
204+
205+
// Assert that the original and decoded messages are the same
206+
assert_eq!(
207+
identity.private_keys.unwrap(),
208+
deserialized_identity.private_keys.unwrap()
209+
);
210+
}
169211
}

0 commit comments

Comments
 (0)