1pub mod headers;
220pub mod keys;
221
222pub mod agent;
223pub mod algs;
224pub mod message;
225
226pub mod errors;
227pub mod utils;
228
229pub(crate) mod common;
230pub(crate) mod cose_struct;
231
232#[cfg(test)]
233mod test_vecs {
234 use crate::agent::CoseAgent;
235 use crate::algs;
236 use crate::keys;
237 use crate::message::CoseMessage;
238 use std::fs;
239 use std::path::Path;
240
241 fn get_test_vec(id: &str) -> Vec<u8> {
242 let path = format!("test_params/{}.bin", id);
243 fs::read(Path::new(&path)).unwrap()
244 }
245
246 fn get_pub_key(kid: &Vec<u8>) -> keys::CoseKey {
247 let key_set = include_bytes!("../test_params/pub_key_set.bin");
248 let mut cose_ks = keys::CoseKeySet::new();
249 cose_ks.bytes = key_set.to_vec();
250 cose_ks.decode().unwrap();
251 cose_ks.get_key(kid).unwrap()
252 }
253
254 fn get_priv_key(kid: &Vec<u8>) -> keys::CoseKey {
255 let key_set = include_bytes!("../test_params/priv_key_set.bin");
256 let mut cose_ks = keys::CoseKeySet::new();
257 cose_ks.bytes = key_set.to_vec();
258 cose_ks.decode().unwrap();
259 cose_ks.get_key(kid).unwrap()
260 }
261
262 #[test]
263 fn c11() {
264 let kid = &b"11".to_vec();
265 let mut verify = CoseMessage::new_sign();
266 verify.bytes = get_test_vec("c11");
267 verify.init_decoder(None).unwrap();
268 let i = verify.get_agent(kid).unwrap()[0];
269 let key = get_pub_key(&kid);
270 verify.agents[i].key(&key).unwrap();
271 verify.decode(None, Some(i)).unwrap();
272 }
273
274 #[test]
275 fn prod_c11() {
276 let kid = &b"11".to_vec();
277 let payload = b"This is the content.".to_vec();
278 let mut sign = CoseMessage::new_sign();
279 sign.payload = payload;
280
281 let key = get_priv_key(&kid);
282
283 let mut agent = CoseAgent::new();
284 agent.header.kid(kid.clone(), false, false);
285 agent.header.alg(algs::ES256, true, false);
286
287 agent.key(&key).unwrap();
288
289 sign.add_agent(&mut agent).unwrap();
290 sign.secure_content(None).unwrap();
291
292 sign.encode(true).unwrap();
293 assert_eq!(sign.bytes, get_test_vec("c11"));
294 }
295
296 #[test]
297 fn c12() {
298 let kid1 = &b"11".to_vec();
299 let kid2 = &b"bilbo.baggins@hobbiton.example".to_vec();
300
301 let mut verify = CoseMessage::new_sign();
302 verify.bytes = get_test_vec("c12");
303 verify.init_decoder(None).unwrap();
304
305 let mut i = verify.get_agent(kid1).unwrap()[0];
306 let mut key = get_pub_key(&kid1);
307 verify.agents[i].key(&key).unwrap();
308 verify.decode(None, Some(i)).unwrap();
309
310 i = verify.get_agent(kid2).unwrap()[0];
311 key = get_pub_key(&kid2);
312 verify.agents[i].key(&key).unwrap();
313 verify.decode(None, Some(i)).unwrap();
314 }
315
316 #[test]
317 fn prod_c12() {
318 let kid1 = &b"11".to_vec();
319 let kid2 = &b"bilbo.baggins@hobbiton.example".to_vec();
320
321 let payload = b"This is the content.".to_vec();
322 let mut sign = CoseMessage::new_sign();
323 sign.payload = payload;
324
325 let mut key = get_priv_key(&kid1);
326 let mut agent = CoseAgent::new();
327 agent.header.kid(kid1.clone(), false, false);
328 agent.header.alg(algs::ES256, true, false);
329 agent.key(&key).unwrap();
330 sign.add_agent(&mut agent).unwrap();
331
332 key = get_priv_key(&kid2);
333 agent = CoseAgent::new();
334 agent.header.kid(kid2.clone(), false, false);
335 agent.header.alg(algs::ES512, true, false);
336 agent.key(&key).unwrap();
337 sign.add_agent(&mut agent).unwrap();
338
339 sign.secure_content(None).unwrap();
340
341 sign.agents[1].payload = vec![];
344 let mut t_vec = CoseMessage::new_sign();
345 t_vec.bytes = get_test_vec("c12");
346 t_vec.init_decoder(None).unwrap();
347 t_vec.agents[1].payload = vec![];
348 t_vec.encode(true).unwrap();
349
350 sign.encode(true).unwrap();
351
352 assert_eq!(sign.bytes, t_vec.bytes);
353 }
354
355 #[test]
356 fn c13() {
357 let kid = &b"11".to_vec();
358 let mut verify = CoseMessage::new_sign();
359 verify.bytes = get_test_vec("c13");
360 verify.init_decoder(None).unwrap();
361
362 let i = verify.get_agent(kid).unwrap()[0];
363 let key = get_pub_key(&kid);
364 verify.agents[i].key(&key).unwrap();
365 verify.decode(None, Some(i)).unwrap();
366
367 let counter = verify.header.get_counter(kid).unwrap()[0];
368 verify.header.counters[counter].key(&key).unwrap();
369 verify.counters_verify(None, counter).unwrap();
370 }
371
372 #[test]
373 fn prod_c13() {
374 let kid = &b"11".to_vec();
375 let payload = b"This is the content.".to_vec();
376
377 let mut sign = CoseMessage::new_sign();
378 sign.payload = payload;
379
380 let key = get_priv_key(&kid);
381 let mut agent = CoseAgent::new();
382 agent.header.kid(kid.clone(), false, false);
383 agent.header.alg(algs::ES256, true, false);
384 agent.key(&key).unwrap();
385
386 sign.add_agent(&mut agent).unwrap();
387 sign.secure_content(None).unwrap();
388
389 agent = CoseAgent::new_counter_sig();
390 agent.header.kid(kid.clone(), false, false);
391 agent.header.alg(algs::ES256, true, false);
392 agent.key(&key).unwrap();
393 sign.counter_sig(None, &mut agent).unwrap();
394 sign.add_counter_sig(agent).unwrap();
395
396 sign.encode(true).unwrap();
397
398 assert_eq!(sign.bytes, get_test_vec("c13"));
399 }
400
401 #[test]
402 fn c21() {
403 let mut verify = CoseMessage::new_sign();
404 verify.bytes = get_test_vec("c21");
405 verify.init_decoder(None).unwrap();
406
407 let key = get_pub_key(&verify.header.kid.clone().unwrap());
408 verify.key(&key).unwrap();
409
410 verify.decode(None, None).unwrap();
411 }
412
413 #[test]
414 fn prod_c21() {
415 let kid = &b"11".to_vec();
416 let payload = b"This is the content.".to_vec();
417
418 let mut sign = CoseMessage::new_sign();
419 sign.payload = payload;
420 sign.header.kid(kid.clone(), false, false);
421 sign.header.alg(algs::ES256, true, false);
422
423 let key = get_priv_key(&kid);
424 sign.key(&key).unwrap();
425
426 sign.secure_content(None).unwrap();
427 sign.encode(true).unwrap();
428
429 assert_eq!(sign.bytes, get_test_vec("c21"));
430 }
431
432 #[test]
433 fn c31() {
434 let kid = &b"meriadoc.brandybuck@buckland.example".to_vec();
435 let msg = b"This is the content.".to_vec();
436
437 let mut dec = CoseMessage::new_encrypt();
438 dec.bytes = get_test_vec("c31");
439 dec.init_decoder(None).unwrap();
440
441 let i = dec.get_agent(kid).unwrap()[0];
442 let key = get_priv_key(kid);
443 dec.agents[i].key(&key).unwrap();
444
445 assert_eq!(dec.decode(None, Some(i)).unwrap(), msg);
446 }
447
448 #[test]
449 fn prod_c31() {
450 let kid = &b"meriadoc.brandybuck@buckland.example".to_vec();
451 let eph_kid = &b"peregrin.took@tuckborough.example".to_vec();
452 let payload = b"This is the content.".to_vec();
453
454 let mut enc = CoseMessage::new_encrypt();
455 enc.header.alg(algs::A128GCM, true, false);
456 enc.header.iv(
457 vec![201, 207, 77, 242, 254, 108, 99, 43, 247, 136, 100, 19],
458 false,
459 false,
460 );
461 enc.payload = payload;
462
463 let mut key = get_priv_key(&kid);
464
465 let mut agent = CoseAgent::new();
466 agent.header.alg(algs::ECDH_ES_HKDF_256, true, false);
467 agent.key(&key).unwrap();
468
469 key = get_priv_key(eph_kid);
470
471 agent.header.ephemeral_key(key, false, false);
472 agent.header.kid(kid.clone(), false, false);
473
474 enc.add_agent(&mut agent).unwrap();
475
476 enc.secure_content(None).unwrap();
477
478 enc.encode(true).unwrap();
479 assert_eq!(enc.bytes, get_test_vec("c31"));
480 }
481
482 #[test]
483 fn c32() {
484 let kid = &b"our-secret".to_vec();
485 let msg = b"This is the content.".to_vec();
486
487 let mut dec = CoseMessage::new_encrypt();
488 dec.bytes = get_test_vec("c32");
489 dec.init_decoder(None).unwrap();
490
491 let i = dec.get_agent(kid).unwrap()[0];
492 let key = get_priv_key(kid);
493 dec.agents[i].key(&key).unwrap();
494 dec.agents[i]
495 .header
496 .party_identity(b"lighting-client".to_vec(), false, false, true, false);
497 dec.agents[i].header.party_identity(
498 b"lighting-server".to_vec(),
499 false,
500 false,
501 false,
502 false,
503 );
504 dec.agents[i]
505 .header
506 .pub_other(b"Encryption Example 02".to_vec());
507
508 assert_eq!(dec.decode(None, Some(i)).unwrap(), msg);
509 }
510
511 #[test]
512 fn prod_c32() {
513 let kid = &b"our-secret".to_vec();
514 let salt = b"aabbccddeeffgghh".to_vec();
515 let payload = b"This is the content.".to_vec();
516
517 let mut enc = CoseMessage::new_encrypt();
518 enc.header.alg(algs::AES_CCM_16_64_128, true, false);
519 enc.header.iv(
520 vec![137, 245, 47, 101, 161, 197, 128, 147, 59, 82, 97, 167, 108],
521 false,
522 false,
523 );
524 enc.payload = payload;
525
526 let key = get_priv_key(&kid);
527
528 let mut agent = CoseAgent::new();
529 agent.header.alg(algs::DIRECT_HKDF_SHA_256, true, false);
530 agent.header.salt(salt, false, false);
531 agent.header.kid(kid.clone(), false, false);
532 agent
533 .header
534 .party_identity(b"lighting-client".to_vec(), false, false, true, false);
535 agent
536 .header
537 .party_identity(b"lighting-server".to_vec(), false, false, false, false);
538 agent.header.pub_other(b"Encryption Example 02".to_vec());
539 agent.key(&key).unwrap();
540
541 enc.add_agent(&mut agent).unwrap();
542
543 enc.secure_content(None).unwrap();
544
545 enc.encode(true).unwrap();
546 assert_eq!(enc.bytes, get_test_vec("c32"));
547 }
548
549 #[test]
550 fn c33() {
551 let msg = b"This is the content.".to_vec();
552
553 let mut dec = CoseMessage::new_encrypt();
554 dec.bytes = get_test_vec("c33");
555 dec.init_decoder(None).unwrap();
556
557 let mut key = get_priv_key(&dec.agents[0].header.kid.clone().unwrap());
558 dec.agents[0].key(&key).unwrap();
559
560 key = get_priv_key(&dec.header.counters[0].header.kid.clone().unwrap());
561 dec.header.counters[0].key(&key).unwrap();
562 dec.counters_verify(None, 0).unwrap();
563
564 assert_eq!(dec.decode(None, Some(0)).unwrap(), msg);
565 }
566
567 #[test]
568 fn prod_c33() {
569 let kid = &b"meriadoc.brandybuck@buckland.example".to_vec();
570 let c_kid = &b"bilbo.baggins@hobbiton.example".to_vec();
571 let eph_kid = &b"peregrin.took@tuckborough.example".to_vec();
572 let payload = b"This is the content.".to_vec();
573
574 let mut enc = CoseMessage::new_encrypt();
575 enc.header.alg(algs::A128GCM, true, false);
576 enc.header.iv(
577 vec![201, 207, 77, 242, 254, 108, 99, 43, 247, 136, 100, 19],
578 false,
579 false,
580 );
581 enc.payload = payload;
582
583 let mut key = get_pub_key(kid);
584
585 let mut agent = CoseAgent::new();
586 agent.header.alg(algs::ECDH_ES_HKDF_256, true, false);
587 agent.key(&key).unwrap();
588
589 key = get_priv_key(eph_kid);
590 agent.header.ephemeral_key(key, false, false);
591 agent.header.kid(kid.clone(), false, false);
592
593 enc.add_agent(&mut agent).unwrap();
594
595 enc.secure_content(None).unwrap();
596
597 key = get_priv_key(c_kid);
598 agent = CoseAgent::new_counter_sig();
599 agent.header.kid(c_kid.clone(), false, false);
600 agent.header.alg(algs::ES512, true, false);
601 agent.key(&key).unwrap();
602 enc.counter_sig(None, &mut agent).unwrap();
603 enc.add_counter_sig(agent).unwrap();
604
605 let mut test_vec = CoseMessage::new_encrypt();
608 test_vec.bytes = get_test_vec("c33");
609 test_vec.init_decoder(None).unwrap();
610 test_vec.header.counters[0].payload = vec![];
611 test_vec.encode(true).unwrap();
612 enc.header.counters[0].payload = vec![];
613
614 enc.encode(true).unwrap();
615
616 assert_eq!(enc.bytes, test_vec.bytes);
617 }
618
619 #[test]
620 fn c34() {
621 let kid = &b"meriadoc.brandybuck@buckland.example".to_vec();
622 let static_kid = &b"peregrin.took@tuckborough.example".to_vec();
623 let msg = b"This is the content.".to_vec();
624 let aad = vec![0, 17, 187, 204, 34, 221, 68, 238, 85, 255, 102, 0, 119];
625
626 let mut dec = CoseMessage::new_encrypt();
627 dec.bytes = get_test_vec("c34");
628 dec.init_decoder(None).unwrap();
629
630 let i = dec.get_agent(&kid.clone()).unwrap()[0];
631 let mut key = get_priv_key(kid);
632 dec.agents[i].key(&key).unwrap();
633
634 key = get_pub_key(static_kid);
635 dec.agents[i].header.ecdh_key(key);
636
637 assert_eq!(dec.decode(Some(aad), Some(i)).unwrap(), msg);
638 }
639
640 #[test]
641 fn prod_c34() {
642 let kid = &b"meriadoc.brandybuck@buckland.example".to_vec();
643 let static_kid = &b"peregrin.took@tuckborough.example".to_vec();
644 let payload = b"This is the content.".to_vec();
645 let aad = vec![0, 17, 187, 204, 34, 221, 68, 238, 85, 255, 102, 0, 119];
646
647 let mut enc = CoseMessage::new_encrypt();
648 enc.header.alg(algs::A128GCM, true, false);
649 enc.header.iv(
650 vec![2, 209, 247, 230, 242, 108, 67, 212, 134, 141, 135, 206],
651 false,
652 false,
653 );
654 enc.payload = payload;
655
656 let mut key = get_priv_key(&kid);
657
658 let mut agent = CoseAgent::new();
659 agent.header.alg(algs::ECDH_SS_A128KW, true, false);
660 agent.key(&key).unwrap();
661
662 key = get_priv_key(static_kid);
663
664 agent
665 .header
666 .static_key_id(static_kid.clone(), key, false, false);
667 agent.header.kid(kid.clone(), false, false);
668 agent.header.party_nonce(vec![1, 1], false, false, true);
669
670 enc.add_agent(&mut agent).unwrap();
671
672 enc.secure_content(Some(aad)).unwrap();
673
674 let mut test_vec = CoseMessage::new_encrypt();
676 test_vec.bytes = get_test_vec("c34");
677 test_vec.init_decoder(None).unwrap();
678 test_vec.agents[0].payload = vec![];
679 test_vec.secured = vec![];
680 test_vec.encode(true).unwrap();
681 enc.agents[0].payload = vec![];
682 enc.secured = vec![];
683
684 enc.encode(true).unwrap();
685
686 assert_eq!(enc.bytes, test_vec.bytes);
687 }
688
689 #[test]
690 fn c41() {
691 let kid = &b"our-secret2".to_vec();
692 let msg = b"This is the content.".to_vec();
693
694 let mut dec = CoseMessage::new_encrypt();
695 dec.bytes = get_test_vec("c41");
696 dec.init_decoder(None).unwrap();
697 let key = get_priv_key(kid);
698 dec.key(&key).unwrap();
699
700 assert_eq!(dec.decode(None, None).unwrap(), msg);
701 }
702
703 #[test]
704 fn prod_c41() {
705 let kid = &b"our-secret2".to_vec();
706 let msg = b"This is the content.".to_vec();
707
708 let mut enc = CoseMessage::new_encrypt();
709 enc.header.alg(algs::AES_CCM_16_64_128, true, false);
710 enc.header.iv(
711 vec![137, 245, 47, 101, 161, 197, 128, 147, 59, 82, 97, 167, 140],
712 false,
713 false,
714 );
715 enc.payload = msg;
716
717 let key = get_priv_key(kid);
718 enc.key(&key).unwrap();
719 enc.secure_content(None).unwrap();
720 enc.encode(true).unwrap();
721
722 assert_eq!(enc.bytes, get_test_vec("c41"));
723 }
724
725 #[test]
726 fn c42() {
727 let kid = &b"our-secret2".to_vec();
728 let msg = b"This is the content.".to_vec();
729
730 let mut dec = CoseMessage::new_encrypt();
731 dec.bytes = get_test_vec("c42");
732 dec.init_decoder(None).unwrap();
733 let mut key = get_priv_key(kid);
734 key.base_iv(vec![137, 245, 47, 101, 161, 197, 128, 147]);
735 dec.key(&key).unwrap();
736
737 assert_eq!(dec.decode(None, None).unwrap(), msg);
738 }
739
740 #[test]
741 fn prod_c42() {
742 let kid = &b"our-secret2".to_vec();
743 let msg = b"This is the content.".to_vec();
744
745 let mut enc = CoseMessage::new_encrypt();
746 enc.header.alg(algs::AES_CCM_16_64_128, true, false);
747 enc.header.partial_iv(vec![97, 167], false, false);
748 enc.payload = msg;
749
750 let mut key = get_priv_key(kid);
751 key.base_iv(vec![137, 245, 47, 101, 161, 197, 128, 147]);
752 enc.key(&key).unwrap();
753 enc.secure_content(None).unwrap();
754 enc.encode(true).unwrap();
755
756 assert_eq!(enc.bytes, get_test_vec("c42"));
757 }
758
759 #[test]
760 fn c51() {
761 let kid = &b"our-secret".to_vec();
762 let mut verify = CoseMessage::new_mac();
763 verify.bytes = get_test_vec("c51");
764 verify.init_decoder(None).unwrap();
765
766 let i = verify.get_agent(kid).unwrap()[0];
767
768 let key = get_priv_key(kid);
769 verify.agents[i].key(&key).unwrap();
770 verify.decode(None, Some(i)).unwrap();
771 }
772
773 #[test]
774 fn prod_c51() {
775 let kid = &b"our-secret".to_vec();
776 let payload = b"This is the content.".to_vec();
777
778 let mut enc = CoseMessage::new_mac();
779 enc.header.alg(algs::AES_MAC_256_64, true, false);
780 enc.payload = payload;
781
782 let key = get_priv_key(&kid);
783
784 let mut agent = CoseAgent::new();
785 agent.header.alg(algs::DIRECT, false, false);
786 agent.header.kid(kid.clone(), false, false);
787 agent.key(&key).unwrap();
788
789 enc.add_agent(&mut agent).unwrap();
790
791 enc.secure_content(None).unwrap();
792
793 enc.encode(true).unwrap();
794 assert_eq!(enc.bytes, get_test_vec("c51"));
795 }
796
797 #[test]
798 fn c52() {
799 let kid = &b"meriadoc.brandybuck@buckland.example".to_vec();
800 let static_kid = &b"peregrin.took@tuckborough.example".to_vec();
801
802 let mut verify = CoseMessage::new_mac();
803 verify.bytes = get_test_vec("c52");
804 verify.init_decoder(None).unwrap();
805
806 let i = verify.get_agent(kid).unwrap()[0];
807 let mut key = get_priv_key(kid);
808 verify.agents[i].key(&key).unwrap();
809
810 key = get_priv_key(static_kid);
811 verify.agents[i].header.ecdh_key(key);
812
813 verify.decode(None, Some(i)).unwrap();
814 }
815
816 #[test]
817 fn prod_c52() {
818 let kid = &b"meriadoc.brandybuck@buckland.example".to_vec();
819 let static_kid = &b"peregrin.took@tuckborough.example".to_vec();
820 let payload = b"This is the content.".to_vec();
821
822 let mut enc = CoseMessage::new_mac();
823 enc.header.alg(algs::HMAC_256_256, true, false);
824 enc.payload = payload;
825
826 let mut key = get_priv_key(&kid);
827
828 let mut agent = CoseAgent::new();
829 agent.header.alg(algs::ECDH_SS_HKDF_256, true, false);
830 agent.key(&key).unwrap();
831
832 key = get_priv_key(&static_kid);
833 agent
834 .header
835 .static_key_id(static_kid.clone(), key, false, false);
836 agent.header.kid(kid.clone(), false, false);
837 agent.header.party_nonce(
838 vec![
839 77, 133, 83, 231, 231, 79, 60, 106, 58, 157, 211, 239, 40, 106, 129, 149, 203, 248,
840 162, 61, 25, 85, 140, 207, 236, 125, 52, 184, 36, 244, 45, 146, 189, 6, 189, 44,
841 127, 2, 113, 240, 33, 78, 20, 31, 183, 121, 174, 40, 86, 171, 245, 133, 165, 131,
842 104, 176, 23, 231, 242, 169, 229, 206, 77, 181,
843 ],
844 false,
845 false,
846 true,
847 );
848
849 enc.add_agent(&mut agent).unwrap();
850
851 enc.secure_content(None).unwrap();
852
853 enc.encode(true).unwrap();
854 assert_eq!(enc.bytes, get_test_vec("c52"));
855 }
856
857 #[test]
858 fn c53() {
859 let kid = &b"018c0ae5-4d9b-471b-bfd6-eef314bc7037".to_vec();
860
861 let mut verify = CoseMessage::new_mac();
862 verify.bytes = get_test_vec("c53");
863 verify.init_decoder(None).unwrap();
864
865 let i = verify.get_agent(kid).unwrap()[0];
866 let key = get_priv_key(&kid);
867
868 verify.agents[i].key(&key).unwrap();
869
870 verify.decode(None, Some(i)).unwrap();
871 }
872
873 #[test]
874 fn prod_c53() {
875 let kid = &b"018c0ae5-4d9b-471b-bfd6-eef314bc7037".to_vec();
876 let payload = b"This is the content.".to_vec();
877
878 let mut enc = CoseMessage::new_mac();
879 enc.header.alg(algs::AES_MAC_128_64, true, false);
880 enc.payload = payload;
881
882 let key = get_priv_key(&kid);
883
884 let mut agent = CoseAgent::new();
885 agent.header.alg(algs::A256KW, false, false);
886 agent.header.kid(kid.clone(), false, false);
887 agent.key(&key).unwrap();
888
889 enc.add_agent(&mut agent).unwrap();
890
891 enc.secure_content(None).unwrap();
892
893 let mut test_vec = CoseMessage::new_mac();
895 test_vec.bytes = get_test_vec("c53");
896 test_vec.init_decoder(None).unwrap();
897 test_vec.agents[0].payload = vec![];
898 test_vec.secured = vec![];
899 test_vec.encode(true).unwrap();
900 enc.agents[0].payload = vec![];
901 enc.secured = vec![];
902
903 enc.encode(true).unwrap();
904 assert_eq!(enc.bytes, test_vec.bytes);
905 }
906
907 #[test]
908 fn c54() {
909 let kid1 = &b"018c0ae5-4d9b-471b-bfd6-eef314bc7037".to_vec();
910 let kid2 = &b"bilbo.baggins@hobbiton.example".to_vec();
911
912 let mut verify = CoseMessage::new_mac();
913 verify.bytes = get_test_vec("c54");
914 verify.init_decoder(None).unwrap();
915
916 let mut i = verify.get_agent(kid1).unwrap()[0];
917 let mut key = get_priv_key(kid1);
918 verify.agents[i].key(&key).unwrap();
919
920 verify.decode(None, Some(i)).unwrap();
921
922 i = verify.get_agent(kid2).unwrap()[0];
923 key = get_priv_key(kid2);
924 verify.agents[i].key(&key).unwrap();
925
926 verify.decode(None, Some(i)).unwrap();
927 }
928 #[test]
929 fn prod_c54() {
930 let kid1 = &b"bilbo.baggins@hobbiton.example".to_vec();
931 let kid2 = &b"018c0ae5-4d9b-471b-bfd6-eef314bc7037".to_vec();
932 let payload = b"This is the content.".to_vec();
933
934 let mut enc = CoseMessage::new_mac();
935 enc.header.alg(algs::HMAC_256_256, true, false);
936 enc.payload = payload;
937
938 let key = get_priv_key(&kid1);
939
940 let mut agent = CoseAgent::new();
941 agent.header.alg(algs::ECDH_ES_A128KW, true, false);
942 agent.key(&key).unwrap();
943
944 let mut eph_key = keys::CoseKey::new();
945 eph_key.kty(keys::EC2);
946 eph_key.crv(keys::P_521);
947 eph_key.d(hex::decode("000624B09A73EAD64AE07C0EBDA18126F02C80720DA239C8643198DBC1A10F967E5183D915678503CB78808F831AED26FF7D0F1E638AC58CD398E2AD00AC8A9B56E6").unwrap());
948 eph_key.x(hex::decode("0043b12669acac3fd27898ffba0bcd2e6c366d53bc4db71f909a759304acfb5e18cdc7ba0b13ff8c7636271a6924b1ac63c02688075b55ef2d613574e7dc242f79c3").unwrap());
949 eph_key.y_parity(true);
950
951 agent.header.ephemeral_key(eph_key, false, false);
952 agent.header.kid(kid1.clone(), false, false);
953
954 enc.add_agent(&mut agent).unwrap();
955
956 let key = get_priv_key(&kid2);
957
958 let mut agent = CoseAgent::new();
959 agent.header.alg(algs::A256KW, false, false);
960 agent.header.kid(kid2.clone(), false, false);
961 agent.key(&key).unwrap();
962
963 enc.add_agent(&mut agent).unwrap();
964
965 enc.secure_content(None).unwrap();
966
967 let mut test_vec = CoseMessage::new_mac();
969 test_vec.bytes = get_test_vec("c54");
970 test_vec.init_decoder(None).unwrap();
971 test_vec.agents[0].payload = vec![];
972 test_vec.agents[1].payload = vec![];
973 test_vec.secured = vec![];
974 test_vec.encode(true).unwrap();
975 enc.agents[0].payload = vec![];
976 enc.agents[1].payload = vec![];
977 enc.secured = vec![];
978
979 enc.encode(true).unwrap();
980 assert_eq!(enc.bytes, test_vec.bytes);
981 }
982
983 #[test]
984 fn c61() {
985 let kid = &b"our-secret".to_vec();
986
987 let mut verify = CoseMessage::new_mac();
988 verify.bytes = get_test_vec("c61");
989 verify.init_decoder(None).unwrap();
990
991 let key = get_priv_key(kid);
992
993 verify.key(&key).unwrap();
994 verify.decode(None, None).unwrap();
995 }
996
997 #[test]
998 fn prod_c61() {
999 let kid = &b"our-secret".to_vec();
1000 let msg = b"This is the content.".to_vec();
1001
1002 let mut enc = CoseMessage::new_mac();
1003 enc.header.alg(algs::AES_MAC_256_64, true, false);
1004 enc.payload = msg;
1005
1006 let key = get_priv_key(kid);
1007 enc.key(&key).unwrap();
1008 enc.secure_content(None).unwrap();
1009 enc.encode(true).unwrap();
1010
1011 assert_eq!(enc.bytes, get_test_vec("c61"));
1012 }
1013 #[test]
1014 fn rsa_pss_01() {
1015 let kid = &b"meriadoc.brandybuck@rsa.example".to_vec();
1016 let mut verify = CoseMessage::new_sign();
1017 verify.bytes = get_test_vec("rsa_pss_01");
1018 verify.init_decoder(None).unwrap();
1019
1020 let i = verify.get_agent(kid).unwrap()[0];
1021 let key = get_pub_key(kid);
1022 verify.agents[i].key(&key).unwrap();
1023
1024 verify.decode(None, Some(i)).unwrap();
1025 }
1026 #[test]
1027 fn prod_rsa_pss_01() {
1028 use crate::headers::ContentTypeTypes;
1029 let kid = &b"meriadoc.brandybuck@rsa.example".to_vec();
1030 let msg = b"This is the content.".to_vec();
1031
1032 let mut sign = CoseMessage::new_sign();
1033 sign.header
1034 .content_type(ContentTypeTypes::Uint(0), true, false);
1035 sign.payload = msg;
1036
1037 let key = get_priv_key(kid);
1038 let mut agent = CoseAgent::new();
1039 agent.header.alg(algs::PS256, true, false);
1040 agent.header.kid(kid.clone(), false, false);
1041 agent.key(&key).unwrap();
1042
1043 sign.add_agent(&mut agent).unwrap();
1044
1045 sign.secure_content(None).unwrap();
1046
1047 let mut test_vec = CoseMessage::new_sign();
1049 test_vec.bytes = get_test_vec("rsa_pss_01");
1050 test_vec.init_decoder(None).unwrap();
1051 test_vec.agents[0].payload = vec![];
1052 test_vec.encode(true).unwrap();
1053 sign.agents[0].payload = vec![];
1054
1055 sign.encode(true).unwrap();
1056
1057 assert_eq!(sign.bytes, test_vec.bytes);
1058 }
1059
1060 #[test]
1061 fn rsa_oaep_01() {
1062 let kid = &b"meriadoc.brandybuck@rsa.example".to_vec();
1063 let mut verify = CoseMessage::new_encrypt();
1064 verify.bytes = get_test_vec("rsa_oaep_01");
1065 verify.init_decoder(None).unwrap();
1066
1067 let i = verify.get_agent(kid).unwrap()[0];
1068 let key = get_priv_key(kid);
1069 verify.agents[i].key(&key).unwrap();
1070
1071 verify.decode(None, Some(i)).unwrap();
1072 }
1073
1074 #[test]
1075 fn prod_rsa_oaep_01() {
1076 let kid = &b"meriadoc.brandybuck@rsa.example".to_vec();
1077 let payload = b"This is the content.".to_vec();
1078
1079 let mut enc = CoseMessage::new_encrypt();
1080 enc.header.alg(algs::A128GCM, true, false);
1081 enc.header.iv(
1082 vec![217, 122, 179, 165, 199, 45, 47, 13, 126, 95, 141, 94],
1083 false,
1084 false,
1085 );
1086 enc.payload = payload;
1087
1088 let key = get_pub_key(&kid);
1089
1090 let mut agent = CoseAgent::new();
1091 agent.header.alg(algs::RSA_OAEP_1, false, false);
1092 agent.header.kid(kid.clone(), false, false);
1093 agent.key(&key).unwrap();
1094
1095 enc.add_agent(&mut agent).unwrap();
1096
1097 enc.secure_content(None).unwrap();
1098
1099 let mut test_vec = CoseMessage::new_encrypt();
1101 test_vec.bytes = get_test_vec("rsa_oaep_01");
1102 test_vec.init_decoder(None).unwrap();
1103 test_vec.agents[0].payload = vec![];
1104 test_vec.secured = vec![];
1105 test_vec.encode(true).unwrap();
1106 enc.agents[0].payload = vec![];
1107 enc.secured = vec![];
1108 enc.encode(true).unwrap();
1109
1110 assert_eq!(enc.bytes, test_vec.bytes);
1111 }
1112
1113 #[test]
1114 fn x509_signed_02() {
1115 let kid = &b"Alice Lovelace".to_vec();
1116 let mut verify = CoseMessage::new_sign();
1117 verify.bytes = get_test_vec("x509_signed_02");
1118
1119 verify.init_decoder(None).unwrap();
1120 let v1 = verify.get_agent(kid).unwrap()[0];
1121 let key = get_pub_key(&kid);
1122 verify.agents[v1].key(&key).unwrap();
1123
1124 verify.decode(None, Some(v1)).unwrap();
1125 }
1126 #[test]
1127 fn prod_x509_signed_02() {
1128 use crate::agent::CoseAgent;
1129 use crate::headers::ContentTypeTypes;
1130 use hex;
1131
1132 let msg = b"This is the content.".to_vec();
1133 let kid = &b"Alice Lovelace".to_vec();
1134
1135 let key = get_priv_key(kid);
1136
1137 let x5_private = hex::decode("30770201010420d42044eb2cd2691e926da4871cf3529ddec6b034f824ba5e050d2c702f97c7a5a00a06082a8648ce3d030107a14403420004863aa7bc0326716aa59db5bf66cc660d0591d51e4891bc2e6a9baff5077d927cad4eed482a7985be019e9b1936c16e00190e8bcc48ee12d35ff89f0fc7a099ca").unwrap().to_vec();
1138 let x5bag = vec![
1139 hex::decode("308201A930820150A00302010202144E3019548429A2893D04B8EDBA143B8F7D17B276300A06082A8648CE3D040302302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793020170D3230313230323137323732355A180F32303533313031303137323732355A3019311730150603550403130E416C696365204C6F76656C6163653059301306072A8648CE3D020106082A8648CE3D03010703420004863AA7BC0326716AA59DB5BF66CC660D0591D51E4891BC2E6A9BAFF5077D927CAD4EED482A7985BE019E9B1936C16E00190E8BCC48EE12D35FF89F0FC7A099CAA361305F300C0603551D130101FF04023000300F0603551D0F0101FF04050303078000301D0603551D0E041604141151555B01FF3F6DDDF9E5712AD3FF72A2D94D62301F0603551D230418301680141E6FC4D0C0DA004A8427CBBD3FE05A99EA2D2D11300A06082A8648CE3D0403020347003044022038FF9207872BA4D685700774783D35BE5B45AF59265A8567AE952D7182D5CBA00220163A18388EFE6310517385458AB4D3BBF7A0C23D9C87DA1CF378884FBBCDC86C").unwrap().to_vec(),
1140 hex::decode("3082019E30820145A003020102021414A4957FD506AA2AAFC669A880032E8C95B87624300A06082A8648CE3D040302302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793020170D3230313230323137323333325A180F32303533313031303137323333325A302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793059301306072A8648CE3D020106082A8648CE3D030107034200047B447C98F731337AFBE3BAC96E793AF12865F3BD56B647A1729764191AE111F3161B4D56FA42F26E1B18DD87F9DB42F4C9168E420E2CE5E2D149648EE0EE5FB4A3433041300F0603551D130101FF040530030101FF300F0603551D0F0101FF04050303070600301D0603551D0E041604141E6FC4D0C0DA004A8427CBBD3FE05A99EA2D2D11300A06082A8648CE3D0403020347003044022006F99B3ACE00007BFB717784DDD230013D8CDCA0BABE20EE00039BEA0898A6D402200FFAF9DE61C1B6BD28BF5DDB1A191E63B22EAD4A69468D5222C487D53C33C204").unwrap().to_vec(),
1141 ];
1142
1143 let mut enc = CoseMessage::new_sign();
1144 enc.header
1145 .content_type(ContentTypeTypes::Uint(0), true, false);
1146 enc.payload(msg);
1147
1148 let mut recipient2 = CoseAgent::new();
1149 recipient2.header.alg(algs::ES256, true, false);
1150 recipient2.key(&key).unwrap();
1151 recipient2.header.kid(kid.clone(), false, false);
1152 recipient2.header.x5bag(x5bag, false, false);
1153 recipient2.header.x5_private(x5_private);
1154 enc.add_agent(&mut recipient2).unwrap();
1155
1156 enc.secure_content(None).unwrap();
1157
1158 let mut test_vec = CoseMessage::new_sign();
1160 test_vec.bytes = get_test_vec("x509_signed_02");
1161 test_vec.init_decoder(None).unwrap();
1162 test_vec.agents[0].payload = vec![];
1163 test_vec.encode(true).unwrap();
1164 enc.agents[0].payload = vec![];
1165 enc.encode(true).unwrap();
1166
1167 assert_eq!(enc.bytes, test_vec.bytes);
1168 }
1169 #[test]
1170 fn x509_signed_04() {
1171 let mut verify = CoseMessage::new_sign();
1172 verify.bytes = get_test_vec("x509_signed_04");
1173
1174 verify.init_decoder(None).unwrap();
1175 let key = get_pub_key(&b"Alice Lovelace".to_vec());
1176 verify.agents[0].key(&key).unwrap();
1177
1178 verify.decode(None, Some(0)).unwrap();
1179 }
1180 #[test]
1181 fn prod_x509_signed_04() {
1182 use crate::agent::CoseAgent;
1183 use crate::headers::ContentTypeTypes;
1184 use hex;
1185
1186 let msg = b"This is the content.".to_vec();
1187 let kid = &b"Alice Lovelace".to_vec();
1188
1189 let key = get_priv_key(kid);
1190
1191 let x5_private = hex::decode("30770201010420d42044eb2cd2691e926da4871cf3529ddec6b034f824ba5e050d2c702f97c7a5a00a06082a8648ce3d030107a14403420004863aa7bc0326716aa59db5bf66cc660d0591d51e4891bc2e6a9baff5077d927cad4eed482a7985be019e9b1936c16e00190e8bcc48ee12d35ff89f0fc7a099ca").unwrap().to_vec();
1192 let x5chain = vec![
1193 hex::decode("308201A930820150A00302010202144E3019548429A2893D04B8EDBA143B8F7D17B276300A06082A8648CE3D040302302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793020170D3230313230323137323732355A180F32303533313031303137323732355A3019311730150603550403130E416C696365204C6F76656C6163653059301306072A8648CE3D020106082A8648CE3D03010703420004863AA7BC0326716AA59DB5BF66CC660D0591D51E4891BC2E6A9BAFF5077D927CAD4EED482A7985BE019E9B1936C16E00190E8BCC48EE12D35FF89F0FC7A099CAA361305F300C0603551D130101FF04023000300F0603551D0F0101FF04050303078000301D0603551D0E041604141151555B01FF3F6DDDF9E5712AD3FF72A2D94D62301F0603551D230418301680141E6FC4D0C0DA004A8427CBBD3FE05A99EA2D2D11300A06082A8648CE3D0403020347003044022038FF9207872BA4D685700774783D35BE5B45AF59265A8567AE952D7182D5CBA00220163A18388EFE6310517385458AB4D3BBF7A0C23D9C87DA1CF378884FBBCDC86C").unwrap().to_vec(),
1194 hex::decode("3082019E30820145A003020102021414A4957FD506AA2AAFC669A880032E8C95B87624300A06082A8648CE3D040302302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793020170D3230313230323137323333325A180F32303533313031303137323333325A302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793059301306072A8648CE3D020106082A8648CE3D030107034200047B447C98F731337AFBE3BAC96E793AF12865F3BD56B647A1729764191AE111F3161B4D56FA42F26E1B18DD87F9DB42F4C9168E420E2CE5E2D149648EE0EE5FB4A3433041300F0603551D130101FF040530030101FF300F0603551D0F0101FF04050303070600301D0603551D0E041604141E6FC4D0C0DA004A8427CBBD3FE05A99EA2D2D11300A06082A8648CE3D0403020347003044022006F99B3ACE00007BFB717784DDD230013D8CDCA0BABE20EE00039BEA0898A6D402200FFAF9DE61C1B6BD28BF5DDB1A191E63B22EAD4A69468D5222C487D53C33C204").unwrap().to_vec(),
1195 ];
1196
1197 let mut enc = CoseMessage::new_sign();
1198 enc.header
1199 .content_type(ContentTypeTypes::Uint(0), true, false);
1200 enc.payload(msg);
1201
1202 let mut recipient2 = CoseAgent::new();
1203 recipient2.header.alg(algs::ES256, true, false);
1204 recipient2.key(&key).unwrap();
1205 recipient2.header.x5chain(x5chain, false, false);
1206 recipient2.header.x5_private(x5_private);
1207 enc.add_agent(&mut recipient2).unwrap();
1208
1209 enc.secure_content(None).unwrap();
1210
1211 let mut test_vec = CoseMessage::new_sign();
1213 test_vec.bytes = get_test_vec("x509_signed_04");
1214 test_vec.init_decoder(None).unwrap();
1215 test_vec.agents[0].payload = vec![];
1216 test_vec.encode(true).unwrap();
1217 enc.agents[0].payload = vec![];
1218 enc.encode(true).unwrap();
1219
1220 assert_eq!(enc.bytes, test_vec.bytes);
1221 }
1222 #[test]
1223 fn x509_signed_05() {
1224 let mut verify = CoseMessage::new_sign();
1225 verify.bytes = get_test_vec("x509_signed_05");
1226
1227 verify.init_decoder(None).unwrap();
1228 let key = get_pub_key(&b"Alice Lovelace".to_vec());
1229 let v1 = 0;
1230 verify.agents[v1].key(&key).unwrap();
1231
1232 verify.decode(None, Some(v1)).unwrap();
1233 }
1234 #[test]
1235 fn prod_x509_signed_05() {
1236 use crate::agent::CoseAgent;
1237 use crate::headers::ContentTypeTypes;
1238 use hex;
1239
1240 let msg = b"This is the content.".to_vec();
1241 let kid = &b"Alice Lovelace".to_vec();
1242
1243 let key = get_priv_key(kid);
1244
1245 let x5_private =
1246 hex::decode("00d42044eb2cd2691e926da4871cf3529ddec6b034f824ba5e050d2c702f97c7a5")
1247 .unwrap()
1248 .to_vec();
1249 let x5t = hex::decode("11FA0500D6763AE15A3238296E04C048A8FDD220A0DDA0234824B18FB6666600")
1250 .unwrap()
1251 .to_vec();
1252
1253 let mut enc = CoseMessage::new_sign();
1254 enc.header
1255 .content_type(ContentTypeTypes::Uint(0), true, false);
1256 enc.payload(msg);
1257
1258 let mut recipient2 = CoseAgent::new();
1259 recipient2.header.alg(algs::ES256, true, false);
1260 recipient2.key(&key).unwrap();
1261 recipient2
1262 .header
1263 .x5t(x5t, algs::SHA_256, false, false)
1264 .unwrap();
1265 recipient2.header.x5_private(x5_private);
1266 enc.add_agent(&mut recipient2).unwrap();
1267
1268 enc.secure_content(None).unwrap();
1269
1270 let mut test_vec = CoseMessage::new_sign();
1272 test_vec.bytes = get_test_vec("x509_signed_05");
1273 test_vec.init_decoder(None).unwrap();
1274 test_vec.agents[0].payload = vec![];
1275 test_vec.encode(true).unwrap();
1276 enc.agents[0].payload = vec![];
1277 enc.encode(true).unwrap();
1278
1279 assert_eq!(enc.bytes, test_vec.bytes);
1280 }
1281}