More .NET libraries
- 
                                
                                    
                                
                                Rebex Total Pack
                                All Rebex .NET libraries together
 
Back to feature list...
Easy-to-use TLS API
Simple Socket-like API
    Rebex TLS features TlsClientSocket and TlsServerSocket classes.
    Their API resembles .NET's System.Net.Sockets.Socket class, but with TLS-related features:
// create an instance of TLS client socket
var socket = new TlsClientSocket();
// connect to a server
socket.Connect("test.rebex.net", 990);
// negotiate a secure TLS session
socket.Negotiate();
// send data
byte[] request = new byte[] { 0x46, 0x45, 0x41, 0x54, 0x0D, 0x0A };
int bytesSent = socket.Send(request);
// receive data
byte[] response = new byte[1024];
int bytesRead = socket.Receive(response);
// ...
// close the socket
socket.Close();
string, the Send/Receive methods support a byte array type (byte[]).
    The Receive method also supports the object type, returning either a string or a byte array, depending
    on the message type received from the server.
TlsSocketClient/TlsServerSocket also support a Task-based asynchronous API.
Asynchronous API
Rebex TLS also features a Task-based asynchronous API that has been carefully optimized for high efficiency and scalability:
// connect to a server
await socket.ConnectAsync("test.rebex.net", 990);
// send a message
byte[] message = Encoding.UTF8.GetBytes("Hello!");
await socket.SendAsync(new ArraySegment<byte>(message));
TlsClientSocket also supports a synchronous variant of this API.
Server-side TLS
To implement a TLS server, use the following approach:
- Listen and accept connections using .NET's 
System.Net.Sockets.SocketAPI. - Once you accepted a connection, convert it to 
TlsServerSocket. - Set 
TlsServerSocketparameters and negotiate a secure TLS session with the TLS client. - Use 
TlsServerSocketto communicate with the TLS client. 
    The following code demonstrates the steps above in an easy-to-read form, and assumes you only need
    to handle a single connection at a time. In a real-world scenario, you would almost certainly want
    to either start a dedicated thread for each TlsServerSocket as soon as each connection is accepted,
    or (better) use TlsServerSocket's asynchronous API with await/async.
// load server certificate
var cert = CertificateChain.LoadPfx("myserver.pfx", "mypassword");
// create a listening socket (using System.Net.Sockets.Socket class)
var listener = new Socket(SocketType.Stream, ProtocolType.Tcp);
listener.Listen(16);
// accept an incoming connection
Socket plainSocket = listener.Accept();
// create an instance of TLS server socket
var socket = new TlsServerSocket(plainSocket);
// specify server certificate
socket.Parameters.Certificate = cert;
// negotiate a secure TLS session
socket.Negotiate();
// receive data
byte[] response = new byte[1024];
int bytesRead = socket.Receive(response);
// ...
// close the socket
socket.Close();
Settings and options
    In most scenarios, TlsClientSocket will be able to connect without any special configuration.
    In other cases, use the Parameters property to configure
    the TlsClientSocket instance before negotiating TLS:
// specify allowed TLS versions
socket.Parameters.Version = TlsVersion.TLS13 | TlsVersion.TLS12;
// set enabled TLS 1.3 ciphers
socket.Parameters.SetSymmetricCipherSuites(
    TlsSymmetricCipherSuite.TLS_AES_128_GCM_SHA256,
    TlsSymmetricCipherSuite.TLS_AES_256_GCM_SHA384,
    TlsSymmetricCipherSuite.TLS_CHACHA20_POLY1305_SHA256
    );
// set enabled TLS 1.2 ciphers
socket.Parameters.AllowedSuites =
    TlsCipherSuite.ECDHE_RSA_WITH_AES_128_GCM_SHA256 |
    TlsCipherSuite.ECDHE_RSA_WITH_AES_256_GCM_SHA384 |
    TlsCipherSuite.ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 |
    TlsCipherSuite.ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 |
    TlsCipherSuite.DHE_RSA_WITH_AES_128_GCM_SHA256 |
    TlsCipherSuite.DHE_RSA_WITH_AES_256_GCM_SHA384;
// specify allowed elliptic curves
socket.Parameters.AllowedCurves = TlsEllipticCurve.All;
// specify minimum allowed Diffie-Hellman key size
socket.Parameters.MinimumDiffieHellmanKeySize = 2048;
// specify server's 'common name' for certificate validation
// (useful if different that server host name)
socket.Parameters.CommonName = "test.rebex.net";
// connect to a server
socket.Connect(serverName, port);
// negotiate a secure TLS session
// using the specifed parameters
socket.Negotiate();
// start communicating
// ...
Back to feature list...