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