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
178ca4ac971a9b862fbd69c57af3a3c0029a6b9f4dPeter Qiupackage com.android.server.wifi.hotspot2.anqp.eap;
186a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
19d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiuimport com.android.internal.annotations.VisibleForTesting;
20d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu
216a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport java.net.ProtocolException;
22d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiuimport java.nio.BufferUnderflowException;
236a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport java.nio.ByteBuffer;
2487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiuimport java.util.HashMap;
2587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiuimport java.util.Map;
266a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
276a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist/**
28d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * The Non-EAP Inner Authentication Type authentication parameter, IEEE802.11-2012, table 8-188.
29d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu *
30d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * Format:
31d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu * | Type |
32d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu *    1
336a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist */
34d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiupublic class NonEAPInnerAuth extends AuthParam {
3587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    public static final int AUTH_TYPE_UNKNOWN = 0;
36d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu    public static final int AUTH_TYPE_PAP = 1;
37d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu    public static final int AUTH_TYPE_CHAP = 2;
38d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu    public static final int AUTH_TYPE_MSCHAP = 3;
39d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu    public static final int AUTH_TYPE_MSCHAPV2 = 4;
40a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist
4187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    private static final Map<String, Integer> AUTH_TYPE_MAP = new HashMap<>();
4287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    static {
4387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        AUTH_TYPE_MAP.put("PAP", AUTH_TYPE_PAP);
4487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        AUTH_TYPE_MAP.put("CHAP", AUTH_TYPE_CHAP);
4587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        AUTH_TYPE_MAP.put("MS-CHAP", AUTH_TYPE_MSCHAP);
4687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        AUTH_TYPE_MAP.put("MS-CHAP-V2", AUTH_TYPE_MSCHAPV2);
4787c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    }
4887c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
49d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu    @VisibleForTesting
50d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu    public static final int EXPECTED_LENGTH_VALUE = 1;
513be1b3fc037bef7fb4448dec89aea3f2e1318853Jan Nordqvist
52d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu    private final int mAuthType;
536a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
54d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu    public NonEAPInnerAuth(int authType) {
55d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu        super(AuthParam.PARAM_TYPE_NON_EAP_INNER_AUTH_TYPE);
56d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu        mAuthType = authType;
57a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist    }
58a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist
5971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    /**
60d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu     * Parse a NonEAPInnerAuth from the given buffer.
61d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu     *
62d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu     * @param payload The byte buffer to read from
63d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu     * @param length The length of the data
64d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu     * @return {@link NonEAPInnerAuth}
65d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu     * @throws BufferUnderflowException
6671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist     */
67d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu    public static NonEAPInnerAuth parse(ByteBuffer payload, int length) throws ProtocolException {
68d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu        if (length != EXPECTED_LENGTH_VALUE) {
69d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu            throw new ProtocolException("Invalid length: " + length);
70d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu        }
71d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu        int authType = payload.get() & 0xFF;
72d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu        return new NonEAPInnerAuth(authType);
736a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    }
746a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
7587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    /**
7687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * Convert an authentication type string to an integer representation.
7787c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     *
7887c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * @param typeStr The string of authentication type
7987c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * @return int
8087c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     */
8187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    public static int getAuthTypeID(String typeStr) {
8287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        if (AUTH_TYPE_MAP.containsKey(typeStr)) {
8387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu            return AUTH_TYPE_MAP.get(typeStr).intValue();
8487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        }
8587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        return AUTH_TYPE_UNKNOWN;
8687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    }
8787c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
886a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    @Override
896a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    public boolean equals(Object thatObject) {
906a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        if (thatObject == this) {
916a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist            return true;
92d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu        }
93d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu        if (!(thatObject instanceof NonEAPInnerAuth)) {
946a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist            return false;
956a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist        }
96d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu        NonEAPInnerAuth that = (NonEAPInnerAuth) thatObject;
97d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu        return mAuthType == that.mAuthType;
98d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu    }
99d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu
100d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu    @Override
101d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu    public int hashCode() {
102d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu        return mAuthType;
1036a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    }
1046a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist
1056a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    @Override
1066a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    public String toString() {
107d8dddd9671750e6bfbcfa218db16ad096b9904eePeter Qiu        return "NonEAPInnerAuth{mAuthType=" + mAuthType + "}";
1086a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist    }
1096a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist}
110