/* * Copyright (C) 2014 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 android.net.wifi.passpoint; import android.net.wifi.WifiEnterpriseConfig; import android.os.Parcelable; import android.os.Parcel; import java.util.Collection; import java.util.Iterator; import java.util.Map; import java.util.Set; /** * A class representing a Wi-Fi Passpoint credential. * @hide */ public class WifiPasspointCredential implements Parcelable { private final static String TAG = "PasspointCredential"; private final static boolean DBG = true; /** Wi-Fi nodes**/ private String mWifiSpFqdn; /** PerProviderSubscription nodes **/ private String mCredentialName; /** SubscriptionUpdate nodes **/ private String mSubscriptionUpdateInterval; private String mSubscriptionUpdateMethod; private String mSubscriptionUpdateRestriction; private String mSubscriptionUpdateURI; private String mSubscriptionUpdateUsername; private String mSubscriptionUpdatePassword; /** HomeSP nodes **/ private String mHomeSpFqdn; private String mFriendlyName; private Collection<WifiPasspointDmTree.HomeOIList> mHomeOIList; private Collection<WifiPasspointDmTree.OtherHomePartners> mOtherHomePartnerList; /** SubscriptionParameters nodes**/ private String mCreationDate; private String mExpirationDate; /** Credential nodes **/ private String mType; private String mInnerMethod; private String mCertType; private String mCertSha256Fingerprint; private String mUpdateIdentifier; private String mUsername; private String mPasswd; private String mRealm; private String mImsi; private String mMcc; private String mMnc; private String mCaRootCert; private String mClientCert; private boolean mCheckAaaServerCertStatus; /** Policy nodes **/ private String mPolicyUpdateUri; private String mPolicyUpdateInterval; private String mPolicyUpdateUsername; private String mPolicyUpdatePassword; private String mPolicyUpdateRestriction; private String mPolicyUpdateMethod; private Collection<WifiPasspointDmTree.PreferredRoamingPartnerList> mPreferredRoamingPartnerList; private Collection<WifiPasspointDmTree.MinBackhaulThresholdNetwork> mMinBackhaulThresholdNetwork; private Collection<WifiPasspointDmTree.SPExclusionList> mSpExclusionList; private Collection<WifiPasspointDmTree.RequiredProtoPortTuple> mRequiredProtoPortTuple; private String mMaxBssLoad; /** CrednetialPriority node **/ private int mCrednetialPriority; /** AAAServerTrustRoot nodes **/ private String mAaaCertUrl; private String mAaaSha256Fingerprint; /** Others **/ private boolean mIsMachineRemediation; private boolean mUserPreferred = false; private String mWifiTreePath; private WifiEnterpriseConfig mEnterpriseConfig; /** @hide */ public WifiPasspointCredential() {} /** * Constructor * @param realm Realm of the passpoint credential * @param fqdn Fully qualified domain name (FQDN) of the credential * @param config Enterprise config, must be either EAP-TLS or EAP-TTLS * @see WifiEnterpriseConfig */ public WifiPasspointCredential(String realm, String fqdn, WifiEnterpriseConfig config) { mRealm = realm; switch (config.getEapMethod()) { case WifiEnterpriseConfig.Eap.TLS: case WifiEnterpriseConfig.Eap.TTLS: mEnterpriseConfig = new WifiEnterpriseConfig(config); break; default: // ignore } } /** @hide */ public WifiPasspointCredential(String type, String caroot, String clientcert, String mcc, String mnc, WifiPasspointDmTree.SpFqdn sp, WifiPasspointDmTree.CredentialInfo credinfo) { if (credinfo == null) { return; } mType = type; mCaRootCert = caroot; mClientCert = clientcert; mWifiSpFqdn = sp.nodeName; mUpdateIdentifier = sp.perProviderSubscription.UpdateIdentifier; mCredentialName = credinfo.nodeName; mOtherHomePartnerList = credinfo.homeSP.otherHomePartners.values(); Set set = credinfo.aAAServerTrustRoot.entrySet(); Iterator i = set.iterator(); if (i.hasNext()) { Map.Entry entry3 = (Map.Entry) i.next(); WifiPasspointDmTree.AAAServerTrustRoot aaa = (WifiPasspointDmTree.AAAServerTrustRoot) entry3.getValue(); mAaaCertUrl = aaa.CertURL; mAaaSha256Fingerprint = aaa.CertSHA256Fingerprint; } mCertType = credinfo.credential.digitalCertificate.CertificateType; mCertSha256Fingerprint = credinfo.credential.digitalCertificate.CertSHA256Fingerprint; mUsername = credinfo.credential.usernamePassword.Username; mPasswd = credinfo.credential.usernamePassword.Password; mIsMachineRemediation = credinfo.credential.usernamePassword.MachineManaged; mInnerMethod = credinfo.credential.usernamePassword.eAPMethod.InnerMethod; mImsi = credinfo.credential.sim.IMSI; mMcc = mcc; mMnc = mnc; mCreationDate = credinfo.credential.CreationDate; mExpirationDate = credinfo.credential.ExpirationDate; mRealm = credinfo.credential.Realm; if (credinfo.credentialPriority == null) { mCrednetialPriority = 128; } else { mCrednetialPriority = Integer.parseInt(credinfo.credentialPriority); } mHomeSpFqdn = credinfo.homeSP.FQDN; mSubscriptionUpdateInterval = credinfo.subscriptionUpdate.UpdateInterval; mSubscriptionUpdateMethod = credinfo.subscriptionUpdate.UpdateMethod; mSubscriptionUpdateRestriction = credinfo.subscriptionUpdate.Restriction; mSubscriptionUpdateURI = credinfo.subscriptionUpdate.URI; mSubscriptionUpdateUsername = credinfo.subscriptionUpdate.usernamePassword.Username; mSubscriptionUpdatePassword = credinfo.subscriptionUpdate.usernamePassword.Password; mPolicyUpdateUri = credinfo.policy.policyUpdate.URI; mPolicyUpdateInterval = credinfo.policy.policyUpdate.UpdateInterval; mPolicyUpdateUsername = credinfo.policy.policyUpdate.usernamePassword.Username; mPolicyUpdatePassword = credinfo.policy.policyUpdate.usernamePassword.Password; mPolicyUpdateRestriction = credinfo.policy.policyUpdate.Restriction; mPolicyUpdateMethod = credinfo.policy.policyUpdate.UpdateMethod; mPreferredRoamingPartnerList = credinfo.policy.preferredRoamingPartnerList.values(); mMinBackhaulThresholdNetwork = credinfo.policy.minBackhaulThreshold.values(); mRequiredProtoPortTuple = credinfo.policy.requiredProtoPortTuple.values(); mMaxBssLoad = credinfo.policy.maximumBSSLoadValue; mSpExclusionList = credinfo.policy.sPExclusionList.values(); mHomeOIList = credinfo.homeSP.homeOIList.values(); mFriendlyName = credinfo.homeSP.FriendlyName; mCheckAaaServerCertStatus = credinfo.credential.CheckAAAServerCertStatus; } /** @hide */ public String getUpdateIdentifier() { return mUpdateIdentifier; } /** @hide */ public String getUpdateMethod() { return mSubscriptionUpdateMethod; } /** @hide */ public void setUpdateMethod(String method) { mSubscriptionUpdateMethod = method; } /** @hide */ public String getWifiSpFqdn() { return mWifiSpFqdn; } /** @hide */ public String getCredName() { return mCredentialName; } /** @hide */ public String getType() { return mType; } /** * Get enterprise config of this Passpoint credential. * @return Enterprise config * @see WifiEnterpriseConfig */ public WifiEnterpriseConfig getEnterpriseConfig() { return new WifiEnterpriseConfig(mEnterpriseConfig); } /** * Set enterprise config of this Passpoint credential. * @param config Enterprise config, must be either EAP-TLS or EAP-TTLS * @see WifiEnterpriseConfig */ public void setEnterpriseConfig(WifiEnterpriseConfig config) { // TODO } /** @hide */ public String getCertType() { return mCertType; } /** @hide */ public String getCertSha256Fingerprint() { return mCertSha256Fingerprint; } /** @hide */ public String getUserName() { return mUsername; } /** @hide */ public String getPassword() { // TODO: guarded by connectivity internal return mPasswd; } /** @hide */ public String getImsi() { return mImsi; } /** @hide */ public String getMcc() { return mMcc; } /** @hide */ public String getMnc() { return mMnc; } /** @hide */ public String getCaRootCertPath() { return mCaRootCert; } /** @hide */ public String getClientCertPath() { return mClientCert; } /** * Get the realm of this Passpoint credential. * @return Realm */ public String getRealm() { return mRealm; } /** * Set the ream of this Passpoint credential. * @param realm Realm */ public void setRealm(String realm) { mRealm = realm; } /** @hide */ public int getPriority() { if (mUserPreferred) { return 0; } return mCrednetialPriority; } /** * Get the fully qualified domain name (FQDN) of this Passpoint credential. * @return FQDN */ public String getHomeSpFqdn() { return mHomeSpFqdn; } /** * Set the fully qualified domain name (FQDN) of this Passpoint credential. * @param fqdn FQDN */ public void setHomeFqdn(String fqdn) { mHomeSpFqdn = fqdn; } /** @hide */ public Collection<WifiPasspointDmTree.OtherHomePartners> getOtherHomePartnerList() { return mOtherHomePartnerList; } /** @hide */ public String getSubscriptionUpdateUsername() { return mSubscriptionUpdateUsername; } /** @hide */ public String getSubscriptionUpdatePassword() { return mSubscriptionUpdatePassword; } /** @hide */ public String getPolicyUpdateUri() { return mPolicyUpdateUri; } /** @hide */ public String getPolicyUpdateInterval() { return mPolicyUpdateInterval; } /** @hide */ public String getPolicyUpdateUsername() { return mPolicyUpdateUsername; } /** @hide */ public String getPolicyUpdatePassword() { return mPolicyUpdatePassword; } /** @hide */ public String getPolicyUpdateRestriction() { return mPolicyUpdateRestriction; } /** @hide */ public String getPolicyUpdateMethod() { return mPolicyUpdateMethod; } /** @hide */ public String getCreationDate() { return mCreationDate; } /** @hide */ public String getExpirationDate() { return mExpirationDate; } /** @hide */ public void setExpirationDate(String expirationdate) { mExpirationDate = expirationdate; } /** @hide */ public Collection<WifiPasspointDmTree.PreferredRoamingPartnerList> getPreferredRoamingPartnerList() { return mPreferredRoamingPartnerList; } /** @hide */ public Collection<WifiPasspointDmTree.HomeOIList> getHomeOiList() { return mHomeOIList; } /** @hide */ public Collection<WifiPasspointDmTree.MinBackhaulThresholdNetwork> getBackhaulThresholdList() { return mMinBackhaulThresholdNetwork; } /** @hide */ public Collection<WifiPasspointDmTree.RequiredProtoPortTuple> getRequiredProtoPortList() { return mRequiredProtoPortTuple; } /** @hide */ public Collection<WifiPasspointDmTree.SPExclusionList> getSPExclusionList() { return mSpExclusionList; } /** @hide */ public boolean getIsMachineRemediation() { return mIsMachineRemediation; } /** @hide */ public String getAaaCertUrl() { return mAaaCertUrl; } /** @hide */ public String getAaaSha256Fingerprint() { return mAaaSha256Fingerprint; } /** @hide */ public String getSubscriptionUpdateRestriction() { return mSubscriptionUpdateRestriction; } /** @hide */ public String getSubscriptionUpdateURI() { return mSubscriptionUpdateURI; } /** @hide */ public String getSubscriptionUpdateInterval() { return mSubscriptionUpdateInterval; } /** @hide */ public String getFriendlyName() { return mFriendlyName; } /** @hide */ public String getMaxBssLoad() { return mMaxBssLoad; } /** @hide */ public boolean getUserPreference() { return mUserPreferred; } /** @hide */ public boolean getCheckAaaServerCertStatus() { return mCheckAaaServerCertStatus; } /** @hide */ public void setUserPreference(boolean value) { mUserPreferred = value; } @Override /** @hide */ public boolean equals(Object obj) { boolean result = false; if (obj instanceof WifiPasspointCredential) { final WifiPasspointCredential other = (WifiPasspointCredential) obj; if (this.mType.equals(other.mType)) { if (this.mType.equals("TTLS")) { result = this.mUsername.equals(other.mUsername) && this.mPasswd.equals(other.mPasswd) && this.mRealm.equals(other.mRealm) && this.mHomeSpFqdn.equals(other.mHomeSpFqdn); } if (this.mType.equals("TLS")) { result = this.mRealm.equals(other.mRealm) && this.mHomeSpFqdn.equals(other.mHomeSpFqdn) && this.mClientCert.equals(other.mClientCert); } if (this.mType.equals("SIM")) { result = this.mMcc.equals(other.mMcc) && this.mMnc.equals(other.mMnc) && this.mImsi.equals(other.mImsi) && this.mHomeSpFqdn.equals(other.mHomeSpFqdn); } } } return result; } @Override /** @hide */ public String toString() { StringBuffer sb = new StringBuffer(); String none = "<none>"; if (!DBG) { sb.append(none); } else { sb.append(", UpdateIdentifier: ") .append(mUpdateIdentifier == null ? none : mUpdateIdentifier) .append(", SubscriptionUpdateMethod: ") .append(mSubscriptionUpdateMethod == null ? none : mSubscriptionUpdateMethod) .append(", Type: ").append(mType == null ? none : mType) .append(", Username: ").append(mUsername == null ? none : mUsername) .append(", Passwd: ").append(mPasswd == null ? none : mPasswd) .append(", SubDMAccUsername: ") .append(mSubscriptionUpdateUsername == null ? none : mSubscriptionUpdateUsername) .append(", SubDMAccPassword: ") .append(mSubscriptionUpdatePassword == null ? none : mSubscriptionUpdatePassword) .append(", PolDMAccUsername: ") .append(mPolicyUpdateUsername == null ? none : mPolicyUpdateUsername) .append(", PolDMAccPassword: ") .append(mPolicyUpdatePassword == null ? none : mPolicyUpdatePassword) .append(", Imsi: ").append(mImsi == null ? none : mImsi) .append(", Mcc: ").append(mMcc == null ? none : mMcc) .append(", Mnc: ").append(mMnc == null ? none : mMnc) .append(", CaRootCert: ").append(mCaRootCert == null ? none : mCaRootCert) .append(", Realm: ").append(mRealm == null ? none : mRealm) .append(", Priority: ").append(mCrednetialPriority) .append(", Fqdn: ").append(mHomeSpFqdn == null ? none : mHomeSpFqdn) .append(", Otherhomepartners: ") .append(mOtherHomePartnerList == null ? none : mOtherHomePartnerList) .append(", ExpirationDate: ") .append(mExpirationDate == null ? none : mExpirationDate) .append(", MaxBssLoad: ").append(mMaxBssLoad == null ? none : mMaxBssLoad) .append(", SPExclusionList: ").append(mSpExclusionList); if (mPreferredRoamingPartnerList != null) { sb.append("PreferredRoamingPartnerList:"); for (WifiPasspointDmTree.PreferredRoamingPartnerList prpListItem : mPreferredRoamingPartnerList) { sb.append("[fqdnmatch:").append(prpListItem.FQDN_Match). append(", priority:").append(prpListItem.Priority). append(", country:").append(prpListItem.Country).append("]"); } } if (mHomeOIList != null) { sb.append("HomeOIList:"); for (WifiPasspointDmTree.HomeOIList HomeOIListItem : mHomeOIList) { sb.append("[HomeOI:").append(HomeOIListItem.HomeOI). append(", HomeOIRequired:").append(HomeOIListItem.HomeOIRequired). append("]"); } } if (mMinBackhaulThresholdNetwork != null) { sb.append("BackHaulThreshold:"); for (WifiPasspointDmTree.MinBackhaulThresholdNetwork BhtListItem : mMinBackhaulThresholdNetwork) { sb.append("[networkType:").append(BhtListItem.NetworkType). append(", dlBandwidth:").append(BhtListItem.DLBandwidth). append(", ulBandwidth:").append(BhtListItem.ULBandwidth). append("]"); } } if (mRequiredProtoPortTuple != null) { sb.append("WifiMORequiredProtoPortTupleList:"); for (WifiPasspointDmTree.RequiredProtoPortTuple RpptListItem : mRequiredProtoPortTuple) { sb.append("[IPProtocol:").append(RpptListItem.IPProtocol). append(", PortNumber:").append(RpptListItem.PortNumber). append("]"); } } } return sb.toString(); } /** Implement the Parcelable interface {@hide} */ public int describeContents() { return 0; } /** Implement the Parcelable interface {@hide} */ public void writeToParcel(Parcel dest, int flags) { dest.writeString(mWifiSpFqdn); dest.writeString(mCredentialName); dest.writeString(mType); dest.writeInt(mCrednetialPriority); dest.writeString(mHomeSpFqdn); dest.writeString(mRealm); } /** Implement the Parcelable interface {@hide} */ public void readFromParcel(Parcel in) { mWifiSpFqdn = in.readString(); mCredentialName = in.readString(); mType = in.readString(); mCrednetialPriority = in.readInt(); mHomeSpFqdn = in.readString(); mRealm = in.readString(); } /** Implement the Parcelable interface {@hide} */ public static final Creator<WifiPasspointCredential> CREATOR = new Creator<WifiPasspointCredential>() { public WifiPasspointCredential createFromParcel(Parcel in) { WifiPasspointCredential pc = new WifiPasspointCredential(); pc.mWifiSpFqdn = in.readString(); pc.mCredentialName = in.readString(); pc.mType = in.readString(); pc.mCrednetialPriority = in.readInt(); pc.mHomeSpFqdn = in.readString(); pc.mRealm = in.readString(); return pc; } public WifiPasspointCredential[] newArray(int size) { return new WifiPasspointCredential[size]; } }; /** @hide */ public int compareTo(WifiPasspointCredential another) { //The smaller the higher if (mCrednetialPriority < another.mCrednetialPriority) { return -1; } else if (mCrednetialPriority == another.mCrednetialPriority) { return this.mType.compareTo(another.mType); } else { return 1; } } @Override /** @hide */ public int hashCode() { int hash = 208; if (mType != null) { hash += mType.hashCode(); } if (mRealm != null) { hash += mRealm.hashCode(); } if (mHomeSpFqdn != null) { hash += mHomeSpFqdn.hashCode(); } if (mUsername != null) { hash += mUsername.hashCode(); } if (mPasswd != null) { hash += mPasswd.hashCode(); } return hash; } }