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 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 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 cbor_event::Type::Special => None,
628 _ => 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 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}