Hi Juliusz,

There are some warnings when compiling with wolfssl v4.0.0-stable:


In file included from crypto_openssl.c:44:
openssl_compat.h:93: warning: "EVP_CIPHER_CTX_reset" redefined
   93 | #define EVP_CIPHER_CTX_reset EVP_CIPHER_CTX_init
      |
In file included from crypto_openssl.h:32,
                 from crypto_backend.h:33,
                 from crypto.h:125,
                 from crypto_openssl.c:42:
/usr/local/include/wolfssl/openssl/evp.h:769: note: this is the location
of the previous definition
  769 | #define EVP_CIPHER_CTX_reset          wolfSSL_EVP_CIPHER_CTX_reset
      |



ssl_openssl.c: In function ‘tls_ctx_load_ca’:
ssl_openssl.c:1601:55: warning: passing argument 1 of
‘wolfSSL_sk_X509_NAME_new’ from incompatible pointer type
[-Wincompatible-pointer-types]
 1601 |                         cert_names =
sk_X509_NAME_new(sk_x509_name_cmp);
      |
^~~~~~~~~~~~~~~~
      |                                                       |
      |                                                       int
(*)(const X509_NAME * const*, const X509_NAME * const*) {aka int
(*)(const struct WOLFSSL_X509_NAME * const*, const struct
WOLFSSL_X509_NAME * const*)}
In file included from /usr/local/include/wolfssl/openssl/ssl.h:35,
                 from ssl_openssl.h:32,
                 from ssl_backend.h:36,
                 from ssl_openssl.c:44:
/usr/local/include/wolfssl/ssl.h:3534:47: note: expected
‘wolf_sk_compare_cb’ {aka ‘int (*)(const void * const*, const void *
const*)’} but argument is of type ‘int (*)(const X509_NAME * const*,
const X509_NAME * const*)’ {aka ‘int (*)(const struct WOLFSSL_X509_NAME
* const*, const struct WOLFSSL_X509_NAME * const*)’}
 3534 | WOLFSSL_API WOLF_STACK_OF(WOLFSSL_X509_NAME)*
