Matt Caswell 32ec41539b Server side version negotiation rewrite
This commit changes the way that we do server side protocol version
negotiation. Previously we had a whole set of code that had an "up front"
state machine dedicated to the negotiating the protocol version. This adds
significant complexity to the state machine. Historically the justification
for doing this was the support of SSLv2 which works quite differently to
SSLv3+. However, we have now removed support for SSLv2 so there is little
reason to maintain this complexity.

The one slight difficulty is that, although we no longer support SSLv2, we
do still support an SSLv3+ ClientHello in an SSLv2 backward compatible
ClientHello format. This is generally only used by legacy clients. This
commit adds support within the SSLv3 code for these legacy format
ClientHellos.

Server side version negotiation now works in much the same was as DTLS,
i.e. we introduce the concept of TLS_ANY_VERSION. If s->version is set to
that then when a ClientHello is received it will work out the most
appropriate version to respond with. Also, SSLv23_method and
SSLv23_server_method have been replaced with TLS_method and
TLS_server_method respectively. The old SSLv23* names still exist as
macros pointing at the new name, although they are deprecated.

Subsequent commits will look at client side version negotiation, as well of
removal of the old s23* code.

Reviewed-by: Kurt Roeckx <kurt@openssl.org>
2015-05-16 09:19:56 +01:00
..
2001-09-17 19:07:00 +00:00
2001-09-17 19:07:00 +00:00
2015-01-22 09:20:09 +00:00
2015-01-22 09:20:09 +00:00

easy_tls - generic SSL/TLS proxy
========

(... and example for non-blocking SSL/TLS I/O multiplexing.)


  easy_tls.c, easy_tls.h:

     Small generic SSL/TLS proxy library: With a few function calls,
     an application socket will be replaced by a pipe handled by a
     separate SSL/TLS proxy process.  This allows easily adding
     SSL/TLS support to many programs not originally designed for it.

     [Actually easy_tls.c is not a proper library: Customization
     requires defining preprocessor macros while compiling it.
     This is quite confusing, so I'll probably change it.]

     These files may be used under the OpenSSL license.



  test.c, test.h, Makefile, cert.pem, cacerts.pem:

     Rudimentary example program using the easy_tls library, and
     example key and certificates for it.  Usage examples:

       $ ./test 8443     # create server listening at port 8443
       $ ./test 127.0.0.1 8443  # create client, connect to port 8443
                                # at IP address 127.0.0.1

     'test' will not automatically do SSL/TLS, or even read or write
     data -- it must be told to do so on input lines starting
     with a command letter.  'W' means write a line, 'R' means
     read a line, 'C' means close the connection, 'T' means
     start an SSL/TLS proxy.  E.g. (user input tagged with '*'):

     * R
       <<< 220 mail.example.net
     * WSTARTTLS
       >>> STARTTLS
     * R
       <<< 220 Ready to start TLS
     * T
       test_process_init(fd = 3, client_p = 1, apparg = (nil))
       +++ `E:self signed certificate in certificate chain'
       +++ `<... certificate info ...>'
     * WHELO localhost
       >>> HELO localhost
       R
       <<< 250 mail.example.net

     You can even do SSL/TLS over SSL/TLS over SSL/TLS ... by using
     'T' multiple times.  I have no idea why you would want to though.


This code is rather old.  When I find time I will update anything that
should be changed, and improve code comments.  To compile the sample
program 'test' on platforms other then Linux or Solaris, you will have
to edit the Makefile.

As noted above, easy_tls.c will be changed to become a library one
day, which means that future revisions will not be fully compatible to
the current version.

Bodo M<>ller <bodo@openssl.org>