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        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}