Commit e9ec818c authored by rubiate's avatar rubiate Committed by Nick Mathewson
Browse files

Support LibreSSL with opaque structures

Determining if OpenSSL structures are opaque now uses an autoconf check
instead of comparing the version number. Some definitions have been
moved to their own check as assumptions which were true for OpenSSL
with opaque structures did not hold for LibreSSL. Closes ticket 21359.
parent 0d4d9b6d
Loading
Loading
Loading
Loading

changes/21359

0 → 100644
+8 −0
Original line number Diff line number Diff line
  o Testing
    - tortls tests now use an autoconf check to determine if OpenSSL
      structures are opaque, instead of an explicit version check.
      See ticket 21359.

  o Minor bugfixes (compilation)
    - Support building with recent LibreSSL code that uses opaque
      structures. Closes ticket 21359.
+5 −0
Original line number Diff line number Diff line
@@ -677,6 +677,11 @@ AC_CHECK_FUNCS([ \
dnl Check if OpenSSL has scrypt implementation.
AC_CHECK_FUNCS([ EVP_PBE_scrypt ])

dnl Check if OpenSSL structures are opaque
AC_CHECK_MEMBERS([SSL.state], , ,
[#include <openssl/ssl.h>
])

LIBS="$save_LIBS"
LDFLAGS="$save_LDFLAGS"
CPPFLAGS="$save_CPPFLAGS"
+24 −19
Original line number Diff line number Diff line
@@ -38,9 +38,11 @@ ENABLE_GCC_WARNING(redundant-decls)
#include "log_test_helpers.h"
#define NS_MODULE tortls

#if OPENSSL_VERSION_NUMBER >= OPENSSL_V_SERIES(1,1,0) \
    && !defined(LIBRESSL_VERSION_NUMBER)
#ifndef HAVE_SSL_STATE
#define OPENSSL_OPAQUE
#endif

#if defined(OPENSSL_OPAQUE) && !defined(LIBRESSL_VERSION_NUMBER)
#define SSL_STATE_STR "before SSL initialization"
#else
#define SSL_STATE_STR "before/accept initialization"
@@ -723,6 +725,26 @@ test_tortls_get_my_certs(void *ignored)
  (void)1;
}

#ifndef HAVE_SSL_GET_CLIENT_CIPHERS
static SSL_CIPHER *
get_cipher_by_name(const char *name)
{
  int i;
  const SSL_METHOD *method = SSLv23_method();
  int num = method->num_ciphers();

  for (i = 0; i < num; ++i) {
    const SSL_CIPHER *cipher = method->get_cipher(i);
    const char *ciphername = SSL_CIPHER_get_name(cipher);
    if (!strcmp(ciphername, name)) {
      return (SSL_CIPHER *)cipher;
    }
  }

  return NULL;
}
#endif

#ifndef OPENSSL_OPAQUE
static void
test_tortls_get_ciphersuite_name(void *ignored)
@@ -741,23 +763,6 @@ test_tortls_get_ciphersuite_name(void *ignored)
  tor_free(ctx);
}

static SSL_CIPHER *
get_cipher_by_name(const char *name)
{
  int i;
  const SSL_METHOD *method = SSLv23_method();
  int num = method->num_ciphers();
  for (i = 0; i < num; ++i) {
    const SSL_CIPHER *cipher = method->get_cipher(i);
    const char *ciphername = SSL_CIPHER_get_name(cipher);
    if (!strcmp(ciphername, name)) {
      return (SSL_CIPHER *)cipher;
    }
  }

  return NULL;
}

static SSL_CIPHER *
get_cipher_by_id(uint16_t id)
{