Credential.java revision 820d73615f338d6c71f2d75aba0ad8410e9eed3e
171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvistpackage com.android.server.wifi.hotspot2.pps;
271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
303e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpandeimport android.net.wifi.WifiEnterpriseConfig;
4a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvistimport android.security.Credentials;
5a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvistimport android.security.KeyStore;
6d3fb9cbb12d013dd70e672ace5c41ab18a3679a0Vinit Deshpandeimport android.text.TextUtils;
771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvistimport android.util.Base64;
8af955ffa0082189fb688429732427c333f2491ceVinit Deshpandeimport android.util.Log;
971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
1003e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpandeimport com.android.server.wifi.anqp.eap.EAP;
1171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvistimport com.android.server.wifi.anqp.eap.EAPMethod;
12a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvistimport com.android.server.wifi.anqp.eap.NonEAPInnerAuth;
1371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvistimport com.android.server.wifi.hotspot2.Utils;
1471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvistimport com.android.server.wifi.hotspot2.omadm.OMAException;
1571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
16a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvistimport java.io.IOException;
1771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvistimport java.nio.charset.StandardCharsets;
18a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvistimport java.security.GeneralSecurityException;
19a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvistimport java.security.MessageDigest;
2005d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvistimport java.util.Arrays;
2171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
2271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvistpublic class Credential {
2371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    public enum CertType {IEEE, x509v3}
2471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
25a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist    public static final String CertTypeX509 = "x509v3";
26a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist    public static final String CertTypeIEEE = "802.1ar";
27a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist
2871a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    private final long mCtime;
2971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    private final long mExpTime;
3071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    private final String mRealm;
3171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    private final boolean mCheckAAACert;
3271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
3371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    private final String mUserName;
3471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    private final String mPassword;
35820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist    private final boolean mDisregardPassword;
3671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    private final boolean mMachineManaged;
3771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    private final String mSTokenApp;
3871a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    private final boolean mShare;
3971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    private final EAPMethod mEAPMethod;
4071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
4171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    private final CertType mCertType;
4271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    private final byte[] mFingerPrint;
4371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
4471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    private final String mImsi;
4571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
4671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    public Credential(long ctime, long expTime, String realm, boolean checkAAACert,
4771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                      EAPMethod eapMethod, String userName, String password,
4871a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                      boolean machineManaged, String stApp, boolean share) {
4971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mCtime = ctime;
5071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mExpTime = expTime;
5171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mRealm = realm;
5271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mCheckAAACert = checkAAACert;
5371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mEAPMethod = eapMethod;
5471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mUserName = userName;
55d3fb9cbb12d013dd70e672ace5c41ab18a3679a0Vinit Deshpande
56a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist        if (!TextUtils.isEmpty(password)) {
57d3fb9cbb12d013dd70e672ace5c41ab18a3679a0Vinit Deshpande            byte[] pwOctets = Base64.decode(password, Base64.DEFAULT);
58d3fb9cbb12d013dd70e672ace5c41ab18a3679a0Vinit Deshpande            mPassword = new String(pwOctets, StandardCharsets.UTF_8);
59d3fb9cbb12d013dd70e672ace5c41ab18a3679a0Vinit Deshpande        } else {
60d3fb9cbb12d013dd70e672ace5c41ab18a3679a0Vinit Deshpande            mPassword = null;
61d3fb9cbb12d013dd70e672ace5c41ab18a3679a0Vinit Deshpande        }
62820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        mDisregardPassword = false;
63d3fb9cbb12d013dd70e672ace5c41ab18a3679a0Vinit Deshpande
6471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mMachineManaged = machineManaged;
6571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mSTokenApp = stApp;
6671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mShare = share;
6771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
6871a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mCertType = null;
6971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mFingerPrint = null;
7071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
7171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mImsi = null;
7271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    }
7371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
7471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    public Credential(long ctime, long expTime, String realm, boolean checkAAACert,
7571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                      EAPMethod eapMethod, Credential.CertType certType, byte[] fingerPrint) {
7671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mCtime = ctime;
7771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mExpTime = expTime;
7871a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mRealm = realm;
7971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mCheckAAACert = checkAAACert;
8071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mEAPMethod = eapMethod;
8171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mCertType = certType;
8271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mFingerPrint = fingerPrint;
8371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
8471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mUserName = null;
8571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mPassword = null;
86820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        mDisregardPassword = false;
8771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mMachineManaged = false;
8871a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mSTokenApp = null;
8971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mShare = false;
9071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
9171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mImsi = null;
9271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    }
9371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
9471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    public Credential(long ctime, long expTime, String realm, boolean checkAAACert,
9571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                      EAPMethod eapMethod, String imsi) {
9671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mCtime = ctime;
9771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mExpTime = expTime;
9871a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mRealm = realm;
9971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mCheckAAACert = checkAAACert;
10071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mEAPMethod = eapMethod;
10171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mImsi = imsi;
10271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
10371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mCertType = null;
10471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mFingerPrint = null;
10571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
10671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mUserName = null;
10771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mPassword = null;
108820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        mDisregardPassword = false;
10971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mMachineManaged = false;
11071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mSTokenApp = null;
11171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        mShare = false;
11271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    }
11371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
114820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist    public Credential(Credential other, String password) {
115820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        mCtime = other.mCtime;
116820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        mExpTime = other.mExpTime;
117820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        mRealm = other.mRealm;
118820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        mCheckAAACert = other.mCheckAAACert;
119820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        mUserName = other.mUserName;
120820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        mPassword = password;
121820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        mDisregardPassword = other.mDisregardPassword;
122820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        mMachineManaged = other.mMachineManaged;
123820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        mSTokenApp = other.mSTokenApp;
124820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        mShare = other.mShare;
125820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        mEAPMethod = other.mEAPMethod;
126820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        mCertType = other.mCertType;
127820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        mFingerPrint = other.mFingerPrint;
128820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        mImsi = other.mImsi;
129820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist    }
130820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist
131820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist    public Credential(WifiEnterpriseConfig enterpriseConfig, KeyStore keyStore, boolean update)
132820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist            throws IOException {
13303e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande        mCtime = 0;
13403e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande        mExpTime = 0;
13503e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande        mRealm = enterpriseConfig.getRealm();
13603e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande        mCheckAAACert = true;
13703e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande        mEAPMethod = mapEapMethod(enterpriseConfig.getEapMethod(),
13803e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande                enterpriseConfig.getPhase2Method());
139a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist        mCertType = mEAPMethod.getEAPMethodID() == EAP.EAPMethodID.EAP_TLS ? CertType.x509v3 : null;
140a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist        byte[] fingerPrint;
141a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist
142a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist        if (enterpriseConfig.getClientCertificate() != null) {
143a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist            // !!! Not sure this will be true in any practical instances:
144a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist            try {
145a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist                MessageDigest digester = MessageDigest.getInstance("SHA-256");
146a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist                fingerPrint = digester.digest(enterpriseConfig.getClientCertificate().getEncoded());
14705d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist            } catch (GeneralSecurityException gse) {
148820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist                Log.e(Utils.HS20_TAG, "Failed to generate certificate fingerprint: " + gse);
149a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist                fingerPrint = null;
150a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist            }
15105d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        } else if (enterpriseConfig.getClientCertificateAlias() != null) {
152a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist            String alias = enterpriseConfig.getClientCertificateAlias();
1534e940bb499f65b4305dbeb2e01237c43c2b0b42dJan Nordqvist            byte[] octets = keyStore.get(Credentials.USER_CERTIFICATE + alias);
154a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist            if (octets != null) {
155a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist                try {
156a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist                    MessageDigest digester = MessageDigest.getInstance("SHA-256");
157a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist                    fingerPrint = digester.digest(octets);
15805d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                } catch (GeneralSecurityException gse) {
159a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist                    Log.e("HS2J", "Failed to construct digest: " + gse);
160a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist                    fingerPrint = null;
161a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist                }
16205d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist            } else // !!! The current alias is *not* derived from the fingerprint...
163a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist            {
164a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist                try {
165a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist                    fingerPrint = Base64.decode(enterpriseConfig.getClientCertificateAlias(),
166a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist                            Base64.DEFAULT);
167a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist                } catch (IllegalArgumentException ie) {
168820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist                    Log.e(Utils.HS20_TAG, "Bad base 64 alias");
169a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist                    fingerPrint = null;
170a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist                }
171a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist            }
17205d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        } else {
173a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist            fingerPrint = null;
174d3fb9cbb12d013dd70e672ace5c41ab18a3679a0Vinit Deshpande        }
175a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist        mFingerPrint = fingerPrint;
17603e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande        mImsi = enterpriseConfig.getPlmn();
177d3fb9cbb12d013dd70e672ace5c41ab18a3679a0Vinit Deshpande        mUserName = enterpriseConfig.getIdentity();
178d3fb9cbb12d013dd70e672ace5c41ab18a3679a0Vinit Deshpande        mPassword = enterpriseConfig.getPassword();
179820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        mDisregardPassword = update && mPassword.length() < 2;
18003e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande        mMachineManaged = false;
18103e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande        mSTokenApp = null;
18203e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande        mShare = false;
18303e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande    }
18403e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande
18571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    public static CertType mapCertType(String certType) throws OMAException {
186a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist        if (certType.equalsIgnoreCase(CertTypeX509)) {
18771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist            return CertType.x509v3;
188a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist        } else if (certType.equalsIgnoreCase(CertTypeIEEE)) {
18971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist            return CertType.IEEE;
19071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        } else {
19171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist            throw new OMAException("Invalid cert type: '" + certType + "'");
19271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        }
19371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    }
19471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
195a7ead3d4be45cb69bb5851f1a6f9673e93607fc2Jan Nordqvist    private static EAPMethod mapEapMethod(int eapMethod, int phase2Method) throws IOException {
19605d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        switch (eapMethod) {
19705d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist            case WifiEnterpriseConfig.Eap.TLS:
19805d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                return new EAPMethod(EAP.EAPMethodID.EAP_TLS, null);
19905d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist            case WifiEnterpriseConfig.Eap.TTLS:
20003e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande            /* keep this table in sync with WifiEnterpriseConfig.Phase2 enum */
20105d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                NonEAPInnerAuth inner;
20205d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                switch (phase2Method) {
20305d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                    case WifiEnterpriseConfig.Phase2.PAP:
20405d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                        inner = new NonEAPInnerAuth(NonEAPInnerAuth.NonEAPType.PAP);
20505d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                        break;
20605d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                    case WifiEnterpriseConfig.Phase2.MSCHAP:
20705d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                        inner = new NonEAPInnerAuth(NonEAPInnerAuth.NonEAPType.MSCHAP);
20805d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                        break;
20905d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                    case WifiEnterpriseConfig.Phase2.MSCHAPV2:
21005d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                        inner = new NonEAPInnerAuth(NonEAPInnerAuth.NonEAPType.MSCHAPv2);
21105d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                        break;
21205d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                    default:
21305d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                        throw new IOException("TTLS phase2 method " +
21405d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                                phase2Method + " not valid for Passpoint");
21505d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                }
21605d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                return new EAPMethod(EAP.EAPMethodID.EAP_TTLS, inner);
21705d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist            case WifiEnterpriseConfig.Eap.SIM:
21805d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                return new EAPMethod(EAP.EAPMethodID.EAP_SIM, null);
21905d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist            case WifiEnterpriseConfig.Eap.AKA:
22005d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                return new EAPMethod(EAP.EAPMethodID.EAP_AKA, null);
22105d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist            case WifiEnterpriseConfig.Eap.AKA_PRIME:
22205d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                return new EAPMethod(EAP.EAPMethodID.EAP_AKAPrim, null);
22305d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist            default:
22405d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                String methodName;
22505d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                if (eapMethod >= 0 && eapMethod < WifiEnterpriseConfig.Eap.strings.length) {
22605d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                    methodName = WifiEnterpriseConfig.Eap.strings[eapMethod];
22705d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                } else {
22805d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                    methodName = Integer.toString(eapMethod);
22905d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                }
23005d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist                throw new IOException("EAP method id " + methodName + " is not valid for Passpoint");
23103e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande        }
23203e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande    }
23303e92b925a595a1a467290a2d54ca2602cce9b9eVinit Deshpande
23471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    public EAPMethod getEAPMethod() {
23571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        return mEAPMethod;
23671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    }
23771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
23871a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    public String getRealm() {
23971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        return mRealm;
24071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    }
24171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
24271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    public String getImsi() {
24371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        return mImsi;
24471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    }
24571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist
24677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public String getUserName() {
24777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return mUserName;
24877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
24977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
25077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    public String getPassword() {
25177f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist        return mPassword;
25277f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
25377f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
254820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist    public boolean hasDisregardPassword() {
255820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        return mDisregardPassword;
256820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist    }
257820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist
258a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist    public CertType getCertType() {
259a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist        return mCertType;
260a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist    }
261a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist
262a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist    public byte[] getFingerPrint() {
263a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist        return mFingerPrint;
264a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist    }
265a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist
266820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist    public long getCtime() {
267820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        return mCtime;
268820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist    }
269820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist
270820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist    public long getExpTime() {
271820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        return mExpTime;
272820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist    }
273820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist
27471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    @Override
27505d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist    public boolean equals(Object o) {
27605d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        if (this == o) return true;
27705d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        if (o == null || getClass() != o.getClass()) return false;
27805d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist
27905d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        Credential that = (Credential) o;
28005d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist
28105d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        if (mCheckAAACert != that.mCheckAAACert) return false;
28205d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        if (mCtime != that.mCtime) return false;
28305d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        if (mExpTime != that.mExpTime) return false;
28405d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        if (mMachineManaged != that.mMachineManaged) return false;
28505d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        if (mShare != that.mShare) return false;
28605d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        if (mCertType != that.mCertType) return false;
28705d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        if (!mEAPMethod.equals(that.mEAPMethod)) return false;
28805d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        if (!Arrays.equals(mFingerPrint, that.mFingerPrint)) return false;
289820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        if (!safeEquals(mImsi, that.mImsi)) {
29005d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist            return false;
291820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        }
292820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist
293820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        if (!mDisregardPassword && !safeEquals(mPassword, that.mPassword)) {
294820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist            return false;
295820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        }
296820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist
29705d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        if (!mRealm.equals(that.mRealm)) return false;
298820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        if (!safeEquals(mSTokenApp, that.mSTokenApp)) {
29905d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist            return false;
300820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        }
301820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        if (!safeEquals(mUserName, that.mUserName)) {
30205d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist            return false;
303820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        }
30405d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist
30505d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        return true;
30605d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist    }
30705d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist
308820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist    private static boolean safeEquals(String s1, String s2) {
309820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        if (s1 == null) {
310820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist            return s2 == null;
311820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        }
312820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        else {
313820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist            return s2 != null && s1.equals(s2);
314820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist        }
315820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist    }
316820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist
31705d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist    @Override
31805d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist    public int hashCode() {
31905d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        int result = (int) (mCtime ^ (mCtime >>> 32));
32005d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        result = 31 * result + (int) (mExpTime ^ (mExpTime >>> 32));
32105d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        result = 31 * result + mRealm.hashCode();
32205d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        result = 31 * result + (mCheckAAACert ? 1 : 0);
32305d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        result = 31 * result + (mUserName != null ? mUserName.hashCode() : 0);
32405d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        result = 31 * result + (mPassword != null ? mPassword.hashCode() : 0);
32505d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        result = 31 * result + (mMachineManaged ? 1 : 0);
32605d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        result = 31 * result + (mSTokenApp != null ? mSTokenApp.hashCode() : 0);
32705d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        result = 31 * result + (mShare ? 1 : 0);
32805d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        result = 31 * result + mEAPMethod.hashCode();
32905d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        result = 31 * result + (mCertType != null ? mCertType.hashCode() : 0);
33005d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        result = 31 * result + (mFingerPrint != null ? Arrays.hashCode(mFingerPrint) : 0);
33105d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        result = 31 * result + (mImsi != null ? mImsi.hashCode() : 0);
33205d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist        return result;
33305d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist    }
33405d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist
33505d2f4e6f26834a94b53187e6121379a16749088Jan Nordqvist    @Override
33671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    public String toString() {
33771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist        return "Credential{" +
33871a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                "mCtime=" + Utils.toUTCString(mCtime) +
33971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                ", mExpTime=" + Utils.toUTCString(mExpTime) +
34071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                ", mRealm='" + mRealm + '\'' +
34171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                ", mCheckAAACert=" + mCheckAAACert +
34271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                ", mUserName='" + mUserName + '\'' +
34371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                ", mPassword='" + mPassword + '\'' +
344820d73615f338d6c71f2d75aba0ad8410e9eed3eJan Nordqvist                ", mDisregardPassword=" + mDisregardPassword +
34571a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                ", mMachineManaged=" + mMachineManaged +
34671a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                ", mSTokenApp='" + mSTokenApp + '\'' +
34771a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                ", mShare=" + mShare +
34871a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                ", mEAPMethod=" + mEAPMethod +
34971a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                ", mCertType=" + mCertType +
35071a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                ", mFingerPrint=" + Utils.toHexString(mFingerPrint) +
35171a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                ", mImsi='" + mImsi + '\'' +
35271a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist                '}';
35371a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist    }
35471a988c8e9859244b83cd55bb6b6ee913fcaf95cJan Nordqvist}
355