CRYPTO_memcmp introduced in

https://github.com/openssl/openssl/commit/7c770d572a719fa40fa9c82807a0bd3840baf4a0


no good guard candidate :(

пт, 22 янв. 2021 г. в 02:26, Илья Шипицин <[email protected]>:

> we use openssl-1.0.2u for ci builds:
>
> https://github.com/haproxy/haproxy/runs/1743866222?check_suite_focus=true
>
>
> not sure about 1.0.2 beta
>
> пт, 22 янв. 2021 г. в 02:19, Bertrand Jacquin <[email protected]>:
>
>> According to INSTALL file, OpenSSL 1.0.2 is still supported by HAProxy,
>> however OpenSSL 1.0.2 lacking CRYPTO_memcmp(), haproxy does not build:
>>
>>   $ make V=1 TARGET=linux-glibc USE_NS= USE_OPENSSL=1
>>   ..
>>   cc -Iinclude  -O2 -g -Wall -Wextra -Wdeclaration-after-statement
>> -fwrapv  -Wno-unused-label -Wno-sign-compare -Wno-unused-parameter
>> -Wno-clobbered -Wno-missing-field-initializers   -Wtype-limits
>>  -DUSE_EPOLL  -DUSE_NETFILTER     -DUSE_POLL  -DUSE_THREAD
>> -DUSE_BACKTRACE   -DUSE_TPROXY -DUSE_LINUX_TPROXY -DUSE_LINUX_SPLICE
>> -DUSE_LIBCRYPT -DUSE_CRYPT_H -DUSE_GETADDRINFO -DUSE_OPENSSL  -DUSE_FUTEX
>> -DUSE_ACCEPT4    -DUSE_CPU_AFFINITY -DUSE_TFO  -DUSE_DL -DUSE_RT
>> -DUSE_PRCTL -DUSE_THREAD_DUMP
>> -DCONFIG_HAPROXY_VERSION=\"2.4-dev5-37286a-78\"
>> -DCONFIG_HAPROXY_DATE=\"2021/01/21\" -c -o src/sample.o src/sample.c
>> src/sample.c: In function 'sample_conv_secure_memcmp':
>> src/sample.c:3130:2: warning: implicit declaration of function
>> 'CRYPTO_memcmp'
>>   ..
>>   cc  -g -o haproxy src/ev_poll.o src/ev_epoll.o src/ssl_sample.o
>> src/ssl_sock.o src/ssl_crtlist.o src/ssl_ckch.o src/ssl_utils.o
>> src/cfgparse-ssl.o src/mux_h2.o src/mux_fcgi.o src/http_ana.o src/stream.o
>> src/mux_h1.o src/stats.o src/flt_spoe.o src/backend.o src/tcpcheck.o
>> src/server.o src/tools.o src/cli.o src/cfgparse.o src/log.o
>> src/cfgparse-listen.o src/check.o src/stick_table.o src/peers.o src/dns.o
>> src/stream_interface.o src/sample.o src/http_htx.o src/haproxy.o
>> src/http_act.o src/proxy.o src/pattern.o src/listener.o src/cache.o
>> src/http_fetch.o src/session.o src/connection.o src/sink.o src/task.o
>> src/filters.o src/fcgi-app.o src/tcp_rules.o src/payload.o src/mux_pt.o
>> src/flt_http_comp.o src/cfgparse-global.o src/vars.o src/map.o src/debug.o
>> src/queue.o src/h1_htx.o src/compression.o src/mworker.o src/flt_trace.o
>> src/acl.o src/trace.o src/proto_sockpair.o src/proto_tcp.o src/lb_chash.o
>> src/htx.o src/xprt_handshake.o src/h1.o src/sock.o src/ring.o
>> src/extcheck.o src/tcp_sample.o src/frontend.o src/h2.o src/channel.o
>> src/applet.o src/tcp_act.o src/http_rules.o src/fd.o src/raw_sock.o
>> src/pool.o src/mailers.o src/http_conv.o src/lb_fwrr.o src/proto_uxst.o
>> src/http.o src/lb_fwlc.o src/lb_fas.o src/activity.o src/sock_unix.o
>> src/protocol.o src/mworker-prog.o src/signal.o src/proto_udp.o src/lb_map.o
>> src/sock_inet.o src/ev_select.o src/cfgparse-tcp.o src/action.o
>> src/thread.o src/sha1.o src/ebmbtree.o src/cfgparse-unix.o src/dict.o
>> src/time.o src/hpack-dec.o src/arg.o src/hpack-tbl.o src/eb64tree.o
>> src/chunk.o src/shctx.o src/regex.o src/fcgi.o src/eb32tree.o
>> src/eb32sctree.o src/dynbuf.o src/pipe.o src/lru.o src/ebimtree.o
>> src/uri_auth.o src/freq_ctr.o src/ebsttree.o src/ebistree.o src/auth.o
>> src/wdt.o src/http_acl.o src/hpack-enc.o src/hpack-huff.o src/ebtree.o
>> src/base64.o src/hash.o src/dgram.o src/version.o src/fix.o src/mqtt.o
>>  -lcrypt -ldl -lrt -lpthread -Wl,--export-dynamic  -lssl -lcrypto -ldl
>>   src/sample.o: In function `sample_conv_secure_memcmp':
>>   src/sample.c:3130: undefined reference to `CRYPTO_memcmp'
>>   collect2: ld returned 1 exit status
>>   make: *** [haproxy] Error 1
>>
>> See:
>> https://git.openssl.org/?p=openssl.git;a=commitdiff;h=f5cd3561ba9363e6bcc58fcb6b1e94930f81967d
>>
>>   $ git describe --contains f5cd3561ba9363e6bcc58fcb6b1e94930f81967d
>>   OpenSSL_1_0_2-beta1~439
>>
>> Since secure_memcmp is meant to be used in constant time sensible
>> environment, this commit removes the converter when the version of
>> OpenSSL does not meant the requirement. Adjusting related documentation,
>> pointing the user to strcmp instead.
>>
>> Cc: Emeric Brun <[email protected]>
>> Cc: William Lallemand <[email protected]>
>> ---
>>  doc/configuration.txt |  6 +++++-
>>  src/sample.c          | 12 +++++++-----
>>  2 files changed, 12 insertions(+), 6 deletions(-)
>>
>> diff --git a/doc/configuration.txt b/doc/configuration.txt
>> index 899bdf553a85..f25da9c1bfa6 100644
>> --- a/doc/configuration.txt
>> +++ b/doc/configuration.txt
>> @@ -15996,7 +15996,11 @@ secure_memcmp(<var>)
>>    performed in constant time.
>>
>>    Please note that this converter is only available when haproxy has been
>> -  compiled with USE_OPENSSL.
>> +  compiled with USE_OPENSSL. Requires at least OpenSSL 1.0.2.
>> +
>> +  See also the strcmp converter if you need to compare two binary
>> +  strings without concern related to constant time or if OpenSSL is not
>> +  enabled.
>>
>>    Example :
>>
>> diff --git a/src/sample.c b/src/sample.c
>> index bf2de2a2522d..bb12789b551f 100644
>> --- a/src/sample.c
>> +++ b/src/sample.c
>> @@ -3100,12 +3100,14 @@ static int sample_conv_strcmp(const struct arg
>> *arg_p, struct sample *smp, void
>>         return 1;
>>  }
>>
>> -#ifdef USE_OPENSSL
>> +#if defined(USE_OPENSSL) && HA_OPENSSL_VERSION_NUMBER > 0x1000200fL
>>  /* Compares bytestring with a variable containing a bytestring. Return
>> value
>>   * is `true` if both bytestrings are bytewise identical and `false`
>> otherwise.
>>   *
>> - * Comparison will be performed in constant time if both bytestrings are
>> of
>> - * the same length. If the lengths differ execution time will not be
>> constant.
>> + * Comparison will be performed in constant time if the library support
>> + * constant time memcmp (starting with OpenSSL 1.0.2) and if both
>> + * bytestrings are of the same length. Otherwise execution time will not
>> + * be constant.
>>   */
>>  static int sample_conv_secure_memcmp(const struct arg *arg_p, struct
>> sample *smp, void *private)
>>  {
>> @@ -3422,7 +3424,7 @@ static int smp_check_strcmp(struct arg *args,
>> struct sample_conv *conv,
>>         return 0;
>>  }
>>
>> -#ifdef USE_OPENSSL
>> +#if defined(USE_OPENSSL) && HA_OPENSSL_VERSION_NUMBER > 0x1000200fL
>>  /* This function checks the "secure_memcmp" converter's arguments and
>> extracts the
>>   * variable name and its scope.
>>   */
>> @@ -3988,7 +3990,7 @@ static struct sample_conv_kw_list sample_conv_kws =
>> {ILH, {
>>  #endif
>>         { "concat", sample_conv_concat,    ARG3(1,STR,STR,STR),
>> smp_check_concat, SMP_T_STR,  SMP_T_STR },
>>         { "strcmp", sample_conv_strcmp,    ARG1(1,STR), smp_check_strcmp,
>> SMP_T_STR,  SMP_T_SINT },
>> -#ifdef USE_OPENSSL
>> +#if defined(USE_OPENSSL) && HA_OPENSSL_VERSION_NUMBER > 0x1000200fL
>>         { "secure_memcmp", sample_conv_secure_memcmp,    ARG1(1,STR),
>> smp_check_secure_memcmp, SMP_T_BIN,  SMP_T_BOOL },
>>  #endif
>>
>>
>>

Reply via email to