Please try the corrected patches. Before Haproxy was kind of unstable. Now it 
seems to work fine. I also changed tests for defined LIBRESSL_VERSION_NUMBER to 
testing LibreSSL version to keep the older versions working.

On 17-02-10 13:48:20, Piotr Kubaj wrote:
> I'm attaching two patches:
> a) patch-src_ssl__sock.c - it makes possible to build Haproxy against 
> LibreSSL 2.5.1 at all,
> b) patch-include_proto_openssl-compat.h - since "auto" ECDHE API doesn't work 
> OOTB, this patch is also needed
> 
> They are against the latest 20170209 snapshot. Please consider merging a) to 
> stable branches.
> 
> -- 
>  ______________________________________ 
> / The things that interest people most \
> \ are usually none of their business.  /
>  -------------------------------------- 
>         \   ^__^
>          \  (oo)\_______
>             (__)\       )\/\
>                 ||----w |
>                 ||     ||

> --- include/proto/openssl-compat.h.orig       2017-02-10 12:38:04 UTC
> +++ include/proto/openssl-compat.h
> @@ -183,7 +183,7 @@ static inline int EVP_PKEY_base_id(EVP_P
>  #endif
>  
>  /* This function does nothing in 1.1.0 and doesn't exist in boringssl */
> -#if defined(OPENSSL_IS_BORINGSSL) || (OPENSSL_VERSION_NUMBER >= 0x1010000fL)
> +#if !defined(LIBRESSL_VERSION_NUMBER) && (defined(OPENSSL_IS_BORINGSSL) || 
> (OPENSSL_VERSION_NUMBER >= 0x1010000fL))
>  #undef  SSL_CTX_set_ecdh_auto
>  #define SSL_CTX_set_ecdh_auto(ctx, onoff)
>  #endif

