Home | History | Annotate | Download | only in uicc
      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