1+ use std:: fmt;
2+
3+ use serde:: {
4+ de:: { self , MapAccess , Visitor } ,
5+ ser:: { SerializeMap , SerializeStruct } ,
6+ Deserialize , Deserializer , Serialize , Serializer ,
7+ } ;
8+
9+ use crate :: hyperware:: process:: sign:: {
10+ NetKeyVerifyRequest , Request as SignRequest , Response as SignResponse ,
11+ } ;
112use crate :: { last_blob, Address , Request } ;
2- // TODO: use WIT types
313
414pub fn net_key_sign ( message : Vec < u8 > ) -> anyhow:: Result < Vec < u8 > > {
5- Request :: to ( ( "our" , "sign" , "sign" , "sys" ) )
6- . body ( " \" NetKeySign\" " )
15+ let response = Request :: to ( ( "our" , "sign" , "sign" , "sys" ) )
16+ . body ( serde_json :: to_vec ( & SignRequest :: NetKeySign ) . unwrap ( ) )
717 . blob_bytes ( message)
818 . send_and_await_response ( 10 ) ??;
19+
20+ let SignResponse :: NetKeySign = serde_json:: from_slice ( response. body ( ) ) ? else {
21+ return Err ( anyhow:: anyhow!(
22+ "unexpected response from sign:sign:sys: {}" ,
23+ String :: from_utf8( response. body( ) . into( ) ) . unwrap_or_default( ) ,
24+ ) ) ;
25+ } ;
26+
927 Ok ( last_blob ( ) . unwrap ( ) . bytes )
1028}
1129
@@ -16,23 +34,225 @@ pub fn net_key_verify(
1634) -> anyhow:: Result < bool > {
1735 let response = Request :: to ( ( "our" , "sign" , "sign" , "sys" ) )
1836 . body (
19- serde_json:: json!( {
20- "NetKeyVerify" : {
21- "node" : signer,
22- "signature" : signature,
23- }
24- } )
25- . to_string ( ) ,
37+ serde_json:: to_vec ( & SignRequest :: NetKeyVerify ( NetKeyVerifyRequest {
38+ node : signer. to_string ( ) ,
39+ signature,
40+ } ) )
41+ . unwrap ( ) ,
2642 )
2743 . blob_bytes ( message)
2844 . send_and_await_response ( 10 ) ??;
2945
30- let response: serde_json:: Value = serde_json:: from_slice ( response. body ( ) ) ?;
31- let serde_json:: Value :: Bool ( response) = response[ "NetKeyVerify" ] else {
46+ let SignResponse :: NetKeyVerify ( response) = serde_json:: from_slice ( response. body ( ) ) ? else {
3247 return Err ( anyhow:: anyhow!(
33- "unexpected response from sign:sign:sys: {response}"
48+ "unexpected response from sign:sign:sys: {}" ,
49+ String :: from_utf8( response. body( ) . into( ) ) . unwrap_or_default( ) ,
3450 ) ) ;
3551 } ;
3652
3753 Ok ( response)
3854}
55+
56+ impl Serialize for NetKeyVerifyRequest {
57+ fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
58+ where
59+ S : Serializer ,
60+ {
61+ let mut state = serializer. serialize_struct ( "NetKeyVerifyRequest" , 2 ) ?;
62+ state. serialize_field ( "node" , & self . node ) ?;
63+ state. serialize_field ( "signature" , & self . signature ) ?;
64+ state. end ( )
65+ }
66+ }
67+
68+ impl < ' de > Deserialize < ' de > for NetKeyVerifyRequest {
69+ fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
70+ where
71+ D : Deserializer < ' de > ,
72+ {
73+ #[ derive( Deserialize ) ]
74+ #[ serde( field_identifier, rename_all = "snake_case" ) ]
75+ enum Field {
76+ Node ,
77+ Signature ,
78+ }
79+
80+ struct NetKeyVerifyRequestVisitor ;
81+
82+ impl < ' de > Visitor < ' de > for NetKeyVerifyRequestVisitor {
83+ type Value = NetKeyVerifyRequest ;
84+
85+ fn expecting ( & self , formatter : & mut fmt:: Formatter ) -> fmt:: Result {
86+ formatter. write_str ( "struct NetKeyVerifyRequest" )
87+ }
88+
89+ fn visit_map < V > ( self , mut map : V ) -> Result < NetKeyVerifyRequest , V :: Error >
90+ where
91+ V : MapAccess < ' de > ,
92+ {
93+ let mut node = None ;
94+ let mut signature = None ;
95+
96+ while let Some ( key) = map. next_key ( ) ? {
97+ match key {
98+ Field :: Node => {
99+ if node. is_some ( ) {
100+ return Err ( de:: Error :: duplicate_field ( "node" ) ) ;
101+ }
102+ node = Some ( map. next_value ( ) ?) ;
103+ }
104+ Field :: Signature => {
105+ if signature. is_some ( ) {
106+ return Err ( de:: Error :: duplicate_field ( "signature" ) ) ;
107+ }
108+ signature = Some ( map. next_value ( ) ?) ;
109+ }
110+ }
111+ }
112+
113+ let node = node. ok_or_else ( || de:: Error :: missing_field ( "node" ) ) ?;
114+ let signature = signature. ok_or_else ( || de:: Error :: missing_field ( "signature" ) ) ?;
115+
116+ Ok ( NetKeyVerifyRequest { node, signature } )
117+ }
118+ }
119+
120+ deserializer. deserialize_struct (
121+ "NetKeyVerifyRequest" ,
122+ & [ "node" , "signature" ] ,
123+ NetKeyVerifyRequestVisitor ,
124+ )
125+ }
126+ }
127+
128+ impl Serialize for SignRequest {
129+ fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
130+ where
131+ S : Serializer ,
132+ {
133+ match self {
134+ SignRequest :: NetKeySign => {
135+ let mut map = serializer. serialize_map ( Some ( 1 ) ) ?;
136+ map. serialize_entry ( "NetKeySign" , & ( ) ) ?;
137+ map. end ( )
138+ }
139+ SignRequest :: NetKeyVerify ( request) => {
140+ let mut map = serializer. serialize_map ( Some ( 1 ) ) ?;
141+ map. serialize_entry ( "NetKeyVerify" , request) ?;
142+ map. end ( )
143+ }
144+ SignRequest :: NetKeyMakeMessage => {
145+ let mut map = serializer. serialize_map ( Some ( 1 ) ) ?;
146+ map. serialize_entry ( "NetKeyMakeMessage" , & ( ) ) ?;
147+ map. end ( )
148+ }
149+ }
150+ }
151+ }
152+
153+ impl < ' de > Deserialize < ' de > for SignRequest {
154+ fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
155+ where
156+ D : Deserializer < ' de > ,
157+ {
158+ struct SignRequestVisitor ;
159+
160+ impl < ' de > Visitor < ' de > for SignRequestVisitor {
161+ type Value = SignRequest ;
162+
163+ fn expecting ( & self , formatter : & mut fmt:: Formatter ) -> fmt:: Result {
164+ formatter. write_str ( "a map with a single key representing the SignRequest variant" )
165+ }
166+
167+ fn visit_map < A > ( self , mut map : A ) -> Result < Self :: Value , A :: Error >
168+ where
169+ A : MapAccess < ' de > ,
170+ {
171+ let ( variant, value) = map
172+ . next_entry :: < String , serde_json:: Value > ( ) ?
173+ . ok_or_else ( || de:: Error :: invalid_length ( 0 , & self ) ) ?;
174+
175+ match variant. as_str ( ) {
176+ "NetKeySign" => Ok ( SignRequest :: NetKeySign ) ,
177+ "NetKeyVerify" => {
178+ let request = serde_json:: from_value ( value) . map_err ( de:: Error :: custom) ?;
179+ Ok ( SignRequest :: NetKeyVerify ( request) )
180+ }
181+ "NetKeyMakeMessage" => Ok ( SignRequest :: NetKeyMakeMessage ) ,
182+ _ => Err ( de:: Error :: unknown_variant (
183+ & variant,
184+ & [ "NetKeySign" , "NetKeyVerify" , "NetKeyMakeMessage" ] ,
185+ ) ) ,
186+ }
187+ }
188+ }
189+
190+ deserializer. deserialize_map ( SignRequestVisitor )
191+ }
192+ }
193+
194+ impl Serialize for SignResponse {
195+ fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
196+ where
197+ S : Serializer ,
198+ {
199+ match self {
200+ SignResponse :: NetKeySign => {
201+ let mut map = serializer. serialize_map ( Some ( 1 ) ) ?;
202+ map. serialize_entry ( "NetKeySign" , & ( ) ) ?;
203+ map. end ( )
204+ }
205+ SignResponse :: NetKeyVerify ( valid) => {
206+ let mut map = serializer. serialize_map ( Some ( 1 ) ) ?;
207+ map. serialize_entry ( "NetKeyVerify" , valid) ?;
208+ map. end ( )
209+ }
210+ SignResponse :: NetKeyMakeMessage => {
211+ let mut map = serializer. serialize_map ( Some ( 1 ) ) ?;
212+ map. serialize_entry ( "NetKeyMakeMessage" , & ( ) ) ?;
213+ map. end ( )
214+ }
215+ }
216+ }
217+ }
218+
219+ impl < ' de > Deserialize < ' de > for SignResponse {
220+ fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
221+ where
222+ D : Deserializer < ' de > ,
223+ {
224+ struct SignResponseVisitor ;
225+
226+ impl < ' de > Visitor < ' de > for SignResponseVisitor {
227+ type Value = SignResponse ;
228+
229+ fn expecting ( & self , formatter : & mut fmt:: Formatter ) -> fmt:: Result {
230+ formatter. write_str ( "a map with a single key representing the SignResponse variant" )
231+ }
232+
233+ fn visit_map < A > ( self , mut map : A ) -> Result < Self :: Value , A :: Error >
234+ where
235+ A : MapAccess < ' de > ,
236+ {
237+ let ( variant, value) = map
238+ . next_entry :: < String , serde_json:: Value > ( ) ?
239+ . ok_or_else ( || de:: Error :: invalid_length ( 0 , & self ) ) ?;
240+
241+ match variant. as_str ( ) {
242+ "NetKeySign" => Ok ( SignResponse :: NetKeySign ) ,
243+ "NetKeyVerify" => {
244+ let valid = serde_json:: from_value ( value) . map_err ( de:: Error :: custom) ?;
245+ Ok ( SignResponse :: NetKeyVerify ( valid) )
246+ }
247+ "NetKeyMakeMessage" => Ok ( SignResponse :: NetKeyMakeMessage ) ,
248+ _ => Err ( de:: Error :: unknown_variant (
249+ & variant,
250+ & [ "NetKeySign" , "NetKeyVerify" , "NetKeyMakeMessage" ] ,
251+ ) ) ,
252+ }
253+ }
254+ }
255+
256+ deserializer. deserialize_map ( SignResponseVisitor )
257+ }
258+ }
0 commit comments