培训考核三期,新版培训,网页版培训登录器
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

92 lines
3.3 KiB

#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.Collections;
using System.IO;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.IO;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Tls
{
public sealed class ServerNameList
{
private readonly IList m_serverNameList;
/// <param name="serverNameList">an <see cref="IList"/> of <see cref="ServerName"/>.</param>
public ServerNameList(IList serverNameList)
{
if (null == serverNameList)
throw new ArgumentNullException("serverNameList");
this.m_serverNameList = serverNameList;
}
/// <returns>an <see cref="IList"/> of <see cref="ServerName"/>.</returns>
public IList ServerNames
{
get { return m_serverNameList; }
}
/// <summary>Encode this <see cref="ServerNameList"/> to a <see cref="Stream"/>.</summary>
/// <param name="output">the <see cref="Stream"/> to encode to .</param>
/// <exception cref="IOException"/>
public void Encode(Stream output)
{
MemoryStream buf = new MemoryStream();
short[] nameTypesSeen = TlsUtilities.EmptyShorts;
foreach (ServerName entry in ServerNames)
{
nameTypesSeen = CheckNameType(nameTypesSeen, entry.NameType);
if (null == nameTypesSeen)
throw new TlsFatalAlert(AlertDescription.internal_error);
entry.Encode(buf);
}
int length = (int)buf.Length;
TlsUtilities.CheckUint16(length);
TlsUtilities.WriteUint16(length, output);
Streams.WriteBufTo(buf, output);
}
/// <summary>Parse a <see cref="ServerNameList"/> from a <see cref="Stream"/>.</summary>
/// <param name="input">the <see cref="Stream"/> to parse from.</param>
/// <returns>a <see cref="ServerNameList"/> object.</returns>
/// <exception cref="IOException"/>
public static ServerNameList Parse(Stream input)
{
byte[] data = TlsUtilities.ReadOpaque16(input, 1);
MemoryStream buf = new MemoryStream(data, false);
short[] nameTypesSeen = TlsUtilities.EmptyShorts;
IList server_name_list = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateArrayList();
while (buf.Position < buf.Length)
{
ServerName entry = ServerName.Parse(buf);
nameTypesSeen = CheckNameType(nameTypesSeen, entry.NameType);
if (null == nameTypesSeen)
throw new TlsFatalAlert(AlertDescription.illegal_parameter);
server_name_list.Add(entry);
}
return new ServerNameList(server_name_list);
}
private static short[] CheckNameType(short[] nameTypesSeen, short nameType)
{
// RFC 6066 3. The ServerNameList MUST NOT contain more than one name of the same NameType.
if (Arrays.Contains(nameTypesSeen, nameType))
return null;
return Arrays.Append(nameTypesSeen, nameType);
}
}
}
#pragma warning restore
#endif