1
0
mirror of https://github.com/mariadb-corporation/mariadb-connector-c.git synced 2025-08-07 02:42:49 +03:00

Since we use TLS and not SSL functions and structures were renamed

from SSL to TLS
This commit is contained in:
Georg Richter
2016-03-16 18:20:08 +01:00
parent f68b89bc46
commit 4b1e94bccc
18 changed files with 329 additions and 1182 deletions

View File

@@ -49,13 +49,14 @@ struct st_mysql_options_extension {
const char *proc_info,
unsigned int proc_info_length);
MARIADB_DB_DRIVER *db_driver;
char *ssl_fp; /* finger print of server certificate */
char *ssl_fp_list; /* white list of finger prints */
char *ssl_pw; /* password for encrypted certificates */
char *tls_fp; /* finger print of server certificate */
char *tls_fp_list; /* white list of finger prints */
char *tls_pw; /* password for encrypted certificates */
my_bool multi_command; /* indicates if client wants to send multiple
commands in one packet */
char *url; /* for connection handler we need to save URL for reconnect */
unsigned int ssl_cipher_strength;
unsigned int tls_cipher_strength;
char *tls_version;
my_bool read_only;
char *connection_handler;
my_bool (*set_option)(MYSQL *mysql, const char *config_option, const char *config_value);

View File

