package com.android.anqp.eap;
import java.net.ProtocolException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import static com.android.anqp.Constants.BYTE_MASK;
import static com.android.anqp.Constants.INT_MASK;
import static com.android.anqp.Constants.SHORT_MASK;
/**
* An EAP authentication parameter, IEEE802.11-2012, table 8-188
*/
public class ExpandedEAPMethod implements AuthParam {
private final EAP.AuthInfoID mAuthInfoID;
private final int mVendorID;
private final long mVendorType;
public ExpandedEAPMethod(EAP.AuthInfoID authInfoID, int length, ByteBuffer payload)
throws ProtocolException {
if (length != 7) {
throw new ProtocolException("Bad length: " + payload.remaining());
}
mAuthInfoID = authInfoID;
ByteBuffer vndBuffer = payload.duplicate().order(ByteOrder.BIG_ENDIAN);
int id = vndBuffer.getShort() & SHORT_MASK;
id = (id << Byte.SIZE) | (vndBuffer.get() & BYTE_MASK);
mVendorID = id;
mVendorType = vndBuffer.getInt() & INT_MASK;
payload.position(payload.position()+7);
}
public ExpandedEAPMethod(EAP.AuthInfoID authInfoID, int vendorID, long vendorType) {
mAuthInfoID = authInfoID;
mVendorID = vendorID;
mVendorType = vendorType;
}
@Override
public EAP.AuthInfoID getAuthInfoID() {
return mAuthInfoID;
}
@Override
public int hashCode() {
return (mAuthInfoID.hashCode() * 31 + mVendorID) * 31 + (int) mVendorType;
}
@Override
public boolean equals(Object thatObject) {
if (thatObject == this) {
return true;
} else if (thatObject == null || thatObject.getClass() != ExpandedEAPMethod.class) {
return false;
} else {
ExpandedEAPMethod that = (ExpandedEAPMethod) thatObject;
return that.getVendorID() == getVendorID() && that.getVendorType() == getVendorType();
}
}
public int getVendorID() {
return mVendorID;
}
public long getVendorType() {
return mVendorType;
}
@Override
public String toString() {
return "Auth method " + mAuthInfoID + ", id " + mVendorID + ", type " + mVendorType + "\n";
}
}