using System; using System.Collections.Generic; using System.IO; namespace Org.BouncyCastle.Tls { public interface TlsClient : TlsPeer { void Init(TlsClientContext context); /// Return the session this client wants to resume, if any. /// /// Note that the peer's certificate chain for the session (if any) may need to be periodically revalidated. /// /// A representing the resumable session to be used for this connection, or /// null to use a new session. /// TlsSession GetSessionToResume(); /// Return the external PSKs to offer in the ClientHello. /// This will only be called when TLS 1.3 or higher is amongst the offered protocol versions. /// an of instances, or null if none should be /// offered. IList GetExternalPsks(); bool IsFallback(); /// (Int32 -> byte[]) /// IDictionary GetClientExtensions(); /// If this client is offering TLS 1.3 or higher, this method may be called to determine for which /// groups a key share should be included in the initial ClientHello. /// /// Groups that were not included in the supported_groups extension (by will /// be ignored. The protocol will then add a suitable key_share extension to the ClientHello extensions. /// /// an of named group values, possibly empty or /// null. /// IList GetEarlyKeyShareGroups(); // TODO[api] //bool ShouldUseCompatibilityMode(); /// void NotifyServerVersion(ProtocolVersion selectedVersion); /// Notifies the client of the session that will be offered in ClientHello for resumption, if any. /// /// /// This will be either the session returned from {@link #getSessionToResume()} or null if that session was /// unusable. NOTE: the actual negotiated session_id is notified by . /// /// The representing the resumable session to be offered for /// this connection, or null if there is none. /// void NotifySessionToResume(TlsSession session); /// Notifies the client of the session_id sent in the ServerHello. /// /// void NotifySessionID(byte[] sessionID); void NotifySelectedCipherSuite(int selectedCipherSuite); /// void NotifySelectedPsk(TlsPsk selectedPsk); /// The protocol implementation validates that any server extensions received correspond to client /// extensions sent. /// /// If further processing of the server extensions is needed, it can be done in this callback. NOTE: This is /// not called for session resumption handshakes. /// /// (Int32 -> byte[]) /// void ProcessServerExtensions(IDictionary serverExtensions); /// (SupplementalDataEntry) /// void ProcessServerSupplementalData(IList serverSupplementalData); /// TlsPskIdentity GetPskIdentity(); /// TlsSrpIdentity GetSrpIdentity(); /// TlsDHGroupVerifier GetDHGroupVerifier(); /// TlsSrpConfigVerifier GetSrpConfigVerifier(); /// TlsAuthentication GetAuthentication(); /// (SupplementalDataEntry) /// IList GetClientSupplementalData(); /// RFC 5077 3.3. NewSessionTicket Handshake Message /// /// This method will be called (only) when a NewSessionTicket handshake message is received. The ticket is /// opaque to the client and clients MUST NOT examine the ticket under the assumption that it complies with e.g. /// RFC 5077 4. "Recommended Ticket Construction". /// /// The ticket. /// void NotifyNewSessionTicket(NewSessionTicket newSessionTicket); } }