SessionParameters
using Org.BouncyCastle.Tls.Crypto;
using Org.BouncyCastle.Utilities;
using System;
using System.Collections.Generic;
using System.IO;
namespace Org.BouncyCastle.Tls
{
    public sealed class SessionParameters
    {
        public sealed class Builder
        {
            private int m_cipherSuite = -1;
            private Certificate m_localCertificate;
            private TlsSecret m_masterSecret;
            private ProtocolVersion m_negotiatedVersion;
            private Certificate m_peerCertificate;
            private byte[] m_pskIdentity;
            private byte[] m_srpIdentity;
            private byte[] m_encodedServerExtensions;
            private bool m_extendedMasterSecret;
            public SessionParameters Build()
            {
                Validate(m_cipherSuite >= 0, "cipherSuite");
                Validate(m_masterSecret != null, "masterSecret");
                return new SessionParameters(m_cipherSuite, m_localCertificate, m_masterSecret, m_negotiatedVersion, m_peerCertificate, m_pskIdentity, m_srpIdentity, m_encodedServerExtensions, m_extendedMasterSecret);
            }
            public Builder SetCipherSuite(int cipherSuite)
            {
                m_cipherSuite = cipherSuite;
                return this;
            }
            public Builder SetExtendedMasterSecret(bool extendedMasterSecret)
            {
                m_extendedMasterSecret = extendedMasterSecret;
                return this;
            }
            public Builder SetLocalCertificate(Certificate localCertificate)
            {
                m_localCertificate = localCertificate;
                return this;
            }
            public Builder SetMasterSecret(TlsSecret masterSecret)
            {
                m_masterSecret = masterSecret;
                return this;
            }
            public Builder SetNegotiatedVersion(ProtocolVersion negotiatedVersion)
            {
                m_negotiatedVersion = negotiatedVersion;
                return this;
            }
            public Builder SetPeerCertificate(Certificate peerCertificate)
            {
                m_peerCertificate = peerCertificate;
                return this;
            }
            public Builder SetPskIdentity(byte[] pskIdentity)
            {
                m_pskIdentity = pskIdentity;
                return this;
            }
            public Builder SetSrpIdentity(byte[] srpIdentity)
            {
                m_srpIdentity = srpIdentity;
                return this;
            }
            public Builder SetServerExtensions(IDictionary<int, byte[]> serverExtensions)
            {
                if (serverExtensions == null || serverExtensions.Count < 1)
                    m_encodedServerExtensions = null;
                else {
                    MemoryStream memoryStream = new MemoryStream();
                    TlsProtocol.WriteExtensions(memoryStream, serverExtensions);
                    m_encodedServerExtensions = memoryStream.ToArray();
                }
                return this;
            }
            private void Validate(bool condition, string parameter)
            {
                if (!condition)
                    throw new InvalidOperationException("Required session parameter '" + parameter + "' not configured");
            }
        }
        private readonly int m_cipherSuite;
        private readonly Certificate m_localCertificate;
        private readonly TlsSecret m_masterSecret;
        private readonly ProtocolVersion m_negotiatedVersion;
        private readonly Certificate m_peerCertificate;
        private readonly byte[] m_pskIdentity;
        private readonly byte[] m_srpIdentity;
        private readonly byte[] m_encodedServerExtensions;
        private readonly bool m_extendedMasterSecret;
        public int CipherSuite => m_cipherSuite;
        public bool IsExtendedMasterSecret => m_extendedMasterSecret;
        public Certificate LocalCertificate => m_localCertificate;
        public TlsSecret MasterSecret => m_masterSecret;
        public ProtocolVersion NegotiatedVersion => m_negotiatedVersion;
        public Certificate PeerCertificate => m_peerCertificate;
        public byte[] PskIdentity => m_pskIdentity;
        public byte[] SrpIdentity => m_srpIdentity;
        private SessionParameters(int cipherSuite, Certificate localCertificate, TlsSecret masterSecret, ProtocolVersion negotiatedVersion, Certificate peerCertificate, byte[] pskIdentity, byte[] srpIdentity, byte[] encodedServerExtensions, bool extendedMasterSecret)
        {
            m_cipherSuite = cipherSuite;
            m_localCertificate = localCertificate;
            m_masterSecret = masterSecret;
            m_negotiatedVersion = negotiatedVersion;
            m_peerCertificate = peerCertificate;
            m_pskIdentity = Arrays.Clone(pskIdentity);
            m_srpIdentity = Arrays.Clone(srpIdentity);
            m_encodedServerExtensions = encodedServerExtensions;
            m_extendedMasterSecret = extendedMasterSecret;
        }
        public void Clear()
        {
            if (m_masterSecret != null)
                m_masterSecret.Destroy();
        }
        public SessionParameters Copy()
        {
            return new SessionParameters(m_cipherSuite, m_localCertificate, m_masterSecret, m_negotiatedVersion, m_peerCertificate, m_pskIdentity, m_srpIdentity, m_encodedServerExtensions, m_extendedMasterSecret);
        }
        public IDictionary<int, byte[]> ReadServerExtensions()
        {
            if (m_encodedServerExtensions == null)
                return null;
            return TlsProtocol.ReadExtensions(new MemoryStream(m_encodedServerExtensions, false));
        }
    }
}