1/*
2 Copyright (c) 2017, MariaDB Corporation.
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; version 2 of the License.
7
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12
13 You should have received a copy of the GNU General Public License
14 along with this program; if not, write to the Free Software
15 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
16
17#include <my_global.h>
18#include <ssl_compat.h>
19
20/*
21 The check is only done for OpenSSL 1.1.x.
22 It could run for OpenSSL 1.0.x but it doesn't make much sense
23 and it hits this bug:
24 https://bugs.launchpad.net/ubuntu/+source/openssl/+bug/1594748
25*/
26
27#ifndef HAVE_OPENSSL11
28int check_openssl_compatibility()
29{
30 return 0;
31}
32#else
33#include <openssl/evp.h>
34
35static uint testing, alloc_size, alloc_count;
36
37static void *coc_malloc(size_t size, const char *f __attribute__((unused)),
38 int l __attribute__((unused)))
39{
40 if (unlikely(testing))
41 {
42 alloc_size+= size;
43 alloc_count++;
44 }
45 return malloc(size);
46}
47
48int check_openssl_compatibility()
49{
50 EVP_CIPHER_CTX *evp_ctx;
51 EVP_MD_CTX *md5_ctx;
52
53 if (!CRYPTO_set_mem_functions(coc_malloc, NULL, NULL))
54 return 0;
55
56 testing= 1;
57 alloc_size= alloc_count= 0;
58 evp_ctx= EVP_CIPHER_CTX_new();
59 EVP_CIPHER_CTX_free(evp_ctx);
60 if (alloc_count != 1 || !alloc_size || alloc_size > EVP_CIPHER_CTX_SIZE)
61 return 1;
62
63 alloc_size= alloc_count= 0;
64 md5_ctx= EVP_MD_CTX_new();
65 EVP_MD_CTX_free(md5_ctx);
66 if (alloc_count != 1 || !alloc_size || alloc_size > EVP_MD_CTX_SIZE)
67 return 1;
68
69 testing= 0;
70 return 0;
71}
72#endif
73