• B
    Add SSL_CTX early callback · 6b1bb98f
    Benjamin Kaduk 提交于
    Provide a callback interface that gives the application the ability
    to adjust the nascent SSL object at the earliest stage of ClientHello
    processing, immediately after extensions have been collected but
    before they have been processed.
    
    This is akin to BoringSSL's "select_certificate_cb" (though it is not
    API compatible), and as the name indicates, one major use is to examine
    the supplied server name indication and select what certificate to
    present to the client.  However, it can also be used to make more
    sweeping configuration changes to the SSL object according to the
    selected server identity and configuration.  That may include adjusting
    the permitted TLS versions, swapping out the SSL_CTX object (as is
    traditionally done in a tlsext_servername_callback), changing the
    server's cipher list, and more.
    
    We also wish to allow an early callback to indicate that it needs to perform
    additional work asynchronously and resume processing later.  To that effect,
    refactor the second half of tls_process_client_hello() into a subroutine to be
    called at the post-processing stage (including the early callback itself), to
    allow the callback to result in remaining in the same work stage for a later
    call to succeed.  This requires allocating for and storing the CLIENTHELLO_MSG
    in the SSL object to be preserved across such calls, but the storage is
    reclaimed after ClientHello processing finishes.
    
    Information about the CliehtHello is available to the callback by means of
    accessor functions that can only be used from the early callback.  This allows
    extensions to make use of the existing internal parsing machinery without
    exposing structure internals (e.g., of PACKET), so that applications do not
    have to write fragile parsing code.
    
    Applications are encouraged to utilize an early callback and not use
    a servername_callback, in order to avoid unexpected behavior that
    occurs due to the relative order of processing between things like
    session resumption and the historical servername callback.
    
    Also tidy up nearby style by removing unnecessary braces around one-line
    conditional bodies.
    Reviewed-by: NMatt Caswell <matt@openssl.org>
    Reviewed-by: NRichard Levitte <levitte@openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/2279)
    6b1bb98f
ssl_locl.h 90.4 KB