1 /* 2 * Copyright 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.internal.telephony.uicc; 17 18 import static org.junit.Assert.assertEquals; 19 import static org.junit.Assert.assertFalse; 20 import static org.junit.Assert.assertNotNull; 21 import static org.junit.Assert.assertNull; 22 import static org.junit.Assert.assertTrue; 23 24 import android.test.suitebuilder.annotation.SmallTest; 25 26 import org.junit.Test; 27 28 import java.util.ArrayList; 29 import java.util.Arrays; 30 31 32 public class AnswerToResetTest { 33 34 @Test 35 @SmallTest 36 public void testAnswerToRestNullString() { 37 AnswerToReset atr = AnswerToReset.parseAtr(null); 38 assertNull(atr); 39 } 40 41 @Test 42 @SmallTest 43 public void testAnswerToRestOddLength() { 44 String str = "3B02145"; 45 AnswerToReset atr = AnswerToReset.parseAtr(str); 46 assertNull(atr); 47 } 48 49 @Test 50 @SmallTest 51 public void testAnswerToRestTooShortLength() { 52 String str = "3B"; 53 AnswerToReset atr = AnswerToReset.parseAtr(str); 54 assertNull(atr); 55 } 56 57 @Test 58 @SmallTest 59 public void testAnswerToRestNoInterfaceByteNoHistoricalByte() { 60 String str = "3B00"; 61 AnswerToReset atr = AnswerToReset.parseAtr(str); 62 assertNotNull(atr); 63 assertEquals(atr.getConventionByte(), (byte) 0x3B); 64 assertEquals(atr.getFormatByte(), (byte) 0x00); 65 assertTrue(atr.getInterfaceBytes().isEmpty()); 66 assertNull(atr.getHistoricalBytes()); 67 assertNull(atr.getCheckByte()); 68 } 69 70 @Test 71 @SmallTest 72 public void testAnswerToRestNoHistoricalByte() { 73 String str = "3F909580B1FE001F4297"; 74 AnswerToReset atr = AnswerToReset.parseAtr(str); 75 assertNotNull(atr); 76 assertEquals(atr.getConventionByte(), (byte) 0x3F); 77 assertEquals(atr.getFormatByte(), (byte) 0x90); 78 79 assertEquals(atr.getInterfaceBytes().size(), 4); 80 AnswerToReset.InterfaceByte expect_t1 = 81 new AnswerToReset.InterfaceByte((byte) 0x95, null, null, (byte) 0x80); 82 AnswerToReset.InterfaceByte expect_t2 = 83 new AnswerToReset.InterfaceByte(null, null, null, (byte) 0xB1); 84 AnswerToReset.InterfaceByte expect_t3 = 85 new AnswerToReset.InterfaceByte((byte) 0xFE, (byte) 0x00, null, (byte) 0x1F); 86 AnswerToReset.InterfaceByte expect_t4 = 87 new AnswerToReset.InterfaceByte((byte) 0x42, null, null, null); 88 ArrayList<AnswerToReset.InterfaceByte> expect = new ArrayList<>( 89 Arrays.asList(expect_t1, expect_t2, expect_t3, expect_t4) 90 ); 91 assertEquals(expect, atr.getInterfaceBytes()); 92 93 assertNull(atr.getHistoricalBytes()); 94 assertEquals(atr.getCheckByte(), Byte.valueOf((byte) 0x97)); 95 } 96 97 @Test 98 @SmallTest 99 public void testAnswerToRestNoInterfaceByte() { 100 String str = "3F078031A073BE211797"; 101 AnswerToReset atr = AnswerToReset.parseAtr(str); 102 assertNotNull(atr); 103 assertEquals(atr.getConventionByte(), (byte) 0x3F); 104 assertEquals(atr.getFormatByte(), (byte) 0x07); 105 assertTrue(atr.getInterfaceBytes().isEmpty()); 106 assertEquals(atr.getHistoricalBytes().getRawData().length, 7); 107 byte[] expect = new byte[]{ 108 (byte) 0x80, (byte) 0x31, (byte) 0xA0, (byte) 0x73, 109 (byte) 0xBE, (byte) 0x21, (byte) 0x17}; 110 assertTrue(Arrays.equals(atr.getHistoricalBytes().getRawData(), expect)); 111 assertEquals(atr.getCheckByte(), Byte.valueOf((byte) 0x97)); 112 } 113 114 @Test 115 @SmallTest 116 public void testAnswerToRestSuccess() { 117 String str = "3F979580B1FE001F428031A073BE211797"; 118 AnswerToReset atr = AnswerToReset.parseAtr(str); 119 assertNotNull(atr); 120 assertEquals(atr.getConventionByte(), (byte) 0x3F); 121 assertEquals(atr.getFormatByte(), (byte) 0x97); 122 123 assertEquals(atr.getInterfaceBytes().size(), 4); 124 AnswerToReset.InterfaceByte expect_t1 = 125 new AnswerToReset.InterfaceByte((byte) 0x95, null, null, (byte) 0x80); 126 AnswerToReset.InterfaceByte expect_t2 = 127 new AnswerToReset.InterfaceByte(null, null, null, (byte) 0xB1); 128 AnswerToReset.InterfaceByte expect_t3 = 129 new AnswerToReset.InterfaceByte((byte) 0xFE, (byte) 0x00, null, (byte) 0x1F); 130 AnswerToReset.InterfaceByte expect_t4 = 131 new AnswerToReset.InterfaceByte((byte) 0x42, null, null, null); 132 ArrayList<AnswerToReset.InterfaceByte> expect_ib = new ArrayList<>( 133 Arrays.asList(expect_t1, expect_t2, expect_t3, expect_t4) 134 ); 135 assertEquals(expect_ib, atr.getInterfaceBytes()); 136 assertEquals(atr.getHistoricalBytes().getRawData().length, 7); 137 byte[] expect_hb = new byte[]{ 138 (byte) 0x80, (byte) 0x31, (byte) 0xA0, (byte) 0x73, 139 (byte) 0xBE, (byte) 0x21, (byte) 0x17}; 140 assertTrue(Arrays.equals(atr.getHistoricalBytes().getRawData(), expect_hb)); 141 assertEquals(atr.getCheckByte(), Byte.valueOf((byte) 0x97)); 142 } 143 144 @Test 145 @SmallTest 146 public void testAnswerToRestSuccessWithoutCheckByte() { 147 String str = "3F979580B0FE0010428031A073BE2117"; 148 AnswerToReset atr = AnswerToReset.parseAtr(str); 149 assertNotNull(atr); 150 assertEquals(atr.getConventionByte(), (byte) 0x3F); 151 assertEquals(atr.getFormatByte(), (byte) 0x97); 152 153 assertEquals(atr.getInterfaceBytes().size(), 4); 154 AnswerToReset.InterfaceByte expect_t1 = 155 new AnswerToReset.InterfaceByte((byte) 0x95, null, null, (byte) 0x80); 156 AnswerToReset.InterfaceByte expect_t2 = 157 new AnswerToReset.InterfaceByte(null, null, null, (byte) 0xB0); 158 AnswerToReset.InterfaceByte expect_t3 = 159 new AnswerToReset.InterfaceByte((byte) 0xFE, (byte) 0x00, null, (byte) 0x10); 160 AnswerToReset.InterfaceByte expect_t4 = 161 new AnswerToReset.InterfaceByte((byte) 0x42, null, null, null); 162 ArrayList<AnswerToReset.InterfaceByte> expect_ib = new ArrayList<>( 163 Arrays.asList(expect_t1, expect_t2, expect_t3, expect_t4) 164 ); 165 assertEquals(expect_ib, atr.getInterfaceBytes()); 166 167 assertEquals(atr.getHistoricalBytes().getRawData().length, 7); 168 byte[] expect_hb = new byte[]{ 169 (byte) 0x80, (byte) 0x31, (byte) 0xA0, (byte) 0x73, 170 (byte) 0xBE, (byte) 0x21, (byte) 0x17}; 171 assertTrue(Arrays.equals(atr.getHistoricalBytes().getRawData(), expect_hb)); 172 173 assertEquals(atr.getCheckByte(), null); 174 assertFalse(atr.isEuiccSupported()); 175 } 176 177 @Test 178 @SmallTest 179 public void testAnswerToRestFailWithoutCheckByte() { 180 String str = "3F979581B0FE0010428031A073BE2117"; 181 AnswerToReset atr = AnswerToReset.parseAtr(str); 182 assertNull(atr); 183 } 184 185 @Test 186 @SmallTest 187 public void testAnswerToRestFailWithExtraByte() { 188 String str = "3F979580B1FE001F428031A073BE21179718"; 189 AnswerToReset atr = AnswerToReset.parseAtr(str); 190 assertNull(atr); 191 } 192 193 @Test 194 @SmallTest 195 public void testAnswerToRestEuiccSupported() { 196 String str = "3F979580BFFE8210428031A073BE211797"; 197 AnswerToReset atr = AnswerToReset.parseAtr(str); 198 assertNotNull(atr); 199 assertEquals(atr.getConventionByte(), (byte) 0x3F); 200 assertEquals(atr.getFormatByte(), (byte) 0x97); 201 202 assertEquals(atr.getInterfaceBytes().size(), 4); 203 AnswerToReset.InterfaceByte expect_t1 = 204 new AnswerToReset.InterfaceByte((byte) 0x95, null, null, (byte) 0x80); 205 AnswerToReset.InterfaceByte expect_t2 = 206 new AnswerToReset.InterfaceByte(null, null, null, (byte) 0xBF); 207 AnswerToReset.InterfaceByte expect_t3 = 208 new AnswerToReset.InterfaceByte((byte) 0xFE, (byte) 0x82, null, (byte) 0x10); 209 AnswerToReset.InterfaceByte expect_t4 = 210 new AnswerToReset.InterfaceByte((byte) 0x42, null, null, null); 211 ArrayList<AnswerToReset.InterfaceByte> expect_ib = new ArrayList<>( 212 Arrays.asList(expect_t1, expect_t2, expect_t3, expect_t4) 213 ); 214 assertEquals(expect_ib, atr.getInterfaceBytes()); 215 216 assertEquals(atr.getHistoricalBytes().getRawData().length, 7); 217 byte[] expect_hb = new byte[]{ 218 (byte) 0x80, (byte) 0x31, (byte) 0xA0, (byte) 0x73, 219 (byte) 0xBE, (byte) 0x21, (byte) 0x17}; 220 assertTrue(Arrays.equals(atr.getHistoricalBytes().getRawData(), expect_hb)); 221 222 assertEquals(atr.getCheckByte(), Byte.valueOf((byte) 0x97)); 223 224 assertTrue(atr.isEuiccSupported()); 225 } 226 227 @Test 228 @SmallTest 229 public void testAnswerToRestEuiccSupportedWithLowerCaseString() { 230 String str = "3f979580bffe8210428031a073be211797"; 231 AnswerToReset atr = AnswerToReset.parseAtr(str); 232 assertNotNull(atr); 233 assertEquals(atr.getConventionByte(), (byte) 0x3F); 234 assertEquals(atr.getFormatByte(), (byte) 0x97); 235 236 assertEquals(atr.getInterfaceBytes().size(), 4); 237 AnswerToReset.InterfaceByte expect_t1 = 238 new AnswerToReset.InterfaceByte((byte) 0x95, null, null, (byte) 0x80); 239 AnswerToReset.InterfaceByte expect_t2 = 240 new AnswerToReset.InterfaceByte(null, null, null, (byte) 0xBF); 241 AnswerToReset.InterfaceByte expect_t3 = 242 new AnswerToReset.InterfaceByte((byte) 0xFE, (byte) 0x82, null, (byte) 0x10); 243 AnswerToReset.InterfaceByte expect_t4 = 244 new AnswerToReset.InterfaceByte((byte) 0x42, null, null, null); 245 ArrayList<AnswerToReset.InterfaceByte> expect_ib = new ArrayList<>( 246 Arrays.asList(expect_t1, expect_t2, expect_t3, expect_t4) 247 ); 248 assertEquals(expect_ib, atr.getInterfaceBytes()); 249 250 assertEquals(atr.getHistoricalBytes().getRawData().length, 7); 251 byte[] expect_hb = new byte[]{ 252 (byte) 0x80, (byte) 0x31, (byte) 0xA0, (byte) 0x73, 253 (byte) 0xBE, (byte) 0x21, (byte) 0x17}; 254 assertTrue(Arrays.equals(atr.getHistoricalBytes().getRawData(), expect_hb)); 255 256 assertEquals(atr.getCheckByte(), Byte.valueOf((byte) 0x97)); 257 258 assertTrue(atr.isEuiccSupported()); 259 } 260 261 @Test 262 @SmallTest 263 public void testAnswerToRestEuiccNotSupportedDueToIncorrectT() { 264 String str = "3F979580BEFE8210428031A073BE211797"; 265 AnswerToReset atr = AnswerToReset.parseAtr(str); 266 assertNotNull(atr); 267 assertEquals(atr.getConventionByte(), (byte) 0x3F); 268 assertEquals(atr.getFormatByte(), (byte) 0x97); 269 270 assertEquals(atr.getInterfaceBytes().size(), 4); 271 AnswerToReset.InterfaceByte expect_t1 = 272 new AnswerToReset.InterfaceByte((byte) 0x95, null, null, (byte) 0x80); 273 AnswerToReset.InterfaceByte expect_t2 = 274 new AnswerToReset.InterfaceByte(null, null, null, (byte) 0xBE); 275 AnswerToReset.InterfaceByte expect_t3 = 276 new AnswerToReset.InterfaceByte((byte) 0xFE, (byte) 0x82, null, (byte) 0x10); 277 AnswerToReset.InterfaceByte expect_t4 = 278 new AnswerToReset.InterfaceByte((byte) 0x42, null, null, null); 279 ArrayList<AnswerToReset.InterfaceByte> expect_ib = new ArrayList<>( 280 Arrays.asList(expect_t1, expect_t2, expect_t3, expect_t4) 281 ); 282 assertEquals(expect_ib, atr.getInterfaceBytes()); 283 284 assertEquals(atr.getHistoricalBytes().getRawData().length, 7); 285 byte[] expect_hb = new byte[]{ 286 (byte) 0x80, (byte) 0x31, (byte) 0xA0, (byte) 0x73, 287 (byte) 0xBE, (byte) 0x21, (byte) 0x17}; 288 assertTrue(Arrays.equals(atr.getHistoricalBytes().getRawData(), expect_hb)); 289 290 assertEquals(atr.getCheckByte(), Byte.valueOf((byte) 0x97)); 291 292 assertFalse(atr.isEuiccSupported()); 293 } 294 295 @Test 296 @SmallTest 297 public void testAnswerToRestEuiccNotSupportedDueToIncorrectTB() { 298 String str = "3F979580BFFE8110428031A073BE211797"; 299 AnswerToReset atr = AnswerToReset.parseAtr(str); 300 assertNotNull(atr); 301 assertEquals(atr.getConventionByte(), (byte) 0x3F); 302 assertEquals(atr.getFormatByte(), (byte) 0x97); 303 304 assertEquals(atr.getInterfaceBytes().size(), 4); 305 AnswerToReset.InterfaceByte expect_t1 = 306 new AnswerToReset.InterfaceByte((byte) 0x95, null, null, (byte) 0x80); 307 AnswerToReset.InterfaceByte expect_t2 = 308 new AnswerToReset.InterfaceByte(null, null, null, (byte) 0xBF); 309 AnswerToReset.InterfaceByte expect_t3 = 310 new AnswerToReset.InterfaceByte((byte) 0xFE, (byte) 0x81, null, (byte) 0x10); 311 AnswerToReset.InterfaceByte expect_t4 = 312 new AnswerToReset.InterfaceByte((byte) 0x42, null, null, null); 313 ArrayList<AnswerToReset.InterfaceByte> expect_ib = new ArrayList<>( 314 Arrays.asList(expect_t1, expect_t2, expect_t3, expect_t4) 315 ); 316 assertEquals(expect_ib, atr.getInterfaceBytes()); 317 318 assertEquals(atr.getHistoricalBytes().getRawData().length, 7); 319 byte[] expect_hb = new byte[]{ 320 (byte) 0x80, (byte) 0x31, (byte) 0xA0, (byte) 0x73, 321 (byte) 0xBE, (byte) 0x21, (byte) 0x17}; 322 assertTrue(Arrays.equals(atr.getHistoricalBytes().getRawData(), expect_hb)); 323 324 assertEquals(atr.getCheckByte(), Byte.valueOf((byte) 0x97)); 325 326 assertFalse(atr.isEuiccSupported()); 327 } 328 329 @Test 330 @SmallTest 331 public void testAnswerToResetExtendedApduSupported() { 332 String str = "3B9F96803FC7828031E073F62158574A4D020C6030005F"; 333 AnswerToReset atr = AnswerToReset.parseAtr(str); 334 assertTrue(atr.isExtendedApduSupported()); 335 336 str = "3B9F96803FC7828031E073F62182574A4D020C6030005F"; 337 atr = AnswerToReset.parseAtr(str); 338 assertFalse(atr.isExtendedApduSupported()); 339 340 str = "3F9F96803FC7828031E073F62158574A4D020C6030005F"; 341 atr = AnswerToReset.parseAtr(str); 342 assertFalse(atr.isExtendedApduSupported()); 343 344 str = "3F9F96803FC7828031E073F62182574A4D020C6030005F"; 345 atr = AnswerToReset.parseAtr(str); 346 assertTrue(atr.isExtendedApduSupported()); 347 } 348 349 @Test 350 @SmallTest 351 public void testAnswerToResetExtendedApduNotSupportedDueToNoTag() { 352 String str = "3F6D000080318065B00501025E83009000"; 353 AnswerToReset atr = AnswerToReset.parseAtr(str); 354 assertFalse(atr.isExtendedApduSupported()); 355 356 str = "3B6D000080318065B00501025E83009000"; 357 atr = AnswerToReset.parseAtr(str); 358 assertFalse(atr.isExtendedApduSupported()); 359 } 360 361 @Test 362 @SmallTest 363 public void testAnswerToResetExtendedApduNotSupportedDueToLessLength() { 364 String str = "3B9E96803FC7828031E072F621574A4D020C6030005F"; 365 AnswerToReset atr = AnswerToReset.parseAtr(str); 366 assertFalse(atr.isExtendedApduSupported()); 367 368 str = "3F9D96803FC7828031E071F6574A4D020C6030005F"; 369 atr = AnswerToReset.parseAtr(str); 370 assertFalse(atr.isExtendedApduSupported()); 371 } 372 373 @Test 374 @SmallTest 375 public void testAnswerToResetParseLtvNodeWithIncorrectLength() { 376 String str = "3B9E96803FC7828031E073F621574A4D020C6030005F"; 377 AnswerToReset atr = AnswerToReset.parseAtr(str); 378 assertNull(atr.getHistoricalBytes()); 379 380 str = "3B9E96803FC7828031E071F621574A4D020C6030005F"; 381 atr = AnswerToReset.parseAtr(str); 382 assertNull(atr.getHistoricalBytes()); 383 } 384 } 385