cardano_message_signing/
serialization.rs

1use super::*;
2use std::io::{Seek, SeekFrom};
3use linked_hash_map::LinkedHashMap;
4
5impl cbor_event::se::Serialize for ProtectedHeaderMap {
6    fn serialize<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
7        serializer.write_bytes(&self.0)
8    }
9}
10
11impl Deserialize for ProtectedHeaderMap {
12    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
13        (|| -> Result<_, DeserializeError> {
14            let bytes = raw.bytes()?;
15            if bytes.is_empty() {
16                Ok(ProtectedHeaderMap::new_empty())
17            } else {
18                // can't use from_bytes since error types won't match up on wasm builds otherwise
19                let mut bytes_deserializer = Deserializer::from(std::io::Cursor::new(bytes));
20                Ok(ProtectedHeaderMap::new(&HeaderMap::deserialize(&mut bytes_deserializer)?))
21            }
22        })().map_err(|e| e.annotate("ProtectedHeaderMap"))
23    }
24}
25
26impl cbor_event::se::Serialize for LabelEnum {
27    fn serialize<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
28        match self {
29            LabelEnum::Int(x) => {
30                x.serialize(serializer)
31            },
32            LabelEnum::Text(x) => {
33                serializer.write_text(&x)
34            },
35        }
36    }
37}
38
39impl Deserialize for LabelEnum {
40    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
41        (|| -> Result<_, DeserializeError> {
42            let initial_position = raw.as_mut_ref().seek(SeekFrom::Current(0)).unwrap();
43            match (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
44                Ok(Int::deserialize(raw)?)
45            })(raw)
46            {
47                Ok(variant) => return Ok(LabelEnum::Int(variant)),
48                Err(_) => raw.as_mut_ref().seek(SeekFrom::Start(initial_position)).unwrap(),
49            };
50            match (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
51                Ok(String::deserialize(raw)?)
52            })(raw)
53            {
54                Ok(variant) => return Ok(LabelEnum::Text(variant)),
55                Err(_) => raw.as_mut_ref().seek(SeekFrom::Start(initial_position)).unwrap(),
56            };
57            Err(DeserializeError::new("LabelEnum", DeserializeFailure::NoVariantMatched.into()))
58        })().map_err(|e| e.annotate("LabelEnum"))
59    }
60}
61
62impl cbor_event::se::Serialize for Label {
63    fn serialize<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
64        self.0.serialize(serializer)
65    }
66}
67
68impl Deserialize for Label {
69    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
70        Ok(Self(LabelEnum::deserialize(raw)?))
71    }
72}
73
74impl cbor_event::se::Serialize for Labels {
75    fn serialize<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
76        serializer.write_array(cbor_event::Len::Len(self.0.len() as u64))?;
77        for element in &self.0 {
78            element.serialize(serializer)?;
79        }
80        Ok(serializer)
81    }
82}
83
84impl Deserialize for Labels {
85    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
86        let mut arr = Vec::new();
87        (|| -> Result<_, DeserializeError> {
88            let len = raw.array()?;
89            while match len { cbor_event::Len::Len(n) => arr.len() < n as usize, cbor_event::Len::Indefinite => true, } {
90                if raw.cbor_type()? == cbor_event::Type::Special {
91                    assert_eq!(raw.special()?, cbor_event::Special::Break);
92                    break;
93                }
94                arr.push(Label::deserialize(raw)?);
95            }
96            Ok(())
97        })().map_err(|e| e.annotate("Labels"))?;
98        Ok(Self(arr))
99    }
100}
101
102impl cbor_event::se::Serialize for COSESignatures {
103    fn serialize<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
104        serializer.write_array(cbor_event::Len::Len(self.0.len() as u64))?;
105        for element in &self.0 {
106            element.serialize(serializer)?;
107        }
108        Ok(serializer)
109    }
110}
111
112impl Deserialize for COSESignatures {
113    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
114        let mut arr = Vec::new();
115        (|| -> Result<_, DeserializeError> {
116            let len = raw.array()?;
117            while match len { cbor_event::Len::Len(n) => arr.len() < n as usize, cbor_event::Len::Indefinite => true, } {
118                if raw.cbor_type()? == cbor_event::Type::Special {
119                    assert_eq!(raw.special()?, cbor_event::Special::Break);
120                    break;
121                }
122                arr.push(COSESignature::deserialize(raw)?);
123            }
124            Ok(())
125        })().map_err(|e| e.annotate("COSESignatures"))?;
126        Ok(Self(arr))
127    }
128}
129
130impl cbor_event::se::Serialize for CounterSignature {
131    fn serialize<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
132        if self.0.len() == 1 {
133            self.0.0.first().unwrap().serialize(serializer)
134        } else {
135            self.0.serialize(serializer)
136        }
137    }
138}
139
140impl Deserialize for CounterSignature {
141    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
142        (|| -> Result<_, DeserializeError> {
143            let initial_position = raw.as_mut_ref().seek(SeekFrom::Current(0)).unwrap();
144            match (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
145                Ok(COSESignature::deserialize(raw)?)
146            })(raw)
147            {
148                Ok(single_sig) => return Ok(CounterSignature::new_single(&single_sig)),
149                Err(_) => raw.as_mut_ref().seek(SeekFrom::Start(initial_position)).unwrap(),
150            };
151            match (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
152                Ok(COSESignatures::deserialize(raw)?)
153            })(raw)
154            {
155                Ok(multi_sig) => return Ok(CounterSignature::new_multi(&multi_sig)),
156                Err(_) => raw.as_mut_ref().seek(SeekFrom::Start(initial_position)).unwrap(),
157            };
158            Err(DeserializeError::new("CounterSignature", DeserializeFailure::NoVariantMatched.into()))
159        })().map_err(|e| e.annotate("CounterSignature"))
160    }
161}
162
163impl cbor_event::se::Serialize for HeaderMap {
164    fn serialize<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
165        serializer.write_map(cbor_event::Len::Len(self.other_headers.len() as u64 + match &self.algorithm_id { Some(_) => 1, None => 0 } + match &self.criticality { Some(_) => 1, None => 0 } + match &self.content_type { Some(_) => 1, None => 0 } + match &self.key_id { Some(_) => 1, None => 0 } + match &self.init_vector { Some(_) => 1, None => 0 } + match &self.partial_init_vector { Some(_) => 1, None => 0 } + match &self.counter_signature { Some(_) => 1, None => 0 }))?;
166        if let Some(field) = &self.algorithm_id {
167            serializer.write_unsigned_integer(1)?;
168            field.serialize(serializer)?;
169        }
170        if let Some(field) = &self.criticality {
171            serializer.write_unsigned_integer(2)?;
172            field.serialize(serializer)?;
173        }
174        if let Some(field) = &self.content_type {
175            serializer.write_unsigned_integer(3)?;
176            field.serialize(serializer)?;
177        }
178        if let Some(field) = &self.key_id {
179            serializer.write_unsigned_integer(4)?;
180            serializer.write_bytes(&field)?;
181        }
182        if let Some(field) = &self.init_vector {
183            serializer.write_unsigned_integer(5)?;
184            serializer.write_bytes(&field)?;
185        }
186        if let Some(field) = &self.partial_init_vector {
187            serializer.write_unsigned_integer(6)?;
188            serializer.write_bytes(&field)?;
189        }
190        if let Some(field) = &self.counter_signature {
191            serializer.write_unsigned_integer(7)?;
192            field.serialize(serializer)?;
193        }
194        for (key, value) in &self.other_headers {
195            key.serialize(serializer)?;
196            value.serialize(serializer)?;
197        }
198        Ok(serializer)
199    }
200}
201
202fn read_value<R: BufRead + Seek>(raw: &mut Deserializer<R>, other_headers: &mut LinkedHashMap<Label, CBORValue>, label: Label, key: Key) -> Result<(), DeserializeError> {
203    let value = CBORValue::deserialize(raw)?;
204    match other_headers.insert(label, value) {
205        Some(_) => Err(DeserializeFailure::DuplicateKey(key).into()),
206        None => Ok(()),
207    }
208}
209
210impl Deserialize for HeaderMap {
211    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
212        (|| -> Result<_, DeserializeError> {
213            let len = raw.map()?;
214            let mut algorithm_id = None;
215            let mut criticality = None;
216            let mut content_type = None;
217            let mut key_id = None;
218            let mut init_vector = None;
219            let mut partial_init_vector = None;
220            let mut counter_signature = None;
221            let mut other_headers = LinkedHashMap::<Label, CBORValue>::new();
222            let mut read = 0;
223            while match len { cbor_event::Len::Len(n) => read < n as usize, cbor_event::Len::Indefinite => true, } {
224                match raw.cbor_type()? {
225                    cbor_event::Type::NegativeInteger => {
226                        let nint_abs = -raw.negative_integer()? as u64;
227                        read_value(
228                            raw,
229                            &mut other_headers,
230                            Label::new_int(&Int::new_negative(to_bignum(nint_abs))),
231                            Key::Nint(nint_abs))?;
232                    },
233                    cbor_event::Type::UnsignedInteger => match raw.unsigned_integer()? {
234                        1 =>  {
235                            if algorithm_id.is_some() {
236                                return Err(DeserializeFailure::DuplicateKey(Key::Uint(1)).into());
237                            }
238                            algorithm_id = Some((|| -> Result<_, DeserializeError> {
239                                Ok(Label::deserialize(raw)?)
240                            })().map_err(|e| e.annotate("algorithm_id"))?);
241                        },
242                        2 =>  {
243                            if criticality.is_some() {
244                                return Err(DeserializeFailure::DuplicateKey(Key::Uint(2)).into());
245                            }
246                            criticality = Some((|| -> Result<_, DeserializeError> {
247                                Ok(Labels::deserialize(raw)?)
248                            })().map_err(|e| e.annotate("criticality"))?);
249                        },
250                        3 =>  {
251                            if content_type.is_some() {
252                                return Err(DeserializeFailure::DuplicateKey(Key::Uint(3)).into());
253                            }
254                            content_type = Some((|| -> Result<_, DeserializeError> {
255                                Ok(Label::deserialize(raw)?)
256                            })().map_err(|e| e.annotate("content_type"))?);
257                        },
258                        4 =>  {
259                            if key_id.is_some() {
260                                return Err(DeserializeFailure::DuplicateKey(Key::Uint(4)).into());
261                            }
262                            key_id = Some((|| -> Result<_, DeserializeError> {
263                                Ok(raw.bytes()?)
264                            })().map_err(|e| e.annotate("key_id"))?);
265                        },
266                        5 =>  {
267                            if init_vector.is_some() {
268                                return Err(DeserializeFailure::DuplicateKey(Key::Uint(5)).into());
269                            }
270                            init_vector = Some((|| -> Result<_, DeserializeError> {
271                                Ok(raw.bytes()?)
272                            })().map_err(|e| e.annotate("init_vector"))?);
273                        },
274                        6 =>  {
275                            if partial_init_vector.is_some() {
276                                return Err(DeserializeFailure::DuplicateKey(Key::Uint(6)).into());
277                            }
278                            partial_init_vector = Some((|| -> Result<_, DeserializeError> {
279                                Ok(raw.bytes()?)
280                            })().map_err(|e| e.annotate("partial_init_vector"))?);
281                        },
282                        7 =>  {
283                            if counter_signature.is_some() {
284                                return Err(DeserializeFailure::DuplicateKey(Key::Uint(7)).into());
285                            }
286                            counter_signature = Some(Box::new((|| -> Result<_, DeserializeError> {
287                                Ok(CounterSignature::deserialize(raw)?)
288                            })().map_err(|e| e.annotate("counter_signature"))?));
289                        },
290                        other_key => {
291                            let uint = other_key;
292                            read_value(
293                                raw,
294                                &mut other_headers,
295                                Label::new_int(&Int::new(to_bignum(uint))),
296                                Key::Uint(uint))?;
297                        },
298                    },
299                    cbor_event::Type::Text => {
300                        let text = raw.text()?;
301                        read_value(
302                            raw,
303                            &mut other_headers,
304                            Label::new_text(text.clone()),
305                            Key::Str(text))?;
306                    },
307                    cbor_event::Type::Special => match raw.special()? {
308                        cbor_event::Special::Break => match len {
309                            cbor_event::Len::Len(_) => return Err(DeserializeFailure::BreakInDefiniteLen.into()),
310                            cbor_event::Len::Indefinite => break,
311                        },
312                        _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
313                    },
314                    other_type => return Err(DeserializeFailure::UnexpectedKeyType(other_type).into()),
315                }
316                read += 1;
317            }
318            Ok(Self {
319                algorithm_id,
320                criticality,
321                content_type,
322                key_id,
323                init_vector,
324                partial_init_vector,
325                counter_signature,
326                other_headers,
327            })
328        })().map_err(|e| e.annotate("HeaderMap"))
329    }
330}
331
332impl cbor_event::se::Serialize for Headers {
333    fn serialize<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
334        serializer.write_array(cbor_event::Len::Len(2))?;
335        self.serialize_as_embedded_group(serializer)
336    }
337}
338
339impl SerializeEmbeddedGroup for Headers {
340    fn serialize_as_embedded_group<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
341        self.protected.serialize(serializer)?;
342        self.unprotected.serialize(serializer)?;
343        Ok(serializer)
344    }
345}
346
347impl Deserialize for Headers {
348    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
349        (|| -> Result<_, DeserializeError> {
350            let len = raw.array()?;
351            let mut read_len = CBORReadLen::new(len);
352            read_len.read_elems(2)?;
353            let ret = Self::deserialize_as_embedded_group(raw, &mut read_len, len);
354            match len {
355                cbor_event::Len::Len(_) => (),
356                cbor_event::Len::Indefinite => match raw.special()? {
357                    cbor_event::Special::Break => (),
358                    _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
359                },
360            }
361            ret
362        })().map_err(|e| e.annotate("Headers"))
363    }
364}
365
366impl DeserializeEmbeddedGroup for Headers {
367    fn deserialize_as_embedded_group<R: BufRead + Seek>(raw: &mut Deserializer<R>, _read_len: &mut CBORReadLen, _len: cbor_event::Len) -> Result<Self, DeserializeError> {
368        let protected = (|| -> Result<_, DeserializeError> {
369            Ok(ProtectedHeaderMap::deserialize(raw)?)
370        })().map_err(|e| e.annotate("protected"))?;
371        let unprotected = (|| -> Result<_, DeserializeError> {
372            Ok(HeaderMap::deserialize(raw)?)
373        })().map_err(|e| e.annotate("unprotected"))?;
374        Ok(Headers {
375            protected,
376            unprotected,
377        })
378    }
379}
380
381impl cbor_event::se::Serialize for COSESignature {
382    fn serialize<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
383        serializer.write_array(cbor_event::Len::Len(3))?;
384        self.headers.serialize_as_embedded_group(serializer)?;
385        serializer.write_bytes(&self.signature)?;
386        Ok(serializer)
387    }
388}
389
390impl Deserialize for COSESignature {
391    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
392        (|| -> Result<_, DeserializeError> {
393            let len = raw.array()?;
394            let mut read_len = CBORReadLen::new(len);
395            read_len.read_elems(3)?;
396            let headers = (|| -> Result<_, DeserializeError> {
397                Ok(Headers::deserialize_as_embedded_group(raw, &mut read_len, len)?)
398            })().map_err(|e| e.annotate("headers"))?;
399            let signature = (|| -> Result<_, DeserializeError> {
400                Ok(raw.bytes()?)
401            })().map_err(|e| e.annotate("signature"))?;
402            match len {
403                cbor_event::Len::Len(_) => (),
404                cbor_event::Len::Indefinite => match raw.special()? {
405                    cbor_event::Special::Break => (),
406                    _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
407                },
408            }
409            Ok(COSESignature {
410                headers,
411                signature,
412            })
413        })().map_err(|e| e.annotate("COSESignature"))
414    }
415}
416
417impl cbor_event::se::Serialize for COSESign1 {
418    fn serialize<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
419        serializer.write_array(cbor_event::Len::Len(4))?;
420        self.headers.serialize_as_embedded_group(serializer)?;
421        match &self.payload {
422            Some(x) => {
423                serializer.write_bytes(&x)
424            },
425            None => serializer.write_special(cbor_event::Special::Null),
426        }?;
427        serializer.write_bytes(&self.signature)?;
428        Ok(serializer)
429    }
430}
431
432impl Deserialize for COSESign1 {
433    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
434        (|| -> Result<_, DeserializeError> {
435            let len = raw.array()?;
436            let mut read_len = CBORReadLen::new(len);
437            read_len.read_elems(4)?;
438            let headers = (|| -> Result<_, DeserializeError> {
439                Ok(Headers::deserialize_as_embedded_group(raw, &mut read_len, len)?)
440            })().map_err(|e| e.annotate("headers"))?;
441            let payload = (|| -> Result<_, DeserializeError> {
442                Ok(match raw.cbor_type()? != cbor_event::Type::Special {
443                    true => {
444                        Some(raw.bytes()?)
445                    },
446                    false => {
447                        if raw.special()? != cbor_event::Special::Null {
448                            return Err(DeserializeFailure::ExpectedNull.into());
449                        }
450                        None
451                    }
452                })
453            })().map_err(|e| e.annotate("payload"))?;
454            let signature = (|| -> Result<_, DeserializeError> {
455                Ok(raw.bytes()?)
456            })().map_err(|e| e.annotate("signature"))?;
457            match len {
458                cbor_event::Len::Len(_) => (),
459                cbor_event::Len::Indefinite => match raw.special()? {
460                    cbor_event::Special::Break => (),
461                    _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
462                },
463            }
464            Ok(COSESign1 {
465                headers,
466                payload,
467                signature,
468            })
469        })().map_err(|e| e.annotate("COSESign1"))
470    }
471}
472
473impl cbor_event::se::Serialize for COSESign {
474    fn serialize<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
475        serializer.write_array(cbor_event::Len::Len(4))?;
476        self.headers.serialize_as_embedded_group(serializer)?;
477        match &self.payload {
478            Some(x) => {
479                serializer.write_bytes(&x)
480            },
481            None => serializer.write_special(cbor_event::Special::Null),
482        }?;
483        self.signatures.serialize(serializer)?;
484        Ok(serializer)
485    }
486}
487
488impl Deserialize for COSESign {
489    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
490        (|| -> Result<_, DeserializeError> {
491            let len = raw.array()?;
492            let mut read_len = CBORReadLen::new(len);
493            read_len.read_elems(4)?;
494            let headers = (|| -> Result<_, DeserializeError> {
495                Ok(Headers::deserialize_as_embedded_group(raw, &mut read_len, len)?)
496            })().map_err(|e| e.annotate("headers"))?;
497            let payload = (|| -> Result<_, DeserializeError> {
498                Ok(match raw.cbor_type()? != cbor_event::Type::Special {
499                    true => {
500                        Some(raw.bytes()?)
501                    },
502                    false => {
503                        if raw.special()? != cbor_event::Special::Null {
504                            return Err(DeserializeFailure::ExpectedNull.into());
505                        }
506                        None
507                    }
508                })
509            })().map_err(|e| e.annotate("payload"))?;
510            let signatures = (|| -> Result<_, DeserializeError> {
511                Ok(COSESignatures::deserialize(raw)?)
512            })().map_err(|e| e.annotate("signatures"))?;
513            match len {
514                cbor_event::Len::Len(_) => (),
515                cbor_event::Len::Indefinite => match raw.special()? {
516                    cbor_event::Special::Break => (),
517                    _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
518                },
519            }
520            Ok(COSESign {
521                headers,
522                payload,
523                signatures,
524            })
525        })().map_err(|e| e.annotate("COSESign"))
526    }
527}
528
529impl cbor_event::se::Serialize for SignedMessageEnum {
530    fn serialize<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
531        match self {
532            SignedMessageEnum::COSESIGN(x) => {
533                x.serialize(serializer)
534            },
535            SignedMessageEnum::COSESIGN1(x) => {
536                x.serialize(serializer)
537            },
538        }
539    }
540}
541
542impl Deserialize for SignedMessageEnum {
543    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
544        (|| -> Result<_, DeserializeError> {
545            let initial_position = raw.as_mut_ref().seek(SeekFrom::Current(0)).unwrap();
546            match (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
547                Ok(COSESign::deserialize(raw)?)
548            })(raw)
549            {
550                Ok(variant) => return Ok(SignedMessageEnum::COSESIGN(variant)),
551                Err(_) => raw.as_mut_ref().seek(SeekFrom::Start(initial_position)).unwrap(),
552            };
553            match (|raw: &mut Deserializer<_>| -> Result<_, DeserializeError> {
554                Ok(COSESign1::deserialize(raw)?)
555            })(raw)
556            {
557                Ok(variant) => return Ok(SignedMessageEnum::COSESIGN1(variant)),
558                Err(_) => raw.as_mut_ref().seek(SeekFrom::Start(initial_position)).unwrap(),
559            };
560            Err(DeserializeError::new("SignedMessageEnum", DeserializeFailure::NoVariantMatched.into()))
561        })().map_err(|e| e.annotate("SignedMessageEnum"))
562    }
563}
564
565impl cbor_event::se::Serialize for SignedMessage {
566    fn serialize<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
567        self.0.serialize(serializer)
568    }
569}
570
571impl Deserialize for SignedMessage {
572    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
573        Ok(Self(SignedMessageEnum::deserialize(raw)?))
574    }
575}
576
577impl cbor_event::se::Serialize for SigStructure {
578    fn serialize<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
579        serializer.write_array(cbor_event::Len::Len(if self.sign_protected().is_some() {5} else {4}))?;
580        let context_str = match self.context {
581            SigContext::Signature => "Signature",
582            SigContext::Signature1 => "Signature1",
583            SigContext::CounterSignature => "CounterSignature",
584        };
585        serializer.write_text(context_str)?;
586        self.body_protected.serialize(serializer)?;
587        if let Some(sign_protected) = &self.sign_protected {
588            sign_protected.serialize(serializer)?;
589        }
590        serializer.write_bytes(&self.external_aad)?;
591        serializer.write_bytes(&self.payload)?;
592        Ok(serializer)
593    }
594}
595
596impl Deserialize for SigStructure {
597    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
598        (|| -> Result<_, DeserializeError> {
599            let len = raw.array()?;
600            let context = (|| -> Result<_, DeserializeError> {
601                match raw.text()?.as_str() {
602                    "Signature" => Ok(SigContext::Signature),
603                    "Signature1" => Ok(SigContext::Signature1),
604                    "CounterSignature" => Ok(SigContext::CounterSignature),
605                    other => Err(DeserializeFailure::FixedValueMismatch{
606                        found: Key::Str(String::from(other)),
607                        expected: Key::Str(String::from("Signature, Signature1, or CounterSignature")),
608                    }.into())
609                }
610            })().map_err(|e| e.annotate("context"))?;
611            let body_protected = (|| -> Result<_, DeserializeError> {
612                Ok(ProtectedHeaderMap::deserialize(raw)?)
613            })().map_err(|e| e.annotate("body_protected"))?;
614            // due to all 3 fields being binary types and the optional one being the first,
615            // we need to read all before we know which strings will be which since we can't
616            // check the length in the indefinite case
617            let b1: Vec<u8> = raw.bytes().map_err(|e| DeserializeError::new("external_aad", DeserializeFailure::CBOR(e)))?;
618            let b2: Vec<u8> = raw.bytes().map_err(|e| DeserializeError::new("payload", DeserializeFailure::CBOR(e)))?;
619            let b3 = match len {
620                cbor_event::Len::Len(n) => match n {
621                    4 => None,
622                    5 => Some(raw.bytes().map_err(|e| DeserializeError::new("payload", DeserializeFailure::CBOR(e)))?),
623                    n => return Err(DeserializeFailure::DefiniteLenMismatch(n, None).into()),
624                },
625                cbor_event::Len::Indefinite => match raw.cbor_type()? {
626                    // assumed to be Break here - will be tested below
627                    cbor_event::Type::Special => None,
628                    // assume bytes otherwise since it can't be a break
629                    _ => Some(raw.bytes().map_err(|e| DeserializeError::new("payload", DeserializeFailure::CBOR(e)))?),
630                },
631            };
632            let (sign_protected, external_aad, payload) = match b3 {
633                Some(bytes) => {
634                    // must be inlined since we already read the CBOR bytes portion
635                    let map = if b1.is_empty() {
636                        ProtectedHeaderMap::new_empty()
637                    } else {
638                        let mut b1_deserializer = Deserializer::from(std::io::Cursor::new(b1));
639                        ProtectedHeaderMap::new(&HeaderMap::deserialize(&mut b1_deserializer)?)
640                    };
641                    (Some(map), b2, bytes)
642                },
643                None => (None, b1, b2),
644            };
645            if len == cbor_event::Len::Indefinite {
646                if raw.special()? != cbor_event::Special::Break {
647                    return Err(DeserializeFailure::EndingBreakMissing.into());
648                }
649            }
650            Ok(SigStructure {
651                context,
652                body_protected,
653                sign_protected,
654                external_aad,
655                payload,
656            })
657        })().map_err(|e| e.annotate("SigStructure"))
658    }
659}
660
661impl cbor_event::se::Serialize for COSEEncrypt0 {
662    fn serialize<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
663        serializer.write_array(cbor_event::Len::Len(3))?;
664        self.headers.serialize_as_embedded_group(serializer)?;
665        match &self.ciphertext {
666            Some(x) => {
667                serializer.write_bytes(&x)
668            },
669            None => serializer.write_special(cbor_event::Special::Null),
670        }?;
671        Ok(serializer)
672    }
673}
674
675impl Deserialize for COSEEncrypt0 {
676    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
677        (|| -> Result<_, DeserializeError> {
678            let len = raw.array()?;
679            let mut read_len = CBORReadLen::new(len);
680            read_len.read_elems(3)?;
681            let headers = (|| -> Result<_, DeserializeError> {
682                Ok(Headers::deserialize_as_embedded_group(raw, &mut read_len, len)?)
683            })().map_err(|e| e.annotate("headers"))?;
684            let ciphertext = (|| -> Result<_, DeserializeError> {
685                Ok(match raw.cbor_type()? != cbor_event::Type::Special {
686                    true => {
687                        Some(raw.bytes()?)
688                    },
689                    false => {
690                        if raw.special()? != cbor_event::Special::Null {
691                            return Err(DeserializeFailure::ExpectedNull.into());
692                        }
693                        None
694                    }
695                })
696            })().map_err(|e| e.annotate("ciphertext"))?;
697            match len {
698                cbor_event::Len::Len(_) => (),
699                cbor_event::Len::Indefinite => match raw.special()? {
700                    cbor_event::Special::Break => (),
701                    _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
702                },
703            }
704            Ok(COSEEncrypt0 {
705                headers,
706                ciphertext,
707            })
708        })().map_err(|e| e.annotate("COSEEncrypt0"))
709    }
710}
711
712impl cbor_event::se::Serialize for PasswordEncryption {
713    fn serialize<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
714        serializer.write_tag(16u64)?;
715        self.0.serialize(serializer)
716    }
717}
718
719impl Deserialize for PasswordEncryption {
720    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
721        let tag = raw.tag().map_err(|e| DeserializeError::from(e).annotate("PasswordEncryption"))?;
722        if tag != 16 {
723            return Err(DeserializeError::new("PasswordEncryption", DeserializeFailure::TagMismatch{ found: tag, expected: 16 }));
724        }
725        Ok(Self(COSEEncrypt0::deserialize(raw)?))
726    }
727}
728
729impl cbor_event::se::Serialize for COSERecipients {
730    fn serialize<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
731        serializer.write_array(cbor_event::Len::Len(self.0.len() as u64))?;
732        for element in &self.0 {
733            element.serialize(serializer)?;
734        }
735        Ok(serializer)
736    }
737}
738
739impl Deserialize for COSERecipients {
740    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
741        let mut arr = Vec::new();
742        (|| -> Result<_, DeserializeError> {
743            let len = raw.array()?;
744            while match len { cbor_event::Len::Len(n) => arr.len() < n as usize, cbor_event::Len::Indefinite => true, } {
745                if raw.cbor_type()? == cbor_event::Type::Special {
746                    assert_eq!(raw.special()?, cbor_event::Special::Break);
747                    break;
748                }
749                arr.push(COSERecipient::deserialize(raw)?);
750            }
751            Ok(())
752        })().map_err(|e| e.annotate("COSERecipients"))?;
753        Ok(Self(arr))
754    }
755}
756
757impl cbor_event::se::Serialize for COSEEncrypt {
758    fn serialize<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
759        serializer.write_array(cbor_event::Len::Len(4))?;
760        self.headers.serialize_as_embedded_group(serializer)?;
761        match &self.ciphertext {
762            Some(x) => {
763                serializer.write_bytes(&x)
764            },
765            None => serializer.write_special(cbor_event::Special::Null),
766        }?;
767        self.recipients.serialize(serializer)?;
768        Ok(serializer)
769    }
770}
771
772impl Deserialize for COSEEncrypt {
773    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
774        (|| -> Result<_, DeserializeError> {
775            let len = raw.array()?;
776            let mut read_len = CBORReadLen::new(len);
777            read_len.read_elems(4)?;
778            let headers = (|| -> Result<_, DeserializeError> {
779                Ok(Headers::deserialize_as_embedded_group(raw, &mut read_len, len)?)
780            })().map_err(|e| e.annotate("headers"))?;
781            let ciphertext = (|| -> Result<_, DeserializeError> {
782                Ok(match raw.cbor_type()? != cbor_event::Type::Special {
783                    true => {
784                        Some(raw.bytes()?)
785                    },
786                    false => {
787                        if raw.special()? != cbor_event::Special::Null {
788                            return Err(DeserializeFailure::ExpectedNull.into());
789                        }
790                        None
791                    }
792                })
793            })().map_err(|e| e.annotate("ciphertext"))?;
794            let recipients = (|| -> Result<_, DeserializeError> {
795                Ok(COSERecipients::deserialize(raw)?)
796            })().map_err(|e| e.annotate("recipients"))?;
797            match len {
798                cbor_event::Len::Len(_) => (),
799                cbor_event::Len::Indefinite => match raw.special()? {
800                    cbor_event::Special::Break => (),
801                    _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
802                },
803            }
804            Ok(COSEEncrypt {
805                headers,
806                ciphertext,
807                recipients,
808            })
809        })().map_err(|e| e.annotate("COSEEncrypt"))
810    }
811}
812
813impl cbor_event::se::Serialize for COSERecipient {
814    fn serialize<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
815        serializer.write_array(cbor_event::Len::Len(3))?;
816        self.headers.serialize_as_embedded_group(serializer)?;
817        match &self.ciphertext {
818            Some(x) => {
819                serializer.write_bytes(&x)
820            },
821            None => serializer.write_special(cbor_event::Special::Null),
822        }?;
823        Ok(serializer)
824    }
825}
826
827impl Deserialize for COSERecipient {
828    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
829        (|| -> Result<_, DeserializeError> {
830            let len = raw.array()?;
831            let mut read_len = CBORReadLen::new(len);
832            read_len.read_elems(3)?;
833            let headers = (|| -> Result<_, DeserializeError> {
834                Ok(Headers::deserialize_as_embedded_group(raw, &mut read_len, len)?)
835            })().map_err(|e| e.annotate("headers"))?;
836            let ciphertext = (|| -> Result<_, DeserializeError> {
837                Ok(match raw.cbor_type()? != cbor_event::Type::Special {
838                    true => {
839                        Some(raw.bytes()?)
840                    },
841                    false => {
842                        if raw.special()? != cbor_event::Special::Null {
843                            return Err(DeserializeFailure::ExpectedNull.into());
844                        }
845                        None
846                    }
847                })
848            })().map_err(|e| e.annotate("ciphertext"))?;
849            match len {
850                cbor_event::Len::Len(_) => (),
851                cbor_event::Len::Indefinite => match raw.special()? {
852                    cbor_event::Special::Break => (),
853                    _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
854                },
855            }
856            Ok(COSERecipient {
857                headers,
858                ciphertext,
859            })
860        })().map_err(|e| e.annotate("COSERecipient"))
861    }
862}
863
864impl cbor_event::se::Serialize for PubKeyEncryption {
865    fn serialize<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
866        serializer.write_tag(96u64)?;
867        self.0.serialize(serializer)
868    }
869}
870
871impl Deserialize for PubKeyEncryption {
872    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
873        let tag = raw.tag().map_err(|e| DeserializeError::from(e).annotate("PubKeyEncryption"))?;
874        if tag != 96 {
875            return Err(DeserializeError::new("PubKeyEncryption", DeserializeFailure::TagMismatch{ found: tag, expected: 96 }));
876        }
877        Ok(Self(COSEEncrypt::deserialize(raw)?))
878    }
879}
880
881impl cbor_event::se::Serialize for COSEKey {
882    fn serialize<'se, W: Write>(&self, serializer: &'se mut Serializer<W>) -> cbor_event::Result<&'se mut Serializer<W>> {
883        serializer.write_map(cbor_event::Len::Len(self.other_headers.len() as u64 + 1 + match &self.key_id { Some(_) => 1, None => 0 } + match &self.algorithm_id { Some(_) => 1, None => 0 } + match &self.key_ops { Some(_) => 1, None => 0 } + match &self.base_init_vector { Some(_) => 1, None => 0 }))?;
884        serializer.write_unsigned_integer(1)?;
885        self.key_type.serialize(serializer)?;
886        if let Some(field) = &self.key_id {
887            serializer.write_unsigned_integer(2)?;
888            serializer.write_bytes(&field)?;
889        }
890        if let Some(field) = &self.algorithm_id {
891            serializer.write_unsigned_integer(3)?;
892            field.serialize(serializer)?;
893        }
894        if let Some(field) = &self.key_ops {
895            serializer.write_unsigned_integer(4)?;
896            field.serialize(serializer)?;
897        }
898        if let Some(field) = &self.base_init_vector {
899            serializer.write_unsigned_integer(5)?;
900            serializer.write_bytes(&field)?;
901        }
902        for (key, value) in &self.other_headers {
903            key.serialize(serializer)?;
904            value.serialize(serializer)?;
905        }
906        Ok(serializer)
907    }
908}
909
910impl Deserialize for COSEKey {
911    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
912        (|| -> Result<_, DeserializeError> {
913            let len = raw.map()?;
914            let mut key_type = None;
915            let mut key_id = None;
916            let mut algorithm_id = None;
917            let mut key_ops = None;
918            let mut base_init_vector = None;
919            let mut other_headers = LinkedHashMap::<Label, CBORValue>::new();
920            let mut read = 0;
921            while match len { cbor_event::Len::Len(n) => read < n as usize, cbor_event::Len::Indefinite => true, } {
922                match raw.cbor_type()? {
923                    cbor_event::Type::NegativeInteger => {
924                        let nint_abs = -raw.negative_integer()? as u64;
925                        read_value(
926                            raw,
927                            &mut other_headers,
928                            Label::new_int(&Int::new_negative(to_bignum(nint_abs))),
929                            Key::Nint(nint_abs))?;
930                    },
931                    cbor_event::Type::UnsignedInteger => match raw.unsigned_integer()? {
932                        1 =>  {
933                            if key_type.is_some() {
934                                return Err(DeserializeFailure::DuplicateKey(Key::Uint(1)).into());
935                            }
936                            key_type = Some((|| -> Result<_, DeserializeError> {
937                                Ok(Label::deserialize(raw)?)
938                            })().map_err(|e| e.annotate("key_type"))?);
939                        },
940                        2 =>  {
941                            if key_id.is_some() {
942                                return Err(DeserializeFailure::DuplicateKey(Key::Uint(2)).into());
943                            }
944                            key_id = Some((|| -> Result<_, DeserializeError> {
945                                Ok(raw.bytes()?)
946                            })().map_err(|e| e.annotate("key_id"))?);
947                        },
948                        3 =>  {
949                            if algorithm_id.is_some() {
950                                return Err(DeserializeFailure::DuplicateKey(Key::Uint(3)).into());
951                            }
952                            algorithm_id = Some((|| -> Result<_, DeserializeError> {
953                                Ok(Label::deserialize(raw)?)
954                            })().map_err(|e| e.annotate("algorithm_id"))?);
955                        },
956                        4 =>  {
957                            if key_ops.is_some() {
958                                return Err(DeserializeFailure::DuplicateKey(Key::Uint(4)).into());
959                            }
960                            key_ops = Some((|| -> Result<_, DeserializeError> {
961                                Ok(Labels::deserialize(raw)?)
962                            })().map_err(|e| e.annotate("key_ops"))?);
963                        },
964                        5 =>  {
965                            if base_init_vector.is_some() {
966                                return Err(DeserializeFailure::DuplicateKey(Key::Uint(5)).into());
967                            }
968                            base_init_vector = Some((|| -> Result<_, DeserializeError> {
969                                Ok(raw.bytes()?)
970                            })().map_err(|e| e.annotate("base_init_vector"))?);
971                        },
972                        other_key => {
973                            let uint = other_key;
974                            read_value(
975                                raw,
976                                &mut other_headers,
977                                Label::new_int(&Int::new(to_bignum(uint))),
978                                Key::Uint(uint))?;
979                        },
980                    },
981                    cbor_event::Type::Text => {
982                        let text = raw.text()?;
983                        read_value(
984                            raw,
985                            &mut other_headers,
986                            Label::new_text(text.clone()),
987                            Key::Str(text))?;
988                    },
989                    cbor_event::Type::Special => match raw.special()? {
990                        cbor_event::Special::Break => match len {
991                            cbor_event::Len::Len(_) => return Err(DeserializeFailure::BreakInDefiniteLen.into()),
992                            cbor_event::Len::Indefinite => break,
993                        },
994                        _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
995                    },
996                    other_type => return Err(DeserializeFailure::UnexpectedKeyType(other_type).into()),
997                }
998                read += 1;
999            }
1000            match key_type {
1001                Some(kty) => Ok(Self {
1002                    key_type: kty,
1003                    key_id,
1004                    algorithm_id,
1005                    key_ops,
1006                    base_init_vector,
1007                    other_headers,
1008                }),
1009                None => Err(DeserializeFailure::MandatoryFieldMissing(Key::Uint(8)).into()),
1010            }
1011        })().map_err(|e| e.annotate("COSEKey"))
1012    }
1013}
1014
1015#[cfg(test)]
1016mod tests {
1017    use super::*;
1018
1019    fn print_cbor_types(vec: &Vec<u8>) {
1020        use cbor_event::Type;
1021        let mut raw = Deserializer::from(std::io::Cursor::new(vec));
1022        let mut lens = Vec::new();
1023        let mut consume_elem = |lens: &mut Vec<cbor_event::Len>| {
1024            if let Some(len) = lens.last_mut() {
1025                if let cbor_event::Len::Len(n) = len {
1026                    *n -= 1;
1027                }
1028            };
1029        };
1030        let mut reduce_depth = |lens: &mut Vec<cbor_event::Len>| {
1031            while let Some(cbor_event::Len::Len(0)) = lens.last() {
1032                lens.pop();
1033                println!("{}}}", "\t".repeat(lens.len()));
1034            }
1035        };
1036        loop {
1037            print!("{}", "\t".repeat(lens.len()));
1038            match raw.cbor_type() {
1039                Err(_) => break,
1040                Ok(Type::UnsignedInteger) => {
1041                    println!("UINT({})", raw.unsigned_integer().unwrap());
1042                    consume_elem(&mut lens);
1043                    reduce_depth(&mut lens);
1044                },
1045                Ok(Type::NegativeInteger) => {
1046                    println!("NINT({})", raw.negative_integer().unwrap());
1047                    consume_elem(&mut lens);
1048                    reduce_depth(&mut lens);
1049                },
1050                Ok(Type::Bytes) => {
1051                    println!("BYTES({:?})", raw.bytes().unwrap());
1052                    consume_elem(&mut lens);
1053                    reduce_depth(&mut lens);
1054                },
1055                Ok(Type::Text) => {
1056                    println!("TEXT({})", raw.text().unwrap());
1057                    consume_elem(&mut lens);
1058                    reduce_depth(&mut lens);
1059                },
1060                Ok(Type::Array) => {
1061                    let len = raw.array().unwrap();
1062                    println!("ARRAY({:?}) {{", len);
1063                    consume_elem(&mut lens);
1064                    lens.push(len);
1065                    if let cbor_event::Len::Len(0) = len {
1066                        reduce_depth(&mut lens);
1067                    }
1068                },
1069                Ok(Type::Map) => {
1070                    let len = raw.map().unwrap();
1071                    println!("MAP({:?}) {{", len);
1072                    consume_elem(&mut lens);
1073                    lens.push(match len {
1074                        cbor_event::Len::Len(n) => cbor_event::Len::Len(2 * n),
1075                        cbor_event::Len::Indefinite => cbor_event::Len::Indefinite,
1076                    });
1077                    if let cbor_event::Len::Len(0) = len {
1078                        reduce_depth(&mut lens);
1079                    }
1080                },
1081                Ok(Type::Tag) => println!("TAG({})", raw.tag().unwrap()),
1082                Ok(Type::Special) => {
1083                    let special = raw.special().unwrap();
1084                    println!("SPECIAL({:?})", special);
1085                    if special == cbor_event::Special::Break {
1086                        if let Some(cbor_event::Len::Indefinite) = lens.last() {
1087                            lens.pop();
1088                            reduce_depth(&mut lens);
1089                        } else {
1090                            panic!("unexpected break");
1091                        }
1092                    } else {
1093                        consume_elem(&mut lens);
1094                        reduce_depth(&mut lens);
1095                    }
1096                },
1097            }
1098        }
1099    }
1100
1101    fn deser_test<T: Deserialize + ToBytes + std::fmt::Debug>(orig: T) {
1102        println!("orig = {:?}", orig);
1103        print_cbor_types(&orig.to_bytes());
1104        let deser = T::deserialize(&mut Deserializer::from(std::io::Cursor::new(orig.to_bytes()))).unwrap();
1105        println!("deser = {:?}", deser);
1106        assert_eq!(orig.to_bytes(), deser.to_bytes());
1107    }
1108
1109    fn label_int(x: i32) -> Label {
1110        Label::new_int(&Int::new_i32(x))
1111    }
1112
1113    fn label_str(s: &str) -> Label {
1114        Label::new_text(String::from(s))
1115    }
1116
1117    #[test]
1118    fn empty_or_serialized_map_ok_empty() {
1119        deser_test(ProtectedHeaderMap::new_empty());
1120    }
1121
1122    #[test]
1123    fn empty_or_serialized_map_ok_some() {
1124        let mut header_map = HeaderMap::new();
1125        header_map.set_algorithm_id(&label_int(199));
1126        header_map.set_partial_init_vector(vec![0u8, 1u8, 2u8]);
1127        deser_test(ProtectedHeaderMap::new(&header_map));
1128    }
1129
1130    #[test]
1131    fn empty_or_serialized_map_err() {
1132        let non_header_bytes = {
1133            let mut buf = Serializer::new_vec();
1134            buf.write_bytes(&[100u8; 9]).unwrap();
1135            buf.finalize()
1136        };
1137        assert_eq!(ProtectedHeaderMap::from_bytes(non_header_bytes).unwrap_err().location.unwrap(), "ProtectedHeaderMap.HeaderMap");
1138    }
1139
1140    #[test]
1141    fn header_map() {
1142        let mut header_map = HeaderMap::new();
1143        header_map.set_algorithm_id(&label_int(0));
1144        let mut crit = Labels::new();
1145        crit.add(&label_int(-166));
1146        crit.add(&label_str("dsfdsf8353jh5  fsdfd!%&#%3j"));
1147        header_map.set_criticality(&crit);
1148        header_map.set_content_type(&label_str("content-type"));
1149        header_map.set_key_id(vec![34u8; 32]);
1150        header_map.set_init_vector(vec![97u8; 16]);
1151        header_map.set_partial_init_vector(vec![5u8; 13]);
1152        let counter_sig = {
1153            let mut hm = HeaderMap::new();
1154            hm.set_key_id(vec![7u8; 7]);
1155            hm.set_content_type(&label_int(-9));
1156            let h = Headers::new(&ProtectedHeaderMap::new(&hm), &hm);
1157            let s = COSESignature::new(&h, vec![87u8; 74]);
1158            CounterSignature::new_single(&s)
1159        };
1160        header_map.set_counter_signature(&counter_sig);
1161        header_map.set_header(&label_str("i am a string key"), &CBORValue::new_text(String::from("also a string")));
1162        header_map.set_header(&label_int(-6), &CBORValue::new_tagged(&TaggedCBOR::new(to_bignum(3u64), &CBORValue::new_special(&CBORSpecial::new_null()))));
1163        deser_test(header_map);
1164    }
1165
1166    #[test]
1167    fn cose_sign() {
1168        let mut header_map = HeaderMap::new();
1169        header_map.set_content_type(&label_int(-1000));
1170        let headers = Headers::new(&ProtectedHeaderMap::new_empty(), &header_map);
1171        let mut sigs = COSESignatures::new();
1172        sigs.add(&COSESignature::new(&headers, vec![57u8; 37]));
1173        let payload = COSESign::new(&headers, Some(vec![64u8; 39]), &sigs);
1174        let no_payload = COSESign::new(&headers, None, &sigs);
1175        deser_test(payload);
1176        deser_test(no_payload);
1177    }
1178
1179
1180    #[test]
1181    fn cose_sign1() {
1182        let mut header_map = HeaderMap::new();
1183        header_map.set_content_type(&label_int(-1000));
1184        let headers = Headers::new(&ProtectedHeaderMap::new_empty(), &header_map);
1185        let payload = COSESign1::new(&headers, Some(vec![64u8; 39]), vec![1u8, 2u8, 100u8]);
1186        let no_payload = COSESign1::new(&headers, None, vec![1u8, 2u8, 100u8]);
1187        deser_test(payload);
1188        deser_test(no_payload);
1189    }
1190
1191    #[test]
1192    fn sig_structure_sign() {
1193        let mut sig_struct = SigStructure::new(
1194            SigContext::Signature,
1195            &ProtectedHeaderMap::new_empty(),
1196            vec![8u8, 9u8, 100u8],
1197            vec![73u8; 23]);
1198        sig_struct.set_sign_protected(&ProtectedHeaderMap::new_empty());
1199        deser_test(sig_struct);
1200    }
1201
1202    #[test]
1203    fn sig_structure_counter() {
1204        let mut sig_struct = SigStructure::new(
1205            SigContext::CounterSignature,
1206            &ProtectedHeaderMap::new_empty(),
1207            vec![8u8, 9u8, 100u8],
1208            vec![73u8; 23]);
1209        sig_struct.set_sign_protected(&ProtectedHeaderMap::new_empty());
1210        deser_test(sig_struct);
1211    }
1212
1213    #[test]
1214    fn sig_structure_sign1() {
1215        let sig_struct = SigStructure::new(
1216            SigContext::Signature1,
1217            &ProtectedHeaderMap::new_empty(),
1218            vec![8u8, 9u8, 100u8],
1219            vec![73u8; 23]);
1220        deser_test(sig_struct);
1221    }
1222
1223    #[test]
1224    fn cose_key() {
1225        let mut cose_key = COSEKey::new(&label_int(8));
1226        cose_key.set_algorithm_id(&label_str("fdsfdsf"));
1227        cose_key.set_base_init_vector(vec![9; 5]);
1228        cose_key.set_key_id(vec![]);
1229        let mut key_ops = Labels::new();
1230        key_ops.add(&label_str("sadsddfd"));
1231        key_ops.add(&label_int(-100));
1232        cose_key.set_key_ops(&key_ops);
1233        cose_key.set_header(&label_str("dsfdsf"), &CBORValue::new_int(&Int::new_i32(-100)));
1234        cose_key.set_header(&label_int(-50), &CBORValue::new_text(String::from("134da2234fdsfd")));
1235        deser_test(cose_key);
1236    }
1237
1238    #[test]
1239    fn counter_sig() {
1240        let mut prot = HeaderMap::new();
1241        prot.set_init_vector(vec![5u8; 96]);
1242        prot.set_algorithm_id(&label_str("some algo"));
1243        let mut unprot = HeaderMap::new();
1244        unprot.set_key_id(vec![3u8, 5u8, 9u8, 13u8, 19u8, 23u8]);
1245        let headers = Headers::new(&ProtectedHeaderMap::new(&prot), &unprot);
1246    
1247        let sig1 = COSESignature::new(&headers, vec![1u8, 5u8, 100u8, 23u8, 32u8, 16u8, 8u8, 64u8, 96u8, 54u8]);    
1248        let cs1 = CounterSignature::new_single(&sig1);
1249        assert_eq!(CounterSignature::from_bytes(cs1.to_bytes()).unwrap().signatures().len(), 1);
1250        deser_test(cs1);
1251
1252        let sig2 = COSESignature::new(&headers, vec![55u8; 43]);
1253        let mut sigs = COSESignatures::new();
1254        sigs.add(&sig1);
1255        sigs.add(&sig2);
1256        let cs2 = CounterSignature::new_multi(&sigs);
1257        
1258        assert_eq!(CounterSignature::from_bytes(cs2.to_bytes()).unwrap().signatures().len(), 2);
1259        deser_test(cs2);
1260    }
1261}