xref: /aosp_15_r20/system/keymint/ta/src/tests.rs (revision 9860b7637a5f185913c70aa0caabe3ecb78441e4)
1*9860b763SAndroid Build Coastguard Worker // Copyright 2022, The Android Open Source Project
2*9860b763SAndroid Build Coastguard Worker //
3*9860b763SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*9860b763SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*9860b763SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*9860b763SAndroid Build Coastguard Worker //
7*9860b763SAndroid Build Coastguard Worker //     http://www.apache.org/licenses/LICENSE-2.0
8*9860b763SAndroid Build Coastguard Worker //
9*9860b763SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*9860b763SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*9860b763SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9860b763SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*9860b763SAndroid Build Coastguard Worker // limitations under the License.
14*9860b763SAndroid Build Coastguard Worker 
15*9860b763SAndroid Build Coastguard Worker //! Tests
16*9860b763SAndroid Build Coastguard Worker 
17*9860b763SAndroid Build Coastguard Worker use crate::{error_rsp, invalid_cbor_rsp_data, keys::SecureKeyWrapper, split_rsp};
18*9860b763SAndroid Build Coastguard Worker use alloc::{vec, vec::Vec};
19*9860b763SAndroid Build Coastguard Worker use der::{Decode, Encode};
20*9860b763SAndroid Build Coastguard Worker use kmr_common::Error;
21*9860b763SAndroid Build Coastguard Worker use kmr_wire::{
22*9860b763SAndroid Build Coastguard Worker     keymint::{
23*9860b763SAndroid Build Coastguard Worker         ErrorCode, KeyFormat, KeyParam, KeyPurpose, NEXT_MESSAGE_SIGNAL_FALSE,
24*9860b763SAndroid Build Coastguard Worker         NEXT_MESSAGE_SIGNAL_TRUE,
25*9860b763SAndroid Build Coastguard Worker     },
26*9860b763SAndroid Build Coastguard Worker     AsCborValue,
27*9860b763SAndroid Build Coastguard Worker };
28*9860b763SAndroid Build Coastguard Worker 
29*9860b763SAndroid Build Coastguard Worker #[test]
test_invalid_data()30*9860b763SAndroid Build Coastguard Worker fn test_invalid_data() {
31*9860b763SAndroid Build Coastguard Worker     // Cross-check that the hand-encoded invalid CBOR data matches an auto-encoded equivalent.
32*9860b763SAndroid Build Coastguard Worker     let rsp = error_rsp(ErrorCode::UnknownError as i32);
33*9860b763SAndroid Build Coastguard Worker     let rsp_data = rsp.into_vec().unwrap();
34*9860b763SAndroid Build Coastguard Worker     assert_eq!(rsp_data, invalid_cbor_rsp_data());
35*9860b763SAndroid Build Coastguard Worker }
36*9860b763SAndroid Build Coastguard Worker 
37*9860b763SAndroid Build Coastguard Worker #[test]
test_secure_key_wrapper()38*9860b763SAndroid Build Coastguard Worker fn test_secure_key_wrapper() {
39*9860b763SAndroid Build Coastguard Worker     let encoded_str = concat!(
40*9860b763SAndroid Build Coastguard Worker         "30820179", // SEQUENCE length 0x179 (SecureKeyWrapper) {
41*9860b763SAndroid Build Coastguard Worker         "020100",   // INTEGER length 1 value 0x00 (version)
42*9860b763SAndroid Build Coastguard Worker         "04820100", // OCTET STRING length 0x100 (encryptedTransportKey)
43*9860b763SAndroid Build Coastguard Worker         "aad93ed5924f283b4bb5526fbe7a1412",
44*9860b763SAndroid Build Coastguard Worker         "f9d9749ec30db9062b29e574a8546f33",
45*9860b763SAndroid Build Coastguard Worker         "c88732452f5b8e6a391ee76c39ed1712",
46*9860b763SAndroid Build Coastguard Worker         "c61d8df6213dec1cffbc17a8c6d04c7b",
47*9860b763SAndroid Build Coastguard Worker         "30893d8daa9b2015213e219468215532",
48*9860b763SAndroid Build Coastguard Worker         "07f8f9931c4caba23ed3bee28b36947e",
49*9860b763SAndroid Build Coastguard Worker         "47f10e0a5c3dc51c988a628daad3e5e1",
50*9860b763SAndroid Build Coastguard Worker         "f4005e79c2d5a96c284b4b8d7e4948f3",
51*9860b763SAndroid Build Coastguard Worker         "31e5b85dd5a236f85579f3ea1d1b8484",
52*9860b763SAndroid Build Coastguard Worker         "87470bdb0ab4f81a12bee42c99fe0df4",
53*9860b763SAndroid Build Coastguard Worker         "bee3759453e69ad1d68a809ce06b949f",
54*9860b763SAndroid Build Coastguard Worker         "7694a990429b2fe81e066ff43e56a216",
55*9860b763SAndroid Build Coastguard Worker         "02db70757922a4bcc23ab89f1e35da77",
56*9860b763SAndroid Build Coastguard Worker         "586775f423e519c2ea394caf48a28d0c",
57*9860b763SAndroid Build Coastguard Worker         "8020f1dcf6b3a68ec246f615ae96dae9",
58*9860b763SAndroid Build Coastguard Worker         "a079b1f6eb959033c1af5c125fd94168",
59*9860b763SAndroid Build Coastguard Worker         "040c", // OCTET STRING length 0x0c (initializationVector)
60*9860b763SAndroid Build Coastguard Worker         "6d9721d08589581ab49204a3",
61*9860b763SAndroid Build Coastguard Worker         "302e",   // SEQUENCE length 0x2e (KeyDescription) {
62*9860b763SAndroid Build Coastguard Worker         "020103", // INTEGER length 1 value 0x03 (keyFormat = RAW)
63*9860b763SAndroid Build Coastguard Worker         "3029",   // SEQUENCE length 0x29 (AuthorizationList) {
64*9860b763SAndroid Build Coastguard Worker         "a108",   // [1] context-specific constructed tag=1 length 0x08 { (purpose)
65*9860b763SAndroid Build Coastguard Worker         "3106",   // SET length 0x06
66*9860b763SAndroid Build Coastguard Worker         "020100", // INTEGER length 1 value 0x00 (Encrypt)
67*9860b763SAndroid Build Coastguard Worker         "020101", // INTEGER length 1 value 0x01 (Decrypt)
68*9860b763SAndroid Build Coastguard Worker         // } end SET
69*9860b763SAndroid Build Coastguard Worker         // } end [1]
70*9860b763SAndroid Build Coastguard Worker         "a203",   // [2] context-specific constructed tag=2 length 0x02 { (algorithm)
71*9860b763SAndroid Build Coastguard Worker         "020120", // INTEGER length 1 value 0x20 (AES)
72*9860b763SAndroid Build Coastguard Worker         // } end [2]
73*9860b763SAndroid Build Coastguard Worker         "a304",     // [3] context-specific constructed tag=3 length 0x04 { (keySize)
74*9860b763SAndroid Build Coastguard Worker         "02020100", // INTEGER length 2 value 0x100
75*9860b763SAndroid Build Coastguard Worker         // } end [3]
76*9860b763SAndroid Build Coastguard Worker         "a405",   // [4] context-specific constructed tag=4 length 0x05 { (blockMode
77*9860b763SAndroid Build Coastguard Worker         "3103",   // SET length 0x03 {
78*9860b763SAndroid Build Coastguard Worker         "020101", // INTEGER length 1 value 0x01 (ECB)
79*9860b763SAndroid Build Coastguard Worker         // } end SET
80*9860b763SAndroid Build Coastguard Worker         // } end [4]
81*9860b763SAndroid Build Coastguard Worker         "a605",   // [6] context-specific constructed tag=6 length 0x05 { (padding)
82*9860b763SAndroid Build Coastguard Worker         "3103",   // SET length 0x03 {
83*9860b763SAndroid Build Coastguard Worker         "020140", // INTEGER length 1 value 0x40 (PKCS7)
84*9860b763SAndroid Build Coastguard Worker         // } end SET
85*9860b763SAndroid Build Coastguard Worker         // } end [5]
86*9860b763SAndroid Build Coastguard Worker         "bf837702", // [503] context-specific constructed tag=503=0x1F7 length 0x02 {
87*9860b763SAndroid Build Coastguard Worker         // (noAuthRequired)
88*9860b763SAndroid Build Coastguard Worker         "0500", // NULL
89*9860b763SAndroid Build Coastguard Worker         // } end [503]
90*9860b763SAndroid Build Coastguard Worker         // } end SEQUENCE (AuthorizationList)
91*9860b763SAndroid Build Coastguard Worker         // } end SEQUENCE (KeyDescription)
92*9860b763SAndroid Build Coastguard Worker         "0420", // OCTET STRING length 0x20 (encryptedKey)
93*9860b763SAndroid Build Coastguard Worker         "a61c6e247e25b3e6e69aa78eb03c2d4a",
94*9860b763SAndroid Build Coastguard Worker         "c20d1f99a9a024a76f35c8e2cab9b68d",
95*9860b763SAndroid Build Coastguard Worker         "0410", // OCTET STRING length 0x10 (tag)
96*9860b763SAndroid Build Coastguard Worker         "2560c70109ae67c030f00b98b512a670",
97*9860b763SAndroid Build Coastguard Worker         // } SEQUENCE (SecureKeyWrapper)
98*9860b763SAndroid Build Coastguard Worker     );
99*9860b763SAndroid Build Coastguard Worker     let encoded_bytes = hex::decode(encoded_str).unwrap();
100*9860b763SAndroid Build Coastguard Worker     let secure_key_wrapper = SecureKeyWrapper::from_der(&encoded_bytes).unwrap();
101*9860b763SAndroid Build Coastguard Worker     assert_eq!(secure_key_wrapper.version, 0);
102*9860b763SAndroid Build Coastguard Worker     let key_format: KeyFormat = secure_key_wrapper.key_description.key_format.try_into().unwrap();
103*9860b763SAndroid Build Coastguard Worker     assert_eq!(KeyFormat::Raw, key_format);
104*9860b763SAndroid Build Coastguard Worker     let authz = secure_key_wrapper.key_description.key_params.auths;
105*9860b763SAndroid Build Coastguard Worker     let purpose_values: Vec<KeyPurpose> = authz
106*9860b763SAndroid Build Coastguard Worker         .iter()
107*9860b763SAndroid Build Coastguard Worker         .filter_map(|param| if let KeyParam::Purpose(v) = param { Some(*v) } else { None })
108*9860b763SAndroid Build Coastguard Worker         .collect();
109*9860b763SAndroid Build Coastguard Worker     assert_eq!(purpose_values.len(), 2);
110*9860b763SAndroid Build Coastguard Worker     assert!(purpose_values.contains(&KeyPurpose::Encrypt));
111*9860b763SAndroid Build Coastguard Worker     assert!(purpose_values.contains(&KeyPurpose::Decrypt));
112*9860b763SAndroid Build Coastguard Worker }
113*9860b763SAndroid Build Coastguard Worker 
114*9860b763SAndroid Build Coastguard Worker #[test]
test_key_description_encode_decode()115*9860b763SAndroid Build Coastguard Worker fn test_key_description_encode_decode() {
116*9860b763SAndroid Build Coastguard Worker     let encoded_secure_key_wrapper = concat!(
117*9860b763SAndroid Build Coastguard Worker         "30820179", // SEQUENCE length 0x179 (SecureKeyWrapper) {
118*9860b763SAndroid Build Coastguard Worker         "020100",   // INTEGER length 1 value 0x00 (version)
119*9860b763SAndroid Build Coastguard Worker         "04820100", // OCTET STRING length 0x100 (encryptedTransportKey)
120*9860b763SAndroid Build Coastguard Worker         "aad93ed5924f283b4bb5526fbe7a1412",
121*9860b763SAndroid Build Coastguard Worker         "f9d9749ec30db9062b29e574a8546f33",
122*9860b763SAndroid Build Coastguard Worker         "c88732452f5b8e6a391ee76c39ed1712",
123*9860b763SAndroid Build Coastguard Worker         "c61d8df6213dec1cffbc17a8c6d04c7b",
124*9860b763SAndroid Build Coastguard Worker         "30893d8daa9b2015213e219468215532",
125*9860b763SAndroid Build Coastguard Worker         "07f8f9931c4caba23ed3bee28b36947e",
126*9860b763SAndroid Build Coastguard Worker         "47f10e0a5c3dc51c988a628daad3e5e1",
127*9860b763SAndroid Build Coastguard Worker         "f4005e79c2d5a96c284b4b8d7e4948f3",
128*9860b763SAndroid Build Coastguard Worker         "31e5b85dd5a236f85579f3ea1d1b8484",
129*9860b763SAndroid Build Coastguard Worker         "87470bdb0ab4f81a12bee42c99fe0df4",
130*9860b763SAndroid Build Coastguard Worker         "bee3759453e69ad1d68a809ce06b949f",
131*9860b763SAndroid Build Coastguard Worker         "7694a990429b2fe81e066ff43e56a216",
132*9860b763SAndroid Build Coastguard Worker         "02db70757922a4bcc23ab89f1e35da77",
133*9860b763SAndroid Build Coastguard Worker         "586775f423e519c2ea394caf48a28d0c",
134*9860b763SAndroid Build Coastguard Worker         "8020f1dcf6b3a68ec246f615ae96dae9",
135*9860b763SAndroid Build Coastguard Worker         "a079b1f6eb959033c1af5c125fd94168",
136*9860b763SAndroid Build Coastguard Worker         "040c", // OCTET STRING length 0x0c (initializationVector)
137*9860b763SAndroid Build Coastguard Worker         "6d9721d08589581ab49204a3",
138*9860b763SAndroid Build Coastguard Worker         "302e",   // SEQUENCE length 0x2e (KeyDescription) {
139*9860b763SAndroid Build Coastguard Worker         "020103", // INTEGER length 1 value 0x03 (keyFormat = RAW)
140*9860b763SAndroid Build Coastguard Worker         "3029",   // SEQUENCE length 0x29 (AuthorizationList) {
141*9860b763SAndroid Build Coastguard Worker         "a108",   // [1] context-specific constructed tag=1 length 0x08 { (purpose)
142*9860b763SAndroid Build Coastguard Worker         "3106",   // SET length 0x06
143*9860b763SAndroid Build Coastguard Worker         "020100", // INTEGER length 1 value 0x00 (Encrypt)
144*9860b763SAndroid Build Coastguard Worker         "020101", // INTEGER length 1 value 0x01 (Decrypt)
145*9860b763SAndroid Build Coastguard Worker         // } end SET
146*9860b763SAndroid Build Coastguard Worker         // } end [1]
147*9860b763SAndroid Build Coastguard Worker         "a203",   // [2] context-specific constructed tag=2 length 0x02 { (algorithm)
148*9860b763SAndroid Build Coastguard Worker         "020120", // INTEGER length 1 value 0x20 (AES)
149*9860b763SAndroid Build Coastguard Worker         // } end [2]
150*9860b763SAndroid Build Coastguard Worker         "a304",     // [3] context-specific constructed tag=3 length 0x04 { (keySize)
151*9860b763SAndroid Build Coastguard Worker         "02020100", // INTEGER length 2 value 0x100
152*9860b763SAndroid Build Coastguard Worker         // } end [3]
153*9860b763SAndroid Build Coastguard Worker         "a405",   // [4] context-specific constructed tag=4 length 0x05 { (blockMode
154*9860b763SAndroid Build Coastguard Worker         "3103",   // SET length 0x03 {
155*9860b763SAndroid Build Coastguard Worker         "020101", // INTEGER length 1 value 0x01 (ECB)
156*9860b763SAndroid Build Coastguard Worker         // } end SET
157*9860b763SAndroid Build Coastguard Worker         // } end [4]
158*9860b763SAndroid Build Coastguard Worker         "a605",   // [6] context-specific constructed tag=6 length 0x05 { (padding)
159*9860b763SAndroid Build Coastguard Worker         "3103",   // SET length 0x03 {
160*9860b763SAndroid Build Coastguard Worker         "020140", // INTEGER length 1 value 0x40 (PKCS7)
161*9860b763SAndroid Build Coastguard Worker         // } end SET
162*9860b763SAndroid Build Coastguard Worker         // } end [5]
163*9860b763SAndroid Build Coastguard Worker         "bf837702", // [503] context-specific constructed tag=503=0x1F7 length 0x02 {
164*9860b763SAndroid Build Coastguard Worker         // (noAuthRequired)
165*9860b763SAndroid Build Coastguard Worker         "0500", // NULL
166*9860b763SAndroid Build Coastguard Worker         // } end [503]
167*9860b763SAndroid Build Coastguard Worker         // } end SEQUENCE (AuthorizationList)
168*9860b763SAndroid Build Coastguard Worker         // } end SEQUENCE (KeyDescription)
169*9860b763SAndroid Build Coastguard Worker         "0420", // OCTET STRING length 0x20 (encryptedKey)
170*9860b763SAndroid Build Coastguard Worker         "a61c6e247e25b3e6e69aa78eb03c2d4a",
171*9860b763SAndroid Build Coastguard Worker         "c20d1f99a9a024a76f35c8e2cab9b68d",
172*9860b763SAndroid Build Coastguard Worker         "0410", // OCTET STRING length 0x10 (tag)
173*9860b763SAndroid Build Coastguard Worker         "2560c70109ae67c030f00b98b512a670",
174*9860b763SAndroid Build Coastguard Worker         // } SEQUENCE (SecureKeyWrapper)
175*9860b763SAndroid Build Coastguard Worker     );
176*9860b763SAndroid Build Coastguard Worker     let encoded_key_description_want = concat!(
177*9860b763SAndroid Build Coastguard Worker         "302e",   // SEQUENCE length 0x2e (KeyDescription) {
178*9860b763SAndroid Build Coastguard Worker         "020103", // INTEGER length 1 value 0x03 (keyFormat = RAW)
179*9860b763SAndroid Build Coastguard Worker         "3029",   // SEQUENCE length 0x29 (AuthorizationList) {
180*9860b763SAndroid Build Coastguard Worker         "a108",   // [1] context-specific constructed tag=1 length 0x08 { (purpose)
181*9860b763SAndroid Build Coastguard Worker         "3106",   // SET length 0x06
182*9860b763SAndroid Build Coastguard Worker         "020100", // INTEGER length 1 value 0x00 (Encrypt)
183*9860b763SAndroid Build Coastguard Worker         "020101", // INTEGER length 1 value 0x01 (Decrypt)
184*9860b763SAndroid Build Coastguard Worker         // } end SET
185*9860b763SAndroid Build Coastguard Worker         // } end [1]
186*9860b763SAndroid Build Coastguard Worker         "a203",   // [2] context-specific constructed tag=2 length 0x02 { (algorithm)
187*9860b763SAndroid Build Coastguard Worker         "020120", // INTEGER length 1 value 0x20 (AES)
188*9860b763SAndroid Build Coastguard Worker         // } end [2]
189*9860b763SAndroid Build Coastguard Worker         "a304",     // [3] context-specific constructed tag=3 length 0x04 { (keySize)
190*9860b763SAndroid Build Coastguard Worker         "02020100", // INTEGER length 2 value 0x100
191*9860b763SAndroid Build Coastguard Worker         // } end [3]
192*9860b763SAndroid Build Coastguard Worker         "a405",   // [4] context-specific constructed tag=4 length 0x05 { (blockMode
193*9860b763SAndroid Build Coastguard Worker         "3103",   // SET length 0x03 {
194*9860b763SAndroid Build Coastguard Worker         "020101", // INTEGER length 1 value 0x01 (ECB)
195*9860b763SAndroid Build Coastguard Worker         // } end SET
196*9860b763SAndroid Build Coastguard Worker         // } end [4]
197*9860b763SAndroid Build Coastguard Worker         "a605",   // [6] context-specific constructed tag=6 length 0x05 { (padding)
198*9860b763SAndroid Build Coastguard Worker         "3103",   // SET length 0x03 {
199*9860b763SAndroid Build Coastguard Worker         "020140", // INTEGER length 1 value 0x40 (PKCS7)
200*9860b763SAndroid Build Coastguard Worker         // } end SET
201*9860b763SAndroid Build Coastguard Worker         // } end [5]
202*9860b763SAndroid Build Coastguard Worker         "bf837702", // [503] context-specific constructed tag=503=0x1F7 length 0x02 {
203*9860b763SAndroid Build Coastguard Worker         // (noAuthRequired)
204*9860b763SAndroid Build Coastguard Worker         "0500", // NULL
205*9860b763SAndroid Build Coastguard Worker                 // } end [503]
206*9860b763SAndroid Build Coastguard Worker                 // } end SEQUENCE (AuthorizationList)
207*9860b763SAndroid Build Coastguard Worker                 // } end SEQUENCE (KeyDescription)
208*9860b763SAndroid Build Coastguard Worker     );
209*9860b763SAndroid Build Coastguard Worker     let encoded_bytes = hex::decode(encoded_secure_key_wrapper).unwrap();
210*9860b763SAndroid Build Coastguard Worker     let secure_key_wrapper = SecureKeyWrapper::from_der(&encoded_bytes).unwrap();
211*9860b763SAndroid Build Coastguard Worker     let key_description = secure_key_wrapper.key_description;
212*9860b763SAndroid Build Coastguard Worker     let encoded_key_description_got = key_description.to_der().unwrap();
213*9860b763SAndroid Build Coastguard Worker     assert_eq!(hex::encode(encoded_key_description_got), encoded_key_description_want);
214*9860b763SAndroid Build Coastguard Worker }
215*9860b763SAndroid Build Coastguard Worker 
216*9860b763SAndroid Build Coastguard Worker #[test]
test_split_rsp_invalid_input()217*9860b763SAndroid Build Coastguard Worker fn test_split_rsp_invalid_input() {
218*9860b763SAndroid Build Coastguard Worker     // Check for invalid inputs
219*9860b763SAndroid Build Coastguard Worker     let rsp = vec![];
220*9860b763SAndroid Build Coastguard Worker     let result = split_rsp(&rsp, 5);
221*9860b763SAndroid Build Coastguard Worker     assert!(result.is_err());
222*9860b763SAndroid Build Coastguard Worker     assert!(matches!(result, Err(Error::Hal(ErrorCode::InvalidArgument, _))));
223*9860b763SAndroid Build Coastguard Worker 
224*9860b763SAndroid Build Coastguard Worker     let rsp = vec![0x82, 0x21, 0x80];
225*9860b763SAndroid Build Coastguard Worker     let result = split_rsp(&rsp, 1);
226*9860b763SAndroid Build Coastguard Worker     assert!(matches!(result, Err(Error::Hal(ErrorCode::InvalidArgument, _))));
227*9860b763SAndroid Build Coastguard Worker }
228*9860b763SAndroid Build Coastguard Worker 
229*9860b763SAndroid Build Coastguard Worker #[test]
test_split_rsp_smaller_input()230*9860b763SAndroid Build Coastguard Worker fn test_split_rsp_smaller_input() {
231*9860b763SAndroid Build Coastguard Worker     // Test for rsp_data size < max_size
232*9860b763SAndroid Build Coastguard Worker     let rsp = vec![0x82, 0x13, 0x82, 0x80, 0x80];
233*9860b763SAndroid Build Coastguard Worker     let result = split_rsp(&rsp, 20).expect("result should not be error");
234*9860b763SAndroid Build Coastguard Worker     assert_eq!(result.len(), 1);
235*9860b763SAndroid Build Coastguard Worker     let inner_msg = result.first().expect("single message is expected").as_slice();
236*9860b763SAndroid Build Coastguard Worker     assert_eq!(inner_msg.len(), 6);
237*9860b763SAndroid Build Coastguard Worker     let marker = inner_msg[0];
238*9860b763SAndroid Build Coastguard Worker     assert_eq!(marker, NEXT_MESSAGE_SIGNAL_FALSE);
239*9860b763SAndroid Build Coastguard Worker     let msg = &inner_msg[1..];
240*9860b763SAndroid Build Coastguard Worker     assert_eq!(msg, rsp);
241*9860b763SAndroid Build Coastguard Worker }
242*9860b763SAndroid Build Coastguard Worker 
243*9860b763SAndroid Build Coastguard Worker #[test]
test_split_rsp_allowed_size_input()244*9860b763SAndroid Build Coastguard Worker fn test_split_rsp_allowed_size_input() {
245*9860b763SAndroid Build Coastguard Worker     // Test for rsp_data size = allowed message length
246*9860b763SAndroid Build Coastguard Worker     let rsp = vec![0x82, 0x13, 0x82, 0x80, 0x80];
247*9860b763SAndroid Build Coastguard Worker     let result = split_rsp(&rsp, 6).expect("result should not be error");
248*9860b763SAndroid Build Coastguard Worker     assert_eq!(result.len(), 1);
249*9860b763SAndroid Build Coastguard Worker     let inner_msg = result.first().expect("single message is expected").as_slice();
250*9860b763SAndroid Build Coastguard Worker     assert_eq!(inner_msg.len(), 6);
251*9860b763SAndroid Build Coastguard Worker     let marker = inner_msg[0];
252*9860b763SAndroid Build Coastguard Worker     assert_eq!(marker, NEXT_MESSAGE_SIGNAL_FALSE);
253*9860b763SAndroid Build Coastguard Worker     let msg = &inner_msg[1..];
254*9860b763SAndroid Build Coastguard Worker     assert_eq!(msg, rsp);
255*9860b763SAndroid Build Coastguard Worker }
256*9860b763SAndroid Build Coastguard Worker 
257*9860b763SAndroid Build Coastguard Worker #[test]
test_split_rsp_max_size_input()258*9860b763SAndroid Build Coastguard Worker fn test_split_rsp_max_size_input() {
259*9860b763SAndroid Build Coastguard Worker     // Test for rsp_data size = max_size
260*9860b763SAndroid Build Coastguard Worker     let rsp = vec![0x82, 0x13, 0x82, 0x80, 0x80, 0x82];
261*9860b763SAndroid Build Coastguard Worker     let result = split_rsp(&rsp, 6).expect("result should not be error");
262*9860b763SAndroid Build Coastguard Worker     assert_eq!(result.len(), 2);
263*9860b763SAndroid Build Coastguard Worker 
264*9860b763SAndroid Build Coastguard Worker     let inner_msg1 = result.first().expect("a message is expected at index 0").as_slice();
265*9860b763SAndroid Build Coastguard Worker     assert_eq!(inner_msg1.len(), 6);
266*9860b763SAndroid Build Coastguard Worker     let marker1 = inner_msg1[0];
267*9860b763SAndroid Build Coastguard Worker     assert_eq!(marker1, NEXT_MESSAGE_SIGNAL_TRUE);
268*9860b763SAndroid Build Coastguard Worker     assert_eq!(&inner_msg1[1..], &rsp[..5]);
269*9860b763SAndroid Build Coastguard Worker 
270*9860b763SAndroid Build Coastguard Worker     let inner_msg2 = result.get(1).expect("a message is expected at index 1").as_slice();
271*9860b763SAndroid Build Coastguard Worker     assert_eq!(inner_msg2.len(), 2);
272*9860b763SAndroid Build Coastguard Worker     let marker2 = inner_msg2[0];
273*9860b763SAndroid Build Coastguard Worker     assert_eq!(marker2, NEXT_MESSAGE_SIGNAL_FALSE);
274*9860b763SAndroid Build Coastguard Worker     assert_eq!(&inner_msg2[1..], &rsp[5..]);
275*9860b763SAndroid Build Coastguard Worker }
276*9860b763SAndroid Build Coastguard Worker 
277*9860b763SAndroid Build Coastguard Worker #[test]
test_split_rsp_larger_input_perfect_split()278*9860b763SAndroid Build Coastguard Worker fn test_split_rsp_larger_input_perfect_split() {
279*9860b763SAndroid Build Coastguard Worker     // Test for rsp_data size > max_size and it is a perfect split
280*9860b763SAndroid Build Coastguard Worker     let rsp1 = vec![0x82, 0x13, 0x82, 0x80, 0x80];
281*9860b763SAndroid Build Coastguard Worker     let rsp2 = vec![0x82, 0x14, 0x82, 0x80, 0x80];
282*9860b763SAndroid Build Coastguard Worker     let rsp3 = vec![0x82, 0x15, 0x82, 0x80, 0x80];
283*9860b763SAndroid Build Coastguard Worker     let mut rsp = vec![];
284*9860b763SAndroid Build Coastguard Worker     rsp.extend_from_slice(&rsp1);
285*9860b763SAndroid Build Coastguard Worker     rsp.extend_from_slice(&rsp2);
286*9860b763SAndroid Build Coastguard Worker     rsp.extend_from_slice(&rsp3);
287*9860b763SAndroid Build Coastguard Worker     let result = split_rsp(&rsp, 6).expect("result should not be error");
288*9860b763SAndroid Build Coastguard Worker     assert_eq!(result.len(), 3);
289*9860b763SAndroid Build Coastguard Worker 
290*9860b763SAndroid Build Coastguard Worker     let inner_msg1 = result.first().expect("a message is expected at index 0").as_slice();
291*9860b763SAndroid Build Coastguard Worker     assert_eq!(inner_msg1.len(), 6);
292*9860b763SAndroid Build Coastguard Worker     let marker1 = inner_msg1[0];
293*9860b763SAndroid Build Coastguard Worker     assert_eq!(marker1, NEXT_MESSAGE_SIGNAL_TRUE);
294*9860b763SAndroid Build Coastguard Worker     let msg1 = &inner_msg1[1..];
295*9860b763SAndroid Build Coastguard Worker     assert_eq!(msg1, rsp1);
296*9860b763SAndroid Build Coastguard Worker 
297*9860b763SAndroid Build Coastguard Worker     let inner_msg2 = result.get(1).expect("a message is expected at index 1").as_slice();
298*9860b763SAndroid Build Coastguard Worker     assert_eq!(inner_msg2.len(), 6);
299*9860b763SAndroid Build Coastguard Worker     let marker2 = inner_msg2[0];
300*9860b763SAndroid Build Coastguard Worker     assert_eq!(marker2, NEXT_MESSAGE_SIGNAL_TRUE);
301*9860b763SAndroid Build Coastguard Worker     let msg2 = &inner_msg2[1..];
302*9860b763SAndroid Build Coastguard Worker     assert_eq!(msg2, rsp2);
303*9860b763SAndroid Build Coastguard Worker 
304*9860b763SAndroid Build Coastguard Worker     let inner_msg3 = result.get(2).expect("a message is expected at index 2").as_slice();
305*9860b763SAndroid Build Coastguard Worker     assert_eq!(inner_msg3.len(), 6);
306*9860b763SAndroid Build Coastguard Worker     let marker3 = inner_msg3[0];
307*9860b763SAndroid Build Coastguard Worker     assert_eq!(marker3, NEXT_MESSAGE_SIGNAL_FALSE);
308*9860b763SAndroid Build Coastguard Worker     let msg3 = &inner_msg3[1..];
309*9860b763SAndroid Build Coastguard Worker     assert_eq!(msg3, rsp3);
310*9860b763SAndroid Build Coastguard Worker }
311*9860b763SAndroid Build Coastguard Worker 
312*9860b763SAndroid Build Coastguard Worker #[test]
test_split_rsp_larger_input_imperfect_split()313*9860b763SAndroid Build Coastguard Worker fn test_split_rsp_larger_input_imperfect_split() {
314*9860b763SAndroid Build Coastguard Worker     // Test for rsp_data size > max_size and it is not a perfect split
315*9860b763SAndroid Build Coastguard Worker     let rsp1 = vec![0x82, 0x00, 0x81, 0x82, 0x13];
316*9860b763SAndroid Build Coastguard Worker     let rsp2 = vec![0x81, 0x83, 0x41, 0x01, 0x80];
317*9860b763SAndroid Build Coastguard Worker     let rsp3 = vec![0x80];
318*9860b763SAndroid Build Coastguard Worker     let mut rsp = vec![];
319*9860b763SAndroid Build Coastguard Worker     rsp.extend_from_slice(&rsp1);
320*9860b763SAndroid Build Coastguard Worker     rsp.extend_from_slice(&rsp2);
321*9860b763SAndroid Build Coastguard Worker     rsp.extend_from_slice(&rsp3);
322*9860b763SAndroid Build Coastguard Worker     let result = split_rsp(&rsp, 6).expect("result should not be error");
323*9860b763SAndroid Build Coastguard Worker     assert_eq!(result.len(), 3);
324*9860b763SAndroid Build Coastguard Worker 
325*9860b763SAndroid Build Coastguard Worker     let inner_msg1 = result.first().expect("a message is expected at index 0").as_slice();
326*9860b763SAndroid Build Coastguard Worker     assert_eq!(inner_msg1.len(), 6);
327*9860b763SAndroid Build Coastguard Worker     let marker1 = inner_msg1[0];
328*9860b763SAndroid Build Coastguard Worker     assert_eq!(marker1, NEXT_MESSAGE_SIGNAL_TRUE);
329*9860b763SAndroid Build Coastguard Worker     let msg1 = &inner_msg1[1..];
330*9860b763SAndroid Build Coastguard Worker     assert_eq!(msg1, rsp1);
331*9860b763SAndroid Build Coastguard Worker 
332*9860b763SAndroid Build Coastguard Worker     let inner_msg2 = result.get(1).expect("a message is expected at index 1").as_slice();
333*9860b763SAndroid Build Coastguard Worker     assert_eq!(inner_msg2.len(), 6);
334*9860b763SAndroid Build Coastguard Worker     let marker2 = inner_msg2[0];
335*9860b763SAndroid Build Coastguard Worker     assert_eq!(marker2, NEXT_MESSAGE_SIGNAL_TRUE);
336*9860b763SAndroid Build Coastguard Worker     let msg2 = &inner_msg2[1..];
337*9860b763SAndroid Build Coastguard Worker     assert_eq!(msg2, rsp2);
338*9860b763SAndroid Build Coastguard Worker 
339*9860b763SAndroid Build Coastguard Worker     let inner_msg3 = result.get(2).expect("a message is expected at index 2").as_slice();
340*9860b763SAndroid Build Coastguard Worker     assert_eq!(inner_msg3.len(), 2);
341*9860b763SAndroid Build Coastguard Worker     let marker3 = inner_msg3[0];
342*9860b763SAndroid Build Coastguard Worker     assert_eq!(marker3, NEXT_MESSAGE_SIGNAL_FALSE);
343*9860b763SAndroid Build Coastguard Worker     let msg3 = &inner_msg3[1..];
344*9860b763SAndroid Build Coastguard Worker     assert_eq!(msg3, rsp3);
345*9860b763SAndroid Build Coastguard Worker }
346