1d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu/* 2d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * Copyright (C) 2016 The Android Open Source Project 3d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * 4d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * Licensed under the Apache License, Version 2.0 (the "License"); 5d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * you may not use this file except in compliance with the License. 6d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * You may obtain a copy of the License at 7d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * 8d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * http://www.apache.org/licenses/LICENSE-2.0 9d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * 10d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * Unless required by applicable law or agreed to in writing, software 11d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * distributed under the License is distributed on an "AS IS" BASIS, 12d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * See the License for the specific language governing permissions and 14d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * limitations under the License. 15d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu */ 16d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu 17d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiupackage com.android.server.wifi.hotspot2.anqp; 18d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu 19d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiuimport android.net.wifi.EAPConstants; 20d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu 21d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiuimport com.android.server.wifi.hotspot2.anqp.eap.AuthParam; 22d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiuimport com.android.server.wifi.hotspot2.anqp.eap.CredentialType; 23d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiuimport com.android.server.wifi.hotspot2.anqp.eap.EAPMethod; 24d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu 25d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiuimport java.io.ByteArrayOutputStream; 26d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiuimport java.io.IOException; 27d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiuimport java.nio.charset.StandardCharsets; 28d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiuimport java.util.ArrayList; 29d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiuimport java.util.Arrays; 30d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiuimport java.util.HashMap; 31d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiuimport java.util.HashSet; 32d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiuimport java.util.List; 33d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiuimport java.util.Map; 34d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiuimport java.util.Set; 35d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu 36d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu/** 37d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * Utility class containing test data for NAI Realm Data. 38d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu */ 39d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiupublic class NAIRealmDataTestUtil { 40d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu /** 41d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * Raw bytes for EAP Method. 42d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu */ 43d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu private static final byte[] TEST_EAP_METHOD_BYTES = 44d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu new byte[] {0x05 /* length */, 0x0D /* EAP_TLS */, 0x01 /* Auth Param Count */, 45d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu 0x05 /* CredentialType */, 0x01, 0x02 /* USIM */}; 46d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu 47d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu /** 48d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * NAI Realm strings. 49d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu */ 50d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu private static final String[] TEST_REALMS = new String[] {"test1", "test2"}; 51d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu 52d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu /** 53d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * Setup expected EAPMethod list. 54d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu */ 55d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu private static final Map<Integer, Set<AuthParam>> TEST_EAP_METHOD_AUTH_PARAMS = 56d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu new HashMap<>(); 57d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu private static final Set<AuthParam> TEST_EAP_METHOD_CREDENTIAL_TYPE_PARAMS = new HashSet<>(); 58d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu private static final List<EAPMethod> TEST_EAP_METHOD_LIST = new ArrayList<>(); 59d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu static { 60d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu TEST_EAP_METHOD_CREDENTIAL_TYPE_PARAMS.add(new CredentialType( 61d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu AuthParam.PARAM_TYPE_CREDENTIAL_TYPE, CredentialType.CREDENTIAL_TYPE_USIM)); 62d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu TEST_EAP_METHOD_AUTH_PARAMS.put(AuthParam.PARAM_TYPE_CREDENTIAL_TYPE, 63d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu TEST_EAP_METHOD_CREDENTIAL_TYPE_PARAMS); 64d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu 65d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu TEST_EAP_METHOD_LIST.add(new EAPMethod(EAPConstants.EAP_TLS, TEST_EAP_METHOD_AUTH_PARAMS)); 66d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu } 67d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu 68d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu /** 69d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * Setup expected NAIRealmData. 70d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu */ 71d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu public static final NAIRealmData TEST_REALM_DATA = 72d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu new NAIRealmData(Arrays.asList(TEST_REALMS), TEST_EAP_METHOD_LIST); 73d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu 74d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu public static byte[] TEST_REAML_WITH_UTF8_DATA_BYTES = formatNAIRealmData(true); 75d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu public static byte[] TEST_REAML_WITH_NON_UTF8_DATA_BYTES = formatNAIRealmData(false); 76d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu 77d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu /** 78d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * Helper function for returning raw bytes of NAI Realm Data (including the length field) for 79d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * testing. 80d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * 81d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * @param utfEncoding Flag indicating the UTF encoding of the realm string 82d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * @return byte[] 83d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu */ 84d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu private static byte[] formatNAIRealmData(boolean utfEncoding) { 85d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu try { 86d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu byte[] realmData = getNAIRealmData(utfEncoding); 87d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu ByteArrayOutputStream stream = new ByteArrayOutputStream(); 88d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu // Realm Data length in Little-Endian. 89d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu stream.write((byte) realmData.length); 90d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu stream.write((byte) realmData.length >> 8); 91d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu stream.write(realmData); 92d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu return stream.toByteArray(); 93d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu } catch (IOException e) { 94d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu return null; 95d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu } 96d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu } 97d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu 98d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu /** 99d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * Helper function for returning raw bytes of NAI Realm Data payload. 100d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * 101d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * @param utfEncoding Flag indicating the encoding of NAI Realm string 102d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * @return byte[] 103d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * @throws IOException 104d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu */ 105d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu private static byte[] getNAIRealmData(boolean utfEncoding) throws IOException { 106d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu String realmsStr = String.join(NAIRealmData.NAI_REALM_STRING_SEPARATOR, TEST_REALMS); 107d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu byte[] realmStrData = realmsStr.getBytes( 108d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu utfEncoding ? StandardCharsets.UTF_8 : StandardCharsets.US_ASCII); 109d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu 110d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu ByteArrayOutputStream stream = new ByteArrayOutputStream(); 111d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu // NAI Realm Encoding byte. 112d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu stream.write((byte) (utfEncoding ? NAIRealmData.NAI_ENCODING_UTF8_MASK : 0)); 113d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu stream.write((byte) realmStrData.length); 114d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu stream.write(realmStrData); 115d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu stream.write((byte) 1); // EAP Method count 116d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu stream.write(TEST_EAP_METHOD_BYTES); 117d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu return stream.toByteArray(); 118d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu } 119d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu} 120