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