> --- src/ssl_sock.c.orig       2017-02-08 18:08:38 UTC
> +++ src/ssl_sock.c
> @@ -829,10 +829,13 @@ static int ssl_sock_load_ocsp(SSL_CTX *c
>               ocsp = NULL;
>  
>  #ifndef SSL_CTX_get_tlsext_status_cb
> -# define SSL_CTX_get_tlsext_status_cb(ctx, cb) \
> -     *cb = (void (*) (void))ctx->tlsext_status_cb;
> +#ifndef SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB
> +#define SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB 128
>  #endif
> -     SSL_CTX_get_tlsext_status_cb(ctx, &callback);
> +#define SSL_CTX_get_tlsext_status_cb(ctx, cb) \
> +        *cb = SSL_CTX_ctrl(ctx,SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB,0, (void 
> (**)(void))cb)
> +#endif
> +        SSL_CTX_get_tlsext_status_cb(ctx, &callback);
>  
>       if (!callback) {
>               struct ocsp_cbk_arg *cb_arg = calloc(1, sizeof(*cb_arg));
> @@ -858,10 +861,13 @@ static int ssl_sock_load_ocsp(SSL_CTX *c
>               int key_type;
>               EVP_PKEY *pkey;
>  
> -#ifdef SSL_CTX_get_tlsext_status_arg
> -             SSL_CTX_ctrl(ctx, SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB_ARG, 0, 
> &cb_arg);
> +#if defined(SSL_CTX_get_tlsext_status_arg) || 
> defined(LIBRESSL_VERSION_NUMBER)
> +#ifndef SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB_ARG
> +#define SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB_ARG 129
> +#endif
> +             SSL_CTX_ctrl(ctx, SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB_ARG, 0, 
> &cb_arg);
>  #else
> -             cb_arg = ctx->tlsext_status_arg;
> +             cb_arg = ctx->tlsext_status_arg;
>  #endif
>  
>               /*
> @@ -1842,7 +1848,7 @@ static int ssl_sock_add_cert_sni(SSL_CTX
>  /* The following code is used for loading multiple crt files into
>   * SSL_CTX's based on CN/SAN
>   */
> -#if OPENSSL_VERSION_NUMBER >= 0x1000200fL && 
> !defined(LIBRESSL_VERSION_NUMBER)
> +#if (OPENSSL_VERSION_NUMBER >= 0x1000200fL && !defined 
> LIBRESSL_VERSION_NUMBER)
>  /* This is used to preload the certifcate, private key
>   * and Cert Chain of a file passed in via the crt
>   * argument
> @@ -3789,7 +3795,7 @@ int ssl_sock_handshake(struct connection
>                                       conn->err_code = CO_ER_SSL_HANDSHAKE;
>  #else
>                                       int empty_handshake;
> -#if (OPENSSL_VERSION_NUMBER >= 0x1010000fL) && 
> !defined(LIBRESSL_VERSION_NUMBER)
> +#if (OPENSSL_VERSION_NUMBER >= 0x1010000fL)
>                                       OSSL_HANDSHAKE_STATE state = 
> SSL_get_state((SSL *)conn->xprt_ctx);
>                                       empty_handshake = state == 
> TLS_ST_BEFORE;
>  #else
> @@ -3867,7 +3873,7 @@ int ssl_sock_handshake(struct connection
>                               conn->err_code = CO_ER_SSL_HANDSHAKE;
>  #else
>                               int empty_handshake;
> -#if (OPENSSL_VERSION_NUMBER >= 0x1010000fL) && 
> !defined(LIBRESSL_VERSION_NUMBER)
> +#if (OPENSSL_VERSION_NUMBER >= 0x1010000fL)
>                               OSSL_HANDSHAKE_STATE state = SSL_get_state((SSL 
> *)conn->xprt_ctx);
>                               empty_handshake = state == TLS_ST_BEFORE;
>  #else
> @@ -6978,7 +6984,7 @@ static struct xprt_ops ssl_sock = {
>       .name     = "SSL",
>  };
>  
> -#if (OPENSSL_VERSION_NUMBER >= 0x1000200fL && !defined OPENSSL_NO_TLSEXT && 
> !defined OPENSSL_IS_BORINGSSL && !defined LIBRESSL_VERSION_NUMBER)
> +#if (OPENSSL_VERSION_NUMBER >= 0x1000200fL && !defined OPENSSL_NO_TLSEXT && 
> !defined OPENSSL_IS_BORINGSSL)
>  
>  static void ssl_sock_sctl_free_func(void *parent, void *ptr, CRYPTO_EX_DATA 
> *ad, int idx, long argl, void *argp)
>  {




-- 
 _______________________________________ 
/ I ain't got no quarrel with them Viet \
| Congs.                                |
|                                       |
\ -- Muhammad Ali                       /
 --------------------------------------- 
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
--- include/proto/openssl-compat.h.orig	2017-02-10 12:38:04 UTC
+++ include/proto/openssl-compat.h
@@ -183,7 +183,7 @@ static inline int EVP_PKEY_base_id(EVP_P
 #endif
 
 /* This function does nothing in 1.1.0 and doesn't exist in boringssl */
-#if defined(OPENSSL_IS_BORINGSSL) || (OPENSSL_VERSION_NUMBER >= 0x1010000fL)
+#if (LIBRESSL_VERSION_NUMBER < 0x2050100fL) && (defined(OPENSSL_IS_BORINGSSL) || (OPENSSL_VERSION_NUMBER >= 0x1010000fL))
 #undef  SSL_CTX_set_ecdh_auto
 #define SSL_CTX_set_ecdh_auto(ctx, onoff)
 #endif
--- src/ssl_sock.c.orig	2017-02-08 18:08:38 UTC
+++ src/ssl_sock.c
@@ -829,10 +829,13 @@ static int ssl_sock_load_ocsp(SSL_CTX *c
 		ocsp = NULL;
 
 #ifndef SSL_CTX_get_tlsext_status_cb
-# define SSL_CTX_get_tlsext_status_cb(ctx, cb) \
-	*cb = (void (*) (void))ctx->tlsext_status_cb;
+#ifndef SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB
+#define SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB 128
 #endif
-	SSL_CTX_get_tlsext_status_cb(ctx, &callback);
+#define SSL_CTX_get_tlsext_status_cb(ctx, cb) \
+        *cb = SSL_CTX_ctrl(ctx,SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB,0, (void (**)(void))cb)
+#endif
+        SSL_CTX_get_tlsext_status_cb(ctx, &callback);
 
 	if (!callback) {
 		struct ocsp_cbk_arg *cb_arg = calloc(1, sizeof(*cb_arg));
@@ -858,10 +861,13 @@ static int ssl_sock_load_ocsp(SSL_CTX *c
 		int key_type;
 		EVP_PKEY *pkey;
 
-#ifdef SSL_CTX_get_tlsext_status_arg
-		SSL_CTX_ctrl(ctx, SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB_ARG, 0, &cb_arg);
+#if defined(SSL_CTX_get_tlsext_status_arg) || (LIBRESSL_VERSION_NUMBER >= 0x2050100fL)
+#ifndef SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB_ARG
+#define SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB_ARG 129
+#endif
+ 		SSL_CTX_ctrl(ctx, SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB_ARG, 0, &cb_arg);
 #else
-		cb_arg = ctx->tlsext_status_arg;
+ 		cb_arg = ctx->tlsext_status_arg;
 #endif
 
 		/*

Attachment: signature.asc
Description: PGP signature

Reply via email to