Hi,

On 12-06-17 15:43, log...@free.fr wrote:
> From: Emmanuel Deloget <log...@free.fr>
> 
> OpenSSL 1.1 does not allow us to directly access the internal of
> any data type, including EVP_CIPHER_CTX. We have to use the defined
> functions to do so.
> 
> Compatibility with OpenSSL 1.0 is kept by defining the corresponding
> functions when they are not found in the library.
> 
> Signed-off-by: Emmanuel Deloget <log...@free.fr>
> ---
>  configure.ac                 |  2 ++
>  src/openvpn/crypto.c         |  4 ++--
>  src/openvpn/crypto_backend.h | 14 ++++++++++++++
>  src/openvpn/crypto_mbedtls.c | 13 +++++++++++++
>  src/openvpn/crypto_openssl.c | 15 +++++++++++++--
>  src/openvpn/openssl_compat.h | 28 ++++++++++++++++++++++++++++
>  6 files changed, 72 insertions(+), 4 deletions(-)
> 
> diff --git a/configure.ac b/configure.ac
> index 6ac4e595..e895cf0a 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -920,6 +920,8 @@ if test "${enable_crypto}" = "yes" -a 
> "${with_crypto_library}" = "openssl"; then
>  
>       AC_CHECK_FUNCS(
>               [ \
> +                     EVP_CIPHER_CTX_new \
> +                     EVP_CIPHER_CTX_free \
>                       EVP_MD_CTX_new \
>                       EVP_MD_CTX_free \
>                       EVP_MD_CTX_reset \
> diff --git a/src/openvpn/crypto.c b/src/openvpn/crypto.c
> index 50e6a734..893879cf 100644
> --- a/src/openvpn/crypto.c
> +++ b/src/openvpn/crypto.c
> @@ -830,7 +830,7 @@ init_key_ctx(struct key_ctx *ctx, struct key *key,
>      if (kt->cipher && kt->cipher_length > 0)
>      {
>  
> -        ALLOC_OBJ(ctx->cipher, cipher_ctx_t);
> +        ctx->cipher = cipher_ctx_new();
>          cipher_ctx_init(ctx->cipher, key->cipher, kt->cipher_length,
>                          kt->cipher, enc);
>  
> @@ -879,7 +879,7 @@ free_key_ctx(struct key_ctx *ctx)
>      if (ctx->cipher)
>      {
>          cipher_ctx_cleanup(ctx->cipher);
> -        free(ctx->cipher);
> +        cipher_ctx_free(ctx->cipher);
>          ctx->cipher = NULL;
>      }
>      if (ctx->hmac)
> diff --git a/src/openvpn/crypto_backend.h b/src/openvpn/crypto_backend.h
> index 8f03e2ba..3a911a47 100644
> --- a/src/openvpn/crypto_backend.h
> +++ b/src/openvpn/crypto_backend.h
> @@ -301,6 +301,20 @@ bool cipher_kt_mode_aead(const cipher_kt_t *cipher);
>   */
>  
>  /**
> + * Allocate a new cipher context
> + *
> + * @return              a new cipher context
> + */
> +cipher_ctx_t *cipher_ctx_new(void);
> +
> +/**
> + * Free a cipher context
> + *
> + * @param ctx           Cipher context.
> + */
> +void cipher_ctx_free(cipher_ctx_t *ctx);
> +
> +/**
>   * Initialise a cipher context, based on the given key and key type.
>   *
>   * @param ctx           Cipher context. May not be NULL
> diff --git a/src/openvpn/crypto_mbedtls.c b/src/openvpn/crypto_mbedtls.c
> index d6741523..4d38aadc 100644
> --- a/src/openvpn/crypto_mbedtls.c
> +++ b/src/openvpn/crypto_mbedtls.c
> @@ -509,6 +509,19 @@ cipher_kt_mode_aead(const cipher_kt_t *cipher)
>   *
>   */
>  
> +mbedtls_cipher_context_t *
> +cipher_ctx_new(void)
> +{
> +    mbedtls_cipher_context_t *ctx;
> +    ALLOC_OBJ(ctx, mbedtls_cipher_context_t);
> +    return ctx;
> +}
> +
> +void
> +cipher_ctx_free(mbedtls_cipher_context_t *ctx)
> +{
> +    free(ctx);
> +}
>  
>  void
>  cipher_ctx_init(mbedtls_cipher_context_t *ctx, uint8_t *key, int key_len,
> diff --git a/src/openvpn/crypto_openssl.c b/src/openvpn/crypto_openssl.c
> index fd599f40..0644f1c3 100644
> --- a/src/openvpn/crypto_openssl.c
> +++ b/src/openvpn/crypto_openssl.c
> @@ -651,6 +651,19 @@ cipher_kt_mode_aead(const cipher_kt_t *cipher)
>   *
>   */
>  
> +cipher_ctx_t *
> +cipher_ctx_new(void)
> +{
> +    EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
> +    check_malloc_return(ctx);
> +    return ctx;
> +}
> +
> +void
> +cipher_ctx_free(EVP_CIPHER_CTX *ctx)
> +{
> +    EVP_CIPHER_CTX_free(ctx);
> +}
>  
>  void
>  cipher_ctx_init(EVP_CIPHER_CTX *ctx, uint8_t *key, int key_len,
> @@ -658,8 +671,6 @@ cipher_ctx_init(EVP_CIPHER_CTX *ctx, uint8_t *key, int 
> key_len,
>  {
>      ASSERT(NULL != kt && NULL != ctx);
>  
> -    CLEAR(*ctx);
> -
>      EVP_CIPHER_CTX_init(ctx);
>      if (!EVP_CipherInit(ctx, kt, NULL, NULL, enc))
>      {
> diff --git a/src/openvpn/openssl_compat.h b/src/openvpn/openssl_compat.h
> index b315bcb7..3f36212a 100644
> --- a/src/openvpn/openssl_compat.h
> +++ b/src/openvpn/openssl_compat.h
> @@ -96,6 +96,34 @@ EVP_MD_CTX_new(void)
>  }
>  #endif
>  
> +#if !defined(HAVE_EVP_CIPHER_CTX_FREE)
> +/**
> + * Free an existing cipher context
> + *
> + * @param ctx                 The cipher context
> + */
> +static inline void
> +EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *c)
> +{
> +     free(c);
> +}
> +#endif
> +
> +#if !defined(HAVE_EVP_CIPHER_CTX_NEW)
> +/**
> + * Allocate a new cipher context object
> + *
> + * @return                    A zero'ed cipher context object
> + */
> +static inline EVP_CIPHER_CTX *
> +EVP_CIPHER_CTX_new(void)
> +{
> +    EVP_CIPHER_CTX *ctx = NULL;
> +    ALLOC_OBJ_CLEAR(ctx, EVP_CIPHER_CTX);
> +    return ctx;
> +}
> +#endif
> +
>  #if !defined(HAVE_SSL_CTX_GET_DEFAULT_PASSWD_CB_USERDATA)
>  /**
>   * Fetch the default password callback user data from the SSL context
> 

ACK

Code looks good, and passes my mbed and openssl tests.

-Steffan

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Openvpn-devel mailing list
Openvpn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel

Reply via email to