cose/
lib.rs

1//! CBOR Object Signing and Encryption, COSE ([RFC 8152](https://tools.ietf.org/html/rfc8152)), implementation for Rust.
2//!
3//! This library offers a set of methods and structures to help encoding/decoding a COSE message,
4//! including the respective cryptographic operations with the given parameters.
5//!
6//! The cryptographic functions used in this library are from the
7//! [rust-openssl](https://crates.io/crates/openssl) and [rand](https://crates.io/crates/rand) crates and
8//! the CBOR encoding/decoding methods are from the
9//! [cbor-codec](https://twittner.gitlab.io/cbor-codec/cbor/) crate.
10//!
11//! # Examples
12//!
13//! The following examples, demonstrate how to encode and decode COSE messages in different types without
14//! the recipients/signers bucket. Examples with the recipients/signers bucket can be found in the modules
15//! [message](message/index.html) and [agent](agent/index.html).
16//!
17//! ## cose-sign1
18//!
19//! ### Encode cose-sign1 message
20//! ```
21//! use cose::message::CoseMessage;
22//! use cose::keys;
23//! use cose::algs;
24//! use hex;
25//!
26//! fn main() {
27//!     let msg = b"This is the content.".to_vec();
28//!     let kid = b"11".to_vec();
29//!
30//!     // cose-key to encode the message
31//!     let mut key = keys::CoseKey::new();
32//!     key.kty(keys::EC2);
33//!     key.alg(algs::ES512);
34//!     key.crv(keys::P_256);
35//!     key.x(hex::decode("bac5b11cad8f99f9c72b05cf4b9e26d244dc189f745228255a219a86d6a09eff").unwrap());
36//!     key.y(hex::decode("20138bf82dc1b6d562be0fa54ab7804a3a64b6d72ccfed6b6fb6ed28bbfc117e").unwrap());
37//!     key.d(hex::decode("57c92077664146e876760c9520d054aa93c3afb04e306705db6090308507b4d3").unwrap());
38//!     key.key_ops(vec![keys::KEY_OPS_SIGN]);
39//!
40//!     // Prepare cose-sign1 message
41//!     let mut sign1 = CoseMessage::new_sign();
42//!     sign1.header.alg(algs::ES512, true, false);
43//!     sign1.header.kid(kid, true, false);
44//!     sign1.payload(msg);
45//!     sign1.key(&key).unwrap();
46//!
47//!     // Generate the signature
48//!     sign1.secure_content(None).unwrap();
49//!
50//!     // Encode the message with the payload
51//!     sign1.encode(true).unwrap();
52//! }
53//! ```
54//!
55//! ### Decode cose-sign1 message
56//! ```
57//! use cose::message::CoseMessage;
58//! use cose::keys;
59//! use cose::algs;
60//! use hex;
61//!
62//! fn main() {
63//!     // cose-key to decode the message
64//!     let mut key = keys::CoseKey::new();
65//!     key.kty(keys::EC2);
66//!     key.alg(algs::ES256);
67//!     key.crv(keys::P_256);
68//!     key.x(hex::decode("bac5b11cad8f99f9c72b05cf4b9e26d244dc189f745228255a219a86d6a09eff").unwrap());
69//!     key.y(hex::decode("20138bf82dc1b6d562be0fa54ab7804a3a64b6d72ccfed6b6fb6ed28bbfc117e").unwrap());
70//!     key.key_ops(vec![keys::KEY_OPS_VERIFY]);
71//!     
72//!     // Generate CoseSign struct with the cose-sign1 message to decode
73//!     let mut verify = CoseMessage::new_sign();
74//!     verify.bytes =
75//!     hex::decode("d28447a2012604423131a054546869732069732074686520636f6e74656e742e5840dc93ddf7d5aff58131589087eaa65eeffa0baf2e72201ee91c0ca876ec42fdfb2a67dbc6ea1a95d2257cec645cf789808c0a392af045e2bc1bdb6746d80f221b").unwrap();
76//!
77//!     // Initial decoding
78//!     verify.init_decoder(None).unwrap();
79//!
80//!     // Add key and verify the signature
81//!     verify.key(&key).unwrap();
82//!     verify.decode(None, None).unwrap();
83//! }
84//! ```
85//!
86//! ## cose-encrypt0
87//!
88//! ### Encode cose-encrypt0 message
89//! ```
90//! use cose::message::CoseMessage;
91//! use cose::keys;
92//! use cose::algs;
93//! use hex;
94//!
95//! fn main() {
96//!     let msg = b"This is the content.".to_vec();
97//!     let kid = b"secret".to_vec();
98//!
99//!     // Prepare the cose-key
100//!     let mut key = keys::CoseKey::new();
101//!     key.kty(keys::SYMMETRIC);
102//!     key.alg(algs::CHACHA20);
103//!     key.k(hex::decode("849b57219dae48de646d07dbb533566e976686457c1491be3a76dcea6c427188").unwrap());
104//!     key.key_ops(vec![keys::KEY_OPS_ENCRYPT]);
105//!
106//!     // Prepare cose-encrypt0 message
107//!     let mut enc0 = CoseMessage::new_encrypt();
108//!     enc0.header.alg(algs::CHACHA20, true, false);
109//!     enc0.header.iv(hex::decode("89f52f65a1c580933b5261a7").unwrap(), true, false);
110//!     enc0.payload(msg);
111//!     enc0.key(&key).unwrap();
112//!
113//!     // Generate the ciphertext with no AAD.
114//!     enc0.secure_content(None).unwrap();
115//!     // Encode the cose-encrypt0 message with the ciphertext included
116//!     enc0.encode(true).unwrap();
117//! }
118//!
119//! ```
120//!
121//! ### Decode cose-encrypt0 message
122//! ```
123//! use cose::message::CoseMessage;
124//! use cose::keys;
125//! use cose::algs;
126//! use hex;
127//!
128//! fn main() {
129//!     let expected_msg = b"This is the content.".to_vec();
130//!
131//!     // Prepare the cose-key
132//!     let mut key = keys::CoseKey::new();
133//!     key.kty(keys::SYMMETRIC);
134//!     key.alg(algs::CHACHA20);
135//!     key.k(hex::decode("849b57219dae48de646d07dbb533566e976686457c1491be3a76dcea6c427188").unwrap());
136//!     key.key_ops(vec![keys::KEY_OPS_DECRYPT]);
137//!
138//!
139//!     // Generate CoseEncrypt struct with the cose-encryt0 message to decode
140//!     let mut dec0 = CoseMessage::new_encrypt();
141//!     dec0.bytes =
142//!     hex::decode("d08352a2011818054c89f52f65a1c580933b5261a7a0582481c32c048134989007b3b5b932811ea410eeab15bd0de5d5ac5be03c84dce8c88871d6e9").unwrap();
143//!
144//!     // Initial decoding of the message
145//!     dec0.init_decoder(None).unwrap();
146//!
147//!     // Add cose-key
148//!     dec0.key(&key).unwrap();
149//!
150//!     // Decrypt the cose-encrypt0 message
151//!     let msg = dec0.decode(None, None).unwrap();
152//!     assert_eq!(msg, expected_msg);
153//! }
154//!
155//! ```
156//! ## cose-mac0
157//!
158//! ### Encode cose-mac0 message
159//! ```
160//! use cose::message::CoseMessage;
161//! use cose::keys;
162//! use cose::algs;
163//! use hex;
164//!
165//! fn main() {
166//!     let msg = b"This is the content.".to_vec();
167//!
168//!     // Prepare the cose-key
169//!     let mut key = keys::CoseKey::new();
170//!     key.kty(keys::SYMMETRIC);
171//!     key.alg(algs::AES_MAC_256_128);
172//!     key.k(hex::decode("849b57219dae48de646d07dbb533566e976686457c1491be3a76dcea6c427188").unwrap());
173//!     key.key_ops(vec![keys::KEY_OPS_MAC]);
174//!
175//!     // Prepare the cose-mac0 message
176//!     let mut mac0 = CoseMessage::new_mac();
177//!     mac0.header.alg(algs::AES_MAC_256_128, true, false);
178//!
179//!     // Add the payload
180//!     mac0.payload(msg);
181//!      
182//!     // Add cose-key
183//!     mac0.key(&key).unwrap();
184//!
185//!     // Generate MAC tag without AAD
186//!     mac0.secure_content(None).unwrap();
187//!     // Encode the cose-mac0 message with the payload included
188//!     mac0.encode(true).unwrap();
189//!
190//! }
191//! ```
192//!
193//! ### Decode cose-mac0 message
194//! ```
195//! use cose::message::CoseMessage;
196//! use cose::keys;
197//! use cose::algs;
198//! use hex;
199//!
200//! fn main() {
201//!     // Prepare the cose-key
202//!     let mut key = keys::CoseKey::new();
203//!     key.kty(keys::SYMMETRIC);
204//!     key.alg(algs::AES_MAC_256_128);
205//!     key.k(hex::decode("849b57219dae48de646d07dbb533566e976686457c1491be3a76dcea6c427188").unwrap());
206//!     key.key_ops(vec![keys::KEY_OPS_MAC_VERIFY]);
207//!
208//!     // Generate CoseMAC struct with the cose-mac0 message to decode
209//!     let mut verify = CoseMessage::new_mac();
210//!     verify.bytes =
211//!     hex::decode("d18444a101181aa054546869732069732074686520636f6e74656e742e50403152cc208c1d501e1dc2a789ae49e4").unwrap();
212//!
213//!     // Initial decoding of the message
214//!     verify.init_decoder(None).unwrap();
215//!
216//!     // Add cose-key
217//!     verify.key(&key).unwrap();
218//!     // Verify the MAC tag of the cose-mac0 message
219//!     verify.decode(None, None).unwrap();
220//! }
221//! ```
222
223pub 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}