1use super::cbor_encodings::*;
5use super::*;
6use crate::byron::AddrAttributes;
7use cbor_event::de::Deserializer;
8use cbor_event::se::Serializer;
9use cml_core::error::*;
10use cml_core::serialization::*;
11use cml_crypto::RawBytesEncoding;
12use std::io::{BufRead, Seek, SeekFrom, Write};
13
14impl Serialize for BootstrapWitness {
15 fn serialize<'se, W: Write>(
16 &self,
17 serializer: &'se mut Serializer<W>,
18 force_canonical: bool,
19 ) -> cbor_event::Result<&'se mut Serializer<W>> {
20 serializer.write_array_sz(
21 self.encodings
22 .as_ref()
23 .map(|encs| encs.len_encoding)
24 .unwrap_or_default()
25 .to_len_sz(4, force_canonical),
26 )?;
27 serializer.write_bytes_sz(
28 self.public_key.to_raw_bytes(),
29 self.encodings
30 .as_ref()
31 .map(|encs| encs.public_key_encoding.clone())
32 .unwrap_or_default()
33 .to_str_len_sz(self.public_key.to_raw_bytes().len() as u64, force_canonical),
34 )?;
35 serializer.write_bytes_sz(
36 self.signature.to_raw_bytes(),
37 self.encodings
38 .as_ref()
39 .map(|encs| encs.signature_encoding.clone())
40 .unwrap_or_default()
41 .to_str_len_sz(self.signature.to_raw_bytes().len() as u64, force_canonical),
42 )?;
43 serializer.write_bytes_sz(
44 &self.chain_code,
45 self.encodings
46 .as_ref()
47 .map(|encs| encs.chain_code_encoding.clone())
48 .unwrap_or_default()
49 .to_str_len_sz(self.chain_code.len() as u64, force_canonical),
50 )?;
51 let mut attributes_inner_se = Serializer::new_vec();
52 cbor_event::Serialize::serialize(&self.attributes, &mut attributes_inner_se)?;
54 let attributes_bytes = attributes_inner_se.finalize();
55 serializer.write_bytes_sz(
56 &attributes_bytes,
57 self.encodings
58 .as_ref()
59 .map(|encs| encs.attributes_bytes_encoding.clone())
60 .unwrap_or_default()
61 .to_str_len_sz(attributes_bytes.len() as u64, force_canonical),
62 )?;
63 self.encodings
64 .as_ref()
65 .map(|encs| encs.len_encoding)
66 .unwrap_or_default()
67 .end(serializer, force_canonical)
68 }
69}
70
71impl Deserialize for BootstrapWitness {
72 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
73 let len = raw.array_sz()?;
74 let len_encoding: LenEncoding = len.into();
75 let mut read_len = CBORReadLen::new(len);
76 read_len.read_elems(4)?;
77 read_len.finish()?;
78 (|| -> Result<_, DeserializeError> {
79 let (public_key, public_key_encoding) = raw
80 .bytes_sz()
81 .map_err(Into::<DeserializeError>::into)
82 .and_then(|(bytes, enc)| {
83 Vkey::from_raw_bytes(&bytes)
84 .map(|bytes| (bytes, StringEncoding::from(enc)))
85 .map_err(|e| DeserializeFailure::InvalidStructure(Box::new(e)).into())
86 })
87 .map_err(|e: DeserializeError| e.annotate("public_key"))?;
88 let (signature, signature_encoding) = raw
89 .bytes_sz()
90 .map_err(Into::<DeserializeError>::into)
91 .and_then(|(bytes, enc)| {
92 Ed25519Signature::from_raw_bytes(&bytes)
93 .map(|bytes| (bytes, StringEncoding::from(enc)))
94 .map_err(|e| DeserializeFailure::InvalidStructure(Box::new(e)).into())
95 })
96 .map_err(|e: DeserializeError| e.annotate("signature"))?;
97 let (chain_code, chain_code_encoding) = raw
98 .bytes_sz()
99 .map_err(Into::<DeserializeError>::into)
100 .map_err(Into::<DeserializeError>::into)
101 .and_then(|(bytes, enc)| {
102 if bytes.len() < 32 || bytes.len() > 32 {
103 Err(DeserializeFailure::RangeCheck {
104 found: bytes.len() as isize,
105 min: Some(32),
106 max: Some(32),
107 }
108 .into())
109 } else {
110 Ok((bytes, StringEncoding::from(enc)))
111 }
112 })
113 .map_err(|e: DeserializeError| e.annotate("chain_code"))?;
114 let (attributes, attributes_bytes_encoding) = (|| -> Result<_, DeserializeError> {
115 let (attributes_bytes, attributes_bytes_encoding) = raw.bytes_sz()?;
116 let inner_de = &mut Deserializer::from(std::io::Cursor::new(attributes_bytes));
117 Ok((
118 AddrAttributes::deserialize(inner_de)?,
119 StringEncoding::from(attributes_bytes_encoding),
120 ))
121 })()
122 .map_err(|e| e.annotate("attributes"))?;
123 match len {
124 cbor_event::LenSz::Len(_, _) => (),
125 cbor_event::LenSz::Indefinite => match raw.special()? {
126 cbor_event::Special::Break => (),
127 _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
128 },
129 }
130 Ok(BootstrapWitness {
131 public_key,
132 signature,
133 chain_code,
134 attributes,
135 encodings: Some(BootstrapWitnessEncoding {
136 len_encoding,
137 public_key_encoding,
138 signature_encoding,
139 chain_code_encoding,
140 attributes_bytes_encoding,
141 }),
142 })
143 })()
144 .map_err(|e| e.annotate("BootstrapWitness"))
145 }
146}
147
148impl Serialize for KESSignature {
149 fn serialize<'se, W: Write>(
150 &self,
151 serializer: &'se mut Serializer<W>,
152 force_canonical: bool,
153 ) -> cbor_event::Result<&'se mut Serializer<W>> {
154 serializer.write_bytes_sz(
155 &self.inner,
156 self.encodings
157 .as_ref()
158 .map(|encs| encs.inner_encoding.clone())
159 .unwrap_or_default()
160 .to_str_len_sz(self.inner.len() as u64, force_canonical),
161 )
162 }
163}
164
165impl Deserialize for KESSignature {
166 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
167 let (inner, inner_encoding) = raw
168 .bytes_sz()
169 .map(|(bytes, enc)| (bytes, StringEncoding::from(enc)))?;
170 if inner.len() != 448 {
171 return Err(DeserializeError::new(
172 "KESSignature",
173 DeserializeFailure::RangeCheck {
174 found: inner.len() as isize,
175 min: Some(448),
176 max: Some(448),
177 },
178 ));
179 }
180 Ok(Self {
181 inner,
182 encodings: Some(KESSignatureEncoding { inner_encoding }),
183 })
184 }
185}
186
187impl Serialize for Nonce {
188 fn serialize<'se, W: Write>(
189 &self,
190 serializer: &'se mut Serializer<W>,
191 force_canonical: bool,
192 ) -> cbor_event::Result<&'se mut Serializer<W>> {
193 match self {
194 Nonce::Identity {
195 identity_encoding,
196 len_encoding,
197 } => {
198 serializer.write_array_sz(len_encoding.to_len_sz(1, force_canonical))?;
199 serializer.write_unsigned_integer_sz(
200 0u64,
201 fit_sz(0u64, *identity_encoding, force_canonical),
202 )?;
203 len_encoding.end(serializer, force_canonical)?;
204 Ok(serializer)
205 }
206 Nonce::Hash {
207 hash,
208 len_encoding,
209 tag_encoding,
210 hash_encoding,
211 } => {
212 serializer.write_array_sz(len_encoding.to_len_sz(2, force_canonical))?;
213 serializer.write_unsigned_integer_sz(
214 1u64,
215 fit_sz(1u64, *tag_encoding, force_canonical),
216 )?;
217 serializer.write_bytes_sz(
218 hash.to_raw_bytes(),
219 hash_encoding.to_str_len_sz(hash.to_raw_bytes().len() as u64, force_canonical),
220 )?;
221 len_encoding.end(serializer, force_canonical)?;
222 Ok(serializer)
223 }
224 }
225 }
226}
227
228impl Deserialize for Nonce {
229 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
230 (|| -> Result<_, DeserializeError> {
231 let len = raw.array_sz()?;
232 let len_encoding: LenEncoding = len.into();
233 let initial_position = raw.as_mut_ref().stream_position().unwrap();
234 let mut errs = Vec::new();
235 let deser_variant = (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
236 let mut read_len = CBORReadLen::new(len);
237 read_len.read_elems(1)?;
238 read_len.finish()?;
239 let (identity_value, identity_encoding) = raw.unsigned_integer_sz()?;
240 if identity_value != 0 {
241 return Err(DeserializeFailure::FixedValueMismatch {
242 found: Key::Uint(identity_value),
243 expected: Key::Uint(0),
244 }
245 .into());
246 }
247 let ret = Ok(Some(identity_encoding));
248 match len {
249 cbor_event::LenSz::Len(_, _) => (),
250 cbor_event::LenSz::Indefinite => match raw.special()? {
251 cbor_event::Special::Break => (),
252 _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
253 },
254 }
255 ret
256 })(raw);
257 match deser_variant {
258 Ok(identity_encoding) => {
259 return Ok(Self::Identity {
260 identity_encoding,
261 len_encoding,
262 })
263 }
264 Err(e) => {
265 errs.push(e.annotate("Identity"));
266 raw.as_mut_ref()
267 .seek(SeekFrom::Start(initial_position))
268 .unwrap();
269 }
270 };
271 let variant_deser = (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
272 let mut read_len = CBORReadLen::new(len);
273 read_len.read_elems(2)?;
274 read_len.finish()?;
275 let tag_encoding = (|| -> Result<_, DeserializeError> {
276 let (tag_value, tag_encoding) = raw.unsigned_integer_sz()?;
277 if tag_value != 1 {
278 return Err(DeserializeFailure::FixedValueMismatch {
279 found: Key::Uint(tag_value),
280 expected: Key::Uint(1),
281 }
282 .into());
283 }
284 Ok(Some(tag_encoding))
285 })()
286 .map_err(|e| e.annotate("tag"))?;
287 let (hash, hash_encoding) = raw
288 .bytes_sz()
289 .map_err(Into::<DeserializeError>::into)
290 .and_then(|(bytes, enc)| {
291 NonceHash::from_raw_bytes(&bytes)
292 .map(|bytes| (bytes, StringEncoding::from(enc)))
293 .map_err(|e| DeserializeFailure::InvalidStructure(Box::new(e)).into())
294 })
295 .map_err(|e: DeserializeError| e.annotate("hash"))?;
296 match len {
297 cbor_event::LenSz::Len(_, _) => (),
298 cbor_event::LenSz::Indefinite => match raw.special()? {
299 cbor_event::Special::Break => (),
300 _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
301 },
302 }
303 Ok(Self::Hash {
304 hash,
305 len_encoding,
306 tag_encoding,
307 hash_encoding,
308 })
309 })(raw);
310 match variant_deser {
311 Ok(variant) => return Ok(variant),
312 Err(e) => {
313 errs.push(e.annotate("Hash"));
314 raw.as_mut_ref()
315 .seek(SeekFrom::Start(initial_position))
316 .unwrap();
317 }
318 };
319 Err(DeserializeError::new(
320 "Nonce",
321 DeserializeFailure::NoVariantMatchedWithCauses(errs),
322 ))
323 })()
324 .map_err(|e| e.annotate("Nonce"))
325 }
326}
327
328impl Serialize for VRFCert {
329 fn serialize<'se, W: Write>(
330 &self,
331 serializer: &'se mut Serializer<W>,
332 force_canonical: bool,
333 ) -> cbor_event::Result<&'se mut Serializer<W>> {
334 serializer.write_array_sz(
335 self.encodings
336 .as_ref()
337 .map(|encs| encs.len_encoding)
338 .unwrap_or_default()
339 .to_len_sz(2, force_canonical),
340 )?;
341 serializer.write_bytes_sz(
342 &self.output,
343 self.encodings
344 .as_ref()
345 .map(|encs| encs.output_encoding.clone())
346 .unwrap_or_default()
347 .to_str_len_sz(self.output.len() as u64, force_canonical),
348 )?;
349 serializer.write_bytes_sz(
350 &self.proof,
351 self.encodings
352 .as_ref()
353 .map(|encs| encs.proof_encoding.clone())
354 .unwrap_or_default()
355 .to_str_len_sz(self.proof.len() as u64, force_canonical),
356 )?;
357 self.encodings
358 .as_ref()
359 .map(|encs| encs.len_encoding)
360 .unwrap_or_default()
361 .end(serializer, force_canonical)
362 }
363}
364
365impl Deserialize for VRFCert {
366 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
367 let len = raw.array_sz()?;
368 let len_encoding: LenEncoding = len.into();
369 let mut read_len = CBORReadLen::new(len);
370 read_len.read_elems(2)?;
371 read_len.finish()?;
372 (|| -> Result<_, DeserializeError> {
373 let (output, output_encoding) = raw
374 .bytes_sz()
375 .map_err(Into::<DeserializeError>::into)
376 .map(|(bytes, enc)| (bytes, StringEncoding::from(enc)))
377 .map_err(|e: DeserializeError| e.annotate("output"))?;
378 let (proof, proof_encoding) = raw
379 .bytes_sz()
380 .map_err(Into::<DeserializeError>::into)
381 .map_err(Into::<DeserializeError>::into)
382 .and_then(|(bytes, enc)| {
383 if bytes.len() < 80 || bytes.len() > 80 {
384 Err(DeserializeFailure::RangeCheck {
385 found: bytes.len() as isize,
386 min: Some(80),
387 max: Some(80),
388 }
389 .into())
390 } else {
391 Ok((bytes, StringEncoding::from(enc)))
392 }
393 })
394 .map_err(|e: DeserializeError| e.annotate("proof"))?;
395 match len {
396 cbor_event::LenSz::Len(_, _) => (),
397 cbor_event::LenSz::Indefinite => match raw.special()? {
398 cbor_event::Special::Break => (),
399 _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
400 },
401 }
402 Ok(VRFCert {
403 output,
404 proof,
405 encodings: Some(VRFCertEncoding {
406 len_encoding,
407 output_encoding,
408 proof_encoding,
409 }),
410 })
411 })()
412 .map_err(|e| e.annotate("VRFCert"))
413 }
414}
415
416impl Serialize for Vkeywitness {
417 fn serialize<'se, W: Write>(
418 &self,
419 serializer: &'se mut Serializer<W>,
420 force_canonical: bool,
421 ) -> cbor_event::Result<&'se mut Serializer<W>> {
422 serializer.write_array_sz(
423 self.encodings
424 .as_ref()
425 .map(|encs| encs.len_encoding)
426 .unwrap_or_default()
427 .to_len_sz(2, force_canonical),
428 )?;
429 serializer.write_bytes_sz(
430 self.vkey.to_raw_bytes(),
431 self.encodings
432 .as_ref()
433 .map(|encs| encs.vkey_encoding.clone())
434 .unwrap_or_default()
435 .to_str_len_sz(self.vkey.to_raw_bytes().len() as u64, force_canonical),
436 )?;
437 serializer.write_bytes_sz(
438 self.ed25519_signature.to_raw_bytes(),
439 self.encodings
440 .as_ref()
441 .map(|encs| encs.ed25519_signature_encoding.clone())
442 .unwrap_or_default()
443 .to_str_len_sz(
444 self.ed25519_signature.to_raw_bytes().len() as u64,
445 force_canonical,
446 ),
447 )?;
448 self.encodings
449 .as_ref()
450 .map(|encs| encs.len_encoding)
451 .unwrap_or_default()
452 .end(serializer, force_canonical)
453 }
454}
455
456impl Deserialize for Vkeywitness {
457 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
458 let len = raw.array_sz()?;
459 let len_encoding: LenEncoding = len.into();
460 let mut read_len = CBORReadLen::new(len);
461 read_len.read_elems(2)?;
462 read_len.finish()?;
463 (|| -> Result<_, DeserializeError> {
464 let (vkey, vkey_encoding) = raw
465 .bytes_sz()
466 .map_err(Into::<DeserializeError>::into)
467 .and_then(|(bytes, enc)| {
468 Vkey::from_raw_bytes(&bytes)
469 .map(|bytes| (bytes, StringEncoding::from(enc)))
470 .map_err(|e| DeserializeFailure::InvalidStructure(Box::new(e)).into())
471 })
472 .map_err(|e: DeserializeError| e.annotate("vkey"))?;
473 let (ed25519_signature, ed25519_signature_encoding) = raw
474 .bytes_sz()
475 .map_err(Into::<DeserializeError>::into)
476 .and_then(|(bytes, enc)| {
477 Ed25519Signature::from_raw_bytes(&bytes)
478 .map(|bytes| (bytes, StringEncoding::from(enc)))
479 .map_err(|e| DeserializeFailure::InvalidStructure(Box::new(e)).into())
480 })
481 .map_err(|e: DeserializeError| e.annotate("ed25519_signature"))?;
482 match len {
483 cbor_event::LenSz::Len(_, _) => (),
484 cbor_event::LenSz::Indefinite => match raw.special()? {
485 cbor_event::Special::Break => (),
486 _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
487 },
488 }
489 Ok(Vkeywitness {
490 vkey,
491 ed25519_signature,
492 encodings: Some(VkeywitnessEncoding {
493 len_encoding,
494 vkey_encoding,
495 ed25519_signature_encoding,
496 }),
497 })
498 })()
499 .map_err(|e| e.annotate("Vkeywitness"))
500 }
501}