aboutsummaryrefslogtreecommitdiff
path: root/src/java/com/android/internal/net/eap/message/simaka/EapSimTypeData.java
blob: ff1be6032026f0702e179c1754621d3ab35c78d1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.internal.net.eap.message.simaka;

import android.annotation.NonNull;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.net.eap.message.EapMessage;

import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * EapSimTypeData represents the Type Data for an {@link EapMessage} during an EAP-SIM session.
 */
public class EapSimTypeData extends EapSimAkaTypeData {
    private static final String TAG = EapSimTypeData.class.getSimpleName();

    // EAP-SIM Subtype values defined by IANA
    // https://www.iana.org/assignments/eapsimaka-numbers/eapsimaka-numbers.xhtml
    public static final int EAP_SIM_START = 10;
    public static final int EAP_SIM_CHALLENGE = 11;
    public static final int EAP_SIM_NOTIFICATION = 12;
    public static final int EAP_SIM_REAUTHENTICATION = 13;
    public static final int EAP_SIM_CLIENT_ERROR = 14;

    public static final Map<Integer, String> EAP_SIM_SUBTYPE_STRING = new HashMap<>();
    static {
        EAP_SIM_SUBTYPE_STRING.put(EAP_SIM_START, "Start");
        EAP_SIM_SUBTYPE_STRING.put(EAP_SIM_CHALLENGE, "Challenge");
        EAP_SIM_SUBTYPE_STRING.put(EAP_SIM_NOTIFICATION, "Notification");
        EAP_SIM_SUBTYPE_STRING.put(EAP_SIM_REAUTHENTICATION, "Re-authentication");
        EAP_SIM_SUBTYPE_STRING.put(EAP_SIM_CLIENT_ERROR, "Client-Error");
    }

    private static final Set<Integer> SUPPORTED_SUBTYPES = new HashSet<>();
    static {
        SUPPORTED_SUBTYPES.add(EAP_SIM_START);
        SUPPORTED_SUBTYPES.add(EAP_SIM_CHALLENGE);
        SUPPORTED_SUBTYPES.add(EAP_SIM_NOTIFICATION);
        SUPPORTED_SUBTYPES.add(EAP_SIM_REAUTHENTICATION);
        SUPPORTED_SUBTYPES.add(EAP_SIM_CLIENT_ERROR);
    }

    private static final EapSimTypeDataDecoder sTypeDataDecoder = new EapSimTypeDataDecoder();

    @VisibleForTesting
    public EapSimTypeData(int eapSubType, LinkedHashMap<Integer, EapSimAkaAttribute> attributeMap) {
        super(eapSubType, attributeMap);
    }

    public EapSimTypeData(int eapSubtype, List<EapSimAkaAttribute> attributes) {
        super(eapSubtype, new LinkedHashMap<>());

        if (!SUPPORTED_SUBTYPES.contains(eapSubtype)) {
            throw new IllegalArgumentException("Invalid subtype for EAP-SIM: " + eapSubtype);
        }

        for (EapSimAkaAttribute attribute : attributes) {
            if (attributeMap.containsKey(attribute.attributeType)) {
                throw new IllegalArgumentException(
                        "Duplicate attribute in attributes: " + attribute.attributeType);
            }
            attributeMap.put(attribute.attributeType, attribute);
        }
    }

    public static EapSimTypeDataDecoder getEapSimTypeDataDecoder() {
        return sTypeDataDecoder;
    }

    /**
     * EapSimTypeDataDecoder will be used for decoding {@link EapSimTypeData} objects.
     */
    public static class EapSimTypeDataDecoder extends EapSimAkaTypeDataDecoder<EapSimTypeData> {
        private static final String TAG = EapSimTypeDataDecoder.class.getSimpleName();
        private static final String EAP_METHOD = "EAP-SIM";

        protected EapSimTypeDataDecoder() {
            super(
                    TAG,
                    EAP_METHOD,
                    SUPPORTED_SUBTYPES,
                    EapSimAttributeFactory.getInstance(),
                    EAP_SIM_SUBTYPE_STRING);
        }

        /**
         * Decodes the given byte-array into a DecodeResult object.
         *
         * @param typeData the byte-encoding of the EapSimTypeData to be parsed
         * @return a DecodeResult object. If the decoding is successful, this will encapsulate an
         *         EapSimTypeData instance representing the data stored in typeData. Otherwise, it
         *         will contain the relevant AtClientErrorCode for the decoding error.
         */
        public DecodeResult<EapSimTypeData> decode(@NonNull byte[] typeData) {
            return super.decode(typeData);
        }

        @Override
        protected EapSimTypeData getInstance(
                int eapSubtype,
                LinkedHashMap<Integer, EapSimAkaAttribute> attributeMap) {
            return new EapSimTypeData(eapSubtype, attributeMap);
        }
    }
}