Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3318 - (show annotations) (download)
Tue Mar 12 14:08:59 2019 UTC (5 years, 1 month ago) by niro
File size: 34201 byte(s)
-updated openssl patch
1 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)