16a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistpackage com.android.server.wifi.anqp; 26a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 307f11f6f2ee7ec17cb08180035dfb5002aaaf5dfJan Nordqvistimport com.android.server.wifi.SIMAccessor; 4866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvistimport com.android.server.wifi.hotspot2.AuthMatch; 5866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvistimport com.android.server.wifi.hotspot2.Utils; 6866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvistimport com.android.server.wifi.hotspot2.pps.Credential; 7866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvistimport com.android.server.wifi.hotspot2.pps.HomeSP; 8866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist 96a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport java.net.ProtocolException; 106a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport java.nio.ByteBuffer; 116a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport java.util.ArrayList; 126a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport java.util.Collections; 136a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport java.util.List; 146a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 156a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport static com.android.server.wifi.anqp.Constants.BYTES_IN_SHORT; 166a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistimport static com.android.server.wifi.anqp.Constants.SHORT_MASK; 176a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 186a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist/** 196a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist * The NAI Realm ANQP Element, IEEE802.11-2012 section 8.4.4.10 206a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist */ 216a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvistpublic class NAIRealmElement extends ANQPElement { 226a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist private final List<NAIRealmData> mRealmData; 236a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 246a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist public NAIRealmElement(Constants.ANQPElementType infoID, ByteBuffer payload) 256a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist throws ProtocolException { 266a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist super(infoID); 276a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 286a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist if (!payload.hasRemaining()) { 296a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist mRealmData = Collections.emptyList(); 306a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist return; 316a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 326a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 336a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist if (payload.remaining() < BYTES_IN_SHORT) { 346a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist throw new ProtocolException("Runt NAI Realm: " + payload.remaining()); 356a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 366a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 376a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist int count = payload.getShort() & SHORT_MASK; 38866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist mRealmData = new ArrayList<>(count); 396a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist while (count > 0) { 406a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist mRealmData.add(new NAIRealmData(payload)); 416a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist count--; 426a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 436a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 446a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 456a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist public List<NAIRealmData> getRealmData() { 466a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist return Collections.unmodifiableList(mRealmData); 476a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 486a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist 49c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist public int match(Credential credential) { 50866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist if (mRealmData.isEmpty()) 51866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist return AuthMatch.Indeterminate; 52866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist 53866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist List<String> credLabels = Utils.splitDomain(credential.getRealm()); 54c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist int best = AuthMatch.None; 55866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist for (NAIRealmData realmData : mRealmData) { 56c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist int match = realmData.match(credLabels, credential); 57c2db1a4ff61fdf72be070e0c1cb739e755760bf3Jan Nordqvist if (match > best) { 58866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist best = match; 59866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist if (best == AuthMatch.Exact) { 60866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist return best; 61866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist } 62866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist } 63866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist } 64866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist return best; 65866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist } 66866c5b061e6e762f2627e3467afc0fe6f29c2668Jan Nordqvist 676a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist @Override 686a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist public String toString() { 697b2caa25fb57f2d95e0d0421704c49d3af4b8e6fJan Nordqvist StringBuilder sb = new StringBuilder(); 7077f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist sb.append("NAI Realm:\n"); 717b2caa25fb57f2d95e0d0421704c49d3af4b8e6fJan Nordqvist for (NAIRealmData data : mRealmData) { 727b2caa25fb57f2d95e0d0421704c49d3af4b8e6fJan Nordqvist sb.append(data); 737b2caa25fb57f2d95e0d0421704c49d3af4b8e6fJan Nordqvist } 747b2caa25fb57f2d95e0d0421704c49d3af4b8e6fJan Nordqvist return sb.toString(); 756a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist } 766a3903fed590e369b576bddbe1ae2d788768ddfeJan Nordqvist} 77