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 DSA. 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/openssl_compat.h | 44 
> ++++++++++++++++++++++++++++++++++++++++++++
>  src/openvpn/ssl_openssl.c    |  6 +++---
>  3 files changed, 49 insertions(+), 3 deletions(-)
> 
> diff --git a/configure.ac b/configure.ac
> index 4c5f28ed..6eded4e6 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -933,6 +933,8 @@ if test "${enable_crypto}" = "yes" -a 
> "${with_crypto_library}" = "openssl"; then
>                       RSA_bits \
>                       RSA_get0_key \
>                       RSA_set0_key \
> +                     DSA_get0_pqg \
> +                     DSA_bits \
>                       RSA_meth_new \
>                       RSA_meth_free \
>                       RSA_meth_set_pub_enc \
> diff --git a/src/openvpn/openssl_compat.h b/src/openvpn/openssl_compat.h
> index 44e3e167..24efa0fd 100644
> --- a/src/openvpn/openssl_compat.h
> +++ b/src/openvpn/openssl_compat.h
> @@ -276,6 +276,50 @@ RSA_bits(const RSA *rsa)
>  }
>  #endif
>  
> +#if !defined(HAVE_DSA_GET0_PQG)
> +/**
> + * Get the DSA parameters
> + *
> + * @param dsa                 The DSA object
> + * @param p                   The @c p parameter
> + * @param q                   The @c q parameter
> + * @param g                   The @c g parameter
> + */
> +static inline void
> +DSA_get0_pqg(const DSA *dsa, const BIGNUM **p,
> +             const BIGNUM **q, const BIGNUM **g)
> +{
> +    if (p != NULL)
> +    {
> +        *p = dsa ? dsa->p : NULL;
> +    }
> +    if (q != NULL)
> +    {
> +        *q = dsa ? dsa->q : NULL;
> +    }
> +    if (g != NULL)
> +    {
> +        *g = dsa ? dsa->g : NULL;
> +    }
> +}
> +#endif
> +
> +#if !defined(HAVE_DSA_BITS)
> +/**
> + * Number of significant DSA bits
> + *
> + * @param rsa                The DSA object ; shall not be NULL
> + * @return                   The number of DSA bits or 0 on error
> + */
> +static inline int
> +DSA_bits(const DSA *dsa)
> +{
> +    const BIGNUM *p = NULL;
> +    DSA_get0_pqg(dsa, &p, NULL, NULL);
> +    return p ? BN_num_bits(p) : 0;
> +}
> +#endif
> +
>  #if !defined(HAVE_RSA_METH_NEW)
>  /**
>   * Allocate a new RSA method object
> diff --git a/src/openvpn/ssl_openssl.c b/src/openvpn/ssl_openssl.c
> index 2a42d3c6..5faeafcc 100644
> --- a/src/openvpn/ssl_openssl.c
> +++ b/src/openvpn/ssl_openssl.c
> @@ -1689,11 +1689,11 @@ print_details(struct key_state_ssl *ks_ssl, const 
> char *prefix)
>                  openvpn_snprintf(s2, sizeof(s2), ", %d bit RSA",
>                                   RSA_bits(rsa));
>              }
> -            else if (EVP_PKEY_id(pkey) == EVP_PKEY_DSA && 
> EVP_PKEY_get0_DSA(pkey) != NULL
> -                     && pkey->pkey.dsa->p != NULL)
> +            else if (EVP_PKEY_id(pkey) == EVP_PKEY_DSA && 
> EVP_PKEY_get0_DSA(pkey) != NULL)
>              {
> +                DSA *dsa = EVP_PKEY_get0_DSA(pkey);
>                  openvpn_snprintf(s2, sizeof(s2), ", %d bit DSA",
> -                                 BN_num_bits(pkey->pkey.dsa->p));
> +                                 DSA_bits(dsa));
>              }
>              EVP_PKEY_free(pkey);
>          }
> 

Looks good too now, ACK.

-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