Magellan Linux

Annotation of /trunk/mariadb/patches/mariadb-10.1.37-openssl-1.1.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3318 - (hide annotations) (download)
Tue Mar 12 14:08:59 2019 UTC (5 years, 3 months ago) by niro
File size: 34201 byte(s)
-updated openssl patch
1 niro 3318 diff --git a/cmake/ssl.cmake b/cmake/ssl.cmake
2     index 24e18600402..6fac749fd13 100644
3     --- a/cmake/ssl.cmake
4     +++ b/cmake/ssl.cmake
5     @@ -182,7 +182,7 @@ MACRO (MYSQL_CHECK_SSL)
6     HAVE_SHA512_DIGEST_LENGTH)
7     SET(CMAKE_REQUIRED_INCLUDES)
8     IF(OPENSSL_INCLUDE_DIR AND OPENSSL_LIBRARIES AND
9     - OPENSSL_MAJOR_VERSION STRLESS "101" AND
10     + OPENSSL_MAJOR_VERSION STRLESS "102" AND
11     CRYPTO_LIBRARY AND HAVE_SHA512_DIGEST_LENGTH)
12    
13     SET(SSL_SOURCES "")
14     diff --git a/include/ssl_compat.h b/include/ssl_compat.h
15     new file mode 100644
16     index 0000000..b0e3ed4
17     --- /dev/null
18     +++ b/include/ssl_compat.h
19     @@ -0,0 +1,75 @@
20     +/*
21     + Copyright (c) 2016, 2017 MariaDB Corporation
22     +
23     + This program is free software; you can redistribute it and/or modify
24     + it under the terms of the GNU General Public License as published by
25     + the Free Software Foundation; version 2 of the License.
26     +
27     + This program is distributed in the hope that it will be useful,
28     + but WITHOUT ANY WARRANTY; without even the implied warranty of
29     + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30     + GNU General Public License for more details.
31     +
32     + You should have received a copy of the GNU General Public License
33     + along with this program; if not, write to the Free Software
34     + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
35     +
36     +#include <openssl/opensslv.h>
37     +
38     +/* OpenSSL version specific definitions */
39     +#if !defined(HAVE_YASSL) && defined(OPENSSL_VERSION_NUMBER)
40     +
41     +#if OPENSSL_VERSION_NUMBER >= 0x10002000L && !defined(LIBRESSL_VERSION_NUMBER)
42     +#define HAVE_X509_check_host 1
43     +#endif
44     +
45     +#if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER)
46     +#define HAVE_OPENSSL11 1
47     +#define ERR_remove_state(X) ERR_clear_error()
48     +#define EVP_MD_CTX_cleanup(X) EVP_MD_CTX_reset(X)
49     +#define EVP_CIPHER_CTX_SIZE 168
50     +#define EVP_MD_CTX_SIZE 48
51     +#undef EVP_MD_CTX_init
52     +#define EVP_MD_CTX_init(X) do { bzero((X), EVP_MD_CTX_SIZE); EVP_MD_CTX_reset(X); } while(0)
53     +#undef EVP_CIPHER_CTX_init
54     +#define EVP_CIPHER_CTX_init(X) do { bzero((X), EVP_CIPHER_CTX_SIZE); EVP_CIPHER_CTX_reset(X); } while(0)
55     +
56     +#else
57     +#define HAVE_OPENSSL10 1
58     +/*
59     + Unfortunately RAND_bytes manual page does not provide any guarantees
60     + in relation to blocking behavior. Here we explicitly use SSLeay random
61     + instead of whatever random engine is currently set in OpenSSL. That way
62     + we are guaranteed to have a non-blocking random.
63     +*/
64     +#define RAND_OpenSSL() RAND_SSLeay()
65     +
66     +#ifdef HAVE_ERR_remove_thread_state
67     +#define ERR_remove_state(X) ERR_remove_thread_state(NULL)
68     +#endif /* HAVE_ERR_remove_thread_state */
69     +
70     +#endif /* HAVE_OPENSSL11 */
71     +
72     +#elif defined(HAVE_YASSL)
73     +#define BN_free(X) do { } while(0)
74     +#endif /* !defined(HAVE_YASSL) */
75     +
76     +#ifndef HAVE_OPENSSL11
77     +#define ASN1_STRING_get0_data(X) ASN1_STRING_data(X)
78     +#define OPENSSL_init_ssl(X,Y) SSL_library_init()
79     +#define DH_set0_pqg(D,P,Q,G) ((D)->p= (P), (D)->g= (G))
80     +#define EVP_CIPHER_CTX_buf_noconst(ctx) ((ctx)->buf)
81     +#define EVP_CIPHER_CTX_encrypting(ctx) ((ctx)->encrypt)
82     +#define EVP_CIPHER_CTX_SIZE sizeof(EVP_CIPHER_CTX)
83     +#define EVP_MD_CTX_SIZE sizeof(EVP_MD_CTX)
84     +#endif
85     +
86     +#ifdef __cplusplus
87     +extern "C" {
88     +#endif /* __cplusplus */
89     +
90     +int check_openssl_compatibility();
91     +
92     +#ifdef __cplusplus
93     +}
94     +#endif
95     diff --git a/include/violite.h b/include/violite.h
96     index a7165ca..572d474 100644
97     --- a/include/violite.h
98     +++ b/include/violite.h
99     @@ -123,13 +123,6 @@ int vio_getnameinfo(const struct sockaddr *sa,
100     int flags);
101    
102     #ifdef HAVE_OPENSSL
103     -#include <openssl/opensslv.h>
104     -#if OPENSSL_VERSION_NUMBER < 0x0090700f
105     -#define DES_cblock des_cblock
106     -#define DES_key_schedule des_key_schedule
107     -#define DES_set_key_unchecked(k,ks) des_set_key_unchecked((k),*(ks))
108     -#define DES_ede3_cbc_encrypt(i,o,l,k1,k2,k3,iv,e) des_ede3_cbc_encrypt((i),(o),(l),*(k1),*(k2),*(k3),(iv),(e))
109     -#endif
110     /* apple deprecated openssl in MacOSX Lion */
111     #ifdef __APPLE__
112     #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
113     @@ -146,14 +139,10 @@ typedef my_socket YASSL_SOCKET_T;
114     #include <openssl/ssl.h>
115     #include <openssl/err.h>
116    
117     -#ifdef HAVE_ERR_remove_thread_state
118     -#define ERR_remove_state(X) ERR_remove_thread_state(NULL)
119     -#endif
120     -
121     enum enum_ssl_init_error
122     {
123     - SSL_INITERR_NOERROR= 0, SSL_INITERR_CERT, SSL_INITERR_KEY,
124     - SSL_INITERR_NOMATCH, SSL_INITERR_BAD_PATHS, SSL_INITERR_CIPHERS,
125     + SSL_INITERR_NOERROR= 0, SSL_INITERR_CERT, SSL_INITERR_KEY,
126     + SSL_INITERR_NOMATCH, SSL_INITERR_BAD_PATHS, SSL_INITERR_CIPHERS,
127     SSL_INITERR_MEMFAIL, SSL_INITERR_DH, SSL_INITERR_LASTERR
128     };
129     const char* sslGetErrString(enum enum_ssl_init_error err);
130     diff --git a/mysql-test/include/require_openssl_client.inc b/mysql-test/include/require_openssl_client.inc
131     new file mode 100644
132     index 0000000..9b19960
133     --- /dev/null
134     +++ b/mysql-test/include/require_openssl_client.inc
135     @@ -0,0 +1,5 @@
136     +if ($CLIENT_TLS_LIBRARY != "OpenSSL") {
137     + if ($CLIENT_TLS_LIBRARY != "LibreSSL") {
138     + skip "Test requires Connector/C with OpenSSL library";
139     + }
140     +}
141     diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl
142     index eaec51b..1b28469 100755
143     --- a/mysql-test/mysql-test-run.pl
144     +++ b/mysql-test/mysql-test-run.pl
145     @@ -2307,6 +2307,11 @@ sub environment_setup {
146     $ENV{'MYSQL_PLUGIN'}= $exe_mysql_plugin;
147     $ENV{'MYSQL_EMBEDDED'}= $exe_mysql_embedded;
148    
149     + my $client_config_exe=
150     + native_path("$bindir/libmariadb/mariadb_config$opt_vs_config/mariadb_config");
151     + my $tls_info= `$client_config_exe --tlsinfo`;
152     + ($ENV{CLIENT_TLS_LIBRARY},$ENV{CLIENT_TLS_LIBRARY_VERSION})=
153     + split(/ /, $tls_info, 2);
154     my $exe_mysqld= find_mysqld($basedir);
155     $ENV{'MYSQLD'}= $exe_mysqld;
156     my $extra_opts= join (" ", @opt_extra_mysqld_opt);
157     diff --git a/mysql-test/r/openssl_6975,tlsv10.result b/mysql-test/r/openssl_6975,tlsv10.result
158     index 7a4465f..202e7f4 100644
159     --- a/mysql-test/r/openssl_6975,tlsv10.result
160     +++ b/mysql-test/r/openssl_6975,tlsv10.result
161     @@ -3,11 +3,11 @@ grant select on test.* to ssl_sslv3@localhost require cipher "AES128-SHA";
162     create user ssl_tls12@localhost;
163     grant select on test.* to ssl_tls12@localhost require cipher "AES128-SHA256";
164     TLS1.2 ciphers: user is ok with any cipher
165     -ERROR 2026 (HY000): SSL connection error: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
166     -ERROR 2026 (HY000): SSL connection error: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
167     +ERROR 2026 (HY000): SSL connection error: sslv3 alert handshake failure
168     +ERROR 2026 (HY000): SSL connection error: sslv3 alert handshake failure
169     TLS1.2 ciphers: user requires SSLv3 cipher AES128-SHA
170     -ERROR 2026 (HY000): SSL connection error: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
171     -ERROR 2026 (HY000): SSL connection error: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
172     +ERROR 2026 (HY000): SSL connection error: sslv3 alert handshake failure
173     +ERROR 2026 (HY000): SSL connection error: sslv3 alert handshake failure
174     TLS1.2 ciphers: user requires TLSv1.2 cipher AES128-SHA256
175     ERROR 2026 (HY000): SSL connection error: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
176     ERROR 2026 (HY000): SSL connection error: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
177     diff --git a/mysql-test/t/openssl_6975.test b/mysql-test/t/openssl_6975.test
178     index 49889a3..6a82d01 100644
179     --- a/mysql-test/t/openssl_6975.test
180     +++ b/mysql-test/t/openssl_6975.test
181     @@ -4,6 +4,7 @@
182     # test SSLv3 and TLSv1.2 ciphers when OpenSSL is restricted to SSLv3 or TLSv1.2
183     #
184     source include/have_ssl_communication.inc;
185     +source include/require_openssl_client.inc;
186    
187     # this is OpenSSL test.
188    
189     diff --git a/mysql-test/t/ssl_7937.test b/mysql-test/t/ssl_7937.test
190     index d593b9d..a764579 100644
191     --- a/mysql-test/t/ssl_7937.test
192     +++ b/mysql-test/t/ssl_7937.test
193     @@ -26,6 +26,7 @@ create procedure have_ssl()
194     # we fake the test result for yassl
195     let yassl=`select variable_value='Unknown' from information_schema.session_status where variable_name='Ssl_session_cache_mode'`;
196     if (!$yassl) {
197     + --replace_result "self signed certificate in certificate chain" "Failed to verify the server certificate" "Error in the certificate." "Failed to verify the server certificate"
198     --exec $MYSQL --ssl --ssl-verify-server-cert -e "call test.have_ssl()" 2>&1
199     }
200     if ($yassl) {
201     diff --git a/mysql-test/t/ssl_8k_key.test b/mysql-test/t/ssl_8k_key.test
202     index 27cffdc..9d5b382 100644
203     --- a/mysql-test/t/ssl_8k_key.test
204     +++ b/mysql-test/t/ssl_8k_key.test
205     @@ -1,5 +1,5 @@
206     -# This test should work in embedded server after we fix mysqltest
207     --- source include/not_embedded.inc
208     +# schannel does not support keys longer than 4k
209     +-- source include/not_windows.inc
210    
211     -- source include/have_ssl_communication.inc
212     #
213     diff --git a/mysys_ssl/CMakeLists.txt b/mysys_ssl/CMakeLists.txt
214     index 4f6f745..f8a767e 100644
215     --- a/mysys_ssl/CMakeLists.txt
216     +++ b/mysys_ssl/CMakeLists.txt
217     @@ -28,6 +28,7 @@ SET(MYSYS_SSL_HIDDEN_SOURCES
218     my_sha384.cc
219     my_sha512.cc
220     my_md5.cc
221     + openssl.c
222     )
223    
224     SET(MYSYS_SSL_SOURCES
225     diff --git a/mysys_ssl/my_crypt.cc b/mysys_ssl/my_crypt.cc
226     index 4393394..da60a10 100644
227     --- a/mysys_ssl/my_crypt.cc
228     +++ b/mysys_ssl/my_crypt.cc
229     @@ -1,6 +1,6 @@
230     /*
231     Copyright (c) 2014 Google Inc.
232     - Copyright (c) 2014, 2015 MariaDB Corporation
233     + Copyright (c) 2014, 2017 MariaDB Corporation
234    
235     This program is free software; you can redistribute it and/or modify
236     it under the terms of the GNU General Public License as published by
237     @@ -17,7 +17,6 @@
238    
239     #include <my_global.h>
240     #include <string.h>
241     -#include <my_crypt.h>
242    
243     #ifdef HAVE_YASSL
244     #include "yassl.cc"
245     @@ -28,42 +27,53 @@
246     #include <openssl/err.h>
247     #include <openssl/rand.h>
248    
249     -#ifdef HAVE_ERR_remove_thread_state
250     -#define ERR_remove_state(X) ERR_remove_thread_state(NULL)
251     +#include <openssl/rand.h>
252     #endif
253    
254     -#endif
255     +#include <my_crypt.h>
256     +#include <ssl_compat.h>
257    
258     class MyCTX
259     {
260     public:
261     - EVP_CIPHER_CTX ctx;
262     - MyCTX() { EVP_CIPHER_CTX_init(&ctx); }
263     - virtual ~MyCTX() { EVP_CIPHER_CTX_cleanup(&ctx); ERR_remove_state(0); }
264     + char ctx_buf[EVP_CIPHER_CTX_SIZE];
265     + EVP_CIPHER_CTX *ctx;
266     +
267     + MyCTX()
268     + {
269     + ctx= (EVP_CIPHER_CTX *)ctx_buf;
270     + EVP_CIPHER_CTX_init(ctx);
271     + }
272     + virtual ~MyCTX()
273     + {
274     + EVP_CIPHER_CTX_cleanup(ctx);
275     + ERR_remove_state(0);
276     + }
277    
278     virtual int init(const EVP_CIPHER *cipher, int encrypt, const uchar *key,
279     uint klen, const uchar *iv, uint ivlen)
280     {
281     + compile_time_assert(MY_AES_CTX_SIZE >= sizeof(MyCTX));
282     if (unlikely(!cipher))
283     return MY_AES_BAD_KEYSIZE;
284    
285     - if (!EVP_CipherInit_ex(&ctx, cipher, NULL, key, iv, encrypt))
286     + if (!EVP_CipherInit_ex(ctx, cipher, NULL, key, iv, encrypt))
287     return MY_AES_OPENSSL_ERROR;
288    
289     - DBUG_ASSERT(EVP_CIPHER_CTX_key_length(&ctx) == (int)klen);
290     - DBUG_ASSERT(EVP_CIPHER_CTX_iv_length(&ctx) <= (int)ivlen);
291     + DBUG_ASSERT(EVP_CIPHER_CTX_key_length(ctx) == (int)klen);
292     + DBUG_ASSERT(EVP_CIPHER_CTX_iv_length(ctx) <= (int)ivlen);
293    
294     return MY_AES_OK;
295     }
296     virtual int update(const uchar *src, uint slen, uchar *dst, uint *dlen)
297     {
298     - if (!EVP_CipherUpdate(&ctx, dst, (int*)dlen, src, slen))
299     + if (!EVP_CipherUpdate(ctx, dst, (int*)dlen, src, slen))
300     return MY_AES_OPENSSL_ERROR;
301     return MY_AES_OK;
302     }
303     virtual int finish(uchar *dst, uint *dlen)
304     {
305     - if (!EVP_CipherFinal_ex(&ctx, dst, (int*)dlen))
306     + if (!EVP_CipherFinal_ex(ctx, dst, (int*)dlen))
307     return MY_AES_BAD_DATA;
308     return MY_AES_OK;
309     }
310     @@ -73,7 +83,8 @@ class MyCTX_nopad : public MyCTX
311     {
312     public:
313     const uchar *key;
314     - int klen;
315     + uint klen, buf_len;
316     + uchar oiv[MY_AES_BLOCK_SIZE];
317    
318     MyCTX_nopad() : MyCTX() { }
319     ~MyCTX_nopad() { }
320     @@ -84,32 +95,48 @@ class MyCTX_nopad : public MyCTX
321     compile_time_assert(MY_AES_CTX_SIZE >= sizeof(MyCTX_nopad));
322     this->key= key;
323     this->klen= klen;
324     + this->buf_len= 0;
325     + memcpy(oiv, iv, ivlen);
326     + DBUG_ASSERT(ivlen == 0 || ivlen == sizeof(oiv));
327     +
328     int res= MyCTX::init(cipher, encrypt, key, klen, iv, ivlen);
329     - memcpy(ctx.oiv, iv, ivlen); // in ECB mode OpenSSL doesn't do that itself
330     - EVP_CIPHER_CTX_set_padding(&ctx, 0);
331     +
332     + EVP_CIPHER_CTX_set_padding(ctx, 0);
333     return res;
334     }
335    
336     + int update(const uchar *src, uint slen, uchar *dst, uint *dlen)
337     + {
338     + buf_len+= slen;
339     + return MyCTX::update(src, slen, dst, dlen);
340     + }
341     +
342     int finish(uchar *dst, uint *dlen)
343     {
344     - if (ctx.buf_len)
345     + buf_len %= MY_AES_BLOCK_SIZE;
346     + if (buf_len)
347     {
348     + uchar *buf= EVP_CIPHER_CTX_buf_noconst(ctx);
349     /*
350     Not much we can do, block ciphers cannot encrypt data that aren't
351     a multiple of the block length. At least not without padding.
352     Let's do something CTR-like for the last partial block.
353     +
354     + NOTE this assumes that there are only buf_len bytes in the buf.
355     + If OpenSSL will change that, we'll need to change the implementation
356     + of this class too.
357     */
358     uchar mask[MY_AES_BLOCK_SIZE];
359     uint mlen;
360    
361     my_aes_crypt(MY_AES_ECB, ENCRYPTION_FLAG_ENCRYPT | ENCRYPTION_FLAG_NOPAD,
362     - ctx.oiv, sizeof(mask), mask, &mlen, key, klen, 0, 0);
363     + oiv, sizeof(mask), mask, &mlen, key, klen, 0, 0);
364     DBUG_ASSERT(mlen == sizeof(mask));
365    
366     - for (int i=0; i < ctx.buf_len; i++)
367     - dst[i]= ctx.buf[i] ^ mask[i];
368     + for (uint i=0; i < buf_len; i++)
369     + dst[i]= buf[i] ^ mask[i];
370     }
371     - *dlen= ctx.buf_len;
372     + *dlen= buf_len;
373     return MY_AES_OK;
374     }
375     };
376     @@ -153,7 +180,7 @@ class MyCTX_gcm : public MyCTX
377     {
378     compile_time_assert(MY_AES_CTX_SIZE >= sizeof(MyCTX_gcm));
379     int res= MyCTX::init(cipher, encrypt, key, klen, iv, ivlen);
380     - int real_ivlen= EVP_CIPHER_CTX_iv_length(&ctx);
381     + int real_ivlen= EVP_CIPHER_CTX_iv_length(ctx);
382     aad= iv + real_ivlen;
383     aadlen= ivlen - real_ivlen;
384     return res;
385     @@ -167,15 +194,15 @@ class MyCTX_gcm : public MyCTX
386     before decrypting the data. it can encrypt data piecewise, like, first
387     half, then the second half, but it must decrypt all at once
388     */
389     - if (!ctx.encrypt)
390     + if (!EVP_CIPHER_CTX_encrypting(ctx))
391     {
392     slen-= MY_AES_BLOCK_SIZE;
393     - if(!EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_GCM_SET_TAG, MY_AES_BLOCK_SIZE,
394     + if(!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG, MY_AES_BLOCK_SIZE,
395     (void*)(src + slen)))
396     return MY_AES_OPENSSL_ERROR;
397     }
398     int unused;
399     - if (aadlen && !EVP_CipherUpdate(&ctx, NULL, &unused, aad, aadlen))
400     + if (aadlen && !EVP_CipherUpdate(ctx, NULL, &unused, aad, aadlen))
401     return MY_AES_OPENSSL_ERROR;
402     aadlen= 0;
403     return MyCTX::update(src, slen, dst, dlen);
404     @@ -184,13 +211,13 @@ class MyCTX_gcm : public MyCTX
405     int finish(uchar *dst, uint *dlen)
406     {
407     int fin;
408     - if (!EVP_CipherFinal_ex(&ctx, dst, &fin))
409     + if (!EVP_CipherFinal_ex(ctx, dst, &fin))
410     return MY_AES_BAD_DATA;
411     DBUG_ASSERT(fin == 0);
412    
413     - if (ctx.encrypt)
414     + if (EVP_CIPHER_CTX_encrypting(ctx))
415     {
416     - if(!EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_GCM_GET_TAG, MY_AES_BLOCK_SIZE, dst))
417     + if(!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, MY_AES_BLOCK_SIZE, dst))
418     return MY_AES_OPENSSL_ERROR;
419     *dlen= MY_AES_BLOCK_SIZE;
420     }
421     @@ -258,12 +285,15 @@ int my_aes_crypt(enum my_aes_mode mode, int flags,
422     {
423     void *ctx= alloca(MY_AES_CTX_SIZE);
424     int res1, res2;
425     - uint d1, d2;
426     + uint d1= 0, d2;
427     if ((res1= my_aes_crypt_init(ctx, mode, flags, key, klen, iv, ivlen)))
428     return res1;
429     res1= my_aes_crypt_update(ctx, src, slen, dst, &d1);
430     res2= my_aes_crypt_finish(ctx, dst + d1, &d2);
431     - *dlen= d1 + d2;
432     + if (res1 || res2)
433     + ERR_remove_state(0); /* in case of failure clear error queue */
434     + else
435     + *dlen= d1 + d2;
436     return res1 ? res1 : res2;
437     }
438    
439     diff --git a/mysys_ssl/my_md5.cc b/mysys_ssl/my_md5.cc
440     index 7139ea9..0105082 100644
441     --- a/mysys_ssl/my_md5.cc
442     +++ b/mysys_ssl/my_md5.cc
443     @@ -1,5 +1,5 @@
444     /* Copyright (c) 2012, Oracle and/or its affiliates.
445     - Copyright (c) 2014, SkySQL Ab.
446     + Copyright (c) 2017, MariaDB Corporation
447    
448     This program is free software; you can redistribute it and/or modify
449     it under the terms of the GNU General Public License as published by
450     @@ -29,38 +29,31 @@
451    
452     #if defined(HAVE_YASSL)
453     #include "md5.hpp"
454     +#include <ssl_compat.h>
455    
456     -typedef TaoCrypt::MD5 MD5_CONTEXT;
457     +typedef TaoCrypt::MD5 EVP_MD_CTX;
458    
459     -static void md5_init(MD5_CONTEXT *context)
460     +static void md5_init(EVP_MD_CTX *context)
461     {
462     - context= new(context) MD5_CONTEXT;
463     + context= new(context) EVP_MD_CTX;
464     context->Init();
465     }
466    
467     -/*
468     - this is a variant of md5_init to be used in this file only.
469     - does nothing for yassl, because the context's constructor was called automatically.
470     -*/
471     -static void md5_init_fast(MD5_CONTEXT *context)
472     -{
473     -}
474     -
475     -static void md5_input(MD5_CONTEXT *context, const uchar *buf, unsigned len)
476     +static void md5_input(EVP_MD_CTX *context, const uchar *buf, unsigned len)
477     {
478     context->Update((const TaoCrypt::byte *) buf, len);
479     }
480    
481     -static void md5_result(MD5_CONTEXT *context, uchar digest[MD5_HASH_SIZE])
482     +static void md5_result(EVP_MD_CTX *context, uchar digest[MD5_HASH_SIZE])
483     {
484     context->Final((TaoCrypt::byte *) digest);
485     }
486    
487     #elif defined(HAVE_OPENSSL)
488     #include <openssl/evp.h>
489     -typedef EVP_MD_CTX MD5_CONTEXT;
490     +#include <ssl_compat.h>
491    
492     -static void md5_init(MD5_CONTEXT *context)
493     +static void md5_init(EVP_MD_CTX *context)
494     {
495     EVP_MD_CTX_init(context);
496     #ifdef EVP_MD_CTX_FLAG_NON_FIPS_ALLOW
497     @@ -70,17 +63,12 @@ static void md5_init(MD5_CONTEXT *context)
498     EVP_DigestInit_ex(context, EVP_md5(), NULL);
499     }
500    
501     -static void md5_init_fast(MD5_CONTEXT *context)
502     -{
503     - md5_init(context);
504     -}
505     -
506     -static void md5_input(MD5_CONTEXT *context, const uchar *buf, unsigned len)
507     +static void md5_input(EVP_MD_CTX *context, const uchar *buf, unsigned len)
508     {
509     EVP_DigestUpdate(context, buf, len);
510     }
511    
512     -static void md5_result(MD5_CONTEXT *context, uchar digest[MD5_HASH_SIZE])
513     +static void md5_result(EVP_MD_CTX *context, uchar digest[MD5_HASH_SIZE])
514     {
515     EVP_DigestFinal_ex(context, digest, NULL);
516     EVP_MD_CTX_cleanup(context);
517     @@ -99,58 +87,58 @@ static void md5_result(MD5_CONTEXT *context, uchar digest[MD5_HASH_SIZE])
518     */
519     void my_md5(uchar *digest, const char *buf, size_t len)
520     {
521     - MD5_CONTEXT md5_context;
522     -
523     - md5_init_fast(&md5_context);
524     - md5_input(&md5_context, (const uchar *)buf, len);
525     - md5_result(&md5_context, digest);
526     + char ctx_buf[EVP_MD_CTX_SIZE];
527     + EVP_MD_CTX * const ctx= (EVP_MD_CTX*)ctx_buf;
528     + md5_init(ctx);
529     + md5_input(ctx, (const uchar *)buf, len);
530     + md5_result(ctx, digest);
531     }
532    
533    
534     /**
535     Wrapper function to compute MD5 message digest for
536     - two messages in order to emulate md5(msg1, msg2).
537     + many messages, concatenated.
538    
539     @param digest [out] Computed MD5 digest
540     @param buf1 [in] First message
541     @param len1 [in] Length of first message
542     - @param buf2 [in] Second message
543     - @param len2 [in] Length of second message
544     + ...
545     + @param bufN [in] NULL terminates the list of buf,len pairs.
546    
547     @return void
548     */
549     void my_md5_multi(uchar *digest, ...)
550     {
551     va_list args;
552     - va_start(args, digest);
553     -
554     - MD5_CONTEXT md5_context;
555     const uchar *str;
556     + char ctx_buf[EVP_MD_CTX_SIZE];
557     + EVP_MD_CTX * const ctx= (EVP_MD_CTX*)ctx_buf;
558     + va_start(args, digest);
559    
560     - md5_init_fast(&md5_context);
561     + md5_init(ctx);
562     for (str= va_arg(args, const uchar*); str; str= va_arg(args, const uchar*))
563     - md5_input(&md5_context, str, va_arg(args, size_t));
564     + md5_input(ctx, str, va_arg(args, size_t));
565    
566     - md5_result(&md5_context, digest);
567     + md5_result(ctx, digest);
568     va_end(args);
569     }
570    
571     size_t my_md5_context_size()
572     {
573     - return sizeof(MD5_CONTEXT);
574     + return EVP_MD_CTX_SIZE;
575     }
576    
577     void my_md5_init(void *context)
578     {
579     - md5_init((MD5_CONTEXT *)context);
580     + md5_init((EVP_MD_CTX *)context);
581     }
582    
583     void my_md5_input(void *context, const uchar *buf, size_t len)
584     {
585     - md5_input((MD5_CONTEXT *)context, buf, len);
586     + md5_input((EVP_MD_CTX *)context, buf, len);
587     }
588    
589     void my_md5_result(void *context, uchar *digest)
590     {
591     - md5_result((MD5_CONTEXT *)context, digest);
592     + md5_result((EVP_MD_CTX *)context, digest);
593     }
594     diff --git a/mysys_ssl/openssl.c b/mysys_ssl/openssl.c
595     new file mode 100644
596     index 0000000..a3f1ca2
597     --- /dev/null
598     +++ b/mysys_ssl/openssl.c
599     @@ -0,0 +1,71 @@
600     +/*
601     + Copyright (c) 2017, MariaDB Corporation.
602     +
603     + This program is free software; you can redistribute it and/or modify
604     + it under the terms of the GNU General Public License as published by
605     + the Free Software Foundation; version 2 of the License.
606     +
607     + This program is distributed in the hope that it will be useful,
608     + but WITHOUT ANY WARRANTY; without even the implied warranty of
609     + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
610     + GNU General Public License for more details.
611     +
612     + You should have received a copy of the GNU General Public License
613     + along with this program; if not, write to the Free Software
614     + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
615     +
616     +#include <my_global.h>
617     +#include <ssl_compat.h>
618     +
619     +#ifdef HAVE_YASSL
620     +
621     +int check_openssl_compatibility()
622     +{
623     + return 0;
624     +}
625     +#else
626     +#include <openssl/evp.h>
627     +
628     +#ifdef HAVE_OPENSSL11
629     +typedef void *(*CRYPTO_malloc_t)(size_t, const char *, int);
630     +#endif
631     +
632     +#ifdef HAVE_OPENSSL10
633     +typedef void *(*CRYPTO_malloc_t)(size_t);
634     +#define CRYPTO_malloc malloc
635     +#define CRYPTO_realloc realloc
636     +#define CRYPTO_free free
637     +#endif
638     +
639     +static uint allocated_size, allocated_count;
640     +
641     +static void *coc_malloc(size_t size)
642     +{
643     + allocated_size+= size;
644     + allocated_count++;
645     + return malloc(size);
646     +}
647     +
648     +int check_openssl_compatibility()
649     +{
650     + EVP_CIPHER_CTX *evp_ctx;
651     + EVP_MD_CTX *md5_ctx;
652     +
653     + CRYPTO_set_mem_functions((CRYPTO_malloc_t)coc_malloc, CRYPTO_realloc, CRYPTO_free);
654     +
655     + allocated_size= allocated_count= 0;
656     + evp_ctx= EVP_CIPHER_CTX_new();
657     + EVP_CIPHER_CTX_free(evp_ctx);
658     + if (allocated_count != 1 || allocated_size > EVP_CIPHER_CTX_SIZE)
659     + return 1;
660     +
661     + allocated_size= allocated_count= 0;
662     + md5_ctx= EVP_MD_CTX_create();
663     + EVP_MD_CTX_destroy(md5_ctx);
664     + if (allocated_count != 1 || allocated_size > EVP_MD_CTX_SIZE)
665     + return 1;
666     +
667     + CRYPTO_set_mem_functions(CRYPTO_malloc, CRYPTO_realloc, CRYPTO_free);
668     + return 0;
669     +}
670     +#endif
671     diff --git a/mysys_ssl/yassl.cc b/mysys_ssl/yassl.cc
672     index e9f8e65..268589d 100644
673     --- a/mysys_ssl/yassl.cc
674     +++ b/mysys_ssl/yassl.cc
675     @@ -45,7 +45,6 @@ typedef struct
676     int buf_len;
677     int final_used;
678     uchar tao_buf[sizeof(TaoCrypt::AES)]; // TaoCrypt::AES object
679     - uchar oiv[TaoCrypt::AES::BLOCK_SIZE]; // original IV
680     uchar buf[TaoCrypt::AES::BLOCK_SIZE]; // last partial input block
681     uchar final[TaoCrypt::AES::BLOCK_SIZE]; // last decrypted (output) block
682     } EVP_CIPHER_CTX;
683     @@ -98,10 +97,7 @@ static int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
684     : TaoCrypt::DECRYPTION, cipher->mode);
685     TAO(ctx)->SetKey(key, cipher->key_len);
686     if (iv)
687     - {
688     TAO(ctx)->SetIV(iv);
689     - memcpy(ctx->oiv, iv, TaoCrypt::AES::BLOCK_SIZE);
690     - }
691     ctx->encrypt= enc;
692     ctx->key_len= cipher->key_len;
693     ctx->flags|= cipher->mode == TaoCrypt::CBC ? EVP_CIPH_CBC_MODE : EVP_CIPH_ECB_MODE;
694     diff --git a/sql-common/client.c b/sql-common/client.c
695     index da18a0f..e3280a1 100644
696     --- a/sql-common/client.c
697     +++ b/sql-common/client.c
698     @@ -105,6 +105,7 @@ my_bool net_flush(NET *net);
699     #endif
700    
701     #include "client_settings.h"
702     +#include <ssl_compat.h>
703     #include <sql_common.h>
704     #include <mysql/client_plugin.h>
705     #include <my_context.h>
706     @@ -1770,9 +1771,8 @@ mysql_get_ssl_cipher(MYSQL *mysql __attribute__((unused)))
707    
708     #if defined(HAVE_OPENSSL)
709    
710     -#if OPENSSL_VERSION_NUMBER >= 0x10002000L && !defined(HAVE_YASSL)
711     +#ifdef HAVE_X509_check_host
712     #include <openssl/x509v3.h>
713     -#define HAVE_X509_check_host
714     #endif
715    
716     static int ssl_verify_server_cert(Vio *vio, const char* server_hostname, const char **errptr)
717     @@ -1844,7 +1844,7 @@ static int ssl_verify_server_cert(Vio *vio, const char* server_hostname, const c
718     goto error;
719     }
720    
721     - cn= (char *) ASN1_STRING_data(cn_asn1);
722     + cn= (char *) ASN1_STRING_get0_data(cn_asn1);
723    
724     if ((size_t)ASN1_STRING_length(cn_asn1) != strlen(cn))
725     {
726     diff --git a/sql/mysqld.cc b/sql/mysqld.cc
727     index 0de9d7a..3a92192 100644
728     --- a/sql/mysqld.cc
729     +++ b/sql/mysqld.cc
730     @@ -338,9 +338,13 @@ static PSI_thread_key key_thread_handle_con_sockets;
731     static PSI_thread_key key_thread_handle_shutdown;
732     #endif /* __WIN__ */
733    
734     -#if defined (HAVE_OPENSSL) && !defined(HAVE_YASSL)
735     +#ifdef HAVE_OPENSSL
736     +#include <ssl_compat.h>
737     +
738     +#ifdef HAVE_OPENSSL10
739     static PSI_rwlock_key key_rwlock_openssl;
740     #endif
741     +#endif
742     #endif /* HAVE_PSI_INTERFACE */
743    
744     #ifdef HAVE_NPTL
745     @@ -987,7 +991,7 @@ PSI_rwlock_key key_rwlock_LOCK_grant, key_rwlock_LOCK_logger,
746    
747     static PSI_rwlock_info all_server_rwlocks[]=
748     {
749     -#if defined (HAVE_OPENSSL) && !defined(HAVE_YASSL)
750     +#ifdef HAVE_OPENSSL10
751     { &key_rwlock_openssl, "CRYPTO_dynlock_value::lock", 0},
752     #endif
753     { &key_rwlock_LOCK_grant, "LOCK_grant", PSI_FLAG_GLOBAL},
754     @@ -1457,7 +1461,7 @@ scheduler_functions *thread_scheduler= &thread_scheduler_struct,
755    
756     #ifdef HAVE_OPENSSL
757     #include <openssl/crypto.h>
758     -#ifndef HAVE_YASSL
759     +#ifdef HAVE_OPENSSL10
760     typedef struct CRYPTO_dynlock_value
761     {
762     mysql_rwlock_t lock;
763     @@ -1468,7 +1472,7 @@ static openssl_lock_t *openssl_dynlock_create(const char *, int);
764     static void openssl_dynlock_destroy(openssl_lock_t *, const char *, int);
765     static void openssl_lock_function(int, int, const char *, int);
766     static void openssl_lock(int, openssl_lock_t *, const char *, int);
767     -#endif
768     +#endif /* HAVE_OPENSSL10 */
769     char *des_key_file;
770     #ifndef EMBEDDED_LIBRARY
771     struct st_VioSSLFd *ssl_acceptor_fd;
772     @@ -2244,11 +2248,11 @@ static void clean_up_mutexes()
773     mysql_mutex_destroy(&LOCK_global_index_stats);
774     #ifdef HAVE_OPENSSL
775     mysql_mutex_destroy(&LOCK_des_key_file);
776     -#ifndef HAVE_YASSL
777     +#ifdef HAVE_OPENSSL10
778     for (int i= 0; i < CRYPTO_num_locks(); ++i)
779     mysql_rwlock_destroy(&openssl_stdlocks[i].lock);
780     OPENSSL_free(openssl_stdlocks);
781     -#endif /* HAVE_YASSL */
782     +#endif /* HAVE_OPENSSL10 */
783     #endif /* HAVE_OPENSSL */
784     #ifdef HAVE_REPLICATION
785     mysql_mutex_destroy(&LOCK_rpl_status);
786     @@ -4038,6 +4042,14 @@ static int init_common_variables()
787     return 1;
788     }
789    
790     +#ifdef HAVE_OPENSSL
791     + if (check_openssl_compatibility())
792     + {
793     + sql_print_error("Incompatible OpenSSL version. Cannot continue...");
794     + return 1;
795     + }
796     +#endif
797     +
798     if (init_thread_environment() ||
799     mysql_init_variables())
800     return 1;
801     @@ -4584,7 +4596,7 @@ static int init_thread_environment()
802     #ifdef HAVE_OPENSSL
803     mysql_mutex_init(key_LOCK_des_key_file,
804     &LOCK_des_key_file, MY_MUTEX_INIT_FAST);
805     -#ifndef HAVE_YASSL
806     +#ifdef HAVE_OPENSSL10
807     openssl_stdlocks= (openssl_lock_t*) OPENSSL_malloc(CRYPTO_num_locks() *
808     sizeof(openssl_lock_t));
809     for (int i= 0; i < CRYPTO_num_locks(); ++i)
810     @@ -4593,8 +4605,8 @@ static int init_thread_environment()
811     CRYPTO_set_dynlock_destroy_callback(openssl_dynlock_destroy);
812     CRYPTO_set_dynlock_lock_callback(openssl_lock);
813     CRYPTO_set_locking_callback(openssl_lock_function);
814     -#endif
815     -#endif
816     +#endif /* HAVE_OPENSSL10 */
817     +#endif /* HAVE_OPENSSL */
818     mysql_rwlock_init(key_rwlock_LOCK_sys_init_connect, &LOCK_sys_init_connect);
819     mysql_rwlock_init(key_rwlock_LOCK_sys_init_slave, &LOCK_sys_init_slave);
820     mysql_rwlock_init(key_rwlock_LOCK_grant, &LOCK_grant);
821     @@ -4627,7 +4639,7 @@ static int init_thread_environment()
822     }
823    
824    
825     -#if defined(HAVE_OPENSSL) && !defined(HAVE_YASSL)
826     +#ifdef HAVE_OPENSSL10
827     static openssl_lock_t *openssl_dynlock_create(const char *file, int line)
828     {
829     openssl_lock_t *lock= new openssl_lock_t;
830     @@ -4687,8 +4699,7 @@ static void openssl_lock(int mode, openssl_lock_t *lock, const char *file,
831     abort();
832     }
833     }
834     -#endif /* HAVE_OPENSSL */
835     -
836     +#endif /* HAVE_OPENSSL10 */
837    
838     static void init_ssl()
839     {
840     diff --git a/sql/slave.cc b/sql/slave.cc
841     index da394ff..2096ed1 100644
842     --- a/sql/slave.cc
843     +++ b/sql/slave.cc
844     @@ -40,6 +40,7 @@
845     #include <my_dir.h>
846     #include <sql_common.h>
847     #include <errmsg.h>
848     +#include <ssl_compat.h>
849     #include <mysqld_error.h>
850     #include <mysys_err.h>
851     #include "rpl_handler.h"
852     @@ -60,7 +61,6 @@
853     #include "debug_sync.h"
854     #include "rpl_parallel.h"
855    
856     -
857     #define FLAGSTR(V,F) ((V)&(F)?#F" ":"")
858    
859     #define MAX_SLAVE_RETRY_PAUSE 5
860     @@ -4506,9 +4506,7 @@ log space");
861    
862     DBUG_LEAVE; // Must match DBUG_ENTER()
863     my_thread_end();
864     -#ifdef HAVE_OPENSSL
865     ERR_remove_state(0);
866     -#endif
867     pthread_exit(0);
868     return 0; // Avoid compiler warnings
869     }
870     @@ -5167,9 +5165,7 @@ pthread_handler_t handle_slave_sql(void *arg)
871    
872     DBUG_LEAVE; // Must match DBUG_ENTER()
873     my_thread_end();
874     -#ifdef HAVE_OPENSSL
875     ERR_remove_state(0);
876     -#endif
877     pthread_exit(0);
878     return 0; // Avoid compiler warnings
879     }
880     diff --git a/vio/vio.c b/vio/vio.c
881     index e3bc8ca..44d0609 100644
882     --- a/vio/vio.c
883     +++ b/vio/vio.c
884     @@ -22,6 +22,7 @@
885     */
886    
887     #include "vio_priv.h"
888     +#include "ssl_compat.h"
889    
890     #ifdef _WIN32
891    
892     diff --git a/vio/viosslfactories.c b/vio/viosslfactories.c
893     index 52b624d..71ef287 100644
894     --- a/vio/viosslfactories.c
895     +++ b/vio/viosslfactories.c
896     @@ -15,6 +15,7 @@
897     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
898    
899     #include "vio_priv.h"
900     +#include <ssl_compat.h>
901    
902     #ifdef HAVE_OPENSSL
903     #ifndef HAVE_YASSL
904     @@ -26,49 +27,56 @@ static my_bool ssl_algorithms_added = FALSE;
905     static my_bool ssl_error_strings_loaded= FALSE;
906    
907     /* the function below was generated with "openssl dhparam -2 -C 2048" */
908     +
909     static
910     DH *get_dh2048()
911     {
912     - static unsigned char dh2048_p[]={
913     - 0xA1,0xBB,0x7C,0x20,0xC5,0x5B,0xC0,0x7B,0x21,0x8B,0xD6,0xA8,
914     - 0x15,0xFC,0x3B,0xBA,0xAB,0x9F,0xDF,0x68,0xC4,0x79,0x78,0x0D,
915     - 0xC1,0x12,0x64,0xE4,0x15,0xC9,0x66,0xDB,0xF6,0xCB,0xB3,0x39,
916     - 0x02,0x5B,0x78,0x62,0xFB,0x09,0xAE,0x09,0x6B,0xDD,0xD4,0x5D,
917     - 0x97,0xBC,0xDC,0x7F,0xE6,0xD6,0xF1,0xCB,0xF5,0xEB,0xDA,0xA7,
918     - 0x2E,0x5A,0x43,0x2B,0xE9,0x40,0xE2,0x85,0x00,0x1C,0xC0,0x0A,
919     - 0x98,0x77,0xA9,0x31,0xDE,0x0B,0x75,0x4D,0x1E,0x1F,0x16,0x83,
920     - 0xCA,0xDE,0xBD,0x21,0xFC,0xC1,0x82,0x37,0x36,0x33,0x0B,0x66,
921     - 0x06,0x3C,0xF3,0xAF,0x21,0x57,0x57,0x80,0xF6,0x94,0x1B,0xA9,
922     - 0xD4,0xF6,0x8F,0x18,0x62,0x0E,0xC4,0x22,0xF9,0x5B,0x62,0xCC,
923     - 0x3F,0x19,0x95,0xCF,0x4B,0x00,0xA6,0x6C,0x0B,0xAF,0x9F,0xD5,
924     - 0xFA,0x3D,0x6D,0xDA,0x30,0x83,0x07,0x91,0xAC,0x15,0xFF,0x8F,
925     - 0x59,0x54,0xEA,0x25,0xBC,0x4E,0xEB,0x6A,0x54,0xDF,0x75,0x09,
926     - 0x72,0x0F,0xEF,0x23,0x70,0xE0,0xA8,0x04,0xEA,0xFF,0x90,0x54,
927     - 0xCD,0x84,0x18,0xC0,0x75,0x91,0x99,0x0F,0xA1,0x78,0x0C,0x07,
928     - 0xB7,0xC5,0xDE,0x55,0x06,0x7B,0x95,0x68,0x2C,0x33,0x39,0xBC,
929     - 0x2C,0xD0,0x6D,0xDD,0xFA,0xDC,0xB5,0x8F,0x82,0x39,0xF8,0x67,
930     - 0x44,0xF1,0xD8,0xF7,0x78,0x11,0x9A,0x77,0x9B,0x53,0x47,0xD6,
931     - 0x2B,0x5D,0x67,0xB8,0xB7,0xBC,0xC1,0xD7,0x79,0x62,0x15,0xC2,
932     - 0xC5,0x83,0x97,0xA7,0xF8,0xB4,0x9C,0xF6,0x8F,0x9A,0xC7,0xDA,
933     - 0x1B,0xBB,0x87,0x07,0xA7,0x71,0xAD,0xB2,0x8A,0x50,0xF8,0x26,
934     - 0x12,0xB7,0x3E,0x0B,
935     - };
936     - static unsigned char dh2048_g[]={
937     - 0x02,
938     - };
939     - DH *dh;
940     -
941     - if ((dh=DH_new()) == NULL) return(NULL);
942     - dh->p=BN_bin2bn(dh2048_p,sizeof(dh2048_p),NULL);
943     - dh->g=BN_bin2bn(dh2048_g,sizeof(dh2048_g),NULL);
944     - if ((dh->p == NULL) || (dh->g == NULL))
945     - { DH_free(dh); return(NULL); }
946     - return(dh);
947     + static unsigned char dhp_2048[] = {
948     + 0xA1,0xBB,0x7C,0x20,0xC5,0x5B,0xC0,0x7B,0x21,0x8B,0xD6,0xA8,
949     + 0x15,0xFC,0x3B,0xBA,0xAB,0x9F,0xDF,0x68,0xC4,0x79,0x78,0x0D,
950     + 0xC1,0x12,0x64,0xE4,0x15,0xC9,0x66,0xDB,0xF6,0xCB,0xB3,0x39,
951     + 0x02,0x5B,0x78,0x62,0xFB,0x09,0xAE,0x09,0x6B,0xDD,0xD4,0x5D,
952     + 0x97,0xBC,0xDC,0x7F,0xE6,0xD6,0xF1,0xCB,0xF5,0xEB,0xDA,0xA7,
953     + 0x2E,0x5A,0x43,0x2B,0xE9,0x40,0xE2,0x85,0x00,0x1C,0xC0,0x0A,
954     + 0x98,0x77,0xA9,0x31,0xDE,0x0B,0x75,0x4D,0x1E,0x1F,0x16,0x83,
955     + 0xCA,0xDE,0xBD,0x21,0xFC,0xC1,0x82,0x37,0x36,0x33,0x0B,0x66,
956     + 0x06,0x3C,0xF3,0xAF,0x21,0x57,0x57,0x80,0xF6,0x94,0x1B,0xA9,
957     + 0xD4,0xF6,0x8F,0x18,0x62,0x0E,0xC4,0x22,0xF9,0x5B,0x62,0xCC,
958     + 0x3F,0x19,0x95,0xCF,0x4B,0x00,0xA6,0x6C,0x0B,0xAF,0x9F,0xD5,
959     + 0xFA,0x3D,0x6D,0xDA,0x30,0x83,0x07,0x91,0xAC,0x15,0xFF,0x8F,
960     + 0x59,0x54,0xEA,0x25,0xBC,0x4E,0xEB,0x6A,0x54,0xDF,0x75,0x09,
961     + 0x72,0x0F,0xEF,0x23,0x70,0xE0,0xA8,0x04,0xEA,0xFF,0x90,0x54,
962     + 0xCD,0x84,0x18,0xC0,0x75,0x91,0x99,0x0F,0xA1,0x78,0x0C,0x07,
963     + 0xB7,0xC5,0xDE,0x55,0x06,0x7B,0x95,0x68,0x2C,0x33,0x39,0xBC,
964     + 0x2C,0xD0,0x6D,0xDD,0xFA,0xDC,0xB5,0x8F,0x82,0x39,0xF8,0x67,
965     + 0x44,0xF1,0xD8,0xF7,0x78,0x11,0x9A,0x77,0x9B,0x53,0x47,0xD6,
966     + 0x2B,0x5D,0x67,0xB8,0xB7,0xBC,0xC1,0xD7,0x79,0x62,0x15,0xC2,
967     + 0xC5,0x83,0x97,0xA7,0xF8,0xB4,0x9C,0xF6,0x8F,0x9A,0xC7,0xDA,
968     + 0x1B,0xBB,0x87,0x07,0xA7,0x71,0xAD,0xB2,0x8A,0x50,0xF8,0x26,
969     + 0x12,0xB7,0x3E,0x0B,
970     + };
971     + static unsigned char dhg_2048[] = {
972     + 0x02
973     + };
974     + DH *dh = DH_new();
975     + BIGNUM *dhp_bn, *dhg_bn;
976     +
977     + if (dh == NULL)
978     + return NULL;
979     + dhp_bn = BN_bin2bn(dhp_2048, sizeof (dhp_2048), NULL);
980     + dhg_bn = BN_bin2bn(dhg_2048, sizeof (dhg_2048), NULL);
981     + if (dhp_bn == NULL || dhg_bn == NULL
982     + || !DH_set0_pqg(dh, dhp_bn, NULL, dhg_bn)) {
983     + DH_free(dh);
984     + BN_free(dhp_bn);
985     + BN_free(dhg_bn);
986     + return NULL;
987     + }
988     + return dh;
989     }
990    
991     -
992     static const char*
993     -ssl_error_string[] =
994     +ssl_error_string[] =
995     {
996     "No error",
997     "Unable to get certificate",
998     @@ -148,9 +156,7 @@ static void check_ssl_init()
999     if (!ssl_algorithms_added)
1000     {
1001     ssl_algorithms_added= TRUE;
1002     - SSL_library_init();
1003     - OpenSSL_add_all_algorithms();
1004     -
1005     + OPENSSL_init_ssl(0, NULL);
1006     }
1007    
1008     if (!ssl_error_strings_loaded)