11use crate :: message:: { EnvoyMessage , PassportMessage } ;
22use anyhow:: bail;
33use bc_components:: { EncapsulationScheme , PrivateKeys , PublicKeys , SignatureScheme , ARID } ;
4- use bc_envelope:: prelude:: CBOR ;
4+ use bc_envelope:: prelude:: { CBORCase , CBOR } ;
55use bc_envelope:: { Envelope , EventBehavior , Expression , ExpressionBehavior , Function } ;
66use bc_xid:: XIDDocument ;
77use 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) ]
9289pub 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