@@ -3,9 +3,9 @@
#define cio_defined
#ifdef HAVE_SSL
#include <ma_ssl.h>
#include <ma_tls.h>
#else
#define MARIADB_SSL void
#define MARIADB_TLS void
#endif
#define PVIO_SET_ERROR if (pvio->set_error) \
@@ -78,7 +78,7 @@ struct st_ma_pvio {
enum enum_pvio_type type;
int timeout[3];
int ssl_type; /* todo: change to enum (ssl plugins) */
MARIADB_SSL *cssl;
MARIADB_TLS *ctls;
MYSQL *mysql;
struct mysql_async_context *async_context; /* For non-blocking API */
PVIO_METHODS *methods;

View File

@@ -1,7 +1,7 @@
#ifndef _ma_ssl_h_
#define _ma_ssl_h_
#ifndef _ma_tls_h_
#define _ma_tls_h_
enum enum_pvio_ssl_type {
enum enum_pvio_tls_type {
SSL_TYPE_DEFAULT=0,
#ifdef _WIN32
SSL_TYPE_SCHANNEL,
@@ -10,11 +10,11 @@ enum enum_pvio_ssl_type {
SSL_TYPE_GNUTLS
};
typedef struct st_ma_pvio_ssl {
typedef struct st_ma_pvio_tls {
void *data;
MARIADB_PVIO *pvio;
void *ssl;
} MARIADB_SSL;
} MARIADB_TLS;
struct st_ssl_version {
unsigned int iversion;
@@ -23,7 +23,7 @@ struct st_ssl_version {
/* Function prototypes */
/* ma_ssl_start
/* ma_tls_start
initializes the ssl library
Parameter:
errmsg pointer to error message buffer
@@ -32,17 +32,17 @@ struct st_ssl_version {
0 success
1 if an error occured
Notes:
On success the global variable ma_ssl_initialized will be set to 1
On success the global variable ma_tls_initialized will be set to 1
*/
int ma_ssl_start(char *errmsg, size_t errmsg_len);
int ma_tls_start(char *errmsg, size_t errmsg_len);
/* ma_ssl_end
/* ma_tls_end
unloads/deinitializes ssl library and unsets global variable
ma_ssl_initialized
ma_tls_initialized
*/
void ma_ssl_end(void);
void ma_tls_end(void);
/* ma_ssl_init
/* ma_tls_init
creates a new SSL structure for a SSL connection and loads
client certificates
@@ -51,106 +51,106 @@ void ma_ssl_end(void);
Returns:
void * a pointer to internal SSL structure
*/
void * ma_ssl_init(MYSQL *mysql);
void * ma_tls_init(MYSQL *mysql);
/* ma_ssl_connect
/* ma_tls_connect
performs SSL handshake
Parameters:
MARIADB_SSL MariaDB SSL container
MARIADB_TLS MariaDB SSL container
Returns:
0 success
1 error
*/
my_bool ma_ssl_connect(MARIADB_SSL *cssl);
my_bool ma_tls_connect(MARIADB_TLS *ctls);
/* ma_ssl_read
/* ma_tls_read
reads up to length bytes from socket
Parameters:
cssl MariaDB SSL container
ctls MariaDB SSL container
buffer read buffer
length buffer length
Returns:
0-n bytes read
-1 if an error occured
*/
size_t ma_ssl_read(MARIADB_SSL *cssl, const uchar* buffer, size_t length);
size_t ma_tls_read(MARIADB_TLS *ctls, const uchar* buffer, size_t length);
/* ma_ssl_write
/* ma_tls_write
write buffer to socket
Parameters:
cssl MariaDB SSL container
ctls MariaDB SSL container
buffer write buffer
length buffer length
Returns:
0-n bytes written
-1 if an error occured
*/
size_t ma_ssl_write(MARIADB_SSL *cssl, const uchar* buffer, size_t length);
size_t ma_tls_write(MARIADB_TLS *ctls, const uchar* buffer, size_t length);
/* ma_ssl_close
/* ma_tls_close
closes SSL connection and frees SSL structure which was previously
created by ma_ssl_init call
created by ma_tls_init call
Parameters:
MARIADB_SSL MariaDB SSL container
MARIADB_TLS MariaDB SSL container
Returns:
0 success
1 error
*/
my_bool ma_ssl_close(MARIADB_SSL *cssl);
my_bool ma_tls_close(MARIADB_TLS *ctls);
/* ma_ssl_verify_server_cert
/* ma_tls_verify_server_cert
validation check of server certificate
Parameter:
MARIADB_SSL MariaDB SSL container
MARIADB_TLS MariaDB SSL container
Returns:
ß success
1 error
*/
int ma_ssl_verify_server_cert(MARIADB_SSL *cssl);
int ma_tls_verify_server_cert(MARIADB_TLS *ctls);
/* ma_ssl_get_cipher
/* ma_tls_get_cipher
returns cipher for current ssl connection
Parameter:
MARIADB_SSL MariaDB SSL container
MARIADB_TLS MariaDB SSL container
Returns:
cipher in use or
NULL on error
*/
const char *ma_ssl_get_cipher(MARIADB_SSL *ssl);
const char *ma_tls_get_cipher(MARIADB_TLS *ssl);
/* ma_ssl_get_finger_print
/* ma_tls_get_finger_print
returns SHA1 finger print of server certificate
Parameter:
MARIADB_SSL MariaDB SSL container
MARIADB_TLS MariaDB SSL container
fp buffer for fingerprint
fp_len buffer length
Returns:
actual size of finger print
*/
unsigned int ma_ssl_get_finger_print(MARIADB_SSL *cssl, unsigned char *fp, unsigned int fp_len);
unsigned int ma_tls_get_finger_print(MARIADB_TLS *ctls, unsigned char *fp, unsigned int fp_len);
/* ma_ssl_get_protocol_version
/* ma_tls_get_protocol_version
returns protocol version in use
Parameter:
MARIADB_SSL MariaDB SSL container
MARIADB_TLS MariaDB SSL container
version pointer to ssl version info
Returns:
0 success
1 error
*/
my_bool ma_ssl_get_protocol_version(MARIADB_SSL *cssl, struct st_ssl_version *version);
my_bool ma_tls_get_protocol_version(MARIADB_TLS *ctls, struct st_ssl_version *version);
/* Function prototypes */
MARIADB_SSL *ma_pvio_ssl_init(MYSQL *mysql);
my_bool ma_pvio_ssl_connect(MARIADB_SSL *cssl);
size_t ma_pvio_ssl_read(MARIADB_SSL *cssl, const uchar *buffer, size_t length);
size_t ma_pvio_ssl_write(MARIADB_SSL *cssl, const uchar *buffer, size_t length);
my_bool ma_pvio_ssl_close(MARIADB_SSL *cssl);
int ma_pvio_ssl_verify_server_cert(MARIADB_SSL *cssl);
const char *ma_pvio_ssl_cipher(MARIADB_SSL *cssl);
my_bool ma_pvio_ssl_check_fp(MARIADB_SSL *cssl, const char *fp, const char *fp_list);
MARIADB_TLS *ma_pvio_tls_init(MYSQL *mysql);
my_bool ma_pvio_tls_connect(MARIADB_TLS *ctls);
size_t ma_pvio_tls_read(MARIADB_TLS *ctls, const uchar *buffer, size_t length);
size_t ma_pvio_tls_write(MARIADB_TLS *ctls, const uchar *buffer, size_t length);
my_bool ma_pvio_tls_close(MARIADB_TLS *ctls);
int ma_pvio_tls_verify_server_cert(MARIADB_TLS *ctls);
const char *ma_pvio_tls_cipher(MARIADB_TLS *ctls);
my_bool ma_pvio_tls_check_fp(MARIADB_TLS *ctls, const char *fp, const char *fp_list);
my_bool ma_pvio_start_ssl(MARIADB_PVIO *pvio);
my_bool ma_pvio_ssl_get_protocol_version(MARIADB_SSL *cssl, struct st_ssl_version *version);
void ma_pvio_ssl_end();
my_bool ma_pvio_tls_get_protocol_version(MARIADB_TLS *ctls, struct st_ssl_version *version);
void ma_pvio_tls_end();
#endif /* _ma_ssl_h_ */
#endif /* _ma_tls_h_ */

View File

@@ -29,9 +29,9 @@ extern ssize_t my_send_async(MARIADB_PVIO *pvio,
extern my_bool my_io_wait_async(struct mysql_async_context *b,
enum enum_pvio_io_event event, int timeout);
#ifdef HAVE_SSL
extern int my_ssl_read_async(struct mysql_async_context *b, MARIADB_SSL *ssl,
extern int my_ssl_read_async(struct mysql_async_context *b, MARIADB_TLS *tls,
void *buf, int size);
extern int my_ssl_write_async(struct mysql_async_context *b, MARIADB_SSL *ssl,
extern int my_ssl_write_async(struct mysql_async_context *b, MARIADB_TLS *tls,
const void *buf, int size);
#endif

View File

@@ -214,13 +214,16 @@ extern unsigned int mariadb_deinitialize_ssl;
MYSQL_OPT_NONBLOCK,
/* MariaDB Connector/C specific */
MYSQL_DATABASE_DRIVER=7000,
MARIADB_OPT_SSL_FP, /* single finger print for server certificate verification */
MARIADB_OPT_SSL_FP_LIST, /* finger print white list for server certificate verification */
MARIADB_OPT_SSL_PASSPHRASE, /* passphrase for encrypted certificates */
MARIADB_OPT_SSL_FP, /* deprecated, use MARIADB_OPT_TLS_PEER_FP instead */
MARIADB_OPT_SSL_FP_LIST, /* deprecated, use MARIADB_OPT_TLS_PEER_FP_LIST instead */
MARIADB_OPT_TLS_PASSPHRASE, /* passphrase for encrypted certificates */
MARIADB_OPT_TLS_CIPHER_STRENGTH,
MARIADB_OPT_TLS_VERSION,
MARIADB_OPT_TLS_PEER_FP, /* single finger print for server certificate verification */
MARIADB_OPT_TLS_PEER_FP_LIST, /* finger print white list for server certificate verification */
MARIADB_OPT_CONNECTION_READ_ONLY,
MYSQL_OPT_CONNECT_ATTRS, /* for mysql_get_optionv */
MARIADB_OPT_USERDATA,
MARIADB_OPT_SSL_CIPHER_STRENGTH,
MARIADB_OPT_CONNECTION_HANDLER,
MARIADB_OPT_PORT,
MARIADB_OPT_UNIXSOCKET,
@@ -259,14 +262,14 @@ extern unsigned int mariadb_deinitialize_ssl;
MARIADB_CONNECTION_SOCKET,
MARIADB_CONNECTION_SQLSTATE,
MARIADB_CONNECTION_SSL_CIPHER,
MARIADB_SSL_LIBRARY,
MARIADB_CONNECTION_SSL_VERSION,
MARIADB_CONNECTION_SSL_VERSION_ID,
MARIADB_TLS_LIBRARY,
MARIADB_CONNECTION_TLS_VERSION,
MARIADB_CONNECTION_TLS_VERSION_ID,
MARIADB_CONNECTION_TYPE,
MARIADB_CONNECTION_UNIX_SOCKET,
MARIADB_CONNECTION_USER,
MARIADB_MAX_ALLOWED_PACKET,
MARIADB_NET_BUFFER_LENGTH
MARIADB_NET_BUFFER_LENGTH,
};
enum mysql_status { MYSQL_STATUS_READY,

View File

@@ -251,7 +251,7 @@ ma_errmsg.c
mariadb_lib.c
ma_list.c
ma_pvio.c
ma_ssl.c
ma_tls.c
ma_alloc.c
ma_compress.c
ma_init.c

View File

@@ -746,49 +746,6 @@ static Bigint *multadd(Bigint *b, int m, int a, Stack_alloc *alloc)
return b;
}
/**
Converts a string to Bigint.
Now we have nd0 digits, starting at s, followed by a
decimal point, followed by nd-nd0 digits.
Unless nd0 == nd, in which case we have a number of the form:
".xxxxxx" or "xxxxxx."
@param s Input string, already partially parsed by ma_strtod_int().
@param nd0 Number of digits before decimal point.
@param nd Total number of digits.
@param y9 Pre-computed value of the first nine digits.
@param alloc Stack allocator for Bigints.
*/
static Bigint *s2b(const char *s, int nd0, int nd, ULong y9, Stack_alloc *alloc)
{
Bigint *b;
int i, k;
Long x, y;
x= (nd + 8) / 9;
for (k= 0, y= 1; x > y; y <<= 1, k++) ;
b= Balloc(k, alloc);
b->p.x[0]= y9;
b->wds= 1;
i= 9;
if (9 < nd0)
{
s+= 9;
do
b= multadd(b, 10, *s++ - '0', alloc);
while (++i < nd0);
s++; /* skip '.' */
}
else
s+= 10;
/* now do the fractional part */
for(; i < nd; i++)
b= multadd(b, 10, *s++ - '0', alloc);
return b;
}
static int hi0bits(register ULong x)
{
@@ -1143,57 +1100,6 @@ static Bigint *diff(Bigint *a, Bigint *b, Stack_alloc *alloc)
}
static double ulp(U *x)
{
register Long L;
U u;
L= (word0(x) & Exp_mask) - (P - 1)*Exp_msk1;
word0(&u) = L;
word1(&u) = 0;
return dval(&u);
}
static double b2d(Bigint *a, int *e)
{
ULong *xa, *xa0, w, y, z;
int k;
U d;
#define d0 word0(&d)
#define d1 word1(&d)
xa0= a->p.x;
xa= xa0 + a->wds;
y= *--xa;
k= hi0bits(y);
*e= 32 - k;
if (k < Ebits)
{
d0= Exp_1 | y >> (Ebits - k);
w= xa > xa0 ? *--xa : 0;
d1= y << ((32-Ebits) + k) | w >> (Ebits - k);
goto ret_d;
}
z= xa > xa0 ? *--xa : 0;
if (k-= Ebits)
{
d0= Exp_1 | y << k | z >> (32 - k);
y= xa > xa0 ? *--xa : 0;
d1= z << k | y >> (32 - k);
}
else
{
d0= Exp_1 | y;
d1= z;
}
ret_d:
#undef d0
#undef d1
return dval(&d);
}
static Bigint *d2b(U *d, int *e, int *bits, Stack_alloc *alloc)
{
Bigint *b;
@@ -1244,24 +1150,6 @@ static Bigint *d2b(U *d, int *e, int *bits, Stack_alloc *alloc)
}
static double ratio(Bigint *a, Bigint *b)
{
U da, db;
int k, ka, kb;
dval(&da)= b2d(a, &ka);
dval(&db)= b2d(b, &kb);
k= ka - kb + 32*(a->wds - b->wds);
if (k > 0)
word0(&da)+= k*Exp_msk1;
else
{
k= -k;
word0(&db)+= k*Exp_msk1;
}
return dval(&da) / dval(&db);
}
static const double tens[] =
{
1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
@@ -1281,755 +1169,6 @@ static const double tinytens[]=
#define Scale_Bit 0x10
#define n_bigtens 5
/*
strtod for IEEE--arithmetic machines.
This strtod returns a nearest machine number to the input decimal
string (or sets errno to EOVERFLOW). Ties are broken by the IEEE round-even
rule.
Inspired loosely by William D. Clinger's paper "How to Read Floating
Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101].
Modifications:
1. We only require IEEE (not IEEE double-extended).
2. We get by with floating-point arithmetic in a case that
Clinger missed -- when we're computing d * 10^n
for a small integer d and the integer n is not too
much larger than 22 (the maximum integer k for which
we can represent 10^k exactly), we may be able to
compute (d*10^k) * 10^(e-k) with just one roundoff.
3. Rather than a bit-at-a-time adjustment of the binary
result in the hard case, we use floating-point
arithmetic to determine the adjustment to within
one bit; only in really hard cases do we need to
compute a second residual.
4. Because of 3., we don't need a large table of powers of 10
for ten-to-e (just some small tables, e.g. of 10^k
for 0 <= k <= 22).
*/
static double ma_strtod_int(const char *s00, char **se, int *error, char *buf, size_t buf_size)
{
int scale;
int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, UNINIT_VAR(c), dsign,
e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
const char *s, *s0, *s1, *end = *se;
double aadj, aadj1;
U aadj2, adj, rv, rv0;
Long L;
ULong y, z;
Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
#ifdef SET_INEXACT
int inexact, oldinexact;
#endif
#ifdef Honor_FLT_ROUNDS
int rounding;
#endif
Stack_alloc alloc;
*error= 0;
alloc.begin= alloc.free= buf;
alloc.end= buf + buf_size;
memset(alloc.freelist, 0, sizeof(alloc.freelist));
sign= nz0= nz= 0;
dval(&rv)= 0.;
for (s= s00; s < end; s++)
switch (*s) {
case '-':
sign= 1;
/* no break */
case '+':
s++;
goto break2;
case '\t':
case '\n':
case '\v':
case '\f':
case '\r':
case ' ':
continue;
default:
goto break2;
}
break2:
if (s >= end)
goto ret0;
if (*s == '0')
{
nz0= 1;
while (++s < end && *s == '0') ;
if (s >= end)
goto ret;
}
s0= s;
y= z= 0;
for (nd= nf= 0; s < end && (c= *s) >= '0' && c <= '9'; nd++, s++)
if (nd < 9)
y= 10*y + c - '0';
else if (nd < 16)
z= 10*z + c - '0';
nd0= nd;
if (s < end && c == '.')
{
++s;
if (!nd)
{
for (; s < end && (c= *s) == '0'; ++s)
nz++;
if (s < end && (c= *s) > '0' && c <= '9')
{
s0= s;
nf+= nz;
nz= 0;
goto have_dig;
}
goto dig_done;
}
for (; s < end && (c= *s) >= '0' && c <= '9'; ++s)
{
have_dig:
/*
Here we are parsing the fractional part.
We can stop counting digits after a while: the extra digits
will not contribute to the actual result produced by s2b().
We have to continue scanning, in case there is an exponent part.
*/
if (nd < 2 * DBL_DIG)
{
nz++;
if (c-= '0')
{
nf+= nz;
for (i= 1; i < nz; i++)
if (nd++ < 9)
y*= 10;
else if (nd <= DBL_DIG + 1)
z*= 10;
if (nd++ < 9)
y= 10*y + c;
else if (nd <= DBL_DIG + 1)
z= 10*z + c;
nz= 0;
}
}
}
}
dig_done:
e= 0;
if (s < end && (c == 'e' || c == 'E'))
{
if (!nd && !nz && !nz0)
goto ret0;
s00= s;
esign= 0;
if (++s < end)
switch (c= *s) {
case '-':
esign= 1;
case '+':
c= *++s;
}
if (s < end && c >= '0' && c <= '9')
{
while (s < end && c == '0')
c= *++s;
if (s < end && c > '0' && c <= '9') {
L= c - '0';
s1= s;
while (++s < end && (c= *s) >= '0' && c <= '9')
L= 10*L + c - '0';
if (s - s1 > 8 || L > 19999)
/* Avoid confusion from exponents
* so large that e might overflow.
*/
e= 19999; /* safe for 16 bit ints */
else
e= (int)L;
if (esign)
e= -e;
}
else
e= 0;
}
else
s= s00;
}
if (!nd)
{
if (!nz && !nz0)
{
ret0:
s= s00;
sign= 0;
}
goto ret;
}
e1= e -= nf;
/*
Now we have nd0 digits, starting at s0, followed by a
decimal point, followed by nd-nd0 digits. The number we're
after is the integer represented by those digits times
10**e
*/
if (!nd0)
nd0= nd;
k= nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
dval(&rv)= y;
if (k > 9)
{
#ifdef SET_INEXACT
if (k > DBL_DIG)
oldinexact = get_inexact();
#endif
dval(&rv)= tens[k - 9] * dval(&rv) + z;
}
bd0= 0;
if (nd <= DBL_DIG
#ifndef Honor_FLT_ROUNDS
&& Flt_Rounds == 1
#endif
)
{
if (!e)
goto ret;
if (e > 0)
{
if (e <= Ten_pmax)
{
#ifdef Honor_FLT_ROUNDS
/* round correctly FLT_ROUNDS = 2 or 3 */
if (sign)
{
rv.d= -rv.d;
sign= 0;
}
#endif
/* rv = */ rounded_product(dval(&rv), tens[e]);
goto ret;
}
i= DBL_DIG - nd;
if (e <= Ten_pmax + i)
{
/*
A fancier test would sometimes let us do
this for larger i values.
*/
#ifdef Honor_FLT_ROUNDS
/* round correctly FLT_ROUNDS = 2 or 3 */
if (sign)
{
rv.d= -rv.d;
sign= 0;
}
#endif
e-= i;
dval(&rv)*= tens[i];
/* rv = */ rounded_product(dval(&rv), tens[e]);
goto ret;
}
}
#ifndef Inaccurate_Divide
else if (e >= -Ten_pmax)
{
#ifdef Honor_FLT_ROUNDS
/* round correctly FLT_ROUNDS = 2 or 3 */
if (sign)
{
rv.d= -rv.d;
sign= 0;
}
#endif
/* rv = */ rounded_quotient(dval(&rv), tens[-e]);
goto ret;
}
#endif
}
e1+= nd - k;
#ifdef SET_INEXACT
inexact= 1;
if (k <= DBL_DIG)
oldinexact= get_inexact();
#endif
scale= 0;
#ifdef Honor_FLT_ROUNDS
if ((rounding= Flt_Rounds) >= 2)
{
if (sign)
rounding= rounding == 2 ? 0 : 2;
else
if (rounding != 2)
rounding= 0;
}
#endif
/* Get starting approximation = rv * 10**e1 */
if (e1 > 0)
{
if ((i= e1 & 15))
dval(&rv)*= tens[i];
if (e1&= ~15)
{
if (e1 > DBL_MAX_10_EXP)
{
ovfl:
*error= EOVERFLOW;
/* Can't trust HUGE_VAL */
#ifdef Honor_FLT_ROUNDS
switch (rounding)
{
case 0: /* toward 0 */
case 3: /* toward -infinity */
word0(&rv)= Big0;
word1(&rv)= Big1;
break;
default:
word0(&rv)= Exp_mask;
word1(&rv)= 0;
}
#else /*Honor_FLT_ROUNDS*/
word0(&rv)= Exp_mask;
word1(&rv)= 0;
#endif /*Honor_FLT_ROUNDS*/
#ifdef SET_INEXACT
/* set overflow bit */
dval(&rv0)= 1e300;
dval(&rv0)*= dval(&rv0);
#endif
if (bd0)
goto retfree;
goto ret;
}
e1>>= 4;
for(j= 0; e1 > 1; j++, e1>>= 1)
if (e1 & 1)
dval(&rv)*= bigtens[j];
/* The last multiplication could overflow. */
word0(&rv)-= P*Exp_msk1;
dval(&rv)*= bigtens[j];
if ((z= word0(&rv) & Exp_mask) > Exp_msk1 * (DBL_MAX_EXP + Bias - P))
goto ovfl;
if (z > Exp_msk1 * (DBL_MAX_EXP + Bias - 1 - P))
{
/* set to largest number (Can't trust DBL_MAX) */
word0(&rv)= Big0;
word1(&rv)= Big1;
}
else
word0(&rv)+= P*Exp_msk1;
}
}
else if (e1 < 0)
{
e1= -e1;
if ((i= e1 & 15))
dval(&rv)/= tens[i];
if ((e1>>= 4))
{
if (e1 >= 1 << n_bigtens)
goto undfl;
if (e1 & Scale_Bit)
scale= 2 * P;
for(j= 0; e1 > 0; j++, e1>>= 1)
if (e1 & 1)
dval(&rv)*= tinytens[j];
if (scale && (j = 2 * P + 1 - ((word0(&rv) & Exp_mask) >> Exp_shift)) > 0)
{
/* scaled rv is denormal; zap j low bits */
if (j >= 32)
{
word1(&rv)= 0;
if (j >= 53)
word0(&rv)= (P + 2) * Exp_msk1;
else
word0(&rv)&= 0xffffffff << (j - 32);
}
else
word1(&rv)&= 0xffffffff << j;
}
if (!dval(&rv))
{
undfl:
dval(&rv)= 0.;
if (bd0)
goto retfree;
goto ret;
}
}
}
/* Now the hard part -- adjusting rv to the correct value.*/
/* Put digits into bd: true value = bd * 10^e */
bd0= s2b(s0, nd0, nd, y, &alloc);
for(;;)
{
bd= Balloc(bd0->k, &alloc);
Bcopy(bd, bd0);
bb= d2b(&rv, &bbe, &bbbits, &alloc); /* rv = bb * 2^bbe */
bs= i2b(1, &alloc);
if (e >= 0)
{
bb2= bb5= 0;
bd2= bd5= e;
}
else
{
bb2= bb5= -e;
bd2= bd5= 0;
}
if (bbe >= 0)
bb2+= bbe;
else
bd2-= bbe;
bs2= bb2;
#ifdef Honor_FLT_ROUNDS
if (rounding != 1)
bs2++;
#endif
j= bbe - scale;
i= j + bbbits - 1; /* logb(rv) */
if (i < Emin) /* denormal */
j+= P - Emin;
else
j= P + 1 - bbbits;
bb2+= j;
bd2+= j;
bd2+= scale;
i= bb2 < bd2 ? bb2 : bd2;
if (i > bs2)
i= bs2;
if (i > 0)
{
bb2-= i;
bd2-= i;
bs2-= i;
}
if (bb5 > 0)
{
bs= pow5mult(bs, bb5, &alloc);
bb1= mult(bs, bb, &alloc);
Bfree(bb, &alloc);
bb= bb1;
}
if (bb2 > 0)
bb= lshift(bb, bb2, &alloc);
if (bd5 > 0)
bd= pow5mult(bd, bd5, &alloc);
if (bd2 > 0)
bd= lshift(bd, bd2, &alloc);
if (bs2 > 0)
bs= lshift(bs, bs2, &alloc);
delta= diff(bb, bd, &alloc);
dsign= delta->sign;
delta->sign= 0;
i= cmp(delta, bs);
#ifdef Honor_FLT_ROUNDS
if (rounding != 1)
{
if (i < 0)
{
/* Error is less than an ulp */
if (!delta->p.x[0] && delta->wds <= 1)
{
/* exact */
#ifdef SET_INEXACT
inexact= 0;
#endif
break;
}
if (rounding)
{
if (dsign)
{
adj.d= 1.;
goto apply_adj;
}
}
else if (!dsign)
{
adj.d= -1.;
if (!word1(&rv) && !(word0(&rv) & Frac_mask))
{
y= word0(&rv) & Exp_mask;
if (!scale || y > 2*P*Exp_msk1)
{
delta= lshift(delta, Log2P, &alloc);
if (cmp(delta, bs) <= 0)
adj.d= -0.5;
}
}
apply_adj:
if (scale && (y= word0(&rv) & Exp_mask) <= 2 * P * Exp_msk1)
word0(&adj)+= (2 * P + 1) * Exp_msk1 - y;
dval(&rv)+= adj.d * ulp(&rv);
}
break;
}
adj.d= ratio(delta, bs);
if (adj.d < 1.)
adj.d= 1.;
if (adj.d <= 0x7ffffffe)
{
/* adj = rounding ? ceil(adj) : floor(adj); */
y= adj.d;
if (y != adj.d)
{
if (!((rounding >> 1) ^ dsign))
y++;
adj.d= y;
}
}
if (scale && (y= word0(&rv) & Exp_mask) <= 2 * P * Exp_msk1)
word0(&adj)+= (2 * P + 1) * Exp_msk1 - y;
adj.d*= ulp(&rv);
if (dsign)
dval(&rv)+= adj.d;
else
dval(&rv)-= adj.d;
goto cont;
}
#endif /*Honor_FLT_ROUNDS*/
if (i < 0)
{
/*
Error is less than half an ulp -- check for special case of mantissa
a power of two.
*/
if (dsign || word1(&rv) || word0(&rv) & Bndry_mask ||
(word0(&rv) & Exp_mask) <= (2 * P + 1) * Exp_msk1)
{
#ifdef SET_INEXACT
if (!delta->x[0] && delta->wds <= 1)
inexact= 0;
#endif
break;
}
if (!delta->p.x[0] && delta->wds <= 1)
{
/* exact result */
#ifdef SET_INEXACT
inexact= 0;
#endif
break;
}
delta= lshift(delta, Log2P, &alloc);
if (cmp(delta, bs) > 0)
goto drop_down;
break;
}
if (i == 0)
{
/* exactly half-way between */
if (dsign)
{
if ((word0(&rv) & Bndry_mask1) == Bndry_mask1 &&
word1(&rv) ==
((scale && (y = word0(&rv) & Exp_mask) <= 2 * P * Exp_msk1) ?
(0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) :
0xffffffff))
{
/*boundary case -- increment exponent*/
word0(&rv)= (word0(&rv) & Exp_mask) + Exp_msk1;
word1(&rv) = 0;
dsign = 0;
break;
}
}
else if (!(word0(&rv) & Bndry_mask) && !word1(&rv))
{
drop_down:
/* boundary case -- decrement exponent */
if (scale)
{
L= word0(&rv) & Exp_mask;
if (L <= (2 *P + 1) * Exp_msk1)
{
if (L > (P + 2) * Exp_msk1)
/* round even ==> accept rv */
break;
/* rv = smallest denormal */
goto undfl;
}
}
L= (word0(&rv) & Exp_mask) - Exp_msk1;
word0(&rv)= L | Bndry_mask1;
word1(&rv)= 0xffffffff;
break;
}
if (!(word1(&rv) & LSB))
break;
if (dsign)
dval(&rv)+= ulp(&rv);
else
{
dval(&rv)-= ulp(&rv);
if (!dval(&rv))
goto undfl;
}
dsign= 1 - dsign;
break;
}
if ((aadj= ratio(delta, bs)) <= 2.)
{
if (dsign)
aadj= aadj1= 1.;
else if (word1(&rv) || word0(&rv) & Bndry_mask)
{
if (word1(&rv) == Tiny1 && !word0(&rv))
goto undfl;
aadj= 1.;
aadj1= -1.;
}
else
{
/* special case -- power of FLT_RADIX to be rounded down... */
if (aadj < 2. / FLT_RADIX)
aadj= 1. / FLT_RADIX;
else
aadj*= 0.5;
aadj1= -aadj;
}
}
else
{
aadj*= 0.5;
aadj1= dsign ? aadj : -aadj;
#ifdef Check_FLT_ROUNDS
switch (Rounding)
{
case 2: /* towards +infinity */
aadj1-= 0.5;
break;
case 0: /* towards 0 */
case 3: /* towards -infinity */
aadj1+= 0.5;
}
#else
if (Flt_Rounds == 0)
aadj1+= 0.5;
#endif /*Check_FLT_ROUNDS*/
}
y= word0(&rv) & Exp_mask;
/* Check for overflow */
if (y == Exp_msk1 * (DBL_MAX_EXP + Bias - 1))
{
dval(&rv0)= dval(&rv);
word0(&rv)-= P * Exp_msk1;
adj.d= aadj1 * ulp(&rv);
dval(&rv)+= adj.d;
if ((word0(&rv) & Exp_mask) >= Exp_msk1 * (DBL_MAX_EXP + Bias - P))
{
if (word0(&rv0) == Big0 && word1(&rv0) == Big1)
goto ovfl;
word0(&rv)= Big0;
word1(&rv)= Big1;
goto cont;
}
else
word0(&rv)+= P * Exp_msk1;
}
else
{
if (scale && y <= 2 * P * Exp_msk1)
{
if (aadj <= 0x7fffffff)
{
if ((z= (ULong) aadj) <= 0)
z= 1;
aadj= z;
aadj1= dsign ? aadj : -aadj;
}
dval(&aadj2) = aadj1;
word0(&aadj2)+= (2 * P + 1) * Exp_msk1 - y;
aadj1= dval(&aadj2);
adj.d= aadj1 * ulp(&rv);
dval(&rv)+= adj.d;
if (rv.d == 0.)
goto undfl;
}
else
{
adj.d= aadj1 * ulp(&rv);
dval(&rv)+= adj.d;
}
}
z= word0(&rv) & Exp_mask;
#ifndef SET_INEXACT
if (!scale)
if (y == z)
{
/* Can we stop now? */
L= (Long)aadj;
aadj-= L;
/* The tolerances below are conservative. */
if (dsign || word1(&rv) || word0(&rv) & Bndry_mask)
{
if (aadj < .4999999 || aadj > .5000001)
break;
}
else if (aadj < .4999999 / FLT_RADIX)
break;
}
#endif
cont:
Bfree(bb, &alloc);
Bfree(bd, &alloc);
Bfree(bs, &alloc);
Bfree(delta, &alloc);
}
#ifdef SET_INEXACT
if (inexact)
{
if (!oldinexact)
{
word0(&rv0)= Exp_1 + (70 << Exp_shift);
word1(&rv0)= 0;
dval(&rv0)+= 1.;
}
}
else if (!oldinexact)
clear_inexact();
#endif
if (scale)
{
word0(&rv0)= Exp_1 - 2 * P * Exp_msk1;
word1(&rv0)= 0;
dval(&rv)*= dval(&rv0);
}
#ifdef SET_INEXACT
if (inexact && !(word0(&rv) & Exp_mask))
{
/* set underflow bit */
dval(&rv0)= 1e-300;
dval(&rv0)*= dval(&rv0);
}
#endif
retfree:
Bfree(bb, &alloc);
Bfree(bd, &alloc);
Bfree(bs, &alloc);
Bfree(bd0, &alloc);
Bfree(delta, &alloc);
ret:
*se= (char *)s;
return sign ? -dval(&rv) : dval(&rv);
}
static int quorem(Bigint *b, Bigint *S)
{

View File

@@ -243,9 +243,9 @@ size_t ma_pvio_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length)
/* secure connection */
#ifdef HAVE_SSL
if (pvio->cssl)
if (pvio->ctls)
{
r= ma_pvio_ssl_read(pvio->cssl, buffer, length);
r= ma_pvio_tls_read(pvio->ctls, buffer, length);
goto end;
}
#endif
@@ -348,9 +348,9 @@ size_t ma_pvio_write(MARIADB_PVIO *pvio, const uchar *buffer, size_t length)
/* secure connection */
#ifdef HAVE_SSL
if (pvio->cssl)
if (pvio->ctls)
{
r= ma_pvio_ssl_write(pvio->cssl, buffer, length);
r= ma_pvio_tls_write(pvio->ctls, buffer, length);
goto end;
}
else
@@ -389,10 +389,10 @@ void ma_pvio_close(MARIADB_PVIO *pvio)
{
/* free internal structures and close connection */
#ifdef HAVE_SSL
if (pvio && pvio->cssl)
if (pvio && pvio->ctls)
{
ma_pvio_ssl_close(pvio->cssl);
free(pvio->cssl);
ma_pvio_tls_close(pvio->ctls);
free(pvio->ctls);
}
#endif
if (pvio && pvio->methods->close)
@@ -511,14 +511,14 @@ my_bool ma_pvio_start_ssl(MARIADB_PVIO *pvio)
if (!pvio || !pvio->mysql)
return 1;
CLEAR_CLIENT_ERROR(pvio->mysql);
if (!(pvio->cssl= ma_pvio_ssl_init(pvio->mysql)))
if (!(pvio->ctls= ma_pvio_tls_init(pvio->mysql)))
{
return 1;
}
if (ma_pvio_ssl_connect(pvio->cssl))
if (ma_pvio_tls_connect(pvio->ctls))
{
free(pvio->cssl);
pvio->cssl= NULL;
free(pvio->ctls);
pvio->ctls= NULL;
return 1;
}
@@ -529,17 +529,17 @@ my_bool ma_pvio_start_ssl(MARIADB_PVIO *pvio)
*/
if ((pvio->mysql->options.ssl_ca || pvio->mysql->options.ssl_capath) &&
(pvio->mysql->client_flag & CLIENT_SSL_VERIFY_SERVER_CERT) &&
ma_pvio_ssl_verify_server_cert(pvio->cssl))
ma_pvio_tls_verify_server_cert(pvio->ctls))
return 1;
if (pvio->mysql->options.extension &&
(pvio->mysql->options.extension->ssl_fp && pvio->mysql->options.extension->ssl_fp[0]) ||
(pvio->mysql->options.extension->ssl_fp_list && pvio->mysql->options.extension->ssl_fp_list[0]))
(pvio->mysql->options.extension->tls_fp && pvio->mysql->options.extension->tls_fp[0]) ||
(pvio->mysql->options.extension->tls_fp_list && pvio->mysql->options.extension->tls_fp_list[0]))
{
if (ma_pvio_ssl_check_fp(pvio->cssl,
pvio->mysql->options.extension->ssl_fp,
pvio->mysql->options.extension->ssl_fp_list))
if (ma_pvio_tls_check_fp(pvio->ctls,
pvio->mysql->options.extension->tls_fp,
pvio->mysql->options.extension->tls_fp_list))
return 1;
}

View File

@@ -38,7 +38,7 @@
#include <string.h>
#include <ma_errmsg.h>
#include <ma_pvio.h>
#include <ma_ssl.h>
#include <ma_tls.h>
#include <mysql/client_plugin.h>
#include <mariadb/ma_io.h>
@@ -48,26 +48,26 @@
#endif
/* Errors should be handled via pvio callback function */
my_bool ma_ssl_initialized= FALSE;
my_bool ma_tls_initialized= FALSE;
unsigned int mariadb_deinitialize_ssl= 1;
char *ssl_protocol_version[5]= {"unknown", "SSL3", "TLS1.0", "TLS1.1", "TLS1.2"};
MARIADB_SSL *ma_pvio_ssl_init(MYSQL *mysql)
MARIADB_TLS *ma_pvio_tls_init(MYSQL *mysql)
{
MARIADB_SSL *cssl= NULL;
MARIADB_TLS *cssl= NULL;
if (!ma_ssl_initialized)
ma_ssl_start(mysql->net.last_error, MYSQL_ERRMSG_SIZE);
if (!ma_tls_initialized)
ma_tls_start(mysql->net.last_error, MYSQL_ERRMSG_SIZE);
if (!(cssl= (MARIADB_SSL *)calloc(1, sizeof(MARIADB_SSL))))
if (!(cssl= (MARIADB_TLS *)calloc(1, sizeof(MARIADB_TLS))))
{
return NULL;
}
/* register error routine and methods */
cssl->pvio= mysql->net.pvio;
if (!(cssl->ssl= ma_ssl_init(mysql)))
if (!(cssl->ssl= ma_tls_init(mysql)))
{
free(cssl);
cssl= NULL;
@@ -75,51 +75,51 @@ MARIADB_SSL *ma_pvio_ssl_init(MYSQL *mysql)
return cssl;
}
my_bool ma_pvio_ssl_connect(MARIADB_SSL *cssl)
my_bool ma_pvio_tls_connect(MARIADB_TLS *cssl)
{
my_bool rc;
if ((rc= ma_ssl_connect(cssl)))
ma_ssl_close(cssl);
if ((rc= ma_tls_connect(cssl)))
ma_tls_close(cssl);
return rc;
}
size_t ma_pvio_ssl_read(MARIADB_SSL *cssl, const uchar* buffer, size_t length)
size_t ma_pvio_tls_read(MARIADB_TLS *cssl, const uchar* buffer, size_t length)
{
return ma_ssl_read(cssl, buffer, length);
return ma_tls_read(cssl, buffer, length);
}
size_t ma_pvio_ssl_write(MARIADB_SSL *cssl, const uchar* buffer, size_t length)
size_t ma_pvio_tls_write(MARIADB_TLS *cssl, const uchar* buffer, size_t length)
{
return ma_ssl_write(cssl, buffer, length);
return ma_tls_write(cssl, buffer, length);
}
my_bool ma_pvio_ssl_close(MARIADB_SSL *cssl)
my_bool ma_pvio_tls_close(MARIADB_TLS *cssl)
{
return ma_ssl_close(cssl);
return ma_tls_close(cssl);
}
int ma_pvio_ssl_verify_server_cert(MARIADB_SSL *cssl)
int ma_pvio_tls_verify_server_cert(MARIADB_TLS *cssl)
{
return ma_ssl_verify_server_cert(cssl);
return ma_tls_verify_server_cert(cssl);
}
const char *ma_pvio_ssl_cipher(MARIADB_SSL *cssl)
const char *ma_pvio_tls_cipher(MARIADB_TLS *cssl)
{
return ma_ssl_get_cipher(cssl);
return ma_tls_get_cipher(cssl);
}
void ma_pvio_ssl_end()
void ma_pvio_tls_end()
{
ma_ssl_end();
ma_tls_end();
}
my_bool ma_pvio_ssl_get_protocol_version(MARIADB_SSL *cssl, struct st_ssl_version *version)
my_bool ma_pvio_tls_get_protocol_version(MARIADB_TLS *cssl, struct st_ssl_version *version)
{
return ma_ssl_get_protocol_version(cssl, version);
return ma_tls_get_protocol_version(cssl, version);
}
static my_bool ma_pvio_ssl_compare_fp(char *fp1, unsigned int fp1_len,
static my_bool ma_pvio_tls_compare_fp(char *fp1, unsigned int fp1_len,
char *fp2, unsigned int fp2_len)
{
char hexstr[64];
@@ -134,17 +134,17 @@ static my_bool ma_pvio_ssl_compare_fp(char *fp1, unsigned int fp1_len,
return 0;
}
my_bool ma_pvio_ssl_check_fp(MARIADB_SSL *cssl, const char *fp, const char *fp_list)
my_bool ma_pvio_tls_check_fp(MARIADB_TLS *cssl, const char *fp, const char *fp_list)
{
unsigned int cert_fp_len= 64;
unsigned char cert_fp[64];
my_bool rc=1;
MYSQL *mysql= cssl->pvio->mysql;
if ((cert_fp_len= ma_ssl_get_finger_print(cssl, cert_fp, cert_fp_len)) < 1)
if ((cert_fp_len= ma_tls_get_finger_print(cssl, cert_fp, cert_fp_len)) < 1)
goto end;
if (fp)
rc= ma_pvio_ssl_compare_fp(cert_fp, cert_fp_len, (char *)fp, (unsigned int)strlen(fp));
rc= ma_pvio_tls_compare_fp(cert_fp, cert_fp_len, (char *)fp, (unsigned int)strlen(fp));
else if (fp_list)
{
MA_FILE *fp;
@@ -164,7 +164,7 @@ my_bool ma_pvio_ssl_check_fp(MARIADB_SSL *cssl, const char *fp, const char *fp_l
if (pos)
*pos= '\0';
if (!ma_pvio_ssl_compare_fp(cert_fp, cert_fp_len, buff, (unsigned int)strlen(buff)))
if (!ma_pvio_tls_compare_fp(cert_fp, cert_fp_len, buff, (unsigned int)strlen(buff)))
{
/* finger print is valid: close file and exit */
ma_close(fp);

View File

@@ -64,7 +64,7 @@
#endif
#include <ma_pvio.h>
#ifdef HAVE_SSL
#include <ma_ssl.h>
#include <ma_tls.h>
#endif
#include <mysql/client_plugin.h>
@@ -610,7 +610,7 @@ struct st_default_options mariadb_defaults[] =
{MARIADB_OPT_SSL_FP, MARIADB_OPTION_STR, "ssl-fp"},
{MARIADB_OPT_SSL_FP_LIST, MARIADB_OPTION_STR, "ssl-fp-list"},
{MARIADB_OPT_SSL_FP_LIST, MARIADB_OPTION_STR, "ssl-fplist"},
{MARIADB_OPT_SSL_PASSPHRASE, MARIADB_OPTION_STR, "ssl_passphrase"},
{MARIADB_OPT_TLS_PASSPHRASE, MARIADB_OPTION_STR, "ssl_passphrase"},
{MYSQL_OPT_BIND, MARIADB_OPTION_STR, "bind-address"},
{0, 0, NULL}
};
@@ -1014,9 +1014,9 @@ const char * STDCALL
mysql_get_ssl_cipher(MYSQL *mysql)
{
#ifdef HAVE_SSL
if (mysql->net.pvio && mysql->net.pvio->cssl)
if (mysql->net.pvio && mysql->net.pvio->ctls)
{
return ma_pvio_ssl_cipher(mysql->net.pvio->cssl);
return ma_pvio_tls_cipher(mysql->net.pvio->ctls);
}
#endif
return(NULL);
@@ -1795,9 +1795,10 @@ static void mysql_close_options(MYSQL *mysql)
free(mysql->options.extension->db_driver);
free(mysql->options.extension->ssl_crl);
free(mysql->options.extension->ssl_crlpath);
free(mysql->options.extension->ssl_fp);
free(mysql->options.extension->ssl_fp_list);
free(mysql->options.extension->ssl_pw);
free(mysql->options.extension->tls_fp);
free(mysql->options.extension->tls_fp_list);
free(mysql->options.extension->tls_pw);
free(mysql->options.extension->tls_version);
free(mysql->options.extension->url);
free(mysql->options.extension->connection_handler);
if(hash_inited(&mysql->options.extension->connect_attrs))
@@ -2776,17 +2777,19 @@ mysql_optionsv(MYSQL *mysql,enum mysql_option option, ...)
case MYSQL_OPT_BIND:
OPT_SET_VALUE_STR(&mysql->options, bind_address, arg1);
break;
case MARIADB_OPT_SSL_CIPHER_STRENGTH:
OPT_SET_EXTENDED_VALUE_INT(&mysql->options, ssl_cipher_strength, *((unsigned int *)arg1));
case MARIADB_OPT_TLS_CIPHER_STRENGTH:
OPT_SET_EXTENDED_VALUE_INT(&mysql->options, tls_cipher_strength, *((unsigned int *)arg1));
break;
case MARIADB_OPT_SSL_FP:
OPT_SET_EXTENDED_VALUE_STR(&mysql->options, ssl_fp, (char *)arg1);
case MARIADB_OPT_TLS_PEER_FP:
OPT_SET_EXTENDED_VALUE_STR(&mysql->options, tls_fp, (char *)arg1);
break;
case MARIADB_OPT_SSL_FP_LIST:
OPT_SET_EXTENDED_VALUE_STR(&mysql->options, ssl_fp_list, (char *)arg1);
case MARIADB_OPT_TLS_PEER_FP_LIST:
OPT_SET_EXTENDED_VALUE_STR(&mysql->options, tls_fp_list, (char *)arg1);
break;
case MARIADB_OPT_SSL_PASSPHRASE:
OPT_SET_EXTENDED_VALUE_STR(&mysql->options, ssl_pw, (char *)arg1);
case MARIADB_OPT_TLS_PASSPHRASE:
OPT_SET_EXTENDED_VALUE_STR(&mysql->options, tls_pw, (char *)arg1);
break;
case MARIADB_OPT_COM_MULTI:
if (&mysql->net.pvio &&
@@ -3000,17 +3003,19 @@ mysql_get_optionv(MYSQL *mysql, enum mysql_option option, void *arg, ...)
case MYSQL_OPT_BIND:
*((char **)arg)= mysql->options.bind_address;
break;
case MARIADB_OPT_SSL_CIPHER_STRENGTH:
*((unsigned int *)arg) = mysql->options.extension ? mysql->options.extension->ssl_cipher_strength : 0;
case MARIADB_OPT_TLS_CIPHER_STRENGTH:
*((unsigned int *)arg) = mysql->options.extension ? mysql->options.extension->tls_cipher_strength : 0;
break;
case MARIADB_OPT_SSL_FP:
*((char **)arg)= mysql->options.extension ? mysql->options.extension->ssl_fp : NULL;
case MARIADB_OPT_TLS_PEER_FP:
*((char **)arg)= mysql->options.extension ? mysql->options.extension->tls_fp : NULL;
break;
case MARIADB_OPT_SSL_FP_LIST:
*((char **)arg)= mysql->options.extension ? mysql->options.extension->ssl_fp_list : NULL;
case MARIADB_OPT_TLS_PEER_FP_LIST:
*((char **)arg)= mysql->options.extension ? mysql->options.extension->tls_fp_list : NULL;
break;
case MARIADB_OPT_SSL_PASSPHRASE:
*((char **)arg)= mysql->options.extension ? mysql->options.extension->ssl_pw : NULL;
case MARIADB_OPT_TLS_PASSPHRASE:
*((char **)arg)= mysql->options.extension ? mysql->options.extension->tls_pw : NULL;
break;
case MARIADB_OPT_CONNECTION_READ_ONLY:
*((my_bool *)arg)= mysql->options.extension ? mysql->options.extension->read_only : 0;
@@ -3340,7 +3345,7 @@ void STDCALL mysql_server_end(void)
if (ma_init_done)
ma_end(0);
#ifdef HAVE_SSL
ma_pvio_ssl_end();
ma_pvio_tls_end();
#endif
mysql_client_init= 0;
ma_init_done= 0;
@@ -3461,31 +3466,31 @@ my_bool STDCALL mariadb_get_infov(MYSQL *mysql, enum mariadb_value value, void *
goto error;
*((char **)arg)= mysql->net.sqlstate;
break;
case MARIADB_CONNECTION_SSL_VERSION:
case MARIADB_CONNECTION_TLS_VERSION:
#ifdef HAVE_SSL
if (mysql && mysql->net.pvio && mysql->net.pvio->cssl)
if (mysql && mysql->net.pvio && mysql->net.pvio->ctls)
{
struct st_ssl_version version;
if (!ma_pvio_ssl_get_protocol_version(mysql->net.pvio->cssl, &version))
if (!ma_pvio_tls_get_protocol_version(mysql->net.pvio->ctls, &version))
*((char **)arg)= version.cversion;
}
else
#endif
goto error;
break;
case MARIADB_CONNECTION_SSL_VERSION_ID:
case MARIADB_CONNECTION_TLS_VERSION_ID:
#ifdef HAVE_SSL
if (mysql && mysql->net.pvio && mysql->net.pvio->cssl)
if (mysql && mysql->net.pvio && mysql->net.pvio->ctls)
{
struct st_ssl_version version;
if (!ma_pvio_ssl_get_protocol_version(mysql->net.pvio->cssl, &version))
if (!ma_pvio_tls_get_protocol_version(mysql->net.pvio->ctls, &version))
*((unsigned int *)arg)= version.iversion;
}
else
#endif
goto error;
break;
case MARIADB_SSL_LIBRARY:
case MARIADB_TLS_LIBRARY:
#ifdef HAVE_SSL
#ifdef HAVE_GNUTLS
*((char **)arg)= "GNUTLS";
@@ -3579,8 +3584,8 @@ my_bool STDCALL mariadb_get_infov(MYSQL *mysql, enum mariadb_value value, void *
break;
case MARIADB_CONNECTION_SSL_CIPHER:
#ifdef HAVE_SSL
if (mysql && mysql->net.pvio && mysql->net.pvio->cssl)
*((char **)arg)= (char *)ma_pvio_ssl_cipher(mysql->net.pvio->cssl);
if (mysql && mysql->net.pvio && mysql->net.pvio->ctls)
*((char **)arg)= (char *)ma_pvio_tls_cipher(mysql->net.pvio->ctls);
else
#endif
goto error;

View File

@@ -29,19 +29,19 @@
#include <ma_pthread.h>
#include <mysql/client_plugin.h>
#include <string.h>
#include <ma_ssl.h>
#include <ma_tls.h>
pthread_mutex_t LOCK_gnutls_config;
static gnutls_certificate_credentials_t GNUTLS_xcred;
extern my_bool ma_ssl_initialized;
extern my_bool ma_tls_initialized;
extern unsigned int mariadb_deinitialize_ssl;
static int my_verify_callback(gnutls_session_t ssl);
#define MAX_SSL_ERR_LEN 100
static void ma_ssl_set_error(MYSQL *mysql, int ssl_errno)
static void ma_tls_set_error(MYSQL *mysql, int ssl_errno)
{
char ssl_error[MAX_SSL_ERR_LEN];
const char *ssl_error_reason;
@@ -64,7 +64,7 @@ static void ma_ssl_set_error(MYSQL *mysql, int ssl_errno)
}
static void ma_ssl_get_error(char *errmsg, size_t length, int ssl_errno)
static void ma_tls_get_error(char *errmsg, size_t length, int ssl_errno)
{
const char *ssl_error_reason;
@@ -93,11 +93,11 @@ static void ma_ssl_get_error(char *errmsg, size_t length, int ssl_errno)
0 success
1 error
*/
int ma_ssl_start(char *errmsg, size_t errmsg_len)
int ma_tls_start(char *errmsg, size_t errmsg_len)
{
int rc= 0;
if (ma_ssl_initialized)
if (ma_tls_initialized)
return 0;
pthread_mutex_init(&LOCK_gnutls_config,MY_MUTEX_INIT_FAST);
@@ -105,12 +105,12 @@ int ma_ssl_start(char *errmsg, size_t errmsg_len)
if ((rc= gnutls_global_init()) != GNUTLS_E_SUCCESS)
{
ma_ssl_get_error(errmsg, errmsg_len, rc);
ma_tls_get_error(errmsg, errmsg_len, rc);
goto end;
}
/* Allocate a global context for credentials */
rc= gnutls_certificate_allocate_credentials(&GNUTLS_xcred);
ma_ssl_initialized= TRUE;
ma_tls_initialized= TRUE;
end:
pthread_mutex_unlock(&LOCK_gnutls_config);
return rc;
@@ -128,9 +128,9 @@ end:
RETURN VALUES
void
*/
void ma_ssl_end()
void ma_tls_end()
{
if (ma_ssl_initialized)
if (ma_tls_initialized)
{
pthread_mutex_lock(&LOCK_gnutls_config);
gnutls_certificate_free_keys(GNUTLS_xcred);
@@ -140,14 +140,14 @@ void ma_ssl_end()
gnutls_certificate_free_credentials(GNUTLS_xcred);
if (mariadb_deinitialize_ssl)
gnutls_global_deinit();
ma_ssl_initialized= FALSE;
ma_tls_initialized= FALSE;
pthread_mutex_unlock(&LOCK_gnutls_config);
pthread_mutex_destroy(&LOCK_gnutls_config);
}
return;
}
static int ma_ssl_set_certs(MYSQL *mysql)
static int ma_tls_set_certs(MYSQL *mysql)
{
char *certfile= mysql->options.ssl_cert,
*keyfile= mysql->options.ssl_key;
@@ -179,7 +179,7 @@ static int ma_ssl_set_certs(MYSQL *mysql)
if ((ssl_error= gnutls_certificate_set_x509_key_file2(GNUTLS_xcred,
certfile, keyfile,
GNUTLS_X509_FMT_PEM,
OPT_HAS_EXT_VAL(mysql, ssl_pw) ? mysql->options.extension->ssl_pw : NULL,
OPT_HAS_EXT_VAL(mysql, tls_pw) ? mysql->options.extension->tls_pw : NULL,
0)) < 0)
goto error;
}
@@ -191,7 +191,7 @@ error:
return ssl_error;
}
void *ma_ssl_init(MYSQL *mysql)
void *ma_tls_init(MYSQL *mysql)
{
gnutls_session_t ssl= NULL;
int ssl_error= 0;
@@ -199,7 +199,7 @@ void *ma_ssl_init(MYSQL *mysql)
pthread_mutex_lock(&LOCK_gnutls_config);
if ((ssl_error= ma_ssl_set_certs(mysql)) < 0)
if ((ssl_error= ma_tls_set_certs(mysql)) < 0)
goto error;
if ((ssl_error = gnutls_init(&ssl, GNUTLS_CLIENT & GNUTLS_NONBLOCK)) < 0)
@@ -216,36 +216,36 @@ void *ma_ssl_init(MYSQL *mysql)
pthread_mutex_unlock(&LOCK_gnutls_config);
return (void *)ssl;
error:
ma_ssl_set_error(mysql, ssl_error);
ma_tls_set_error(mysql, ssl_error);
if (ssl)
gnutls_deinit(ssl);
pthread_mutex_unlock(&LOCK_gnutls_config);
return NULL;
}
ssize_t ma_ssl_push(gnutls_transport_ptr_t ptr, const void* data, size_t len)
ssize_t ma_tls_push(gnutls_transport_ptr_t ptr, const void* data, size_t len)
{
MARIADB_PVIO *pvio= (MARIADB_PVIO *)ptr;
ssize_t rc= pvio->methods->write(pvio, data, len);
return rc;
}
ssize_t ma_ssl_pull(gnutls_transport_ptr_t ptr, void* data, size_t len)
ssize_t ma_tls_pull(gnutls_transport_ptr_t ptr, void* data, size_t len)
{
MARIADB_PVIO *pvio= (MARIADB_PVIO *)ptr;
ssize_t rc= pvio->methods->read(pvio, data, len);
return rc;
}
static int ma_ssl_pull_timeout(gnutls_transport_ptr_t ptr, unsigned int ms)
static int ma_tls_pull_timeout(gnutls_transport_ptr_t ptr, unsigned int ms)
{
MARIADB_PVIO *pvio= (MARIADB_PVIO *)ptr;
return pvio->methods->wait_io_or_timeout(pvio, 0, ms);
}
my_bool ma_ssl_connect(MARIADB_SSL *cssl)
my_bool ma_tls_connect(MARIADB_TLS *ctls)
{
gnutls_session_t ssl = (gnutls_session_t)cssl->ssl;
gnutls_session_t ssl = (gnutls_session_t)ctls->ssl;
my_bool blocking;
MYSQL *mysql;
MARIADB_PVIO *pvio;
@@ -263,9 +263,9 @@ my_bool ma_ssl_connect(MARIADB_SSL *cssl)
/* we don't use GnuTLS read/write functions */
gnutls_transport_set_ptr(ssl, pvio);
gnutls_transport_set_push_function(ssl, ma_ssl_push);
gnutls_transport_set_pull_function(ssl, ma_ssl_pull);
gnutls_transport_set_pull_timeout_function(ssl, ma_ssl_pull_timeout);
gnutls_transport_set_push_function(ssl, ma_tls_push);
gnutls_transport_set_pull_function(ssl, ma_tls_pull);
gnutls_transport_set_pull_timeout_function(ssl, ma_tls_pull_timeout);
gnutls_handshake_set_timeout(ssl, pvio->timeout[PVIO_CONNECT_TIMEOUT]);
do {
@@ -274,47 +274,47 @@ my_bool ma_ssl_connect(MARIADB_SSL *cssl)
if (ret < 0)
{
ma_ssl_set_error(mysql, ret);
ma_tls_set_error(mysql, ret);
/* restore blocking mode */
if (!blocking)
pvio->methods->blocking(pvio, FALSE, 0);
return 1;
}
cssl->ssl= (void *)ssl;
ctls->ssl= (void *)ssl;
return 0;
}
size_t ma_ssl_read(MARIADB_SSL *cssl, const uchar* buffer, size_t length)
size_t ma_tls_read(MARIADB_TLS *ctls, const uchar* buffer, size_t length)
{
return gnutls_record_recv((gnutls_session_t )cssl->ssl, (void *)buffer, length);
return gnutls_record_recv((gnutls_session_t )ctls->ssl, (void *)buffer, length);
}
size_t ma_ssl_write(MARIADB_SSL *cssl, const uchar* buffer, size_t length)
size_t ma_tls_write(MARIADB_TLS *ctls, const uchar* buffer, size_t length)
{
return gnutls_record_send((gnutls_session_t )cssl->ssl, (void *)buffer, length);
return gnutls_record_send((gnutls_session_t )ctls->ssl, (void *)buffer, length);
}
my_bool ma_ssl_close(MARIADB_SSL *cssl)
my_bool ma_tls_close(MARIADB_TLS *ctls)
{
gnutls_bye((gnutls_session_t )cssl->ssl, GNUTLS_SHUT_WR);
gnutls_deinit((gnutls_session_t )cssl->ssl);
cssl->ssl= NULL;
gnutls_bye((gnutls_session_t )ctls->ssl, GNUTLS_SHUT_WR);
gnutls_deinit((gnutls_session_t )ctls->ssl);
ctls->ssl= NULL;
return 0;
}
int ma_ssl_verify_server_cert(MARIADB_SSL *cssl)
int ma_tls_verify_server_cert(MARIADB_TLS *ctls)
{
/* server verification is already handled before */
return 0;
}
const char *ma_ssl_get_cipher(MARIADB_SSL *cssl)
const char *ma_tls_get_cipher(MARIADB_TLS *ctls)
{
if (!cssl || !cssl->ssl)
if (!ctls || !ctls->ssl)
return NULL;
return gnutls_cipher_get_name (gnutls_cipher_get((gnutls_session_t )cssl->ssl));
return gnutls_cipher_get_name (gnutls_cipher_get((gnutls_session_t )ctls->ssl));
}
static int my_verify_callback(gnutls_session_t ssl)
@@ -388,19 +388,19 @@ static int my_verify_callback(gnutls_session_t ssl)
return 0;
}
unsigned int ma_ssl_get_finger_print(MARIADB_SSL *cssl, unsigned char *fp, unsigned int len)
unsigned int ma_tls_get_finger_print(MARIADB_TLS *ctls, unsigned char *fp, unsigned int len)
{
MYSQL *mysql;
size_t fp_len= len;
const gnutls_datum_t *cert_list;
unsigned int cert_list_size;
if (!cssl || !cssl->ssl)
if (!ctls || !ctls->ssl)
return 0;
mysql= (MYSQL *)gnutls_session_get_ptr(cssl->ssl);
mysql= (MYSQL *)gnutls_session_get_ptr(ctls->ssl);
cert_list = gnutls_certificate_get_peers (cssl->ssl, &cert_list_size);
cert_list = gnutls_certificate_get_peers (ctls->ssl, &cert_list_size);
if (cert_list == NULL)
{
my_set_error(mysql, CR_SSL_CONNECTION_ERROR, SQLSTATE_UNKNOWN,
@@ -420,12 +420,12 @@ unsigned int ma_ssl_get_finger_print(MARIADB_SSL *cssl, unsigned char *fp, unsig
}
}
my_bool ma_ssl_get_protocol_version(MARIADB_SSL *cssl, struct st_ssl_version *version)
my_bool ma_tls_get_protocol_version(MARIADB_TLS *ctls, struct st_ssl_version *version)
{
if (!cssl || !cssl->ssl)
if (!ctls || !ctls->ssl)
return 1;
version->iversion= gnutls_protocol_get_version(cssl->ssl);
version->iversion= gnutls_protocol_get_version(ctls->ssl);
version->cversion= (char *)gnutls_protocol_get_name(version->iversion);
return 0;
}

View File

@@ -396,8 +396,8 @@ SECURITY_STATUS ma_schannel_handshake_loop(MARIADB_PVIO *pvio, my_bool InitialRe
SECURITY_STATUS rc;
PUCHAR IoBuffer;
BOOL fDoRead;
MARIADB_SSL *cssl= pvio->cssl;
SC_CTX *sctx= (SC_CTX *)cssl->ssl;
MARIADB_TLS *ctls= pvio->ctls;
SC_CTX *sctx= (SC_CTX *)ctls->ssl;
dwSSPIFlags = ISC_REQ_SEQUENCE_DETECT |
@@ -562,13 +562,13 @@ loopend:
}
/* }}} */
/* {{{ SECURITY_STATUS ma_schannel_client_handshake(MARIADB_SSL *cssl) */
/* {{{ SECURITY_STATUS ma_schannel_client_handshake(MARIADB_TLS *ctls) */
/*
performs client side handshake
SYNOPSIS
ma_schannel_client_handshake()
cssl Pointer to a MARIADB_SSL structure
ctls Pointer to a MARIADB_TLS structure
DESCRIPTION
initiates a client/server handshake. This function can be used
@@ -578,7 +578,7 @@ loopend:
SEC_E_OK on success
*/
SECURITY_STATUS ma_schannel_client_handshake(MARIADB_SSL *cssl)
SECURITY_STATUS ma_schannel_client_handshake(MARIADB_TLS *ctls)
{
MARIADB_PVIO *pvio;
SECURITY_STATUS sRet;
@@ -594,11 +594,11 @@ SECURITY_STATUS ma_schannel_client_handshake(MARIADB_SSL *cssl)
SecBufferDesc BufferOut;
SecBuffer BuffersOut;
if (!cssl || !cssl->pvio)
if (!ctls || !ctls->pvio)
return 1;
pvio= cssl->pvio;
sctx= (SC_CTX *)cssl->ssl;
pvio= ctls->pvio;
sctx= (SC_CTX *)ctls->ssl;
/* Initialie securifty context */
BuffersOut.BufferType= SECBUFFER_TOKEN;
@@ -701,10 +701,10 @@ SECURITY_STATUS ma_schannel_read_decrypt(MARIADB_PVIO *pvio,
*pData, *pExtra;
int i;
if (!pvio || !pvio->methods || !pvio->methods->read || !pvio->cssl || !DecryptLength)
if (!pvio || !pvio->methods || !pvio->methods->read || !pvio->ctls || !DecryptLength)
return SEC_E_INTERNAL_ERROR;
sctx= (SC_CTX *)pvio->cssl->ssl;
sctx= (SC_CTX *)pvio->ctls->ssl;
*DecryptLength= 0;
while (1)
@@ -880,7 +880,7 @@ size_t ma_schannel_write_encrypt(MARIADB_PVIO *pvio,
SecBuffer Buffers[4];
DWORD cbMessage;
PBYTE pbMessage;
SC_CTX *sctx= (SC_CTX *)pvio->cssl->ssl;
SC_CTX *sctx= (SC_CTX *)pvio->ctls->ssl;
size_t payload;
payload= MIN(WriteBufferSize, sctx->IoBufferSize);
@@ -920,15 +920,15 @@ size_t ma_schannel_write_encrypt(MARIADB_PVIO *pvio,
extern char *ssl_protocol_version[5];
/* {{{ ma_ssl_get_protocol_version(MARIADB_SSL *cssl, struct st_ssl_version *version) */
my_bool ma_ssl_get_protocol_version(MARIADB_SSL *cssl, struct st_ssl_version *version)
/* {{{ ma_tls_get_protocol_version(MARIADB_TLS *ctls, struct st_ssl_version *version) */
my_bool ma_tls_get_protocol_version(MARIADB_TLS *ctls, struct st_ssl_version *version)
{
SC_CTX *sctx;
SecPkgContext_ConnectionInfo ConnectionInfo;
if (!cssl->ssl)
if (!ctls->ssl)
return 1;
sctx= (SC_CTX *)cssl->ssl;
sctx= (SC_CTX *)ctls->ssl;
if (QueryContextAttributes(&sctx->ctxt, SECPKG_ATTR_CONNECTION_INFO, &ConnectionInfo) != SEC_E_OK)
return 1;

View File

@@ -56,7 +56,6 @@ struct st_schannel {
PUCHAR IoBuffer;
DWORD IoBufferSize;
SecPkgContext_StreamSizes Sizes;
CtxtHandle ctxt;
MYSQL *mysql;
};
@@ -67,7 +66,7 @@ extern HCERTSTORE ca_CertStore, crl_CertStore;
extern my_bool ca_Check, crl_Check;
CERT_CONTEXT *ma_schannel_create_cert_context(MARIADB_PVIO *pvio, const char *pem_file);
SECURITY_STATUS ma_schannel_client_handshake(MARIADB_SSL *cssl);
SECURITY_STATUS ma_schannel_client_handshake(MARIADB_TLS *ctls);
SECURITY_STATUS ma_schannel_handshake_loop(MARIADB_PVIO *pvio, my_bool InitialRead, SecBuffer *pExtraData);
my_bool ma_schannel_load_private_key(MARIADB_PVIO *pvio, CERT_CONTEXT *ctx, char *key_file);
PCCRL_CONTEXT ma_schannel_create_crl_context(MARIADB_PVIO *pvio, const char *pem_file);

View File

@@ -42,7 +42,7 @@
#endif
#include <ma_pthread.h>
extern my_bool ma_ssl_initialized;
extern my_bool ma_tls_initialized;
extern unsigned int mariadb_deinitialize_ssl;
static SSL_CTX *SSL_context= NULL;
@@ -52,7 +52,7 @@ static pthread_mutex_t LOCK_openssl_config;
static pthread_mutex_t *LOCK_crypto= NULL;
static void ma_ssl_set_error(MYSQL *mysql)
static void ma_tls_set_error(MYSQL *mysql)
{
ulong ssl_errno= ERR_get_error();
char ssl_error[MAX_SSL_ERR_LEN];
@@ -76,7 +76,7 @@ static void ma_ssl_set_error(MYSQL *mysql)
}
static void ma_ssl_get_error(char *errmsg, size_t length)
static void ma_tls_get_error(char *errmsg, size_t length)
{
ulong ssl_errno= ERR_get_error();
const char *ssl_error_reason;
@@ -113,13 +113,13 @@ static void my_cb_threadid(CRYPTO_THREADID *id)
#endif
#ifdef HAVE_SSL_SESSION_CACHE
typedef struct st_ma_ssl_session {
typedef struct st_ma_tls_session {
char md4_hash[17];
SSL_SESSION *session;
} MA_SSL_SESSION;
MA_SSL_SESSION *ma_ssl_sessions= NULL;
unsigned int ma_ssl_session_cache_size= 128;
MA_SSL_SESSION *ma_tls_sessions= NULL;
unsigned int ma_tls_session_cache_size= 128;
static char *ma_md4_hash(const char *host, const char *user, unsigned int port, char *md4)
{
@@ -130,28 +130,28 @@ static char *ma_md4_hash(const char *host, const char *user, unsigned int port,
return md4;
}
MA_SSL_SESSION *ma_ssl_get_session(MYSQL *mysql)
MA_SSL_SESSION *ma_tls_get_session(MYSQL *mysql)
{
char md4[17];
int i;
if (!ma_ssl_sessions)
if (!ma_tls_sessions)
return NULL;
memset(md4, 0, 16);
ma_md4_hash(mysql->host, mysql->user, mysql->port, md4);
for (i=0; i < ma_ssl_session_cache_size; i++)
for (i=0; i < ma_tls_session_cache_size; i++)
{
if (ma_ssl_sessions[i].session &&
!strncmp(ma_ssl_sessions[i].md4_hash, md4, 16))
if (ma_tls_sessions[i].session &&
!strncmp(ma_tls_sessions[i].md4_hash, md4, 16))
{
return &ma_ssl_sessions[i];
return &ma_tls_sessions[i];
}
}
return NULL;
}
static int ma_ssl_session_cb(SSL *ssl, SSL_SESSION *session)
static int ma_tls_session_cb(SSL *ssl, SSL_SESSION *session)
{
MYSQL *mysql;
MA_SSL_SESSION *stored_session;
@@ -160,34 +160,34 @@ static int ma_ssl_session_cb(SSL *ssl, SSL_SESSION *session)
mysql= (MYSQL *)SSL_get_app_data(ssl);
/* check if we already stored session key */
if ((stored_session= ma_ssl_get_session(mysql)))
if ((stored_session= ma_tls_get_session(mysql)))
{
SSL_SESSION_free(stored_session->session);
stored_session->session= session;
return 1;
}
for (i=0; i < ma_ssl_session_cache_size; i++)
for (i=0; i < ma_tls_session_cache_size; i++)
{
if (!ma_ssl_sessions[i].session)
if (!ma_tls_sessions[i].session)
{
ma_md4_hash(mysql->host, mysql->user, mysql->port, ma_ssl_sessions[i].md4_hash);
ma_ssl_sessions[i].session= session;
ma_md4_hash(mysql->host, mysql->user, mysql->port, ma_tls_sessions[i].md4_hash);
ma_tls_sessions[i].session= session;
}
return 1;
}
return 0;
}
static void ma_ssl_remove_session_cb(SSL_CTX* ctx, SSL_SESSION* session)
static void ma_tls_remove_session_cb(SSL_CTX* ctx, SSL_SESSION* session)
{
int i;
for (i=0; i < ma_ssl_session_cache_size; i++)
if (session == ma_ssl_sessions[i].session)
for (i=0; i < ma_tls_session_cache_size; i++)
if (session == ma_tls_sessions[i].session)
{
ma_ssl_sessions[i].md4_hash[0]= 0;
SSL_SESSION_free(ma_ssl_sessions[i].session);
ma_ssl_sessions[i].session= NULL;
ma_tls_sessions[i].md4_hash[0]= 0;
SSL_SESSION_free(ma_tls_sessions[i].session);
ma_tls_sessions[i].session= NULL;
}
}
#endif
@@ -238,10 +238,10 @@ static int ssl_thread_init()
0 success
1 error
*/
int ma_ssl_start(char *errmsg, size_t errmsg_len)
int ma_tls_start(char *errmsg, size_t errmsg_len)
{
int rc= 1;
if (ma_ssl_initialized)
if (ma_tls_initialized)
return 0;
/* lock mutex to prevent multiple initialization */
@@ -267,17 +267,17 @@ int ma_ssl_start(char *errmsg, size_t errmsg_len)
if (!(SSL_context= SSL_CTX_new(SSLv23_client_method())))
#endif
{
ma_ssl_get_error(errmsg, errmsg_len);
ma_tls_get_error(errmsg, errmsg_len);
goto end;
}
#ifdef HAVE_SSL_SESSION_CACHE
SSL_CTX_set_session_cache_mode(SSL_context, SSL_SESS_CACHE_CLIENT);
ma_ssl_sessions= (MA_SSL_SESSION *)calloc(1, sizeof(struct st_ma_ssl_session) * ma_ssl_session_cache_size);
SSL_CTX_sess_set_new_cb(SSL_context, ma_ssl_session_cb);
SSL_CTX_sess_set_remove_cb(SSL_context, ma_ssl_remove_session_cb);
ma_tls_sessions= (MA_SSL_SESSION *)calloc(1, sizeof(struct st_ma_tls_session) * ma_tls_session_cache_size);
SSL_CTX_sess_set_new_cb(SSL_context, ma_tls_session_cb);
SSL_CTX_sess_set_remove_cb(SSL_context, ma_tls_remove_session_cb);
#endif
rc= 0;
ma_ssl_initialized= TRUE;
ma_tls_initialized= TRUE;
end:
pthread_mutex_unlock(&LOCK_openssl_config);
return rc;
@@ -295,9 +295,9 @@ end:
RETURN VALUES
void
*/
void ma_ssl_end()
void ma_tls_end()
{
if (ma_ssl_initialized)
if (ma_tls_initialized)
{
int i;
pthread_mutex_lock(&LOCK_openssl_config);
@@ -325,14 +325,14 @@ void ma_ssl_end()
CONF_modules_unload(1);
sk_SSL_COMP_free(SSL_COMP_get_compression_methods());
}
ma_ssl_initialized= FALSE;
ma_tls_initialized= FALSE;
pthread_mutex_unlock(&LOCK_openssl_config);
pthread_mutex_destroy(&LOCK_openssl_config);
}
return;
}
int ma_ssl_get_password(char *buf, int size, int rwflag, void *userdata)
int ma_tls_get_password(char *buf, int size, int rwflag, void *userdata)
{
memset(buf, 0, size);
if (userdata)
@@ -341,7 +341,7 @@ int ma_ssl_get_password(char *buf, int size, int rwflag, void *userdata)
}
static int ma_ssl_set_certs(MYSQL *mysql)
static int ma_tls_set_certs(MYSQL *mysql)
{
char *certfile= mysql->options.ssl_cert,
*keyfile= mysql->options.ssl_key;
@@ -375,10 +375,10 @@ static int ma_ssl_set_certs(MYSQL *mysql)
/* If the private key file is encrypted, we need to register a callback function
* for providing password. */
if (OPT_HAS_EXT_VAL(mysql, ssl_pw))
if (OPT_HAS_EXT_VAL(mysql, tls_pw))
{
SSL_CTX_set_default_passwd_cb_userdata(SSL_context, (void *)mysql->options.extension->ssl_pw);
SSL_CTX_set_default_passwd_cb(SSL_context, ma_ssl_get_password);
SSL_CTX_set_default_passwd_cb_userdata(SSL_context, (void *)mysql->options.extension->tls_pw);
SSL_CTX_set_default_passwd_cb(SSL_context, ma_tls_get_password);
}
if (keyfile && keyfile[0])
@@ -391,7 +391,7 @@ static int ma_ssl_set_certs(MYSQL *mysql)
goto error;
}
}
if (OPT_HAS_EXT_VAL(mysql, ssl_pw))
if (OPT_HAS_EXT_VAL(mysql, tls_pw))
{
SSL_CTX_set_default_passwd_cb_userdata(SSL_context, NULL);
SSL_CTX_set_default_passwd_cb(SSL_context, NULL);
@@ -416,7 +416,7 @@ static int ma_ssl_set_certs(MYSQL *mysql)
return 0;
error:
ma_ssl_set_error(mysql);
ma_tls_set_error(mysql);
return 1;
}
@@ -450,16 +450,16 @@ static int my_verify_callback(int ok, X509_STORE_CTX *ctx)
}
void *ma_ssl_init(MYSQL *mysql)
void *ma_tls_init(MYSQL *mysql)
{
int verify;
SSL *ssl= NULL;
#ifdef HAVE_SSL_SESSION_CACHE
MA_SSL_SESSION *session= ma_ssl_get_session(mysql);
MA_SSL_SESSION *session= ma_tls_get_session(mysql);
#endif
pthread_mutex_lock(&LOCK_openssl_config);
if (ma_ssl_set_certs(mysql))
if (ma_tls_set_certs(mysql))
{
goto error;
}
@@ -490,9 +490,9 @@ error:
return NULL;
}
my_bool ma_ssl_connect(MARIADB_SSL *cssl)
my_bool ma_tls_connect(MARIADB_TLS *ctls)
{
SSL *ssl = (SSL *)cssl->ssl;
SSL *ssl = (SSL *)ctls->ssl;
my_bool blocking;
MYSQL *mysql;
MARIADB_PVIO *pvio;
@@ -512,7 +512,7 @@ my_bool ma_ssl_connect(MARIADB_SSL *cssl)
if (SSL_connect(ssl) != 1)
{
ma_ssl_set_error(mysql);
ma_tls_set_error(mysql);
/* restore blocking mode */
if (!blocking)
pvio->methods->blocking(pvio, FALSE, 0);
@@ -532,29 +532,29 @@ my_bool ma_ssl_connect(MARIADB_SSL *cssl)
return 1;
}
}
pvio->cssl->ssl= cssl->ssl= (void *)ssl;
pvio->ctls->ssl= ctls->ssl= (void *)ssl;
return 0;
}
size_t ma_ssl_read(MARIADB_SSL *cssl, const uchar* buffer, size_t length)
size_t ma_tls_read(MARIADB_TLS *ctls, const uchar* buffer, size_t length)
{
return SSL_read((SSL *)cssl->ssl, (void *)buffer, (int)length);
return SSL_read((SSL *)ctls->ssl, (void *)buffer, (int)length);
}
size_t ma_ssl_write(MARIADB_SSL *cssl, const uchar* buffer, size_t length)
size_t ma_tls_write(MARIADB_TLS *ctls, const uchar* buffer, size_t length)
{
return SSL_write((SSL *)cssl->ssl, (void *)buffer, (int)length);
return SSL_write((SSL *)ctls->ssl, (void *)buffer, (int)length);
}
my_bool ma_ssl_close(MARIADB_SSL *cssl)
my_bool ma_tls_close(MARIADB_TLS *ctls)
{
int i, rc;
SSL *ssl;
if (!cssl || !cssl->ssl)
if (!ctls || !ctls->ssl)
return 1;
ssl= (SSL *)cssl->ssl;
ssl= (SSL *)ctls->ssl;
SSL_set_quiet_shutdown(ssl, 1);
/* 2 x pending + 2 * data = 4 */
@@ -563,12 +563,12 @@ my_bool ma_ssl_close(MARIADB_SSL *cssl)
break;
SSL_free(ssl);
cssl->ssl= NULL;
ctls->ssl= NULL;
return rc;
}
int ma_ssl_verify_server_cert(MARIADB_SSL *cssl)
int ma_tls_verify_server_cert(MARIADB_TLS *ctls)
{
X509 *cert;
MYSQL *mysql;
@@ -580,9 +580,9 @@ int ma_ssl_verify_server_cert(MARIADB_SSL *cssl)
SSL *ssl;
MARIADB_PVIO *pvio;
if (!cssl || !cssl->ssl)
if (!ctls || !ctls->ssl)
return 1;
ssl= (SSL *)cssl->ssl;
ssl= (SSL *)ctls->ssl;
mysql= (MYSQL *)SSL_get_app_data(ssl);
pvio= mysql->net.pvio;
@@ -632,26 +632,26 @@ error:
return 1;
}
const char *ma_ssl_get_cipher(MARIADB_SSL *cssl)
const char *ma_tls_get_cipher(MARIADB_TLS *ctls)
{
if (!cssl || !cssl->ssl)
if (!ctls || !ctls->ssl)
return NULL;
return SSL_get_cipher_name(cssl->ssl);
return SSL_get_cipher_name(ctls->ssl);
}
unsigned int ma_ssl_get_finger_print(MARIADB_SSL *cssl, unsigned char *fp, unsigned int len)
unsigned int ma_tls_get_finger_print(MARIADB_TLS *ctls, unsigned char *fp, unsigned int len)
{
EVP_MD *digest= (EVP_MD *)EVP_sha1();
X509 *cert;
MYSQL *mysql;
unsigned int fp_len;
if (!cssl || !cssl->ssl)
if (!ctls || !ctls->ssl)
return 0;
mysql= SSL_get_app_data(cssl->ssl);
mysql= SSL_get_app_data(ctls->ssl);
if (!(cert= SSL_get_peer_certificate(cssl->ssl)))
if (!(cert= SSL_get_peer_certificate(ctls->ssl)))
{
my_set_error(mysql, CR_SSL_CONNECTION_ERROR, SQLSTATE_UNKNOWN,
ER(CR_SSL_CONNECTION_ERROR),
@@ -681,14 +681,14 @@ unsigned int ma_ssl_get_finger_print(MARIADB_SSL *cssl, unsigned char *fp, unsig
extern char *ssl_protocol_version[5];
my_bool ma_ssl_get_protocol_version(MARIADB_SSL *cssl, struct st_ssl_version *version)
my_bool ma_tls_get_protocol_version(MARIADB_TLS *ctls, struct st_ssl_version *version)
{
SSL *ssl;
if (!cssl || !cssl->ssl)
if (!ctls || !ctls->ssl)
return 1;
ssl = (SSL *)cssl->ssl;
ssl = (SSL *)ctls->ssl;
switch(ssl->version)
{
#ifdef SSL3_VERSION

View File

@@ -24,7 +24,7 @@
//#define VOID void
extern my_bool ma_ssl_initialized;
extern my_bool ma_tls_initialized;
static pthread_mutex_t LOCK_schannel_config;
static pthread_mutex_t *LOCK_crypto= NULL;
@@ -97,15 +97,15 @@ static int ssl_thread_init()
context SSL_context
SYNOPSIS
ma_ssl_start
ma_tls_start
RETURN VALUES
0 success
1 error
*/
int ma_ssl_start(char *errmsg, size_t errmsg_len)
int ma_tls_start(char *errmsg, size_t errmsg_len)
{
if (!ma_ssl_initialized)
if (!ma_tls_initialized)
{
pthread_mutex_init(&LOCK_schannel_config,MY_MUTEX_INIT_FAST);
pthread_mutex_lock(&LOCK_schannel_config);
@@ -119,7 +119,7 @@ int ma_ssl_start(char *errmsg, size_t errmsg_len)
}
}
ma_ssl_initialized = TRUE;
ma_tls_initialized = TRUE;
pthread_mutex_unlock(&LOCK_schannel_config);
}
return 0;
@@ -131,15 +131,15 @@ int ma_ssl_start(char *errmsg, size_t errmsg_len)
mysql_server_end() function
SYNOPSIS
ma_ssl_end()
ma_tls_end()
void
RETURN VALUES
void
*/
void ma_ssl_end()
void ma_tls_end()
{
if (ma_ssl_initialized)
if (ma_tls_initialized)
{
pthread_mutex_lock(&LOCK_schannel_config);
if (ca_CertStore)
@@ -152,25 +152,25 @@ void ma_ssl_end()
CertCloseStore(crl_CertStore, 0);
crl_CertStore = 0;
}
ma_ssl_initialized= FALSE;
ma_tls_initialized= FALSE;
pthread_mutex_unlock(&LOCK_schannel_config);
pthread_mutex_destroy(&LOCK_schannel_config);
}
return;
}
/* {{{ static int ma_ssl_set_client_certs(MARIADB_SSL *cssl) */
static int ma_ssl_set_client_certs(MARIADB_SSL *cssl)
/* {{{ static int ma_tls_set_client_certs(MARIADB_TLS *ctls) */
static int ma_tls_set_client_certs(MARIADB_TLS *ctls)
{
MYSQL *mysql= cssl->pvio->mysql;
MYSQL *mysql= ctls->pvio->mysql;
char *certfile= mysql->options.ssl_cert,
*keyfile= mysql->options.ssl_key,
*cafile= mysql->options.ssl_ca;
PCERT_CONTEXT ca_ctx= NULL;
PCRL_CONTEXT crl_ctx = NULL;
SC_CTX *sctx= (SC_CTX *)cssl->ssl;
MARIADB_PVIO *pvio= cssl->pvio;
SC_CTX *sctx= (SC_CTX *)ctls->ssl;
MARIADB_PVIO *pvio= ctls->pvio;
if (cafile)
{
@@ -194,7 +194,7 @@ static int ma_ssl_set_client_certs(MARIADB_SSL *cssl)
keyfile= certfile;
if (certfile && certfile[0])
if (!(sctx->client_cert_ctx = ma_schannel_create_cert_context(cssl->pvio, certfile)))
if (!(sctx->client_cert_ctx = ma_schannel_create_cert_context(ctls->pvio, certfile)))
goto end;
if (sctx->client_cert_ctx && keyfile[0])
@@ -229,8 +229,8 @@ end:
}
/* }}} */
/* {{{ void *ma_ssl_init(MARIADB_SSL *cssl, MYSQL *mysql) */
void *ma_ssl_init(MYSQL *mysql)
/* {{{ void *ma_tls_init(MARIADB_TLS *ctls, MYSQL *mysql) */
void *ma_tls_init(MYSQL *mysql)
{
SC_CTX *sctx= NULL;
@@ -249,7 +249,7 @@ void *ma_ssl_init(MYSQL *mysql)
my_bool ma_ssl_connect(MARIADB_SSL *cssl)
my_bool ma_tls_connect(MARIADB_TLS *ctls)
{
my_bool blocking;
MYSQL *mysql;
@@ -262,11 +262,11 @@ my_bool ma_ssl_connect(MARIADB_SSL *cssl)
pLocalCertContext= NULL;
ALG_ID AlgId[MAX_ALG_ID]= {0};
if (!cssl || !cssl->pvio)
if (!ctls || !ctls->pvio)
return 1;;
pvio= cssl->pvio;
sctx= (SC_CTX *)cssl->ssl;
pvio= ctls->pvio;
sctx= (SC_CTX *)ctls->ssl;
/* Set socket to blocking if not already set */
if (!(blocking= pvio->methods->is_blocking(pvio)))
@@ -274,7 +274,7 @@ my_bool ma_ssl_connect(MARIADB_SSL *cssl)
mysql= pvio->mysql;
if (ma_ssl_set_client_certs(cssl))
if (ma_tls_set_client_certs(ctls))
goto end;
ZeroMemory(&Cred, sizeof(SCHANNEL_CRED));
@@ -302,7 +302,7 @@ my_bool ma_ssl_connect(MARIADB_SSL *cssl)
Cred.dwVersion= SCHANNEL_CRED_VERSION;
if (mysql->options.extension)
Cred.dwMinimumCipherStrength = MAX(128, mysql->options.extension->ssl_cipher_strength);
Cred.dwMinimumCipherStrength = MAX(128, mysql->options.extension->tls_cipher_strength);
else
Cred.dwMinimumCipherStrength = 128;
Cred.dwFlags |= SCH_CRED_NO_SERVERNAME_CHECK | SCH_SEND_ROOT_CERT |
@@ -323,7 +323,7 @@ my_bool ma_ssl_connect(MARIADB_SSL *cssl)
}
sctx->FreeCredHdl= 1;
if (ma_schannel_client_handshake(cssl) != SEC_E_OK)
if (ma_schannel_client_handshake(ctls) != SEC_E_OK)
goto end;
sRet= QueryContextAttributes(&sctx->ctxt, SECPKG_ATTR_REMOTE_CERT_CONTEXT, (PVOID)&pRemoteCertContext);
@@ -350,9 +350,9 @@ end:
return 1;
}
size_t ma_ssl_read(MARIADB_SSL *cssl, const uchar* buffer, size_t length)
size_t ma_tls_read(MARIADB_TLS *ctls, const uchar* buffer, size_t length)
{
SC_CTX *sctx= (SC_CTX *)cssl->ssl;
SC_CTX *sctx= (SC_CTX *)ctls->ssl;
MARIADB_PVIO *pvio= sctx->mysql->net.pvio;
DWORD dlength= -1;
@@ -360,9 +360,9 @@ size_t ma_ssl_read(MARIADB_SSL *cssl, const uchar* buffer, size_t length)
return dlength;
}
size_t ma_ssl_write(MARIADB_SSL *cssl, const uchar* buffer, size_t length)
size_t ma_tls_write(MARIADB_TLS *ctls, const uchar* buffer, size_t length)
{
SC_CTX *sctx= (SC_CTX *)cssl->ssl;
SC_CTX *sctx= (SC_CTX *)ctls->ssl;
MARIADB_PVIO *pvio= sctx->mysql->net.pvio;
size_t rc, wlength= 0;
size_t remain= length;
@@ -377,10 +377,10 @@ size_t ma_ssl_write(MARIADB_SSL *cssl, const uchar* buffer, size_t length)
return length;
}
/* {{{ my_bool ma_ssl_close(MARIADB_PVIO *pvio) */
my_bool ma_ssl_close(MARIADB_SSL *cssl)
/* {{{ my_bool ma_tls_close(MARIADB_PVIO *pvio) */
my_bool ma_tls_close(MARIADB_TLS *ctls)
{
SC_CTX *sctx= (SC_CTX *)cssl->ssl;
SC_CTX *sctx= (SC_CTX *)ctls->ssl;
if (sctx)
{
@@ -396,10 +396,10 @@ my_bool ma_ssl_close(MARIADB_SSL *cssl)
}
/* }}} */
int ma_ssl_verify_server_cert(MARIADB_SSL *cssl)
int ma_tls_verify_server_cert(MARIADB_TLS *ctls)
{
SC_CTX *sctx= (SC_CTX *)cssl->ssl;
MARIADB_PVIO *pvio= cssl->pvio;
SC_CTX *sctx= (SC_CTX *)ctls->ssl;
MARIADB_PVIO *pvio= ctls->pvio;
int rc= 1;
char *szName= NULL;
char *pszServerName= pvio->mysql->host;
@@ -461,17 +461,17 @@ end:
return rc;
}
const char *ma_ssl_get_cipher(MARIADB_SSL *cssl)
const char *ma_tls_get_cipher(MARIADB_TLS *ctls)
{
SecPkgContext_ConnectionInfo cinfo;
SECURITY_STATUS sRet;
SC_CTX *sctx;
DWORD i= 0;
if (!cssl || !cssl->ssl)
if (!ctls || !ctls->ssl)
return NULL;
sctx= (SC_CTX *)cssl->ssl;
sctx= (SC_CTX *)ctls->ssl;
sRet= QueryContextAttributes(&sctx->ctxt, SECPKG_ATTR_CONNECTION_INFO, (PVOID)&cinfo);
if (sRet != SEC_E_OK)
@@ -486,9 +486,9 @@ const char *ma_ssl_get_cipher(MARIADB_SSL *cssl)
return NULL;
}
unsigned int ma_ssl_get_finger_print(MARIADB_SSL *cssl, unsigned char *fp, unsigned int len)
unsigned int ma_tls_get_finger_print(MARIADB_TLS *ctls, unsigned char *fp, unsigned int len)
{
SC_CTX *sctx= (SC_CTX *)cssl->ssl;
SC_CTX *sctx= (SC_CTX *)ctls->ssl;
PCCERT_CONTEXT pRemoteCertContext = NULL;
if (QueryContextAttributes(&sctx->ctxt, SECPKG_ATTR_REMOTE_CERT_CONTEXT, (PVOID)&pRemoteCertContext) != SEC_E_OK)
return 0;

View File

@@ -189,8 +189,8 @@ static int send_client_reply_packet(MCPVIO_EXT *mpvio,
if (mysql->options.use_ssl && !(mysql->server_capabilities & CLIENT_SSL))
{
if ((mysql->client_flag & CLIENT_SSL_VERIFY_SERVER_CERT) ||
(mysql->options.extension && (mysql->options.extension->ssl_fp ||
mysql->options.extension->ssl_fp_list)))
(mysql->options.extension && (mysql->options.extension->tls_fp ||
mysql->options.extension->tls_fp_list)))
{
my_set_error(mysql, CR_SSL_CONNECTION_ERROR, SQLSTATE_UNKNOWN,
ER(CR_SSL_CONNECTION_ERROR),

View File

@@ -841,7 +841,7 @@ static int test_get_options(MYSQL *my)
int options_char[]= {MYSQL_READ_DEFAULT_FILE, MYSQL_READ_DEFAULT_GROUP, MYSQL_SET_CHARSET_NAME,
MYSQL_OPT_SSL_KEY, MYSQL_OPT_SSL_CA, MYSQL_OPT_SSL_CERT, MYSQL_OPT_SSL_CAPATH,
MYSQL_OPT_SSL_CIPHER, MYSQL_OPT_BIND, MARIADB_OPT_SSL_FP, MARIADB_OPT_SSL_FP_LIST,
MARIADB_OPT_SSL_PASSPHRASE, 0};
MARIADB_OPT_TLS_PASSPHRASE, 0};
char *init_command[3]= {"SET @a:=1", "SET @b:=2", "SET @c:=3"};
int elements= 0;

View File

@@ -379,7 +379,7 @@ static int test_password_protected(MYSQL *my)
"@CMAKE_SOURCE_DIR@/unittest/libmariadb/certs/client-cert.pem",
"@CMAKE_SOURCE_DIR@/unittest/libmariadb/certs/ca-cert.pem", 0, 0);
mysql_options(mysql, MARIADB_OPT_SSL_PASSPHRASE, "qwerty");
mysql_options(mysql, MARIADB_OPT_TLS_PASSPHRASE, "qwerty");
FAIL_IF(!mysql_real_connect(mysql, hostname, ssluser, sslpw, schema,
port, socketname, 0), mysql_error(mysql));
@@ -780,12 +780,12 @@ static int test_ssl_version(MYSQL *mysql)
port, socketname, 0), mysql_error(my));
diag("cipher: %s", mysql_get_ssl_cipher(my));
mariadb_get_infov(my, MARIADB_CONNECTION_SSL_VERSION_ID, &iversion);
mariadb_get_infov(my, MARIADB_CONNECTION_TLS_VERSION_ID, &iversion);
diag("protocol: %d", iversion);
mariadb_get_infov(my, MARIADB_CONNECTION_SSL_VERSION, &version);
mariadb_get_infov(my, MARIADB_CONNECTION_TLS_VERSION, &version);
diag("protocol: %s", version);
mariadb_get_infov(my, MARIADB_SSL_LIBRARY, &library);
mariadb_get_infov(my, MARIADB_TLS_LIBRARY, &library);
diag("library: %s", library);
mysql_close(my);
@@ -806,7 +806,7 @@ static int test_schannel_cipher(MYSQL *mysql)
FAIL_IF(!my, "mysql_init() failed");
mysql_ssl_set(my,0, 0, "@CMAKE_SOURCE_DIR@/unittest/libmariadb/certs/ca-cert.pem", 0, 0);
mysql_options(my, MARIADB_OPT_SSL_CIPHER_STRENGTH, &cipher_strength);
mysql_options(my, MARIADB_OPT_TLS_CIPHER_STRENGTH, &cipher_strength);
FAIL_IF(!mysql_real_connect(my, hostname, ssluser, sslpw, schema,
port, socketname, 0), mysql_error(my));