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 let kid = &b"meriadoc.brandybuck@rsa.example".to_vec();
650 let mut verify = CoseMessage::new_sign();
651 verify.bytes = hex::decode("D8628443A10300A054546869732069732074686520636F6E74656E742E818344A1013824A104581F6D65726961646F632E6272616E64796275636B407273612E6578616D706C655901003AD4027074989995F25E167F99C9B4096FDC5C242D438D30382AE7B30F83C88D5B5EBECB64D2256D58D3CCE5C47D343BFA532B117C2D04DF3FB20679A99CF3555A7DAE6098BD123B0F3441A1E50E897CBAA1B17CE171EBAB20AE2E10F16D6EE918D37AF102175979BE65EBCEDEB47519346EA3ED6D13B5741BC63742AE31342B10B46FE93F39B55FDD6E32128FD8B476FED88F671F304D0943D2C7A33BCE48DF08E1F890CF5ACDA3EF46DA21981C3A687CFFF85EEB276A98612F38D6EE63644859D66A9AD49939EA290F7A9FDFED9AF1246930F522CB8C6909567DCBE2729716CB18A31E6F231DB3D69A7A432AA3D6FA1DEF9C9659616BEB626F158378E0FBDD").unwrap().to_vec();
652
653 verify.init_decoder(None).unwrap();
654 let v1 = verify.get_agent(kid).unwrap()[0];
655 let mut key = keys::CoseKey::new();
656 key.alg(algs::PS256);
657 key.kty(keys::RSA);
658 key.n(hex::decode("BC7E29D0DF7E20CC9DC8D509E0F68895922AF0EF452190D402C61B554334A7BF91C9A570240F994FAE1B69035BCFAD4F7E249EB26087C2665E7C958C967B1517413DC3F97A431691A5999B257CC6CD356BAD168D929B8BAE9020750E74CF60F6FD35D6BB3FC93FC28900478694F508B33E7C00E24F90EDF37457FC3E8EFCFD2F42306301A8205AB740515331D5C18F0C64D4A43BE52FC440400F6BFC558A6E32884C2AF56F29E5C52780CEA7285F5C057FC0DFDA232D0ADA681B01495D9D0E32196633588E289E59035FF664F056189F2F10FE05827B796C326E3E748FFA7C589ED273C9C43436CDDB4A6A22523EF8BCB2221615B799966F1ABA5BC84B7A27CF").unwrap());
659 key.e(hex::decode("010001").unwrap());
660 key.key_ops(vec![keys::KEY_OPS_VERIFY]);
661 verify.agents[v1].key(&key).unwrap();
662
663 verify.decode(None, Some(v1)).unwrap();
664 }
665 #[test]
666 fn x5bag() {
667 let mut verify = CoseMessage::new_sign();
668 verify.bytes = hex::decode("D8628443A10300A054546869732069732074686520636F6E74656E742E818343A10126A2046E416C696365204C6F76656C6163651820825901AD308201A930820150A00302010202144E3019548429A2893D04B8EDBA143B8F7D17B276300A06082A8648CE3D040302302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793020170D3230313230323137323732355A180F32303533313031303137323732355A3019311730150603550403130E416C696365204C6F76656C6163653059301306072A8648CE3D020106082A8648CE3D03010703420004863AA7BC0326716AA59DB5BF66CC660D0591D51E4891BC2E6A9BAFF5077D927CAD4EED482A7985BE019E9B1936C16E00190E8BCC48EE12D35FF89F0FC7A099CAA361305F300C0603551D130101FF04023000300F0603551D0F0101FF04050303078000301D0603551D0E041604141151555B01FF3F6DDDF9E5712AD3FF72A2D94D62301F0603551D230418301680141E6FC4D0C0DA004A8427CBBD3FE05A99EA2D2D11300A06082A8648CE3D0403020347003044022038FF9207872BA4D685700774783D35BE5B45AF59265A8567AE952D7182D5CBA00220163A18388EFE6310517385458AB4D3BBF7A0C23D9C87DA1CF378884FBBCDC86C5901A23082019E30820145A003020102021414A4957FD506AA2AAFC669A880032E8C95B87624300A06082A8648CE3D040302302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793020170D3230313230323137323333325A180F32303533313031303137323333325A302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793059301306072A8648CE3D020106082A8648CE3D030107034200047B447C98F731337AFBE3BAC96E793AF12865F3BD56B647A1729764191AE111F3161B4D56FA42F26E1B18DD87F9DB42F4C9168E420E2CE5E2D149648EE0EE5FB4A3433041300F0603551D130101FF040530030101FF300F0603551D0F0101FF04050303070600301D0603551D0E041604141E6FC4D0C0DA004A8427CBBD3FE05A99EA2D2D11300A06082A8648CE3D0403020347003044022006F99B3ACE00007BFB717784DDD230013D8CDCA0BABE20EE00039BEA0898A6D402200FFAF9DE61C1B6BD28BF5DDB1A191E63B22EAD4A69468D5222C487D53C33C2045840D27029503ED8CF40C7B73BBCB88C062467C0A50F0897D1559855F4FCF1788874BA8E3843D23B59566BC825102D573817437D91D0D765FA2165EFA390B50A03FF").unwrap().to_vec();
669
670 verify.init_decoder(None).unwrap();
671 let v1 = verify.get_agent(&b"Alice Lovelace".to_vec()).unwrap()[0];
672 let mut key = keys::CoseKey::new();
673 key.alg(algs::ES256);
674 key.kty(keys::EC2);
675 key.crv(keys::P_256);
676 key.x(
677 hex::decode("863aa7bc0326716aa59db5bf66cc660d0591d51e4891bc2e6a9baff5077d927c")
678 .unwrap(),
679 );
680 key.y(
681 hex::decode("ad4eed482a7985be019e9b1936c16e00190e8bcc48ee12d35ff89f0fc7a099ca")
682 .unwrap(),
683 );
684 key.key_ops(vec![keys::KEY_OPS_VERIFY]);
685 verify.agents[v1].key(&key).unwrap();
686
687 verify.decode(None, Some(v1)).unwrap();
688 }
689 #[test]
690 fn x5chain() {
691 let mut verify = CoseMessage::new_sign();
692 verify.bytes = hex::decode("D8628443A10300A054546869732069732074686520636F6E74656E742E818343A10126A11821825901AD308201A930820150A00302010202144E3019548429A2893D04B8EDBA143B8F7D17B276300A06082A8648CE3D040302302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793020170D3230313230323137323732355A180F32303533313031303137323732355A3019311730150603550403130E416C696365204C6F76656C6163653059301306072A8648CE3D020106082A8648CE3D03010703420004863AA7BC0326716AA59DB5BF66CC660D0591D51E4891BC2E6A9BAFF5077D927CAD4EED482A7985BE019E9B1936C16E00190E8BCC48EE12D35FF89F0FC7A099CAA361305F300C0603551D130101FF04023000300F0603551D0F0101FF04050303078000301D0603551D0E041604141151555B01FF3F6DDDF9E5712AD3FF72A2D94D62301F0603551D230418301680141E6FC4D0C0DA004A8427CBBD3FE05A99EA2D2D11300A06082A8648CE3D0403020347003044022038FF9207872BA4D685700774783D35BE5B45AF59265A8567AE952D7182D5CBA00220163A18388EFE6310517385458AB4D3BBF7A0C23D9C87DA1CF378884FBBCDC86C5901A23082019E30820145A003020102021414A4957FD506AA2AAFC669A880032E8C95B87624300A06082A8648CE3D040302302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793020170D3230313230323137323333325A180F32303533313031303137323333325A302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793059301306072A8648CE3D020106082A8648CE3D030107034200047B447C98F731337AFBE3BAC96E793AF12865F3BD56B647A1729764191AE111F3161B4D56FA42F26E1B18DD87F9DB42F4C9168E420E2CE5E2D149648EE0EE5FB4A3433041300F0603551D130101FF040530030101FF300F0603551D0F0101FF04050303070600301D0603551D0E041604141E6FC4D0C0DA004A8427CBBD3FE05A99EA2D2D11300A06082A8648CE3D0403020347003044022006F99B3ACE00007BFB717784DDD230013D8CDCA0BABE20EE00039BEA0898A6D402200FFAF9DE61C1B6BD28BF5DDB1A191E63B22EAD4A69468D5222C487D53C33C2045840CFFD4CDA8DD573279CD6878F30DC44E1295D045BCB13D93D0C42A2F6F3B58C0757F39116ACD90B84EB0DA8818D2BBEB6B919905AF14BAF804599B772FD4A4ECD").unwrap().to_vec();
693
694 verify.init_decoder(None).unwrap();
695 let v1 = 0;
696 let mut key = keys::CoseKey::new();
697 key.alg(algs::ES256);
698 key.kty(keys::EC2);
699 key.crv(keys::P_256);
700 key.x(
701 hex::decode("863aa7bc0326716aa59db5bf66cc660d0591d51e4891bc2e6a9baff5077d927c")
702 .unwrap(),
703 );
704 key.y(
705 hex::decode("ad4eed482a7985be019e9b1936c16e00190e8bcc48ee12d35ff89f0fc7a099ca")
706 .unwrap(),
707 );
708 key.key_ops(vec![keys::KEY_OPS_VERIFY]);
709 verify.agents[v1].key(&key).unwrap();
710
711 verify.decode(None, Some(v1)).unwrap();
712 }
713 #[test]
714 fn x5chain_fail() {
715 use crate::errors::CoseError;
716 let mut verify = CoseMessage::new_sign();
717 verify.bytes = hex::decode("D8628443A10300A054546869732069732074686520636F6E74656E742E818343A10126A11821825901A23082019E30820145A003020102021414A4957FD506AA2AAFC669A880032E8C95B87624300A06082A8648CE3D040302302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793020170D3230313230323137323333325A180F32303533313031303137323333325A302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793059301306072A8648CE3D020106082A8648CE3D030107034200047B447C98F731337AFBE3BAC96E793AF12865F3BD56B647A1729764191AE111F3161B4D56FA42F26E1B18DD87F9DB42F4C9168E420E2CE5E2D149648EE0EE5FB4A3433041300F0603551D130101FF040530030101FF300F0603551D0F0101FF04050303070600301D0603551D0E041604141E6FC4D0C0DA004A8427CBBD3FE05A99EA2D2D11300A06082A8648CE3D0403020347003044022006F99B3ACE00007BFB717784DDD230013D8CDCA0BABE20EE00039BEA0898A6D402200FFAF9DE61C1B6BD28BF5DDB1A191E63B22EAD4A69468D5222C487D53C33C2045901AD308201A930820150A00302010202144E3019548429A2893D04B8EDBA143B8F7D17B276300A06082A8648CE3D040302302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793020170D3230313230323137323732355A180F32303533313031303137323732355A3019311730150603550403130E416C696365204C6F76656C6163653059301306072A8648CE3D020106082A8648CE3D03010703420004863AA7BC0326716AA59DB5BF66CC660D0591D51E4891BC2E6A9BAFF5077D927CAD4EED482A7985BE019E9B1936C16E00190E8BCC48EE12D35FF89F0FC7A099CAA361305F300C0603551D130101FF04023000300F0603551D0F0101FF04050303078000301D0603551D0E041604141151555B01FF3F6DDDF9E5712AD3FF72A2D94D62301F0603551D230418301680141E6FC4D0C0DA004A8427CBBD3FE05A99EA2D2D11300A06082A8648CE3D0403020347003044022038FF9207872BA4D685700774783D35BE5B45AF59265A8567AE952D7182D5CBA00220163A18388EFE6310517385458AB4D3BBF7A0C23D9C87DA1CF378884FBBCDC86C5840CFFD4CDA8DD573279CD6878F30DC44E1295D045BCB13D93D0C42A2F6F3B58C0757F39116ACD90B84EB0DA8818D2BBEB6B919905AF14BAF804599B772FD4A4ECD").unwrap().to_vec();
718
719 match verify.init_decoder(None) {
720 Ok(_) => {
721 panic!("Key Chain validation failed")
722 }
723 Err(e) => match e {
724 CoseError::InvalidKeyChain() => {}
725 _ => panic!("Key Chain validation failed"),
726 },
727 };
728 }
729 #[test]
730 fn x5t() {
731 let mut verify = CoseMessage::new_sign();
732 verify.bytes = hex::decode("D8628443A10300A054546869732069732074686520636F6E74656E742E818343A10126A11822822F582011FA0500D6763AE15A3238296E04C048A8FDD220A0DDA0234824B18FB66666005840E2868433DB5EB82E91F8BE52E8A67903A93332634470DE3DD90D52422B62DFE062248248AC388FAF77B277F91C4FB6EE776EDC52069C67F17D9E7FA57AC9BBA9").unwrap().to_vec();
733
734 verify.init_decoder(None).unwrap();
735 let v1 = 0;
736 let mut key = keys::CoseKey::new();
737 key.alg(algs::ES256);
738 key.kty(keys::EC2);
739 key.crv(keys::P_256);
740 key.x(
741 hex::decode("863aa7bc0326716aa59db5bf66cc660d0591d51e4891bc2e6a9baff5077d927c")
742 .unwrap(),
743 );
744 key.y(
745 hex::decode("ad4eed482a7985be019e9b1936c16e00190e8bcc48ee12d35ff89f0fc7a099ca")
746 .unwrap(),
747 );
748 key.key_ops(vec![keys::KEY_OPS_VERIFY]);
749 verify.agents[v1].key(&key).unwrap();
750
751 verify.decode(None, Some(v1)).unwrap();
752 }
753 #[test]
754 fn x5_sender() {
755 use crate::agent::CoseAgent;
756
757 let msg = b"This is the content.".to_vec();
758 let r2_kid = b"22".to_vec();
759
760 let mut r2_key = keys::CoseKey::new();
761 r2_key.kty(keys::EC2);
762 r2_key.crv(keys::P_256);
763 r2_key.x(
764 hex::decode("98F50A4FF6C05861C8860D13A638EA56C3F5AD7590BBFBF054E1C7B4D91D6280")
765 .unwrap(),
766 );
767 r2_key.d(
768 hex::decode("02D1F7E6F26C43D4868D87CEB2353161740AACF1F7163647984B522A848DF1C3")
769 .unwrap(),
770 );
771
772 let x5_private = hex::decode("30770201010420d42044eb2cd2691e926da4871cf3529ddec6b034f824ba5e050d2c702f97c7a5a00a06082a8648ce3d030107a14403420004863aa7bc0326716aa59db5bf66cc660d0591d51e4891bc2e6a9baff5077d927cad4eed482a7985be019e9b1936c16e00190e8bcc48ee12d35ff89f0fc7a099ca").unwrap().to_vec();
773 let x5chain = vec![
774 hex::decode("308201A930820150A00302010202144E3019548429A2893D04B8EDBA143B8F7D17B276300A06082A8648CE3D040302302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793020170D3230313230323137323732355A180F32303533313031303137323732355A3019311730150603550403130E416C696365204C6F76656C6163653059301306072A8648CE3D020106082A8648CE3D03010703420004863AA7BC0326716AA59DB5BF66CC660D0591D51E4891BC2E6A9BAFF5077D927CAD4EED482A7985BE019E9B1936C16E00190E8BCC48EE12D35FF89F0FC7A099CAA361305F300C0603551D130101FF04023000300F0603551D0F0101FF04050303078000301D0603551D0E041604141151555B01FF3F6DDDF9E5712AD3FF72A2D94D62301F0603551D230418301680141E6FC4D0C0DA004A8427CBBD3FE05A99EA2D2D11300A06082A8648CE3D0403020347003044022038FF9207872BA4D685700774783D35BE5B45AF59265A8567AE952D7182D5CBA00220163A18388EFE6310517385458AB4D3BBF7A0C23D9C87DA1CF378884FBBCDC86C").unwrap().to_vec(),
775 hex::decode("3082019E30820145A003020102021414A4957FD506AA2AAFC669A880032E8C95B87624300A06082A8648CE3D040302302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793020170D3230313230323137323333325A180F32303533313031303137323333325A302C312A30280603550403132153616D706C6520434F534520436572746966696361746520417574686F726974793059301306072A8648CE3D020106082A8648CE3D030107034200047B447C98F731337AFBE3BAC96E793AF12865F3BD56B647A1729764191AE111F3161B4D56FA42F26E1B18DD87F9DB42F4C9168E420E2CE5E2D149648EE0EE5FB4A3433041300F0603551D130101FF040530030101FF300F0603551D0F0101FF04050303070600301D0603551D0E041604141E6FC4D0C0DA004A8427CBBD3FE05A99EA2D2D11300A06082A8648CE3D0403020347003044022006F99B3ACE00007BFB717784DDD230013D8CDCA0BABE20EE00039BEA0898A6D402200FFAF9DE61C1B6BD28BF5DDB1A191E63B22EAD4A69468D5222C487D53C33C204").unwrap().to_vec(),
776 ];
777
778 let mut enc = CoseMessage::new_encrypt();
779 enc.header.alg(algs::A256GCM, true, false);
780 enc.header.iv(
781 hex::decode("89f52f65a1c580933b5261a7").unwrap(),
782 true,
783 false,
784 );
785 enc.payload(msg);
786
787 let mut recipient2 = CoseAgent::new();
788 recipient2.header.alg(algs::ECDH_ES_A128KW, true, false);
789 recipient2.header.kid(r2_kid.clone(), false, false);
790 recipient2.key(&r2_key).unwrap();
791 recipient2.header.x5chain_sender(x5chain, true, false);
792 recipient2.header.x5_private(x5_private);
793 enc.add_agent(&mut recipient2).unwrap();
794
795 enc.secure_content(None).unwrap();
796
797 enc.encode(true).unwrap();
798
799 r2_key.key_ops(vec![keys::KEY_OPS_DERIVE]);
800
801 let mut dec = CoseMessage::new_encrypt();
802 dec.bytes = enc.bytes;
803 dec.init_decoder(None).unwrap();
804
805 let r2_i = dec.get_agent(&r2_kid).unwrap()[0];
806 dec.agents[r2_i].key(&r2_key).unwrap();
807 let resp2 = dec.decode(None, Some(r2_i)).unwrap();
808 assert_eq!(resp2, b"This is the content.".to_vec());
809 }
810}