Hi,

As discusses in #openvpn-devel on IRC, this patch breaks interop with
clients that don't pull, but that will be restored in a follow-up
refactoring (before 2.5 rc1). I can live with that, but I think this
should be mentioned in the commit message.

On 07-07-2020 14:16, Arne Schwabe wrote:
> Ever since the NCPv2 the ncp_get_best_cipher uses the global
> options->ncp_enabled option and ignore the tls_session->ncp_enabled
> option.
> 
> The server side's poor man's NCP is implemented as seeing the list
> of supported ciphers from the peer as just one cipher so this special
> handling for poor man's NCP of the older NCP here is not needed anymore.
> 
> Theoretically we can now get rid of tls_session->ncp_enabled but doing
> so requires more refactoring since options is not available in the
> methods that still use it. And when we remove ncp-disable the variable
> will be removed anyway.
> 
> Also document the remaining usage of tls_poor_mans_ncp better.
> 
> Signed-off-by: Arne Schwabe <a...@rfc2549.org>
> ---
>  src/openvpn/init.c |  2 ++
>  src/openvpn/ssl.c  | 15 +--------------
>  2 files changed, 3 insertions(+), 14 deletions(-)
> 
> diff --git a/src/openvpn/init.c b/src/openvpn/init.c
> index 91b919d5..e9c01629 100644
> --- a/src/openvpn/init.c
> +++ b/src/openvpn/init.c
> @@ -2376,6 +2376,8 @@ do_deferred_options(struct context *c, const unsigned 
> int found)
>          }
>          else if (c->options.ncp_enabled)
>          {
> +            /* If the server did not push a --cipher, we will switch to the
> +             * remote cipher if it is in our ncp-ciphers list */
>              tls_poor_mans_ncp(&c->options, 
> c->c2.tls_multi->remote_ciphername);
>          }
>          struct frame *frame_fragment = NULL;
> diff --git a/src/openvpn/ssl.c b/src/openvpn/ssl.c
> index 9df7552d..71565dd3 100644
> --- a/src/openvpn/ssl.c
> +++ b/src/openvpn/ssl.c
> @@ -2463,8 +2463,7 @@ key_method_2_write(struct buffer *buf, struct 
> tls_session *session)
>       * generation is postponed until after the pull/push, so we can process 
> pushed
>       * cipher directives.
>       */
> -    if (session->opt->server && !(session->opt->ncp_enabled
> -                                  && session->opt->mode == MODE_SERVER && 
> ks->key_id <= 0))
> +    if (session->opt->server && !(session->opt->mode == MODE_SERVER && 
> ks->key_id <= 0))
>      {
>          if (ks->authenticated != KS_AUTH_FALSE)
>          {
> @@ -2616,18 +2615,6 @@ key_method_2_read(struct buffer *buf, struct tls_multi 
> *multi, struct tls_sessio
>      multi->remote_ciphername =
>          options_string_extract_option(options, "cipher", NULL);
>  
> -    if (!tls_peer_supports_ncp(multi->peer_info))
> -    {
> -        /* Peer does not support NCP, but leave NCP enabled if the local and
> -         * remote cipher do not match to attempt 'poor-man's NCP'.
> -         */
> -        if (multi->remote_ciphername == NULL
> -            || 0 == strcmp(multi->remote_ciphername, 
> multi->opt.config_ciphername))
> -        {
> -            session->opt->ncp_enabled = false;
> -        }
> -    }
> -

This removes the last user of tls_peer_supports_ncp(), should that be
removed too?

Other than this I think this looks good and moves in the right
direction. I haven't tested this thoroughly. Since much of the logic
will be changing soon anyway, I think it's okay to move forward
nevertheless. But we do need some aggressive testing when all the
changes are in.

-Steffan


_______________________________________________
Openvpn-devel mailing list
Openvpn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel

Reply via email to