1 package com.android.anqp.eap;
2 
3 import java.net.ProtocolException;
4 import java.nio.ByteBuffer;
5 import java.util.EnumMap;
6 import java.util.HashMap;
7 import java.util.Map;
8 
9 import static com.android.anqp.Constants.BYTE_MASK;
10 
11 /**
12  * An EAP authentication parameter, IEEE802.11-2012, table 8-188
13  */
14 public class NonEAPInnerAuth implements AuthParam {
15 
16     public enum NonEAPType {Reserved, PAP, CHAP, MSCHAP, MSCHAPv2}
17     private static final Map<NonEAPType, String> sOmaMap = new EnumMap<>(NonEAPType.class);
18     private static final Map<String, NonEAPType> sRevOmaMap = new HashMap<>();
19 
20     private final NonEAPType mType;
21 
22     static {
sOmaMap.put(NonEAPType.PAP, "PAP")23         sOmaMap.put(NonEAPType.PAP, "PAP");
sOmaMap.put(NonEAPType.CHAP, "CHAP")24         sOmaMap.put(NonEAPType.CHAP, "CHAP");
sOmaMap.put(NonEAPType.MSCHAP, "MS-CHAP")25         sOmaMap.put(NonEAPType.MSCHAP, "MS-CHAP");
sOmaMap.put(NonEAPType.MSCHAPv2, "MS-CHAP-V2")26         sOmaMap.put(NonEAPType.MSCHAPv2, "MS-CHAP-V2");
27 
28         for (Map.Entry<NonEAPType, String> entry : sOmaMap.entrySet()) {
entry.getKey()29             sRevOmaMap.put(entry.getValue(), entry.getKey());
30         }
31     }
32 
NonEAPInnerAuth(int length, ByteBuffer payload)33     public NonEAPInnerAuth(int length, ByteBuffer payload) throws ProtocolException {
34         if (length != 1) {
35             throw new ProtocolException("Bad length: " + payload.remaining());
36         }
37 
38         int typeID = payload.get() & BYTE_MASK;
39         mType = typeID < NonEAPType.values().length ?
40                 NonEAPType.values()[typeID] :
41                 NonEAPType.Reserved;
42     }
43 
44     public NonEAPInnerAuth(NonEAPType type) {
45         mType = type;
46     }
47 
48     /**
49      * Construct from the OMA-DM PPS data
50      * @param eapType as defined in the HS2.0 spec.
51      */
52     public NonEAPInnerAuth(String eapType) {
53         mType = sRevOmaMap.get(eapType);
54     }
55 
56     @Override
57     public EAP.AuthInfoID getAuthInfoID() {
58         return EAP.AuthInfoID.NonEAPInnerAuthType;
59     }
60 
61     public NonEAPType getType() {
62         return mType;
63     }
64 
65     public String getOMAtype() {
66         return sOmaMap.get(mType);
67     }
68 
69     public static String mapInnerType(NonEAPType type) {
70         return sOmaMap.get(type);
71     }
72 
73     @Override
74     public int hashCode() {
75         return mType.hashCode();
76     }
77 
78     @Override
79     public boolean equals(Object thatObject) {
80         if (thatObject == this) {
81             return true;
82         } else if (thatObject == null || thatObject.getClass() != NonEAPInnerAuth.class) {
83             return false;
84         } else {
85             return ((NonEAPInnerAuth) thatObject).getType() == getType();
86         }
87     }
88 
89     @Override
90     public String toString() {
91         return "Auth method NonEAPInnerAuthEAP, inner = " + mType + '\n';
92     }
93 }
94