Hi Tim,

thanks for the patch. I did a test build and can confirm that it works.
I am now preparing an upload to Debian proper. Should come within the
next few hours.

Thanks for taking care of this issue!

Michael

On Sat, Nov 26, 2016 at 04:50:21PM -0600, Tim Theisen wrote:
> I have been working on getting HTCondor working with OpenSSL 1.1.
> 
> Although we would prefer to compile with VOMS support, it is preferable
> to turn this off, rather than miss getting into stretch. I have a patch
> to turn off compilation with VOMS. (rules.patch) We should revert this
> patch when the VOMS folks fix up their OpenSSL issues.
> 
> Once the VOMS dependency was eliminated, I found a few minor changes
> that needed to be addressed within HTCondor itself. I have included a
> patch to 8.4.9 (OpenSSL1.1.patch). This update will be released as part
> of the HTCondor 8.4.10 release, expected on December 1st.
> 
> Let me know if you need anything more, ...Tim
> 
> On 11/04/2016 06:31 AM, Michael Hanke wrote:
> > Relaying information from upstream's triaging:
> >
> >
> > ------------
> > I concluded that the problem was not with HTCondor. It had to do with the
> > following packages: libglobus-gsi-proxy-core, libglobus-gsi-proxy-ssl and
> > voms. The Globus folks addressed the first two issues. However, the VOMS 
> > issue
> > (#828595) is a blocker for us.
> > https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=828595
> > https://github.com/italiangrid/voms/issues/50
> > ------------
> > _______________________________________________
> > htcondor-debian mailing list
> > htcondor-deb...@cs.wisc.edu
> > https://lists.cs.wisc.edu/mailman/listinfo/htcondor-debian
> 
> -- 
> Tim Theisen
> Release Manager
> HTCondor & Open Science Grid
> Center for High Throughput Computing
> Department of Computer Sciences
> University of Wisconsin - Madison
> 4261 Computer Sciences and Statistics
> 1210 W Dayton St
> Madison, WI 53706-1685
> +1 608 265 5736
> 

> diff --git a/src/condor_includes/condor_crypt_3des.h 
> b/src/condor_includes/condor_crypt_3des.h
> index e2967d8..dc29b6a 100644
> --- a/src/condor_includes/condor_crypt_3des.h
> +++ b/src/condor_includes/condor_crypt_3des.h
> @@ -61,7 +61,7 @@ class Condor_Crypt_3des : public Condor_Crypt_Base {
>      //------------------------------------------
>      // Private constructor
>      //------------------------------------------
> -    des_key_schedule  keySchedule1_, keySchedule2_, keySchedule3_;
> +    DES_key_schedule  keySchedule1_, keySchedule2_, keySchedule3_;
>      unsigned char     ivec_[8];
>      int               num_;
>  };
> diff --git a/src/condor_io/condor_auth_ssl.cpp 
> b/src/condor_io/condor_auth_ssl.cpp
> index b8bb6cf..3c366b3 100644
> --- a/src/condor_io/condor_auth_ssl.cpp
> +++ b/src/condor_io/condor_auth_ssl.cpp
> @@ -36,7 +36,9 @@
>  #endif
>  
>  // Symbols from libssl
> +#if OPENSSL_VERSION_NUMBER < 0x10100000L
>  static long (*SSL_CTX_ctrl_ptr)(SSL_CTX *, int, long, void *) = NULL;
> +#endif
>  static void (*SSL_CTX_free_ptr)(SSL_CTX *) = NULL;
>  static int (*SSL_CTX_load_verify_locations_ptr)(SSL_CTX *, const char *, 
> const char *) = NULL;
>  #if OPENSSL_VERSION_NUMBER < 0x10000000L
> @@ -55,8 +57,12 @@ static void (*SSL_free_ptr)(SSL *) = NULL;
>  static int (*SSL_get_error_ptr)(const SSL *, int) = NULL;
>  static X509 *(*SSL_get_peer_certificate_ptr)(const SSL *) = NULL;
>  static long (*SSL_get_verify_result_ptr)(const SSL *) = NULL;
> +#if OPENSSL_VERSION_NUMBER < 0x10100000L
>  static int (*SSL_library_init_ptr)() = NULL;
>  static void (*SSL_load_error_strings_ptr)() = NULL;
> +#else
> +static int (*OPENSSL_init_ssl_ptr)(uint64_t, const OPENSSL_INIT_SETTINGS *) 
> = NULL;
> +#endif
>  static SSL *(*SSL_new_ptr)(SSL_CTX *) = NULL;
>  static int (*SSL_read_ptr)(SSL *, void *, int) = NULL;
>  static void (*SSL_set_bio_ptr)(SSL *, BIO *, BIO *) = NULL;
> @@ -79,7 +85,11 @@ Condor_Auth_SSL :: Condor_Auth_SSL(ReliSock * sock, int /* 
> remote */)
>  
>  Condor_Auth_SSL :: ~Condor_Auth_SSL()
>  {
> +#if OPENSSL_VERSION_NUMBER < 0x10000000L
>      ERR_remove_state( 0 );
> +#elif OPENSSL_VERSION_NUMBER < 0x10100000L
> +    ERR_remove_thread_state( 0 );
> +#endif
>       if(m_crypto) delete(m_crypto);
>  }
>  
> @@ -96,7 +106,9 @@ bool Condor_Auth_SSL::Initialize()
>  
>       if ( Condor_Auth_Kerberos::Initialize() == false ||
>                (dl_hdl = dlopen(LIBSSL_SO, RTLD_LAZY)) == NULL ||
> +#if OPENSSL_VERSION_NUMBER < 0x10100000L
>                !(SSL_CTX_ctrl_ptr = (long (*)(SSL_CTX *, int, long, void 
> *))dlsym(dl_hdl, "SSL_CTX_ctrl")) ||
> +#endif
>                !(SSL_CTX_free_ptr = (void (*)(SSL_CTX *))dlsym(dl_hdl, 
> "SSL_CTX_free")) ||
>                !(SSL_CTX_load_verify_locations_ptr = (int (*)(SSL_CTX *, 
> const char *, const char *))dlsym(dl_hdl, "SSL_CTX_load_verify_locations")) ||
>  #if OPENSSL_VERSION_NUMBER < 0x10000000L
> @@ -115,8 +127,12 @@ bool Condor_Auth_SSL::Initialize()
>                !(SSL_get_error_ptr = (int (*)(const SSL *, int))dlsym(dl_hdl, 
> "SSL_get_error")) ||
>                !(SSL_get_peer_certificate_ptr = (X509 *(*)(const SSL 
> *))dlsym(dl_hdl, "SSL_get_peer_certificate")) ||
>                !(SSL_get_verify_result_ptr = (long (*)(const SSL 
> *))dlsym(dl_hdl, "SSL_get_verify_result")) ||
> +#if OPENSSL_VERSION_NUMBER < 0x10100000L
>                !(SSL_library_init_ptr = (int (*)())dlsym(dl_hdl, 
> "SSL_library_init")) ||
>                !(SSL_load_error_strings_ptr = (void (*)())dlsym(dl_hdl, 
> "SSL_load_error_strings")) ||
> +#else
> +              !(OPENSSL_init_ssl_ptr = (int (*)(uint64_t, const 
> OPENSSL_INIT_SETTINGS *))dlsym(dl_hdl, "OPENSSL_init_ssl")) ||
> +#endif
>                !(SSL_new_ptr = (SSL *(*)(SSL_CTX *))dlsym(dl_hdl, "SSL_new")) 
> ||
>                !(SSL_read_ptr = (int (*)(SSL *, void *, int))dlsym(dl_hdl, 
> "SSL_read")) ||
>                !(SSL_set_bio_ptr = (void (*)(SSL *, BIO *, BIO 
> *))dlsym(dl_hdl, "SSL_set_bio")) ||
> @@ -141,7 +157,9 @@ bool Condor_Auth_SSL::Initialize()
>               m_initSuccess = true;
>       }
>  #else
> +#if OPENSSL_VERSION_NUMBER < 0x10100000L
>       SSL_CTX_ctrl_ptr = SSL_CTX_ctrl;
> +#endif
>       SSL_CTX_free_ptr = SSL_CTX_free;
>       SSL_CTX_load_verify_locations_ptr = SSL_CTX_load_verify_locations;
>       SSL_CTX_new_ptr = SSL_CTX_new;
> @@ -156,8 +174,12 @@ bool Condor_Auth_SSL::Initialize()
>       SSL_get_error_ptr = SSL_get_error;
>       SSL_get_peer_certificate_ptr = SSL_get_peer_certificate;
>       SSL_get_verify_result_ptr = SSL_get_verify_result;
> +#if OPENSSL_VERSION_NUMBER < 0x10100000L
>       SSL_library_init_ptr = SSL_library_init;
>       SSL_load_error_strings_ptr = SSL_load_error_strings;
> +#else
> +     OPENSSL_init_ssl_ptr = OPENSSL_init_ssl;
> +#endif
>       SSL_new_ptr = SSL_new;
>       SSL_read_ptr = SSL_read;
>       SSL_set_bio_ptr = SSL_set_bio;
> @@ -747,10 +769,17 @@ Condor_Auth_SSL::unwrap(char *   input,
>  
>  int Condor_Auth_SSL :: init_OpenSSL(void)
>  {
> +#if OPENSSL_VERSION_NUMBER < 0x10100000L
>      if (!(*SSL_library_init_ptr)()) {
>          return AUTH_SSL_ERROR;
>      }
>      (*SSL_load_error_strings_ptr)();
> +#else
> +    if (!(*OPENSSL_init_ssl_ptr)(OPENSSL_INIT_LOAD_SSL_STRINGS \
> +                               | OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL)) {
> +        return AUTH_SSL_ERROR;
> +    }
> +#endif
>      // seed_pnrg(); TODO: 
>      return AUTH_SSL_A_OK;
>  }
> @@ -1125,9 +1154,11 @@ SSL_CTX *Condor_Auth_SSL :: setup_ssl_ctx( bool 
> is_server )
>               goto setup_server_ctx_err;
>       }
>  
> +#if OPENSSL_VERSION_NUMBER < 0x10100000L
>       // disable SSLv2.  it has vulnerabilities.
>       //SSL_CTX_set_options( ctx, SSL_OP_NO_SSLv2 );
>       (*SSL_CTX_ctrl_ptr)( ctx, SSL_CTRL_OPTIONS, SSL_OP_NO_SSLv2, NULL );
> +#endif
>  
>      if( (*SSL_CTX_load_verify_locations_ptr)( ctx, cafile, cadir ) != 1 ) {
>          ouch( "Error loading CA file and/or directory\n" );
> @@ -1147,8 +1178,10 @@ SSL_CTX *Condor_Auth_SSL :: setup_ssl_ctx( bool 
> is_server )
>               // TODO where's this?
>      (*SSL_CTX_set_verify_ptr)( ctx, SSL_VERIFY_PEER, verify_callback ); 
>      (*SSL_CTX_set_verify_depth_ptr)( ctx, 4 ); // TODO arbitrary?
> +#if OPENSSL_VERSION_NUMBER < 0x10100000L
>      //SSL_CTX_set_options( ctx, SSL_OP_ALL|SSL_OP_NO_SSLv2 );
>      (*SSL_CTX_ctrl_ptr)( ctx, SSL_CTRL_OPTIONS, SSL_OP_ALL|SSL_OP_NO_SSLv2, 
> NULL );
> +#endif
>      if((*SSL_CTX_set_cipher_list_ptr)( ctx, cipherlist ) != 1 ) {
>          ouch( "Error setting cipher list (no valid ciphers)\n" );
>          goto setup_server_ctx_err;
> diff --git a/src/condor_io/condor_crypt_3des.cpp 
> b/src/condor_io/condor_crypt_3des.cpp
> index 2537e2f..5c8b4e7 100644
> --- a/src/condor_io/condor_crypt_3des.cpp
> +++ b/src/condor_io/condor_crypt_3des.cpp
> @@ -35,9 +35,9 @@ Condor_Crypt_3des :: Condor_Crypt_3des(const KeyInfo& key)
>       unsigned char * keyData = k.getPaddedKeyData(24);
>       ASSERT(keyData);
>  
> -    des_set_key((des_cblock *)  keyData    , keySchedule1_);
> -    des_set_key((des_cblock *) (keyData+8) , keySchedule2_);
> -    des_set_key((des_cblock *) (keyData+16), keySchedule3_);
> +    DES_set_key((DES_cblock *)  keyData    , &keySchedule1_);
> +    DES_set_key((DES_cblock *) (keyData+8) , &keySchedule2_);
> +    DES_set_key((DES_cblock *) (keyData+16), &keySchedule3_);
>  
>      // initialize ivsec
>      resetState();
> @@ -71,9 +71,9 @@ bool Condor_Crypt_3des :: encrypt(unsigned char *  input,
>      output = (unsigned char *) malloc(input_len);
>  
>      if (output) {
> -        des_ede3_cfb64_encrypt(input, output, output_len,
> -                               keySchedule1_, keySchedule2_, keySchedule3_,
> -                               (des_cblock *)ivec_, &num_, DES_ENCRYPT);
> +        DES_ede3_cfb64_encrypt(input, output, output_len,
> +                               &keySchedule1_, &keySchedule2_, 
> &keySchedule3_,
> +                               (DES_cblock *)ivec_, &num_, DES_ENCRYPT);
>          return true;   
>      }
>      else {
> @@ -95,9 +95,9 @@ bool Condor_Crypt_3des :: decrypt(unsigned char *  input,
>      if (output) {
>          output_len = input_len;
>  
> -        des_ede3_cfb64_encrypt(input, output, output_len,
> -                               keySchedule1_, keySchedule2_, keySchedule3_,
> -                               (des_cblock *)ivec_, &num_, DES_DECRYPT);
> +        DES_ede3_cfb64_encrypt(input, output, output_len,
> +                               &keySchedule1_, &keySchedule2_, 
> &keySchedule3_,
> +                               (DES_cblock *)ivec_, &num_, DES_DECRYPT);
>          
>          return true;           // Should be changed
>      }
> diff --git a/src/condor_utils/condor_dh.cpp b/src/condor_utils/condor_dh.cpp
> deleted file mode 100644
> index 8450244..0000000
> --- a/src/condor_utils/condor_dh.cpp
> +++ /dev/null
> @@ -1,204 +0,0 @@
> -/***************************************************************
> - *
> - * Copyright (C) 1990-2011, Condor Team, Computer Sciences Department,
> - * University of Wisconsin-Madison, WI.
> - * 
> - * Licensed under the Apache License, Version 2.0 (the "License"); you
> - * may not use this file except in compliance with the License.  You may
> - * obtain a copy of the License at
> - * 
> - *    http://www.apache.org/licenses/LICENSE-2.0
> - * 
> - * Unless required by applicable law or agreed to in writing, software
> - * distributed under the License is distributed on an "AS IS" BASIS,
> - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> - * See the License for the specific language governing permissions and
> - * limitations under the License.
> - *
> - ***************************************************************/
> -
> -
> -#include "condor_common.h"
> -#include "condor_dh.h"
> -#include "condor_debug.h"
> -#include "condor_config.h"
> -
> -#if HAVE_EXT_OPENSSL
> -
> -//#include <openssl/pem.h>
> -//#include <openssl/bn.h>
> -
> -const char DH_CONFIG_FILE[] = "CONDOR_DH_CONFIG";
> -
> -Condor_Diffie_Hellman :: Condor_Diffie_Hellman()
> -    : dh_     (0),
> -      secret_ (0),
> -      keySize_(0)
> -{
> -    initialize();
> -}
> -
> -Condor_Diffie_Hellman :: ~Condor_Diffie_Hellman()
> -{
> -    if (dh_) {
> -        DH_free(dh_);
> -    }
> -    if (secret_) {
> -        free(secret_);
> -    }
> -    keySize_ = 0;
> -
> -}
> -
> -int Condor_Diffie_Hellman :: compute_shared_secret(const char * pk)
> -{
> -    // the input pk is assumed to be an encoded string representing
> -    // the binary data for the remote party's public key -- y (or x)
> -    // the local DH knows about g and x, now, it will compute
> -    // (g^x)^y, or (g^y)^x
> -
> -    BIGNUM * remote_pubKey = NULL;
> -
> -    if (BN_hex2bn(&remote_pubKey, pk) == 0) {
> -        dprintf(D_ALWAYS, "Unable to obtain remote public key\n");
> -        goto error;
> -    }
> -
> -    if ((dh_ != NULL) && (remote_pubKey != NULL)) {
> -
> -        secret_ = (unsigned char *) malloc(DH_size(dh_));
> -
> -        // Now compute
> -        keySize_ = DH_compute_key(secret_, remote_pubKey, dh_);
> -        BN_clear_free(remote_pubKey);
> -
> -        if (keySize_ == -1) {
> -            dprintf(D_ALWAYS, "Unable to compute shared secret\n");
> -            goto error;
> -        }
> -    }   
> -    else {
> -        goto error;
> -    }
> -    return 1;
> -
> - error:
> -    if (remote_pubKey) {
> -        BN_clear_free(remote_pubKey);
> -    }
> -    if (secret_) {
> -        free(secret_);
> -        secret_ = NULL;
> -    }
> -    return 0;
> -}
> -    
> -char * Condor_Diffie_Hellman :: getPublicKeyChar()
> -{
> -    // This will return g^x, x is the secret, encoded in HEX format
> -    if (dh_ && dh_->pub_key) {
> -        return BN_bn2hex(dh_->pub_key);
> -    }
> -    else {
> -        return NULL;
> -    }
> -}
> -
> -BIGNUM * Condor_Diffie_Hellman::getPrime()
> -{
> -    if (dh_) {
> -        return dh_->p;
> -    }
> -    else {
> -        return 0;
> -    }
> -}
> -
> -char * Condor_Diffie_Hellman :: getPrimeChar()
> -{
> -    if (dh_ && dh_->p) {
> -        return BN_bn2hex(dh_->p);
> -    }
> -    else {
> -        return NULL;
> -    }
> -}
> -
> -BIGNUM * Condor_Diffie_Hellman :: getGenerator()
> -{
> -    if (dh_) {
> -        return dh_->g;
> -    }
> -    else {
> -        return 0;
> -    }
> -}
> -
> -char * Condor_Diffie_Hellman :: getGeneratorChar()
> -{
> -    if (dh_ && dh_->g) {
> -        return BN_bn2hex(dh_->g);
> -    }
> -    else {
> -        return NULL;
> -    }
> -}
> -
> -const unsigned char * Condor_Diffie_Hellman :: getSecret() const
> -{
> -    return secret_;
> -}
> -
> -int Condor_Diffie_Hellman :: getSecretSize() const
> -{
> -    return keySize_;
> -}
> -
> -int Condor_Diffie_Hellman :: initialize()
> -{
> -    // First, check the config file to find out where is the file
> -    // with all the parameters
> -    config();
> -    char * dh_config = param(DH_CONFIG_FILE);
> -
> -    FILE * fp = 0;
> -    if ( dh_config ) {
> -        if ( (fp = safe_fopen_wrapper_follow(dh_config, "r")) == NULL) {
> -            dprintf(D_ALWAYS, "Unable to open condor_dh_config file %s\n", 
> dh_config);
> -            goto error;
> -        }
> -
> -        dh_ = PEM_read_DHparams(fp, NULL, NULL, NULL);
> -        if (dh_ == NULL) {
> -            dprintf(D_ALWAYS, "Unable to read DH structure from the 
> configuration file.\n");
> -            goto error;
> -        }
> -
> -        // Now generate private key
> -        if (DH_generate_key(dh_) == 0) {
> -            dprintf(D_ALWAYS, "Unable to generate a private key \n");
> -            goto error;
> -        }
> -    }
> -    else {
> -        dprintf(D_ALWAYS, "The required configuration parameter 
> CONDOR_DH_CONFIG is not specified in the condor configuration file!\n");
> -        goto error;
> -    }
> -    fclose(fp);
> -    free(dh_config);
> -    return 1;
> - error:
> -    if (dh_) {
> -        DH_free(dh_);
> -        dh_ = 0;
> -    }
> -    if (dh_config) {
> -        free(dh_config);
> -    }
> -    if (fp) {
> -        fclose(fp);
> -    }
> -    return 0;
> -}
> -
> -#endif
> diff --git a/src/condor_utils/condor_dh.h b/src/condor_utils/condor_dh.h
> deleted file mode 100644
> index 63ba8ed..0000000
> --- a/src/condor_utils/condor_dh.h
> +++ /dev/null
> @@ -1,73 +0,0 @@
> -/***************************************************************
> - *
> - * Copyright (C) 1990-2007, Condor Team, Computer Sciences Department,
> - * University of Wisconsin-Madison, WI.
> - * 
> - * Licensed under the Apache License, Version 2.0 (the "License"); you
> - * may not use this file except in compliance with the License.  You may
> - * obtain a copy of the License at
> - * 
> - *    http://www.apache.org/licenses/LICENSE-2.0
> - * 
> - * Unless required by applicable law or agreed to in writing, software
> - * distributed under the License is distributed on an "AS IS" BASIS,
> - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> - * See the License for the specific language governing permissions and
> - * limitations under the License.
> - *
> - ***************************************************************/
> -
> -#ifndef CONDOR_DH
> -#define CONDOR_DH
> -
> -#include "condor_common.h"
> -
> -#if HAVE_EXT_OPENSSL
> -
> -#include <openssl/ssl.h>
> -//#include <openssl/rand.h>
> -
> -//----------------------------------------------------------------------
> -//  Diffie-Hellman key exchange, based on API provided by OpenSSL
> -//  privately known variables: x and y -- the secret, one for each
> -//                             party
> -//  publicly known variables:  g -- the generator, p -- the prime, 
> -//                             g^x -- the public key
> -//----------------------------------------------------------------------
> -
> -class Condor_Diffie_Hellman {
> -
> - public:
> -    Condor_Diffie_Hellman();
> -    ~Condor_Diffie_Hellman();
> -    
> -    char * getPublicKeyChar();
> -    //------------------------------------------
> -    // PURPOSE: Return public key in HEX encoded format
> -    // REQUIRE: None
> -    // RETURNS: HEX string or NULL
> -    //------------------------------------------
> -
> -    BIGNUM * getPrime();
> -    BIGNUM * getGenerator();
> -    // These two methods return the prime and the generator
> -    
> -    char * getPrimeChar();
> -    char * getGeneratorChar();
> -    // These two methods return the prime and the generator
> -    // in HEX encoded format if they exist. Otherwise, NULL is returned.
> -
> -    int  compute_shared_secret(const char * pk);
> -    const unsigned char * getSecret() const;
> -    int getSecretSize() const;
> -
> - private:
> -    int initialize();
> -
> -    DH * dh_;
> -    unsigned char * secret_;
> -    int keySize_;
> -};
> -#endif
> -
> -#endif

> --- rules.orig        2016-08-19 03:14:12.000000000 -0500
> +++ rules     2016-11-26 16:30:32.150213560 -0600
> @@ -35,6 +35,8 @@
>               -DHAVE_EXT_LIBXML2:BOOL=ON \
>               -DHAVE_EXT_OPENSSL:BOOL=ON \
>               -DHAVE_EXT_PCRE:BOOL=ON \
> +             -DHAVE_EXT_VOMS:BOOL=OFF \
> +             -DWITH_VOMS:BOOL=OFF \
>               -DWITH_LIBCGROUP:BOOL=ON \
>               -DWANT_CONTRIB:BOOL=OFF \
>               -DWITH_BOSCO:BOOL=OFF \


-- 
Michael Hanke
GPG: 4096R/C073D2287FFB9E9B
http://psychoinformatics.de

Reply via email to