Skip to content

Commit 8d24555

Browse files
committed
sign: use wit types; do response checking on sign
1 parent ae16266 commit 8d24555

File tree

1 file changed

+233
-13
lines changed

1 file changed

+233
-13
lines changed

src/sign.rs

Lines changed: 233 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,29 @@
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+
};
112
use crate::{last_blob, Address, Request};
2-
// TODO: use WIT types
313

414
pub 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

Comments
 (0)