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