package org.bouncycastle.crypto.tls; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Vector; public class ServerNameList { protected Vector serverNameList; /** * @param serverNameList a {@link Vector} of {@link ServerName}. */ public ServerNameList(Vector serverNameList) { if (serverNameList == null || serverNameList.isEmpty()) { throw new IllegalArgumentException("'serverNameList' must not be null or empty"); } this.serverNameList = serverNameList; } /** * @return a {@link Vector} of {@link ServerName}. */ public Vector getServerNameList() { return serverNameList; } /** * Encode this {@link ServerNameList} to an {@link OutputStream}. * * @param output * the {@link OutputStream} to encode to. * @throws IOException */ public void encode(OutputStream output) throws IOException { ByteArrayOutputStream buf = new ByteArrayOutputStream(); for (int i = 0; i < serverNameList.size(); ++i) { ServerName entry = (ServerName)serverNameList.elementAt(i); entry.encode(buf); } TlsUtils.checkUint16(buf.size()); TlsUtils.writeUint16(buf.size(), output); buf.writeTo(output); } /** * Parse a {@link ServerNameList} from an {@link InputStream}. * * @param input * the {@link InputStream} to parse from. * @return a {@link ServerNameList} object. * @throws IOException */ public static ServerNameList parse(InputStream input) throws IOException { int length = TlsUtils.readUint16(input); if (length < 1) { throw new TlsFatalAlert(AlertDescription.decode_error); } byte[] data = TlsUtils.readFully(length, input); ByteArrayInputStream buf = new ByteArrayInputStream(data); Vector server_name_list = new Vector(); while (buf.available() > 0) { ServerName entry = ServerName.parse(buf); server_name_list.addElement(entry); } return new ServerNameList(server_name_list); } }