wolfSSL_sk_X509_NAME_new(
      |
^~~~~~~~~~~~~~~~~~~~~~~~
ssl_openssl.c: In function ‘print_details’:
ssl_openssl.c:2082:22: warning: unused variable ‘dsa’ [-Wunused-variable]
 2082 |                 DSA *dsa = EVP_PKEY_get0_DSA(pkey);
      |                      ^~~



Anything that can be fixed?


On top of that, unfortunately something is not working.

While openvpn can connect if provided with a config that references key
material from external files, i.e. "key a/b/c.key" or "cert
a/b/c/d.crt", it does not work when trying to connect using inline
material, i.e. "<key>$something here</key>".


This is what I see:

Thu May  7 12:16:12 2020 OpenVPN 2.5_git [git:master/6acb2a69e47a8da0]
x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [MH/PKTINFO]
[AEAD] built on May  7 2020
Thu May  7 12:16:12 2020 library versions: 4.4.0, LZO 2.10
Thu May  7 12:16:12 2020 WARNING: --ns-cert-type is DEPRECATED.  Use
--remote-cert-tls instead.
Thu May  7 12:16:12 2020 OpenSSL: Please supply a buffer for error string
Thu May  7 12:16:12 2020 Cannot load inline certificate file
Thu May  7 12:16:12 2020 Exiting due to fatal error


Any clue why this is failing?

- openvpn is: master openvpn + your patch
- for wolfssl I tested both master and 4.4.0



Regards,


On 29/04/2020 16:51, Juliusz Sosinowicz wrote:
> This patch adds support for wolfSSL in OpenVPN. Support is added by using 
> wolfSSL's OpenSSL compatibility layer. Function calls are left unchanged and 
> instead the OpenSSL includes point to wolfSSL headers and OpenVPN is linked 
> against the wolfSSL library.
> 
> As requested by OpenVPN maintainers, this patch does not include 
> wolfssl/options.h on its own. By defining the macro EXTERNAL_OPTS_OPENVPN in 
> the configure script wolfSSL will include wolfssl/options.h on its own 
> (change added in https://github.com/wolfSSL/wolfssl/pull/2825). The patch 
> adds an option `--disable-wolfssl-options-h` in case the user would like to 
> supply their own settings file for wolfSSL.
> 
> wolfSSL:
> Support added in: https://github.com/wolfSSL/wolfssl/pull/2503
> ```
> git clone https://github.com/wolfSSL/wolfssl.git
> cd wolfssl
> ./autogen.sh
> ./configure --enable-openvpn
> make
> sudo make install
> ```
> 
> OpenVPN:
> ```
> autoreconf -i -v -f
> ./configure --with-crypto-library=wolfssl
> make
> make check
> sudo make install
> ```
> 
> Signed-off-by: Juliusz Sosinowicz <juli...@wolfssl.com>
> ---
>  configure.ac          | 91 ++++++++++++++++++++++++++++++++++++++++++-
>  src/openvpn/syshead.h |  3 +-
>  2 files changed, 91 insertions(+), 3 deletions(-)
> 
> diff --git a/configure.ac b/configure.ac
> index fcec7389..53ad3181 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -276,16 +276,23 @@ AC_ARG_WITH(
>  
>  AC_ARG_WITH(
>       [crypto-library],
> -     [AS_HELP_STRING([--with-crypto-library=library], [build with the given 
> crypto library, TYPE=openssl|mbedtls @<:@default=openssl@:>@])],
> +     [AS_HELP_STRING([--with-crypto-library=library], [build with the given 
> crypto library, TYPE=openssl|mbedtls|wolfssl @<:@default=openssl@:>@])],
>       [
>               case "${withval}" in
> -                     openssl|mbedtls) ;;
> +                     openssl|mbedtls|wolfssl) ;;
>                       *) AC_MSG_ERROR([bad value ${withval} for 
> --with-crypto-library]) ;;
>               esac
>       ],
>       [with_crypto_library="openssl"]
>  )
>  
> +AC_ARG_ENABLE(
> +     [wolfssl-options-h],
> +     [AS_HELP_STRING([--disable-wolfssl-options-h], [Disable including 
> options.h in wolfSSL @<:@default=yes@:>@])],
> +     ,
> +     [enable_wolfssl_options_h="yes"]
> +)
> +
>  AC_ARG_VAR([PLUGINDIR], [Path of plug-in directory 
> @<:@default=LIBDIR/openvpn/plugins@:>@])
>  if test -n "${PLUGINDIR}"; then
>       plugindir="${PLUGINDIR}"
> @@ -1029,6 +1036,86 @@ elif test "${with_crypto_library}" = "mbedtls"; then
>       AC_DEFINE([ENABLE_CRYPTO_MBEDTLS], [1], [Use mbed TLS library])
>       CRYPTO_CFLAGS="${MBEDTLS_CFLAGS}"
>       CRYPTO_LIBS="${MBEDTLS_LIBS}"
> +
> +elif test "${with_crypto_library}" = "wolfssl"; then
> +     AC_ARG_VAR([WOLFSSL_CFLAGS], [C compiler flags for wolfssl])
> +     AC_ARG_VAR([WOLFSSL_LIBS], [linker flags for wolfssl])
> +     AC_ARG_VAR([WOLFSSL_DIR], [Path to the wolfssl directory 
> @<:@default=/usr/local/include/wolfssl@:>@])
> +     if test -n "${WOLFSSL_DIR}"; then
> +             wolfssldir="${WOLFSSL_DIR}"
> +     else
> +             wolfssldir="/usr/local/include/wolfssl"
> +     fi
> +
> +     saved_CFLAGS="${CFLAGS}"
> +     saved_LIBS="${LIBS}"
> +
> +     if test -z "${WOLFSSL_CFLAGS}" -a -z "${WOLFSSL_LIBS}"; then
> +             # if the user did not explicitly specify flags, try to 
> autodetect
> +             LIBS="${LIBS} -lwolfssl -lm -pthread"
> +             AC_CHECK_LIB(
> +                     [wolfssl],
> +                     [wolfSSL_Init],
> +                     [],
> +                     [AC_MSG_ERROR([Could not link wolfSSL library.])]
> +             )
> +             AC_CHECK_HEADER([wolfssl/options.h],,[AC_MSG_ERROR([wolfSSL 
> header wolfssl/options.h not found!])])
> +     fi
> +
> +     AC_DEFINE([HAVE_HMAC_CTX_NEW], [1], [Emulate AC_CHECK_FUNCS since these 
> are defined as macros])
> +     AC_DEFINE([HAVE_HMAC_CTX_FREE], [1], [Emulate AC_CHECK_FUNCS since 
> these are defined as macros])
> +     AC_DEFINE([HAVE_HMAC_CTX_RESET], [1], [Emulate AC_CHECK_FUNCS since 
> these are defined as macros])
> +     AC_DEFINE([HAVE_EVP_MD_CTX_NEW], [1], [Emulate AC_CHECK_FUNCS since 
> these are defined as macros])
> +     AC_DEFINE([HAVE_EVP_MD_CTX_FREE], [1], [Emulate AC_CHECK_FUNCS since 
> these are defined as macros])
> +     AC_DEFINE([HAVE_EVP_MD_CTX_RESET], [1], [Emulate AC_CHECK_FUNCS since 
> these are defined as macros])
> +     AC_DEFINE([HAVE_OPENSSL_VERSION], [1], [Emulate AC_CHECK_FUNCS since 
> these are defined as macros])
> +     AC_DEFINE([HAVE_SSL_CTX_GET_DEFAULT_PASSWD_CB], [1], [Emulate 
> AC_CHECK_FUNCS since these are defined as macros])
> +     AC_DEFINE([HAVE_SSL_CTX_GET_DEFAULT_PASSWD_CB_USERDATA], [1], [Emulate 
> AC_CHECK_FUNCS since these are defined as macros])
> +     AC_DEFINE([HAVE_SSL_CTX_SET_SECURITY_LEVEL], [1], [Emulate 
> AC_CHECK_FUNCS since these are defined as macros])
> +     AC_DEFINE([HAVE_X509_GET0_PUBKEY], [1], [Emulate AC_CHECK_FUNCS since 
> these are defined as macros])
> +     AC_DEFINE([HAVE_X509_STORE_GET0_OBJECTS], [1], [Emulate AC_CHECK_FUNCS 
> since these are defined as macros])
> +     AC_DEFINE([HAVE_X509_OBJECT_FREE], [1], [Emulate AC_CHECK_FUNCS since 
> these are defined as macros])
> +     AC_DEFINE([HAVE_X509_OBJECT_GET_TYPE], [1], [Emulate AC_CHECK_FUNCS 
> since these are defined as macros])
> +     AC_DEFINE([HAVE_EVP_PKEY_ID], [1], [Emulate AC_CHECK_FUNCS since these 
> are defined as macros])
> +     AC_DEFINE([HAVE_EVP_PKEY_GET0_RSA], [1], [Emulate AC_CHECK_FUNCS since 
> these are defined as macros])
> +     AC_DEFINE([HAVE_EVP_PKEY_GET0_DSA], [1], [Emulate AC_CHECK_FUNCS since 
> these are defined as macros])
> +     AC_DEFINE([HAVE_EVP_PKEY_GET0_EC_KEY], [1], [Emulate AC_CHECK_FUNCS 
> since these are defined as macros])
> +     AC_DEFINE([HAVE_RSA_SET_FLAGS], [1], [Emulate AC_CHECK_FUNCS since 
> these are defined as macros])
> +     AC_DEFINE([HAVE_RSA_BITS], [1], [Emulate AC_CHECK_FUNCS since these are 
> defined as macros])
> +     AC_DEFINE([HAVE_RSA_GET0_KEY], [1], [Emulate AC_CHECK_FUNCS since these 
> are defined as macros])
> +     AC_DEFINE([HAVE_RSA_SET0_KEY], [1], [Emulate AC_CHECK_FUNCS since these 
> are defined as macros])
> +     AC_DEFINE([HAVE_DSA_GET0_PQG], [1], [Emulate AC_CHECK_FUNCS since these 
> are defined as macros])
> +     AC_DEFINE([HAVE_DSA_BITS], [1], [Emulate AC_CHECK_FUNCS since these are 
> defined as macros])
> +     AC_DEFINE([HAVE_RSA_METH_NEW], [1], [Emulate AC_CHECK_FUNCS since these 
> are defined as macros])
> +     AC_DEFINE([HAVE_RSA_METH_FREE], [1], [Emulate AC_CHECK_FUNCS since 
> these are defined as macros])
> +     AC_DEFINE([HAVE_RSA_METH_SET_PUB_ENC], [1], [Emulate AC_CHECK_FUNCS 
> since these are defined as macros])
> +     AC_DEFINE([HAVE_RSA_METH_SET_PUB_DEC], [1], [Emulate AC_CHECK_FUNCS 
> since these are defined as macros])
> +     AC_DEFINE([HAVE_RSA_METH_SET_PRIV_ENC], [1], [Emulate AC_CHECK_FUNCS 
> since these are defined as macros])
> +     AC_DEFINE([HAVE_RSA_METH_SET_PRIV_DEC], [1], [Emulate AC_CHECK_FUNCS 
> since these are defined as macros])
> +     AC_DEFINE([HAVE_RSA_METH_SET_INIT], [1], [Emulate AC_CHECK_FUNCS since 
> these are defined as macros])
> +     AC_DEFINE([HAVE_RSA_METH_SET_SIGN], [1], [Emulate AC_CHECK_FUNCS since 
> these are defined as macros])
> +     AC_DEFINE([HAVE_RSA_METH_SET_FINISH], [1], [Emulate AC_CHECK_FUNCS 
> since these are defined as macros])
> +     AC_DEFINE([HAVE_RSA_METH_SET0_APP_DATA], [1], [Emulate AC_CHECK_FUNCS 
> since these are defined as macros])
> +     AC_DEFINE([HAVE_RSA_METH_GET0_APP_DATA], [1], [Emulate AC_CHECK_FUNCS 
> since these are defined as macros])
> +     AC_DEFINE([HAVE_EC_GROUP_ORDER_BITS], [1], [Emulate AC_CHECK_FUNCS 
> since these are defined as macros])
> +     
> +     have_crypto_aead_modes="yes"
> +     have_crypto="yes"
> +    
> +     if test "${enable_wolfssl_options_h}" = "yes"; then
> +             AC_DEFINE([EXTERNAL_OPTS_OPENVPN], [1], [Include options.h from 
> wolfSSL library])
> +     else
> +             AC_DEFINE([WOLFSSL_USER_SETTINGS], [1], [Use custom 
> user_settings.h file for wolfSSL library])
> +     fi
> +     
> +     WOLFSSL_CFLAGS="${WOLFSSL_CFLAGS} -I${wolfssldir}"
> +     CFLAGS="${WOLFSSL_CFLAGS} ${CFLAGS}"
> +     LIBS="${WOLFSSL_LIBS} ${LIBS}"
> +     
> +     AC_DEFINE([ENABLE_CRYPTO_WOLFSSL], [1], [Use wolfSSL crypto library])
> +     AC_DEFINE([ENABLE_CRYPTO_OPENSSL], [1], [Use wolfSSL openssl 
> compatibility layer])
> +     CRYPTO_CFLAGS="${WOLFSSL_CFLAGS}"
> +     CRYPTO_LIBS="${WOLFSSL_LIBS}"
>  else
>       AC_MSG_ERROR([Invalid crypto library: ${with_crypto_library}])
>  fi
> diff --git a/src/openvpn/syshead.h b/src/openvpn/syshead.h
> index b031dd60..0196596c 100644
> --- a/src/openvpn/syshead.h
> +++ b/src/openvpn/syshead.h
> @@ -593,7 +593,8 @@ socket_defined(const socket_descriptor_t sd)
>  /*
>   * Do we have CryptoAPI capability?
>   */
> -#if defined(_WIN32) && defined(ENABLE_CRYPTO_OPENSSL)
> +#if defined(_WIN32) && defined(ENABLE_CRYPTO_OPENSSL) && \
> +        !defined(ENABLE_CRYPTO_WOLFSSL)
>  #define ENABLE_CRYPTOAPI
>  #endif
>  
> 

-- 
Antonio Quartulli


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

Reply via email to