1pub mod headers;
224pub mod keys;
225
226pub mod agent;
227pub mod algs;
228pub mod message;
229
230pub mod errors;
231pub mod utils;
232
233pub(crate) mod common;
234pub(crate) mod cose_struct;
235
236#[cfg(test)]
237mod test_vecs {
238 use crate::algs;
239 use crate::keys;
240 use crate::message::CoseMessage;
241 const ELEVEN: [u8; 118] = [
242 167, 1, 2, 32, 1, 2, 66, 49, 49, 33, 88, 32, 186, 197, 177, 28, 173, 143, 153, 249, 199,
243 43, 5, 207, 75, 158, 38, 210, 68, 220, 24, 159, 116, 82, 40, 37, 90, 33, 154, 134, 214,
244 160, 158, 255, 34, 88, 32, 32, 19, 139, 248, 45, 193, 182, 213, 98, 190, 15, 165, 74, 183,
245 128, 74, 58, 100, 182, 215, 44, 207, 237, 107, 111, 182, 237, 40, 187, 252, 17, 126, 35,
246 88, 32, 87, 201, 32, 119, 102, 65, 70, 232, 118, 118, 12, 149, 32, 208, 84, 170, 147, 195,
247 175, 176, 78, 48, 103, 5, 219, 96, 144, 48, 133, 7, 180, 211, 4, 130, 2, 1,
248 ];
249 const BILBO: [u8; 249] = [
250 167, 1, 2, 32, 3, 2, 88, 30, 98, 105, 108, 98, 111, 46, 98, 97, 103, 103, 105, 110, 115,
251 64, 104, 111, 98, 98, 105, 116, 111, 110, 46, 101, 120, 97, 109, 112, 108, 101, 33, 88, 66,
252 0, 114, 153, 44, 179, 172, 8, 236, 243, 229, 198, 61, 237, 236, 13, 81, 168, 193, 247, 158,
253 242, 248, 47, 148, 243, 199, 55, 191, 93, 231, 152, 102, 113, 234, 198, 37, 254, 130, 87,
254 187, 208, 57, 70, 68, 202, 170, 58, 175, 143, 39, 164, 88, 95, 187, 202, 208, 242, 69, 118,
255 32, 8, 94, 92, 143, 66, 173, 34, 88, 66, 1, 220, 166, 148, 123, 206, 136, 188, 87, 144, 72,
256 90, 201, 116, 39, 52, 43, 195, 95, 136, 125, 134, 214, 90, 8, 147, 119, 226, 71, 230, 11,
257 170, 85, 228, 232, 80, 30, 42, 218, 87, 36, 172, 81, 214, 144, 144, 8, 3, 62, 188, 16, 172,
258 153, 155, 157, 127, 92, 194, 81, 159, 63, 225, 234, 29, 148, 117, 35, 88, 66, 0, 8, 81, 56,
259 221, 171, 245, 202, 151, 95, 88, 96, 249, 26, 8, 233, 29, 109, 95, 154, 118, 173, 64, 24,
260 118, 106, 71, 102, 128, 181, 92, 211, 57, 232, 171, 108, 114, 181, 250, 205, 178, 162, 165,
261 10, 194, 91, 208, 134, 100, 125, 211, 226, 230, 233, 158, 132, 202, 44, 54, 9, 253, 241,
262 119, 254, 178, 109, 4, 130, 2, 1,
263 ];
264 const MERIADOC: [u8; 154] = [
265 167, 1, 2, 32, 1, 2, 88, 36, 109, 101, 114, 105, 97, 100, 111, 99, 46, 98, 114, 97, 110,
266 100, 121, 98, 117, 99, 107, 64, 98, 117, 99, 107, 108, 97, 110, 100, 46, 101, 120, 97, 109,
267 112, 108, 101, 33, 88, 32, 101, 237, 165, 161, 37, 119, 194, 186, 232, 41, 67, 127, 227,
268 56, 112, 26, 16, 170, 163, 117, 225, 187, 91, 93, 225, 8, 222, 67, 156, 8, 85, 29, 34, 88,
269 32, 30, 82, 237, 117, 112, 17, 99, 247, 249, 228, 13, 223, 159, 52, 27, 61, 201, 186, 134,
270 10, 247, 224, 202, 124, 167, 233, 238, 205, 0, 132, 209, 156, 35, 88, 32, 175, 249, 7, 201,
271 159, 154, 211, 170, 230, 196, 205, 242, 17, 34, 188, 226, 189, 104, 181, 40, 62, 105, 7,
272 21, 74, 217, 17, 132, 15, 162, 8, 207, 4, 131, 7, 1, 2,
273 ];
274
275 const PEREGRIN: [u8; 150] = [
276 167, 1, 2, 32, 1, 2, 88, 33, 112, 101, 114, 101, 103, 114, 105, 110, 46, 116, 111, 111,
277 107, 64, 116, 117, 99, 107, 98, 111, 114, 111, 117, 103, 104, 46, 101, 120, 97, 109, 112,
278 108, 101, 33, 88, 32, 152, 245, 10, 79, 246, 192, 88, 97, 200, 134, 13, 19, 166, 56, 234,
279 86, 195, 245, 173, 117, 144, 187, 251, 240, 84, 225, 199, 180, 217, 29, 98, 128, 34, 88,
280 32, 240, 20, 0, 176, 137, 134, 120, 4, 184, 233, 252, 150, 195, 147, 33, 97, 241, 147, 79,
281 66, 35, 6, 145, 112, 217, 36, 183, 224, 59, 248, 34, 187, 35, 88, 32, 2, 209, 247, 230,
282 242, 108, 67, 212, 134, 141, 135, 206, 178, 53, 49, 97, 116, 10, 172, 241, 247, 22, 54, 71,
283 152, 75, 82, 42, 132, 141, 241, 195, 4, 130, 2, 1,
284 ];
285 const OUR_SECRET: [u8; 55] = [
286 165, 1, 4, 2, 74, 111, 117, 114, 45, 115, 101, 99, 114, 101, 116, 32, 88, 32, 132, 155, 87,
287 33, 157, 174, 72, 222, 100, 109, 7, 219, 181, 51, 86, 110, 151, 102, 134, 69, 124, 20, 145,
288 190, 58, 118, 220, 234, 108, 66, 113, 136, 3, 15, 4, 129, 10,
289 ];
290 const UID: [u8; 81] = [
291 164, 1, 4, 2, 88, 36, 48, 49, 56, 99, 48, 97, 101, 53, 45, 52, 100, 57, 98, 45, 52, 55, 49,
292 98, 45, 98, 102, 100, 54, 45, 101, 101, 102, 51, 49, 52, 98, 99, 55, 48, 51, 55, 32, 88,
293 32, 132, 155, 87, 33, 157, 174, 72, 222, 100, 109, 7, 219, 181, 51, 86, 110, 151, 102, 134,
294 69, 124, 20, 145, 190, 58, 118, 220, 234, 108, 66, 113, 136, 4, 130, 2, 1,
295 ];
296 #[test]
297 fn c11() {
298 let kid = &b"11".to_vec();
299 let mut verify = CoseMessage::new_sign();
300 verify.bytes = [
301 216, 98, 132, 64, 160, 84, 84, 104, 105, 115, 32, 105, 115, 32, 116, 104, 101, 32, 99,
302 111, 110, 116, 101, 110, 116, 46, 129, 131, 67, 161, 1, 38, 161, 4, 66, 49, 49, 88, 64,
303 226, 174, 175, 212, 13, 105, 209, 157, 254, 110, 82, 7, 124, 93, 127, 244, 228, 8, 40,
304 44, 190, 251, 93, 6, 203, 244, 20, 175, 46, 25, 217, 130, 172, 69, 172, 152, 184, 84,
305 76, 144, 139, 69, 7, 222, 30, 144, 183, 23, 195, 211, 72, 22, 254, 146, 106, 43, 152,
306 245, 58, 253, 47, 160, 243, 10,
307 ]
308 .to_vec();
309 verify.init_decoder(None).unwrap();
310 let v1 = verify.get_agent(kid).unwrap()[0];
311 let mut key = keys::CoseKey::new();
312 key.bytes = ELEVEN.to_vec();
313 key.decode().unwrap();
314 key.alg(algs::ES256);
315 verify.agents[v1].key(&key).unwrap();
316 }
317
318 #[test]
319 fn c12() {
320 let kid1 = &b"11".to_vec();
321 let kid2 = &b"bilbo.baggins@hobbiton.example".to_vec();
322 let mut verify = CoseMessage::new_sign();
323 verify.bytes = [
324 216, 98, 132, 64, 160, 84, 84, 104, 105, 115, 32, 105, 115, 32, 116, 104, 101, 32, 99,
325 111, 110, 116, 101, 110, 116, 46, 130, 131, 67, 161, 1, 38, 161, 4, 66, 49, 49, 88, 64,
326 226, 174, 175, 212, 13, 105, 209, 157, 254, 110, 82, 7, 124, 93, 127, 244, 228, 8, 40,
327 44, 190, 251, 93, 6, 203, 244, 20, 175, 46, 25, 217, 130, 172, 69, 172, 152, 184, 84,
328 76, 144, 139, 69, 7, 222, 30, 144, 183, 23, 195, 211, 72, 22, 254, 146, 106, 43, 152,
329 245, 58, 253, 47, 160, 243, 10, 131, 68, 161, 1, 56, 35, 161, 4, 88, 30, 98, 105, 108,
330 98, 111, 46, 98, 97, 103, 103, 105, 110, 115, 64, 104, 111, 98, 98, 105, 116, 111, 110,
331 46, 101, 120, 97, 109, 112, 108, 101, 88, 132, 0, 162, 210, 138, 124, 43, 219, 21, 135,
332 135, 116, 32, 246, 90, 223, 125, 11, 154, 6, 99, 93, 209, 222, 100, 187, 98, 151, 76,
333 134, 63, 11, 22, 13, 210, 22, 55, 52, 3, 78, 106, 192, 3, 176, 30, 135, 5, 82, 76, 92,
334 76, 164, 121, 169, 82, 240, 36, 126, 232, 203, 11, 79, 183, 57, 123, 160, 141, 0, 158,
335 12, 139, 244, 130, 39, 12, 197, 119, 26, 161, 67, 150, 110, 90, 70, 154, 9, 246, 19,
336 72, 128, 48, 197, 176, 126, 198, 215, 34, 227, 131, 90, 219, 91, 45, 140, 68, 233, 95,
337 251, 19, 135, 125, 210, 88, 40, 102, 136, 53, 53, 222, 59, 176, 61, 1, 117, 63, 131,
338 171, 135, 187, 79, 122, 2, 151,
339 ]
340 .to_vec();
341
342 verify.init_decoder(None).unwrap();
343 let c1 = verify.get_agent(kid1).unwrap()[0];
344 let mut key = keys::CoseKey::new();
345 key.bytes = ELEVEN.to_vec();
346 key.decode().unwrap();
347 key.alg(algs::ES256);
348 verify.agents[c1].key(&key).unwrap();
349 verify.decode(None, Some(c1)).unwrap();
350 let c2 = verify.get_agent(kid2).unwrap()[0];
351 key = keys::CoseKey::new();
352 key.bytes = BILBO.to_vec();
353 key.decode().unwrap();
354 key.alg(algs::ES512);
355 verify.agents[c2].key(&key).unwrap();
356 verify.decode(None, Some(c2)).unwrap();
357 }
358
359 #[test]
360 fn c13() {
361 let kid = &b"11".to_vec();
362 let mut verify = CoseMessage::new_sign();
363 verify.bytes = [
364 216, 98, 132, 64, 161, 7, 131, 67, 161, 1, 38, 161, 4, 66, 49, 49, 88, 64, 90, 192, 94,
365 40, 157, 93, 14, 27, 10, 127, 4, 138, 93, 43, 100, 56, 19, 222, 213, 11, 201, 228, 146,
366 32, 244, 247, 39, 143, 133, 241, 157, 74, 119, 214, 85, 201, 211, 181, 30, 128, 90,
367 116, 176, 153, 225, 224, 133, 170, 205, 151, 252, 41, 215, 47, 136, 126, 136, 2, 187,
368 102, 80, 204, 235, 44, 84, 84, 104, 105, 115, 32, 105, 115, 32, 116, 104, 101, 32, 99,
369 111, 110, 116, 101, 110, 116, 46, 129, 131, 67, 161, 1, 38, 161, 4, 66, 49, 49, 88, 64,
370 226, 174, 175, 212, 13, 105, 209, 157, 254, 110, 82, 7, 124, 93, 127, 244, 228, 8, 40,
371 44, 190, 251, 93, 6, 203, 244, 20, 175, 46, 25, 217, 130, 172, 69, 172, 152, 184, 84,
372 76, 144, 139, 69, 7, 222, 30, 144, 183, 23, 195, 211, 72, 22, 254, 146, 106, 43, 152,
373 245, 58, 253, 47, 160, 243, 10,
374 ]
375 .to_vec();
376
377 verify.init_decoder(None).unwrap();
378 let v1 = verify.get_agent(kid).unwrap()[0];
379 let mut key = keys::CoseKey::new();
380 key.bytes = ELEVEN.to_vec();
381 key.decode().unwrap();
382 key.alg(algs::ES256);
383 verify.agents[v1].key(&key).unwrap();
384
385 verify.decode(None, Some(v1)).unwrap();
386
387 let counter = verify.header.get_counter(&b"11".to_vec()).unwrap()[0];
388 verify.header.counters[counter].key(&key).unwrap();
389 verify.counters_verify(None, counter).unwrap();
390 }
391 #[test]
392 fn c21() {
393 let mut verify = CoseMessage::new_sign();
394 verify.bytes = [
395 210, 132, 67, 161, 1, 38, 161, 4, 66, 49, 49, 84, 84, 104, 105, 115, 32, 105, 115, 32,
396 116, 104, 101, 32, 99, 111, 110, 116, 101, 110, 116, 46, 88, 64, 142, 179, 62, 76, 163,
397 29, 28, 70, 90, 176, 90, 172, 52, 204, 107, 35, 213, 143, 239, 92, 8, 49, 6, 196, 210,
398 90, 145, 174, 240, 176, 17, 126, 42, 249, 162, 145, 170, 50, 225, 74, 184, 52, 220, 86,
399 237, 42, 34, 52, 68, 84, 126, 1, 241, 29, 59, 9, 22, 229, 164, 195, 69, 202, 203, 54,
400 ]
401 .to_vec();
402
403 verify.init_decoder(None).unwrap();
404 let mut key = keys::CoseKey::new();
405 key.bytes = ELEVEN.to_vec();
406 key.decode().unwrap();
407 key.alg(algs::ES256);
408 verify.key(&key).unwrap();
409 verify.decode(None, None).unwrap();
410 }
411 #[test]
412 fn c31() {
413 let kid = &b"meriadoc.brandybuck@buckland.example".to_vec();
414 let msg = b"This is the content.".to_vec();
415 let mut dec = CoseMessage::new_encrypt();
416 dec.bytes = [
417 216, 96, 132, 67, 161, 1, 1, 161, 5, 76, 201, 207, 77, 242, 254, 108, 99, 43, 247, 136,
418 100, 19, 88, 36, 122, 219, 226, 112, 156, 168, 24, 251, 65, 95, 30, 93, 246, 111, 78,
419 26, 81, 5, 59, 166, 214, 90, 26, 12, 82, 163, 87, 218, 122, 100, 75, 128, 112, 161, 81,
420 176, 129, 131, 68, 161, 1, 56, 24, 162, 32, 164, 1, 2, 32, 1, 33, 88, 32, 152, 245, 10,
421 79, 246, 192, 88, 97, 200, 134, 13, 19, 166, 56, 234, 86, 195, 245, 173, 117, 144, 187,
422 251, 240, 84, 225, 199, 180, 217, 29, 98, 128, 34, 245, 4, 88, 36, 109, 101, 114, 105,
423 97, 100, 111, 99, 46, 98, 114, 97, 110, 100, 121, 98, 117, 99, 107, 64, 98, 117, 99,
424 107, 108, 97, 110, 100, 46, 101, 120, 97, 109, 112, 108, 101, 64,
425 ]
426 .to_vec();
427 dec.init_decoder(None).unwrap();
428 let r = dec.get_agent(kid).unwrap()[0];
429 let mut key = keys::CoseKey::new();
430 key.bytes = MERIADOC.to_vec();
431 key.decode().unwrap();
432 dec.agents[r].key(&key).unwrap();
433 assert_eq!(dec.decode(None, Some(r)).unwrap(), msg);
434 }
435
436 #[test]
437 fn c33() {
438 let kid = &b"meriadoc.brandybuck@buckland.example".to_vec();
439 let msg = b"This is the content.".to_vec();
440 let mut dec = CoseMessage::new_encrypt();
441 dec.bytes = [
442 216, 96, 132, 67, 161, 1, 1, 162, 5, 76, 201, 207, 77, 242, 254, 108, 99, 43, 247, 136,
443 100, 19, 7, 131, 68, 161, 1, 56, 35, 161, 4, 88, 30, 98, 105, 108, 98, 111, 46, 98, 97,
444 103, 103, 105, 110, 115, 64, 104, 111, 98, 98, 105, 116, 111, 110, 46, 101, 120, 97,
445 109, 112, 108, 101, 88, 132, 0, 146, 150, 99, 200, 120, 155, 178, 129, 119, 174, 40,
446 70, 126, 102, 55, 125, 161, 35, 2, 215, 249, 89, 77, 41, 153, 175, 165, 223, 165, 49,
447 41, 79, 136, 150, 242, 182, 205, 241, 116, 0, 20, 244, 199, 241, 163, 88, 227, 166,
448 207, 87, 244, 237, 111, 176, 47, 207, 143, 122, 169, 137, 245, 223, 208, 127, 7, 0,
449 163, 167, 216, 243, 198, 4, 186, 112, 250, 148, 17, 189, 16, 194, 89, 27, 72, 62, 29,
450 44, 49, 222, 0, 49, 131, 228, 52, 216, 251, 161, 143, 23, 164, 199, 227, 223, 160, 3,
451 172, 28, 243, 211, 13, 68, 210, 83, 60, 73, 137, 211, 172, 56, 195, 139, 113, 72, 28,
452 195, 67, 12, 157, 101, 231, 221, 255, 88, 36, 122, 219, 226, 112, 156, 168, 24, 251,
453 65, 95, 30, 93, 246, 111, 78, 26, 81, 5, 59, 166, 214, 90, 26, 12, 82, 163, 87, 218,
454 122, 100, 75, 128, 112, 161, 81, 176, 129, 131, 68, 161, 1, 56, 24, 162, 32, 164, 1, 2,
455 32, 1, 33, 88, 32, 152, 245, 10, 79, 246, 192, 88, 97, 200, 134, 13, 19, 166, 56, 234,
456 86, 195, 245, 173, 117, 144, 187, 251, 240, 84, 225, 199, 180, 217, 29, 98, 128, 34,
457 245, 4, 88, 36, 109, 101, 114, 105, 97, 100, 111, 99, 46, 98, 114, 97, 110, 100, 121,
458 98, 117, 99, 107, 64, 98, 117, 99, 107, 108, 97, 110, 100, 46, 101, 120, 97, 109, 112,
459 108, 101, 64,
460 ]
461 .to_vec();
462 dec.init_decoder(None).unwrap();
463 let r = dec.get_agent(kid).unwrap()[0];
464 let mut key = keys::CoseKey::new();
465 key.bytes = MERIADOC.to_vec();
466 key.decode().unwrap();
467 key.alg(algs::ECDH_ES_HKDF_256);
468 dec.agents[r].key(&key).unwrap();
469 assert_eq!(dec.decode(None, Some(r)).unwrap(), msg);
470 let c = dec
471 .header
472 .get_counter(&b"bilbo.baggins@hobbiton.example".to_vec())
473 .unwrap()[0];
474 key = keys::CoseKey::new();
475 key.bytes = BILBO.to_vec();
476 key.decode().unwrap();
477 key.alg(algs::ES512);
478 dec.header.counters[c].key(&key).unwrap();
479 dec.counters_verify(None, c).unwrap();
480 }
481 #[test]
482 fn c34() {
483 let kid = &b"meriadoc.brandybuck@buckland.example".to_vec();
484 let msg = b"This is the content.".to_vec();
485 let aad = vec![0, 17, 187, 204, 34, 221, 68, 238, 85, 255, 102, 0, 119];
486 let mut dec = CoseMessage::new_encrypt();
487 dec.bytes = [
488 216, 96, 132, 67, 161, 1, 1, 161, 5, 76, 2, 209, 247, 230, 242, 108, 67, 212, 134, 141,
489 135, 206, 88, 36, 100, 248, 77, 145, 59, 166, 10, 118, 7, 10, 154, 72, 242, 110, 151,
490 232, 99, 226, 133, 41, 216, 245, 51, 94, 95, 1, 101, 238, 233, 118, 180, 165, 246, 198,
491 240, 157, 129, 131, 68, 161, 1, 56, 31, 163, 34, 88, 33, 112, 101, 114, 101, 103, 114,
492 105, 110, 46, 116, 111, 111, 107, 64, 116, 117, 99, 107, 98, 111, 114, 111, 117, 103,
493 104, 46, 101, 120, 97, 109, 112, 108, 101, 4, 88, 36, 109, 101, 114, 105, 97, 100, 111,
494 99, 46, 98, 114, 97, 110, 100, 121, 98, 117, 99, 107, 64, 98, 117, 99, 107, 108, 97,
495 110, 100, 46, 101, 120, 97, 109, 112, 108, 101, 53, 66, 1, 1, 88, 24, 65, 224, 215,
496 111, 87, 157, 189, 13, 147, 106, 102, 45, 84, 216, 88, 32, 55, 222, 46, 54, 111, 222,
497 28, 98,
498 ]
499 .to_vec();
500 dec.init_decoder(None).unwrap();
501 let r = dec.get_agent(kid).unwrap()[0];
502 let mut key = keys::CoseKey::new();
503 key.bytes = MERIADOC.to_vec();
504 key.decode().unwrap();
505 key.key_ops(vec![keys::KEY_OPS_DERIVE]);
506 dec.agents[r].key(&key).unwrap();
507 key = keys::CoseKey::new();
508 key.bytes = PEREGRIN.to_vec();
509 key.decode().unwrap();
510 key.alg(algs::ES256);
511 key.key_ops(vec![keys::KEY_OPS_DERIVE]);
512 dec.agents[r].header.ecdh_key(key);
513 assert_eq!(dec.decode(Some(aad), Some(r)).unwrap(), msg);
514 }
515 #[test]
516 fn c51() {
517 let mut verify = CoseMessage::new_mac();
518 verify.bytes = [
519 216, 97, 133, 67, 161, 1, 15, 160, 84, 84, 104, 105, 115, 32, 105, 115, 32, 116, 104,
520 101, 32, 99, 111, 110, 116, 101, 110, 116, 46, 72, 158, 18, 38, 186, 31, 129, 184, 72,
521 129, 131, 64, 162, 1, 37, 4, 74, 111, 117, 114, 45, 115, 101, 99, 114, 101, 116, 64,
522 ]
523 .to_vec();
524 verify.init_decoder(None).unwrap();
525 let r = verify.get_agent(&b"our-secret".to_vec()).unwrap()[0];
526 let mut key = keys::CoseKey::new();
527 key.bytes = OUR_SECRET.to_vec();
528 key.decode().unwrap();
529 key.alg(algs::AES_MAC_256_64);
530 verify.agents[r].key(&key).unwrap();
531 verify.decode(None, Some(r)).unwrap();
532 }
533 #[test]
534 fn c52() {
535 let kid = &b"meriadoc.brandybuck@buckland.example".to_vec();
536 let mut verify = CoseMessage::new_mac();
537 verify.bytes = [
538 216, 97, 133, 67, 161, 1, 5, 160, 84, 84, 104, 105, 115, 32, 105, 115, 32, 116, 104,
539 101, 32, 99, 111, 110, 116, 101, 110, 116, 46, 88, 32, 129, 160, 52, 72, 172, 211, 211,
540 5, 55, 110, 170, 17, 251, 63, 228, 22, 169, 85, 190, 44, 190, 126, 201, 111, 1, 44,
541 153, 75, 195, 241, 106, 65, 129, 131, 68, 161, 1, 56, 26, 163, 34, 88, 33, 112, 101,
542 114, 101, 103, 114, 105, 110, 46, 116, 111, 111, 107, 64, 116, 117, 99, 107, 98, 111,
543 114, 111, 117, 103, 104, 46, 101, 120, 97, 109, 112, 108, 101, 4, 88, 36, 109, 101,
544 114, 105, 97, 100, 111, 99, 46, 98, 114, 97, 110, 100, 121, 98, 117, 99, 107, 64, 98,
545 117, 99, 107, 108, 97, 110, 100, 46, 101, 120, 97, 109, 112, 108, 101, 53, 88, 64, 77,
546 133, 83, 231, 231, 79, 60, 106, 58, 157, 211, 239, 40, 106, 129, 149, 203, 248, 162,
547 61, 25, 85, 140, 207, 236, 125, 52, 184, 36, 244, 45, 146, 189, 6, 189, 44, 127, 2,
548 113, 240, 33, 78, 20, 31, 183, 121, 174, 40, 86, 171, 245, 133, 165, 131, 104, 176, 23,
549 231, 242, 169, 229, 206, 77, 181, 64,
550 ]
551 .to_vec();
552 verify.init_decoder(None).unwrap();
553 let r = verify.get_agent(kid).unwrap()[0];
554 let mut key = keys::CoseKey::new();
555 key.bytes = MERIADOC.to_vec();
556 key.decode().unwrap();
557 verify.agents[r].key(&key).unwrap();
558 key = keys::CoseKey::new();
559 key.bytes = PEREGRIN.to_vec();
560 key.decode().unwrap();
561 verify.agents[r].header.ecdh_key(key);
562
563 verify.decode(None, Some(r)).unwrap();
564 }
565 #[test]
566 fn c53() {
567 let kid = &b"018c0ae5-4d9b-471b-bfd6-eef314bc7037".to_vec();
568 let mut verify = CoseMessage::new_mac();
569 verify.bytes = [
570 216, 97, 133, 67, 161, 1, 14, 160, 84, 84, 104, 105, 115, 32, 105, 115, 32, 116, 104,
571 101, 32, 99, 111, 110, 116, 101, 110, 116, 46, 72, 54, 245, 175, 175, 11, 171, 93, 67,
572 129, 131, 64, 162, 1, 36, 4, 88, 36, 48, 49, 56, 99, 48, 97, 101, 53, 45, 52, 100, 57,
573 98, 45, 52, 55, 49, 98, 45, 98, 102, 100, 54, 45, 101, 101, 102, 51, 49, 52, 98, 99,
574 55, 48, 51, 55, 88, 24, 113, 26, 176, 220, 47, 196, 88, 93, 206, 39, 239, 250, 103,
575 129, 200, 9, 62, 186, 144, 111, 34, 123, 110, 176,
576 ]
577 .to_vec();
578 verify.init_decoder(None).unwrap();
579 let r = verify.get_agent(kid).unwrap()[0];
580 let mut key = keys::CoseKey::new();
581 key.bytes = UID.to_vec();
582 key.decode().unwrap();
583 key.alg(algs::AES_MAC_128_64);
584 key.key_ops(vec![keys::KEY_OPS_MAC_VERIFY]);
585 verify.agents[r].key(&key).unwrap();
586
587 verify.decode(None, Some(r)).unwrap();
588 }
589 #[test]
590 fn c54() {
591 let kid1 = &b"bilbo.baggins@hobbiton.example".to_vec();
592 let kid2 = &b"018c0ae5-4d9b-471b-bfd6-eef314bc7037".to_vec();
593 let mut verify = CoseMessage::new_mac();
594 verify.bytes = [
595 216, 97, 133, 67, 161, 1, 5, 160, 84, 84, 104, 105, 115, 32, 105, 115, 32, 116, 104,
596 101, 32, 99, 111, 110, 116, 101, 110, 116, 46, 88, 32, 191, 72, 35, 94, 128, 155, 92,
597 66, 233, 149, 242, 183, 213, 250, 19, 98, 14, 126, 216, 52, 227, 55, 246, 170, 67, 223,
598 22, 30, 73, 233, 50, 62, 130, 131, 68, 161, 1, 56, 28, 162, 32, 164, 1, 2, 32, 3, 33,
599 88, 66, 0, 67, 177, 38, 105, 172, 172, 63, 210, 120, 152, 255, 186, 11, 205, 46, 108,
600 54, 109, 83, 188, 77, 183, 31, 144, 154, 117, 147, 4, 172, 251, 94, 24, 205, 199, 186,
601 11, 19, 255, 140, 118, 54, 39, 26, 105, 36, 177, 172, 99, 192, 38, 136, 7, 91, 85, 239,
602 45, 97, 53, 116, 231, 220, 36, 47, 121, 195, 34, 245, 4, 88, 30, 98, 105, 108, 98, 111,
603 46, 98, 97, 103, 103, 105, 110, 115, 64, 104, 111, 98, 98, 105, 116, 111, 110, 46, 101,
604 120, 97, 109, 112, 108, 101, 88, 40, 51, 155, 196, 247, 153, 132, 205, 198, 179, 230,
605 206, 95, 49, 90, 76, 125, 43, 10, 196, 102, 252, 234, 105, 232, 192, 125, 251, 202, 91,
606 177, 246, 97, 188, 95, 142, 13, 249, 227, 239, 245, 131, 64, 162, 1, 36, 4, 88, 36, 48,
607 49, 56, 99, 48, 97, 101, 53, 45, 52, 100, 57, 98, 45, 52, 55, 49, 98, 45, 98, 102, 100,
608 54, 45, 101, 101, 102, 51, 49, 52, 98, 99, 55, 48, 51, 55, 88, 40, 11, 44, 124, 252,
609 224, 78, 152, 39, 99, 66, 214, 71, 106, 119, 35, 192, 144, 223, 221, 21, 249, 165, 24,
610 231, 115, 101, 73, 233, 152, 55, 6, 149, 230, 214, 168, 59, 74, 229, 7, 187,
611 ]
612 .to_vec();
613 verify.init_decoder(None).unwrap();
614 let mut r = verify.get_agent(kid1).unwrap()[0];
615 let mut key = keys::CoseKey::new();
616 key.bytes = BILBO.to_vec();
617 key.decode().unwrap();
618 key.key_ops(vec![keys::KEY_OPS_DERIVE]);
619 verify.agents[r].key(&key).unwrap();
620 verify.decode(None, Some(r)).unwrap();
621
622 r = verify.get_agent(kid2).unwrap()[0];
623 let mut key = keys::CoseKey::new();
624 key.bytes = UID.to_vec();
625 key.decode().unwrap();
626 key.alg(algs::AES_MAC_128_64);
627 key.key_ops(vec![keys::KEY_OPS_MAC_VERIFY]);
628 verify.agents[r].key(&key).unwrap();
629 verify.decode(None, Some(r)).unwrap();
630 }
631 #[test]
632 fn c61() {
633 let mut verify = CoseMessage::new_mac();
634 verify.bytes = [
635 209, 132, 67, 161, 1, 15, 160, 84, 84, 104, 105, 115, 32, 105, 115, 32, 116, 104, 101,
636 32, 99, 111, 110, 116, 101, 110, 116, 46, 72, 114, 96, 67, 116, 80, 39, 33, 79,
637 ]
638 .to_vec();
639 verify.init_decoder(None).unwrap();
640 let mut key = keys::CoseKey::new();
641 key.bytes = OUR_SECRET.to_vec();
642 key.decode().unwrap();
643 key.alg(algs::AES_MAC_256_64);
644 verify.key(&key).unwrap();
645 verify.decode(None, None).unwrap();
646 }
647 #[test]
648 fn rsa() {
649 use hex;
650 let kid = &b"meriadoc.brandybuck@rsa.example".to_vec();
651 let mut verify = CoseMessage::new_sign();
652 verify.bytes = hex::decode("D8628443A10300A054546869732069732074686520636F6E74656E742E818344A1013824A104581F6D65726961646F632E6272616E64796275636B407273612E6578616D706C655901003AD4027074989995F25E167F99C9B4096FDC5C242D438D30382AE7B30F83C88D5B5EBECB64D2256D58D3CCE5C47D343BFA532B117C2D04DF3FB20679A99CF3555A7DAE6098BD123B0F3441A1E50E897CBAA1B17CE171EBAB20AE2E10F16D6EE918D37AF102175979BE65EBCEDEB47519346EA3ED6D13B5741BC63742AE31342B10B46FE93F39B55FDD6E32128FD8B476FED88F671F304D0943D2C7A33BCE48DF08E1F890CF5ACDA3EF46DA21981C3A687CFFF85EEB276A98612F38D6EE63644859D66A9AD49939EA290F7A9FDFED9AF1246930F522CB8C6909567DCBE2729716CB18A31E6F231DB3D69A7A432AA3D6FA1DEF9C9659616BEB626F158378E0FBDD").unwrap().to_vec();
653
654 verify.init_decoder(None).unwrap();
655 let v1 = verify.get_agent(kid).unwrap()[0];
656 let mut key = keys::CoseKey::new();
657 key.alg(algs::PS256);
658 key.kty(keys::RSA);
659 key.n(hex::decode("BC7E29D0DF7E20CC9DC8D509E0F68895922AF0EF452190D402C61B554334A7BF91C9A570240F994FAE1B69035BCFAD4F7E249EB26087C2665E7C958C967B1517413DC3F97A431691A5999B257CC6CD356BAD168D929B8BAE9020750E74CF60F6FD35D6BB3FC93FC28900478694F508B33E7C00E24F90EDF37457FC3E8EFCFD2F42306301A8205AB740515331D5C18F0C64D4A43BE52FC440400F6BFC558A6E32884C2AF56F29E5C52780CEA7285F5C057FC0DFDA232D0ADA681B01495D9D0E32196633588E289E59035FF664F056189F2F10FE05827B796C326E3E748FFA7C589ED273C9C43436CDDB4A6A22523EF8BCB2221615B799966F1ABA5BC84B7A27CF").unwrap());
660 key.e(hex::decode("010001").unwrap());
661 key.key_ops(vec![keys::KEY_OPS_VERIFY]);
662 verify.agents[v1].key(&key).unwrap();
663
664 verify.decode(None, Some(v1)).unwrap();
665 }
666 #[test]
667 fn x5bag() {
668 use hex;
669 let mut verify = CoseMessage::new_sign();
670 verify.bytes = hex::decode("D8628443A10300A054546869732069732074686520636F6E74656E742E818343A10126A2046E416C696365204C6F76656C6163651820825901AD308201A930820150A00302010202144E3019548429A2893D04B8EDBA143B8F7D17B276300A06082A8648CE3D040302302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793020170D3230313230323137323732355A180F32303533313031303137323732355A3019311730150603550403130E416C696365204C6F76656C6163653059301306072A8648CE3D020106082A8648CE3D03010703420004863AA7BC0326716AA59DB5BF66CC660D0591D51E4891BC2E6A9BAFF5077D927CAD4EED482A7985BE019E9B1936C16E00190E8BCC48EE12D35FF89F0FC7A099CAA361305F300C0603551D130101FF04023000300F0603551D0F0101FF04050303078000301D0603551D0E041604141151555B01FF3F6DDDF9E5712AD3FF72A2D94D62301F0603551D230418301680141E6FC4D0C0DA004A8427CBBD3FE05A99EA2D2D11300A06082A8648CE3D0403020347003044022038FF9207872BA4D685700774783D35BE5B45AF59265A8567AE952D7182D5CBA00220163A18388EFE6310517385458AB4D3BBF7A0C23D9C87DA1CF378884FBBCDC86C5901A23082019E30820145A003020102021414A4957FD506AA2AAFC669A880032E8C95B87624300A06082A8648CE3D040302302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793020170D3230313230323137323333325A180F32303533313031303137323333325A302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793059301306072A8648CE3D020106082A8648CE3D030107034200047B447C98F731337AFBE3BAC96E793AF12865F3BD56B647A1729764191AE111F3161B4D56FA42F26E1B18DD87F9DB42F4C9168E420E2CE5E2D149648EE0EE5FB4A3433041300F0603551D130101FF040530030101FF300F0603551D0F0101FF04050303070600301D0603551D0E041604141E6FC4D0C0DA004A8427CBBD3FE05A99EA2D2D11300A06082A8648CE3D0403020347003044022006F99B3ACE00007BFB717784DDD230013D8CDCA0BABE20EE00039BEA0898A6D402200FFAF9DE61C1B6BD28BF5DDB1A191E63B22EAD4A69468D5222C487D53C33C2045840D27029503ED8CF40C7B73BBCB88C062467C0A50F0897D1559855F4FCF1788874BA8E3843D23B59566BC825102D573817437D91D0D765FA2165EFA390B50A03FF").unwrap().to_vec();
671
672 verify.init_decoder(None).unwrap();
673 let v1 = verify.get_agent(&b"Alice Lovelace".to_vec()).unwrap()[0];
674 let mut key = keys::CoseKey::new();
675 key.alg(algs::ES256);
676 key.kty(keys::EC2);
677 key.crv(keys::P_256);
678 key.x(
679 hex::decode("863aa7bc0326716aa59db5bf66cc660d0591d51e4891bc2e6a9baff5077d927c")
680 .unwrap(),
681 );
682 key.y(
683 hex::decode("ad4eed482a7985be019e9b1936c16e00190e8bcc48ee12d35ff89f0fc7a099ca")
684 .unwrap(),
685 );
686 key.key_ops(vec![keys::KEY_OPS_VERIFY]);
687 verify.agents[v1].key(&key).unwrap();
688
689 verify.decode(None, Some(v1)).unwrap();
690 }
691 #[test]
692 fn x5chain() {
693 use hex;
694 let mut verify = CoseMessage::new_sign();
695 verify.bytes = hex::decode("D8628443A10300A054546869732069732074686520636F6E74656E742E818343A10126A11821825901AD308201A930820150A00302010202144E3019548429A2893D04B8EDBA143B8F7D17B276300A06082A8648CE3D040302302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793020170D3230313230323137323732355A180F32303533313031303137323732355A3019311730150603550403130E416C696365204C6F76656C6163653059301306072A8648CE3D020106082A8648CE3D03010703420004863AA7BC0326716AA59DB5BF66CC660D0591D51E4891BC2E6A9BAFF5077D927CAD4EED482A7985BE019E9B1936C16E00190E8BCC48EE12D35FF89F0FC7A099CAA361305F300C0603551D130101FF04023000300F0603551D0F0101FF04050303078000301D0603551D0E041604141151555B01FF3F6DDDF9E5712AD3FF72A2D94D62301F0603551D230418301680141E6FC4D0C0DA004A8427CBBD3FE05A99EA2D2D11300A06082A8648CE3D0403020347003044022038FF9207872BA4D685700774783D35BE5B45AF59265A8567AE952D7182D5CBA00220163A18388EFE6310517385458AB4D3BBF7A0C23D9C87DA1CF378884FBBCDC86C5901A23082019E30820145A003020102021414A4957FD506AA2AAFC669A880032E8C95B87624300A06082A8648CE3D040302302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793020170D3230313230323137323333325A180F32303533313031303137323333325A302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793059301306072A8648CE3D020106082A8648CE3D030107034200047B447C98F731337AFBE3BAC96E793AF12865F3BD56B647A1729764191AE111F3161B4D56FA42F26E1B18DD87F9DB42F4C9168E420E2CE5E2D149648EE0EE5FB4A3433041300F0603551D130101FF040530030101FF300F0603551D0F0101FF04050303070600301D0603551D0E041604141E6FC4D0C0DA004A8427CBBD3FE05A99EA2D2D11300A06082A8648CE3D0403020347003044022006F99B3ACE00007BFB717784DDD230013D8CDCA0BABE20EE00039BEA0898A6D402200FFAF9DE61C1B6BD28BF5DDB1A191E63B22EAD4A69468D5222C487D53C33C2045840CFFD4CDA8DD573279CD6878F30DC44E1295D045BCB13D93D0C42A2F6F3B58C0757F39116ACD90B84EB0DA8818D2BBEB6B919905AF14BAF804599B772FD4A4ECD").unwrap().to_vec();
696
697 verify.init_decoder(None).unwrap();
698 let v1 = 0;
699 let mut key = keys::CoseKey::new();
700 key.alg(algs::ES256);
701 key.kty(keys::EC2);
702 key.crv(keys::P_256);
703 key.x(
704 hex::decode("863aa7bc0326716aa59db5bf66cc660d0591d51e4891bc2e6a9baff5077d927c")
705 .unwrap(),
706 );
707 key.y(
708 hex::decode("ad4eed482a7985be019e9b1936c16e00190e8bcc48ee12d35ff89f0fc7a099ca")
709 .unwrap(),
710 );
711 key.key_ops(vec![keys::KEY_OPS_VERIFY]);
712 verify.agents[v1].key(&key).unwrap();
713
714 verify.decode(None, Some(v1)).unwrap();
715 }
716 #[test]
717 fn x5chain_fail() {
718 use crate::errors::CoseError;
719 use hex;
720 let mut verify = CoseMessage::new_sign();
721 verify.bytes = hex::decode("D8628443A10300A054546869732069732074686520636F6E74656E742E818343A10126A11821825901A23082019E30820145A003020102021414A4957FD506AA2AAFC669A880032E8C95B87624300A06082A8648CE3D040302302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793020170D3230313230323137323333325A180F32303533313031303137323333325A302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793059301306072A8648CE3D020106082A8648CE3D030107034200047B447C98F731337AFBE3BAC96E793AF12865F3BD56B647A1729764191AE111F3161B4D56FA42F26E1B18DD87F9DB42F4C9168E420E2CE5E2D149648EE0EE5FB4A3433041300F0603551D130101FF040530030101FF300F0603551D0F0101FF04050303070600301D0603551D0E041604141E6FC4D0C0DA004A8427CBBD3FE05A99EA2D2D11300A06082A8648CE3D0403020347003044022006F99B3ACE00007BFB717784DDD230013D8CDCA0BABE20EE00039BEA0898A6D402200FFAF9DE61C1B6BD28BF5DDB1A191E63B22EAD4A69468D5222C487D53C33C2045901AD308201A930820150A00302010202144E3019548429A2893D04B8EDBA143B8F7D17B276300A06082A8648CE3D040302302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793020170D3230313230323137323732355A180F32303533313031303137323732355A3019311730150603550403130E416C696365204C6F76656C6163653059301306072A8648CE3D020106082A8648CE3D03010703420004863AA7BC0326716AA59DB5BF66CC660D0591D51E4891BC2E6A9BAFF5077D927CAD4EED482A7985BE019E9B1936C16E00190E8BCC48EE12D35FF89F0FC7A099CAA361305F300C0603551D130101FF04023000300F0603551D0F0101FF04050303078000301D0603551D0E041604141151555B01FF3F6DDDF9E5712AD3FF72A2D94D62301F0603551D230418301680141E6FC4D0C0DA004A8427CBBD3FE05A99EA2D2D11300A06082A8648CE3D0403020347003044022038FF9207872BA4D685700774783D35BE5B45AF59265A8567AE952D7182D5CBA00220163A18388EFE6310517385458AB4D3BBF7A0C23D9C87DA1CF378884FBBCDC86C5840CFFD4CDA8DD573279CD6878F30DC44E1295D045BCB13D93D0C42A2F6F3B58C0757F39116ACD90B84EB0DA8818D2BBEB6B919905AF14BAF804599B772FD4A4ECD").unwrap().to_vec();
722
723 match verify.init_decoder(None) {
724 Ok(_) => {
725 panic!("Key Chain validation failed")
726 }
727 Err(e) => match e {
728 CoseError::InvalidKeyChain() => {}
729 _ => panic!("Key Chain validation failed"),
730 },
731 };
732 }
733 #[test]
734 fn x5t() {
735 use hex;
736 let mut verify = CoseMessage::new_sign();
737 verify.bytes = hex::decode("D8628443A10300A054546869732069732074686520636F6E74656E742E818343A10126A11822822F582011FA0500D6763AE15A3238296E04C048A8FDD220A0DDA0234824B18FB66666005840E2868433DB5EB82E91F8BE52E8A67903A93332634470DE3DD90D52422B62DFE062248248AC388FAF77B277F91C4FB6EE776EDC52069C67F17D9E7FA57AC9BBA9").unwrap().to_vec();
738
739 verify.init_decoder(None).unwrap();
740 let v1 = 0;
741 let mut key = keys::CoseKey::new();
742 key.alg(algs::ES256);
743 key.kty(keys::EC2);
744 key.crv(keys::P_256);
745 key.x(
746 hex::decode("863aa7bc0326716aa59db5bf66cc660d0591d51e4891bc2e6a9baff5077d927c")
747 .unwrap(),
748 );
749 key.y(
750 hex::decode("ad4eed482a7985be019e9b1936c16e00190e8bcc48ee12d35ff89f0fc7a099ca")
751 .unwrap(),
752 );
753 key.key_ops(vec![keys::KEY_OPS_VERIFY]);
754 verify.agents[v1].key(&key).unwrap();
755
756 verify.decode(None, Some(v1)).unwrap();
757 }
758 #[test]
759 fn x5_sender() {
760 use crate::agent::CoseAgent;
761 use hex;
762
763 let msg = b"This is the content.".to_vec();
764 let r2_kid = b"22".to_vec();
765
766 let mut r2_key = keys::CoseKey::new();
767 r2_key.kty(keys::EC2);
768 r2_key.crv(keys::P_256);
769 r2_key.x(
770 hex::decode("98F50A4FF6C05861C8860D13A638EA56C3F5AD7590BBFBF054E1C7B4D91D6280")
771 .unwrap(),
772 );
773 r2_key.d(
774 hex::decode("02D1F7E6F26C43D4868D87CEB2353161740AACF1F7163647984B522A848DF1C3")
775 .unwrap(),
776 );
777
778 let x5_private = hex::decode("30770201010420d42044eb2cd2691e926da4871cf3529ddec6b034f824ba5e050d2c702f97c7a5a00a06082a8648ce3d030107a14403420004863aa7bc0326716aa59db5bf66cc660d0591d51e4891bc2e6a9baff5077d927cad4eed482a7985be019e9b1936c16e00190e8bcc48ee12d35ff89f0fc7a099ca").unwrap().to_vec();
779 let x5chain = vec![
780 hex::decode("308201A930820150A00302010202144E3019548429A2893D04B8EDBA143B8F7D17B276300A06082A8648CE3D040302302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793020170D3230313230323137323732355A180F32303533313031303137323732355A3019311730150603550403130E416C696365204C6F76656C6163653059301306072A8648CE3D020106082A8648CE3D03010703420004863AA7BC0326716AA59DB5BF66CC660D0591D51E4891BC2E6A9BAFF5077D927CAD4EED482A7985BE019E9B1936C16E00190E8BCC48EE12D35FF89F0FC7A099CAA361305F300C0603551D130101FF04023000300F0603551D0F0101FF04050303078000301D0603551D0E041604141151555B01FF3F6DDDF9E5712AD3FF72A2D94D62301F0603551D230418301680141E6FC4D0C0DA004A8427CBBD3FE05A99EA2D2D11300A06082A8648CE3D0403020347003044022038FF9207872BA4D685700774783D35BE5B45AF59265A8567AE952D7182D5CBA00220163A18388EFE6310517385458AB4D3BBF7A0C23D9C87DA1CF378884FBBCDC86C").unwrap().to_vec(),
781 hex::decode("3082019E30820145A003020102021414A4957FD506AA2AAFC669A880032E8C95B87624300A06082A8648CE3D040302302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793020170D3230313230323137323333325A180F32303533313031303137323333325A302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793059301306072A8648CE3D020106082A8648CE3D030107034200047B447C98F731337AFBE3BAC96E793AF12865F3BD56B647A1729764191AE111F3161B4D56FA42F26E1B18DD87F9DB42F4C9168E420E2CE5E2D149648EE0EE5FB4A3433041300F0603551D130101FF040530030101FF300F0603551D0F0101FF04050303070600301D0603551D0E041604141E6FC4D0C0DA004A8427CBBD3FE05A99EA2D2D11300A06082A8648CE3D0403020347003044022006F99B3ACE00007BFB717784DDD230013D8CDCA0BABE20EE00039BEA0898A6D402200FFAF9DE61C1B6BD28BF5DDB1A191E63B22EAD4A69468D5222C487D53C33C204").unwrap().to_vec(),
782 ];
783
784 let mut enc = CoseMessage::new_encrypt();
785 enc.header.alg(algs::A256GCM, true, false);
786 enc.header.iv(
787 hex::decode("89f52f65a1c580933b5261a7").unwrap(),
788 true,
789 false,
790 );
791 enc.payload(msg);
792
793 let mut recipient2 = CoseAgent::new();
794 recipient2.header.alg(algs::ECDH_ES_A128KW, true, false);
795 recipient2.header.kid(r2_kid.clone(), false, false);
796 recipient2.key(&r2_key).unwrap();
797 recipient2.header.x5chain_sender(x5chain, true, false);
798 recipient2.header.x5_private(x5_private);
799 enc.add_agent(&mut recipient2).unwrap();
800
801 enc.secure_content(None).unwrap();
802
803 enc.encode(true).unwrap();
804
805 r2_key.key_ops(vec![keys::KEY_OPS_DERIVE]);
806
807 let mut dec = CoseMessage::new_encrypt();
808 dec.bytes = enc.bytes;
809 dec.init_decoder(None).unwrap();
810
811 let r2_i = dec.get_agent(&r2_kid).unwrap()[0];
812 dec.agents[r2_i].key(&r2_key).unwrap();
813 let resp2 = dec.decode(None, Some(r2_i)).unwrap();
814 assert_eq!(resp2, b"This is the content.".to_vec());
815 }
816}