Home | History | Annotate | Download | only in pps
      1 package com.android.hotspot2.pps;
      2 
      3 import android.text.TextUtils;
      4 import android.util.Base64;
      5 
      6 import com.android.anqp.eap.EAPMethod;
      7 import com.android.hotspot2.IMSIParameter;
      8 import com.android.hotspot2.Utils;
      9 import com.android.hotspot2.omadm.OMAException;
     10 
     11 import java.nio.charset.StandardCharsets;
     12 import java.util.Arrays;
     13 
     14 public class Credential {
     15     public enum CertType {IEEE, x509v3}
     16 
     17     public static final String CertTypeX509 = "x509v3";
     18     public static final String CertTypeIEEE = "802.1ar";
     19 
     20     private final long mCtime;
     21     private final long mExpTime;
     22     private final String mRealm;
     23     private final boolean mCheckAAACert;
     24 
     25     private final String mUserName;
     26     private final String mPassword;
     27     private final boolean mDisregardPassword;
     28     private final boolean mMachineManaged;
     29     private final String mSTokenApp;
     30     private final boolean mShare;
     31     private final EAPMethod mEAPMethod;
     32 
     33     private final CertType mCertType;
     34     private final byte[] mFingerPrint;
     35 
     36     private final IMSIParameter mImsi;
     37 
     38     public Credential(long ctime, long expTime, String realm, boolean checkAAACert,
     39                       EAPMethod eapMethod, String userName, String password,
     40                       boolean machineManaged, String stApp, boolean share) {
     41         mCtime = ctime;
     42         mExpTime = expTime;
     43         mRealm = realm;
     44         mCheckAAACert = checkAAACert;
     45         mEAPMethod = eapMethod;
     46         mUserName = userName;
     47 
     48         if (!TextUtils.isEmpty(password)) {
     49             byte[] pwOctets = Base64.decode(password, Base64.DEFAULT);
     50             mPassword = new String(pwOctets, StandardCharsets.UTF_8);
     51         } else {
     52             mPassword = null;
     53         }
     54         mDisregardPassword = false;
     55 
     56         mMachineManaged = machineManaged;
     57         mSTokenApp = stApp;
     58         mShare = share;
     59 
     60         mCertType = null;
     61         mFingerPrint = null;
     62 
     63         mImsi = null;
     64     }
     65 
     66     public Credential(long ctime, long expTime, String realm, boolean checkAAACert,
     67                       EAPMethod eapMethod, Credential.CertType certType, byte[] fingerPrint) {
     68         mCtime = ctime;
     69         mExpTime = expTime;
     70         mRealm = realm;
     71         mCheckAAACert = checkAAACert;
     72         mEAPMethod = eapMethod;
     73         mCertType = certType;
     74         mFingerPrint = fingerPrint;
     75 
     76         mUserName = null;
     77         mPassword = null;
     78         mDisregardPassword = false;
     79         mMachineManaged = false;
     80         mSTokenApp = null;
     81         mShare = false;
     82 
     83         mImsi = null;
     84     }
     85 
     86     public Credential(long ctime, long expTime, String realm, boolean checkAAACert,
     87                       EAPMethod eapMethod, IMSIParameter imsi) {
     88         mCtime = ctime;
     89         mExpTime = expTime;
     90         mRealm = realm;
     91         mCheckAAACert = checkAAACert;
     92         mEAPMethod = eapMethod;
     93         mImsi = imsi;
     94 
     95         mCertType = null;
     96         mFingerPrint = null;
     97 
     98         mUserName = null;
     99         mPassword = null;
    100         mDisregardPassword = false;
    101         mMachineManaged = false;
    102         mSTokenApp = null;
    103         mShare = false;
    104     }
    105 
    106     public Credential(Credential other, String password) {
    107         mCtime = other.mCtime;
    108         mExpTime = other.mExpTime;
    109         mRealm = other.mRealm;
    110         mCheckAAACert = other.mCheckAAACert;
    111         mUserName = other.mUserName;
    112         mPassword = password;
    113         mDisregardPassword = other.mDisregardPassword;
    114         mMachineManaged = other.mMachineManaged;
    115         mSTokenApp = other.mSTokenApp;
    116         mShare = other.mShare;
    117         mEAPMethod = other.mEAPMethod;
    118         mCertType = other.mCertType;
    119         mFingerPrint = other.mFingerPrint;
    120         mImsi = other.mImsi;
    121     }
    122 
    123     public static CertType mapCertType(String certType) throws OMAException {
    124         if (certType.equalsIgnoreCase(CertTypeX509)) {
    125             return CertType.x509v3;
    126         } else if (certType.equalsIgnoreCase(CertTypeIEEE)) {
    127             return CertType.IEEE;
    128         } else {
    129             throw new OMAException("Invalid cert type: '" + certType + "'");
    130         }
    131     }
    132 
    133     public EAPMethod getEAPMethod() {
    134         return mEAPMethod;
    135     }
    136 
    137     public String getRealm() {
    138         return mRealm;
    139     }
    140 
    141     public IMSIParameter getImsi() {
    142         return mImsi;
    143     }
    144 
    145     public String getUserName() {
    146         return mUserName;
    147     }
    148 
    149     public String getPassword() {
    150         return mPassword;
    151     }
    152 
    153     public boolean hasDisregardPassword() {
    154         return mDisregardPassword;
    155     }
    156 
    157     public CertType getCertType() {
    158         return mCertType;
    159     }
    160 
    161     public byte[] getFingerPrint() {
    162         return mFingerPrint;
    163     }
    164 
    165     public long getCtime() {
    166         return mCtime;
    167     }
    168 
    169     public long getExpTime() {
    170         return mExpTime;
    171     }
    172 
    173     @Override
    174     public boolean equals(Object o) {
    175         if (this == o) return true;
    176         if (o == null || getClass() != o.getClass()) return false;
    177 
    178         Credential that = (Credential) o;
    179 
    180         if (mCheckAAACert != that.mCheckAAACert) return false;
    181         if (mCtime != that.mCtime) return false;
    182         if (mExpTime != that.mExpTime) return false;
    183         if (mMachineManaged != that.mMachineManaged) return false;
    184         if (mShare != that.mShare) return false;
    185         if (mCertType != that.mCertType) return false;
    186         if (!mEAPMethod.equals(that.mEAPMethod)) return false;
    187         if (!Arrays.equals(mFingerPrint, that.mFingerPrint)) return false;
    188         if (!safeEquals(mImsi, that.mImsi)) {
    189             return false;
    190         }
    191 
    192         if (!mDisregardPassword && !safeEquals(mPassword, that.mPassword)) {
    193             return false;
    194         }
    195 
    196         if (!mRealm.equals(that.mRealm)) return false;
    197         if (!safeEquals(mSTokenApp, that.mSTokenApp)) {
    198             return false;
    199         }
    200         if (!safeEquals(mUserName, that.mUserName)) {
    201             return false;
    202         }
    203 
    204         return true;
    205     }
    206 
    207     private static boolean safeEquals(Object s1, Object s2) {
    208         if (s1 == null) {
    209             return s2 == null;
    210         } else {
    211             return s2 != null && s1.equals(s2);
    212         }
    213     }
    214 
    215     @Override
    216     public int hashCode() {
    217         int result = (int) (mCtime ^ (mCtime >>> 32));
    218         result = 31 * result + (int) (mExpTime ^ (mExpTime >>> 32));
    219         result = 31 * result + mRealm.hashCode();
    220         result = 31 * result + (mCheckAAACert ? 1 : 0);
    221         result = 31 * result + (mUserName != null ? mUserName.hashCode() : 0);
    222         result = 31 * result + (mPassword != null ? mPassword.hashCode() : 0);
    223         result = 31 * result + (mMachineManaged ? 1 : 0);
    224         result = 31 * result + (mSTokenApp != null ? mSTokenApp.hashCode() : 0);
    225         result = 31 * result + (mShare ? 1 : 0);
    226         result = 31 * result + mEAPMethod.hashCode();
    227         result = 31 * result + (mCertType != null ? mCertType.hashCode() : 0);
    228         result = 31 * result + (mFingerPrint != null ? Arrays.hashCode(mFingerPrint) : 0);
    229         result = 31 * result + (mImsi != null ? mImsi.hashCode() : 0);
    230         return result;
    231     }
    232 
    233     @Override
    234     public String toString() {
    235         return "Credential{" +
    236                 "mCtime=" + Utils.toUTCString(mCtime) +
    237                 ", mExpTime=" + Utils.toUTCString(mExpTime) +
    238                 ", mRealm='" + mRealm + '\'' +
    239                 ", mCheckAAACert=" + mCheckAAACert +
    240                 ", mUserName='" + mUserName + '\'' +
    241                 ", mPassword='" + mPassword + '\'' +
    242                 ", mDisregardPassword=" + mDisregardPassword +
    243                 ", mMachineManaged=" + mMachineManaged +
    244                 ", mSTokenApp='" + mSTokenApp + '\'' +
    245                 ", mShare=" + mShare +
    246                 ", mEAPMethod=" + mEAPMethod +
    247                 ", mCertType=" + mCertType +
    248                 ", mFingerPrint=" + Utils.toHexString(mFingerPrint) +
    249                 ", mImsi='" + mImsi + '\'' +
    250                 '}';
    251     }
    252 }
    253