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"; } }