Hi,

Attached a v2 of the patch below, that removes the else to make the diff
a lot smaller and changes a //-style comment to /* */-style.

-Steffan

On 01-01-14 21:10, Steffan Karger wrote:
> This diff look like a lot has changed, but this just adds some ifs to check
> for NULL in tls_ctx_restrict_ciphers() to prepare for disabling export
> ciphers by default in OpenVPN 2.4+.
> 
> Signed-off-by: Steffan Karger <stef...@karger.me>
> ---
>  src/openvpn/ssl.c          |   5 +-
>  src/openvpn/ssl_backend.h  |   5 +-
>  src/openvpn/ssl_openssl.c  | 130 
> ++++++++++++++++++++++++++-------------------
>  src/openvpn/ssl_polarssl.c |   7 ++-
>  4 files changed, 85 insertions(+), 62 deletions(-)
> 
> diff --git a/src/openvpn/ssl.c b/src/openvpn/ssl.c
> index bd19d75..93222c4 100644
> --- a/src/openvpn/ssl.c
> +++ b/src/openvpn/ssl.c
> @@ -543,10 +543,7 @@ init_ssl (const struct options *options, struct 
> tls_root_ctx *new_ctx)
>      }
>  
>    /* Allowable ciphers */
> -  if (options->cipher_list)
> -    {
> -      tls_ctx_restrict_ciphers(new_ctx, options->cipher_list);
> -    }
> +  tls_ctx_restrict_ciphers(new_ctx, options->cipher_list);
>  
>  #ifdef ENABLE_CRYPTO_POLARSSL
>    /* Personalise the random by mixing in the certificate */
> diff --git a/src/openvpn/ssl_backend.h b/src/openvpn/ssl_backend.h
> index 54383fe..a6fc3bd 100644
> --- a/src/openvpn/ssl_backend.h
> +++ b/src/openvpn/ssl_backend.h
> @@ -167,8 +167,9 @@ void tls_ctx_set_options (struct tls_root_ctx *ctx, 
> unsigned int ssl_flags);
>  /**
>   * Restrict the list of ciphers that can be used within the TLS context.
>   *
> - * @param ctx                TLS context to restrict
> - * @param ciphers    String containing : delimited cipher names.
> + * @param ctx                TLS context to restrict, must be valid.
> + * @param ciphers    String containing : delimited cipher names, or NULL to 
> use
> + *                                   sane defaults.
>   */
>  void tls_ctx_restrict_ciphers(struct tls_root_ctx *ctx, const char *ciphers);
>  
> diff --git a/src/openvpn/ssl_openssl.c b/src/openvpn/ssl_openssl.c
> index 08327a1..5f6c270 100644
> --- a/src/openvpn/ssl_openssl.c
> +++ b/src/openvpn/ssl_openssl.c
> @@ -217,71 +217,91 @@ tls_ctx_set_options (struct tls_root_ctx *ctx, unsigned 
> int ssl_flags)
>  void
>  tls_ctx_restrict_ciphers(struct tls_root_ctx *ctx, const char *ciphers)
>  {
> -  size_t begin_of_cipher, end_of_cipher;
> -
> -  const char *current_cipher;
> -  size_t current_cipher_len;
> +  if (ciphers == NULL)
> +    {
> +      /* Nothing to do */
> +      return;
> +    }
> +  else
> +    {
> +      /* Parse supplied cipher list and pass on to OpenSSL */
> +      size_t begin_of_cipher, end_of_cipher;
>  
> -  const tls_cipher_name_pair *cipher_pair;
> +      const char *current_cipher;
> +      size_t current_cipher_len;
>  
> -  char openssl_ciphers[4096];
> -  size_t openssl_ciphers_len = 0;
> -  openssl_ciphers[0] = '\0';
> +      const tls_cipher_name_pair *cipher_pair;
>  
> -  ASSERT(NULL != ctx);
> +      char openssl_ciphers[4096];
> +      size_t openssl_ciphers_len = 0;
> +      openssl_ciphers[0] = '\0';
>  
> -  // Translate IANA cipher suite names to OpenSSL names
> -  begin_of_cipher = end_of_cipher = 0;
> -  for (; begin_of_cipher < strlen(ciphers); begin_of_cipher = end_of_cipher) 
> {
> -      end_of_cipher += strcspn(&ciphers[begin_of_cipher], ":");
> -      cipher_pair = tls_get_cipher_name_pair(&ciphers[begin_of_cipher], 
> end_of_cipher - begin_of_cipher);
> +      ASSERT(NULL != ctx);
>  
> -      if (NULL == cipher_pair)
> +      // Translate IANA cipher suite names to OpenSSL names
> +      begin_of_cipher = end_of_cipher = 0;
> +      for (; begin_of_cipher < strlen(ciphers); begin_of_cipher = 
> end_of_cipher)
>          {
> -          // No translation found, use original
> -          current_cipher = &ciphers[begin_of_cipher];
> -          current_cipher_len = end_of_cipher - begin_of_cipher;
> -
> -          // Issue warning on missing translation
> -          // %.*s format specifier expects length of type int, so guarantee
> -          // that length is small enough and cast to int.
> -          msg (M_WARN, "No valid translation found for TLS cipher '%.*s'",
> -                 constrain_int(current_cipher_len, 0, 256), current_cipher);
> -        }
> -      else
> -     {
> -       // Use OpenSSL name
> -          current_cipher = cipher_pair->openssl_name;
> -          current_cipher_len = strlen(current_cipher);
> -
> -       if (end_of_cipher - begin_of_cipher == current_cipher_len &&
> -           0 == memcmp (&ciphers[begin_of_cipher], 
> cipher_pair->openssl_name, end_of_cipher - begin_of_cipher))
> -         {
> -           // Non-IANA name used, show warning
> -           msg (M_WARN, "Deprecated TLS cipher name '%s', please use IANA 
> name '%s'", cipher_pair->openssl_name, cipher_pair->iana_name);
> -         }
> -     }
> -
> -      // Make sure new cipher name fits in cipher string
> -      if (((sizeof(openssl_ciphers)-1) - openssl_ciphers_len) < 
> current_cipher_len) {
> -     msg(M_SSLERR, "Failed to set restricted TLS cipher list, too long 
> (>%d).", (int)sizeof(openssl_ciphers)-1);
> -      }
> +          end_of_cipher += strcspn(&ciphers[begin_of_cipher], ":");
> +          cipher_pair = tls_get_cipher_name_pair(&ciphers[begin_of_cipher],
> +              end_of_cipher - begin_of_cipher);
>  
> -      // Concatenate cipher name to OpenSSL cipher string
> -      memcpy(&openssl_ciphers[openssl_ciphers_len], current_cipher, 
> current_cipher_len);
> -      openssl_ciphers_len += current_cipher_len;
> -      openssl_ciphers[openssl_ciphers_len] = ':';
> -      openssl_ciphers_len++;
> +          if (NULL == cipher_pair)
> +            {
> +              // No translation found, use original
> +              current_cipher = &ciphers[begin_of_cipher];
> +              current_cipher_len = end_of_cipher - begin_of_cipher;
> +
> +              // Issue warning on missing translation
> +              // %.*s format specifier expects length of type int, so 
> guarantee
> +              // that length is small enough and cast to int.
> +              msg (M_WARN, "No valid translation found for TLS cipher 
> '%.*s'",
> +                     constrain_int(current_cipher_len, 0, 256), 
> current_cipher);
> +            }
> +          else
> +            {
> +              // Use OpenSSL name
> +              current_cipher = cipher_pair->openssl_name;
> +              current_cipher_len = strlen(current_cipher);
> +
> +              if (end_of_cipher - begin_of_cipher == current_cipher_len &&
> +                  0 == memcmp (&ciphers[begin_of_cipher],
> +                      cipher_pair->openssl_name,
> +                      end_of_cipher - begin_of_cipher))
> +                {
> +                  // Non-IANA name used, show warning
> +                  msg (M_WARN, "Deprecated TLS cipher name '%s', "
> +                      "please use IANA name '%s'", cipher_pair->openssl_name,
> +                      cipher_pair->iana_name);
> +                }
> +            }
>  
> -      end_of_cipher++;
> -  }
> +          // Make sure new cipher name fits in cipher string
> +          if (((sizeof(openssl_ciphers)-1) - openssl_ciphers_len) <
> +              current_cipher_len) {
> +            msg(M_SSLERR,
> +                "Failed to set restricted TLS cipher list, too long (>%d).",
> +                (int)sizeof(openssl_ciphers)-1);
> +          }
> +
> +          // Concatenate cipher name to OpenSSL cipher string
> +          memcpy(&openssl_ciphers[openssl_ciphers_len], current_cipher,
> +              current_cipher_len);
> +          openssl_ciphers_len += current_cipher_len;
> +          openssl_ciphers[openssl_ciphers_len] = ':';
> +          openssl_ciphers_len++;
> +
> +          end_of_cipher++;
> +        }
>  
> -  if (openssl_ciphers_len > 0)
> -    openssl_ciphers[openssl_ciphers_len-1] = '\0';
> +      if (openssl_ciphers_len > 0)
> +        openssl_ciphers[openssl_ciphers_len-1] = '\0';
>  
> -  // Set OpenSSL cipher list
> -  if(!SSL_CTX_set_cipher_list(ctx->ctx, openssl_ciphers))
> -    msg(M_SSLERR, "Failed to set restricted TLS cipher list: %s", 
> openssl_ciphers);
> +      // Set OpenSSL cipher list
> +      if(!SSL_CTX_set_cipher_list(ctx->ctx, openssl_ciphers))
> +        msg(M_SSLERR, "Failed to set restricted TLS cipher list: %s",
> +            openssl_ciphers);
> +    }
>  }
>  
>  void
> diff --git a/src/openvpn/ssl_polarssl.c b/src/openvpn/ssl_polarssl.c
> index 551c352..d964b91 100644
> --- a/src/openvpn/ssl_polarssl.c
> +++ b/src/openvpn/ssl_polarssl.c
> @@ -173,7 +173,12 @@ tls_ctx_restrict_ciphers(struct tls_root_ctx *ctx, const 
> char *ciphers)
>  {
>    char *tmp_ciphers, *tmp_ciphers_orig, *token;
>    int i, cipher_count;
> -  int ciphers_len = strlen (ciphers);
> +  int ciphers_len;
> +
> +  if (NULL == ciphers)
> +    return; // Nothing to do
> +
> +  ciphers_len = strlen (ciphers);
>  
>    ASSERT (NULL != ctx);
>    ASSERT (0 != ciphers_len);
> 
>From 980b26eaa90099640197438e4b8f28d0f7fd21b1 Mon Sep 17 00:00:00 2001
From: Steffan Karger <stef...@karger.me>
List-Post: openvpn-devel@lists.sourceforge.net
Date: Fri, 3 Jan 2014 21:03:02 +0100
Subject: [PATCH 1/3] Make tls_ctx_restrict_ciphers accept NULL as char
 *cipher_list.

This adds some ifs to check for NULL in tls_ctx_restrict_ciphers() to prepare
for disabling export ciphers by default in OpenVPN 2.4+.

Signed-off-by: Steffan Karger <stef...@karger.me>
---
 src/openvpn/ssl.c          | 5 +----
 src/openvpn/ssl_backend.h  | 5 +++--
 src/openvpn/ssl_openssl.c  | 7 +++++++
 src/openvpn/ssl_polarssl.c | 7 ++++++-
 4 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/src/openvpn/ssl.c b/src/openvpn/ssl.c
index bd19d75..93222c4 100644
--- a/src/openvpn/ssl.c
+++ b/src/openvpn/ssl.c
@@ -543,10 +543,7 @@ init_ssl (const struct options *options, struct tls_root_ctx *new_ctx)
     }

   /* Allowable ciphers */
-  if (options->cipher_list)
-    {
-      tls_ctx_restrict_ciphers(new_ctx, options->cipher_list);
-    }
+  tls_ctx_restrict_ciphers(new_ctx, options->cipher_list);

 #ifdef ENABLE_CRYPTO_POLARSSL
   /* Personalise the random by mixing in the certificate */
diff --git a/src/openvpn/ssl_backend.h b/src/openvpn/ssl_backend.h
index 54383fe..a6fc3bd 100644
--- a/src/openvpn/ssl_backend.h
+++ b/src/openvpn/ssl_backend.h
@@ -167,8 +167,9 @@ void tls_ctx_set_options (struct tls_root_ctx *ctx, unsigned int ssl_flags);
 /**
  * Restrict the list of ciphers that can be used within the TLS context.
  *
- * @param ctx		TLS context to restrict
- * @param ciphers	String containing : delimited cipher names.
+ * @param ctx		TLS context to restrict, must be valid.
+ * @param ciphers	String containing : delimited cipher names, or NULL to use
+ *					sane defaults.
  */
 void tls_ctx_restrict_ciphers(struct tls_root_ctx *ctx, const char *ciphers);

diff --git a/src/openvpn/ssl_openssl.c b/src/openvpn/ssl_openssl.c
index 08327a1..349c64e 100644
--- a/src/openvpn/ssl_openssl.c
+++ b/src/openvpn/ssl_openssl.c
@@ -217,6 +217,13 @@ tls_ctx_set_options (struct tls_root_ctx *ctx, unsigned int ssl_flags)
 void
 tls_ctx_restrict_ciphers(struct tls_root_ctx *ctx, const char *ciphers)
 {
+  if (ciphers == NULL)
+    {
+      /* Nothing to do */
+      return;
+    }
+
+  /* Parse supplied cipher list and pass on to OpenSSL */
   size_t begin_of_cipher, end_of_cipher;

   const char *current_cipher;
diff --git a/src/openvpn/ssl_polarssl.c b/src/openvpn/ssl_polarssl.c
index 551c352..a517bf8 100644
--- a/src/openvpn/ssl_polarssl.c
+++ b/src/openvpn/ssl_polarssl.c
@@ -173,7 +173,12 @@ tls_ctx_restrict_ciphers(struct tls_root_ctx *ctx, const char *ciphers)
 {
   char *tmp_ciphers, *tmp_ciphers_orig, *token;
   int i, cipher_count;
-  int ciphers_len = strlen (ciphers);
+  int ciphers_len;
+
+  if (NULL == ciphers)
+    return; /* Nothing to do */
+
+  ciphers_len = strlen (ciphers);

   ASSERT (NULL != ctx);
   ASSERT (0 != ciphers_len);
-- 
1.8.3.2

Reply via email to