Merge branch '5.5' into 10.0

This commit is contained in:
Sergei Golubchik 2016-10-25 16:41:43 +02:00
commit 12c3e16dfa
25 changed files with 551 additions and 193 deletions

View File

@ -245,7 +245,8 @@ static void end_pager();
static void init_tee(const char *); static void init_tee(const char *);
static void end_tee(); static void end_tee();
static const char* construct_prompt(); static const char* construct_prompt();
static char *get_arg(char *line, my_bool get_next_arg); enum get_arg_mode { CHECK, GET, GET_NEXT};
static char *get_arg(char *line, get_arg_mode mode);
static void init_username(); static void init_username();
static void add_int_to_prompt(int toadd); static void add_int_to_prompt(int toadd);
static int get_result_width(MYSQL_RES *res); static int get_result_width(MYSQL_RES *res);
@ -2257,7 +2258,7 @@ static COMMANDS *find_command(char *name)
if (!my_strnncoll(&my_charset_latin1, (uchar*) name, len, if (!my_strnncoll(&my_charset_latin1, (uchar*) name, len,
(uchar*) commands[i].name, len) && (uchar*) commands[i].name, len) &&
(commands[i].name[len] == '\0') && (commands[i].name[len] == '\0') &&
(!end || commands[i].takes_params)) (!end || (commands[i].takes_params && get_arg(name, CHECK))))
{ {
index= i; index= i;
break; break;
@ -3177,7 +3178,7 @@ com_charset(String *buffer __attribute__((unused)), char *line)
char buff[256], *param; char buff[256], *param;
CHARSET_INFO * new_cs; CHARSET_INFO * new_cs;
strmake_buf(buff, line); strmake_buf(buff, line);
param= get_arg(buff, 0); param= get_arg(buff, GET);
if (!param || !*param) if (!param || !*param)
{ {
return put_info("Usage: \\C charset_name | charset charset_name", return put_info("Usage: \\C charset_name | charset charset_name",
@ -4263,12 +4264,12 @@ com_connect(String *buffer, char *line)
#ifdef EXTRA_DEBUG #ifdef EXTRA_DEBUG
tmp[1]= 0; tmp[1]= 0;
#endif #endif
tmp= get_arg(buff, 0); tmp= get_arg(buff, GET);
if (tmp && *tmp) if (tmp && *tmp)
{ {
my_free(current_db); my_free(current_db);
current_db= my_strdup(tmp, MYF(MY_WME)); current_db= my_strdup(tmp, MYF(MY_WME));
tmp= get_arg(buff, 1); tmp= get_arg(buff, GET_NEXT);
if (tmp) if (tmp)
{ {
my_free(current_host); my_free(current_host);
@ -4371,7 +4372,7 @@ com_delimiter(String *buffer __attribute__((unused)), char *line)
char buff[256], *tmp; char buff[256], *tmp;
strmake_buf(buff, line); strmake_buf(buff, line);
tmp= get_arg(buff, 0); tmp= get_arg(buff, GET);
if (!tmp || !*tmp) if (!tmp || !*tmp)
{ {
@ -4402,7 +4403,7 @@ com_use(String *buffer __attribute__((unused)), char *line)
bzero(buff, sizeof(buff)); bzero(buff, sizeof(buff));
strmake_buf(buff, line); strmake_buf(buff, line);
tmp= get_arg(buff, 0); tmp= get_arg(buff, GET);
if (!tmp || !*tmp) if (!tmp || !*tmp)
{ {
put_info("USE must be followed by a database name", INFO_ERROR); put_info("USE must be followed by a database name", INFO_ERROR);
@ -4487,23 +4488,22 @@ com_nowarnings(String *buffer __attribute__((unused)),
} }
/* /*
Gets argument from a command on the command line. If get_next_arg is Gets argument from a command on the command line. If mode is not GET_NEXT,
not defined, skips the command and returns the first argument. The skips the command and returns the first argument. The line is modified by
line is modified by adding zero to the end of the argument. If adding zero to the end of the argument. If mode is GET_NEXT, then the
get_next_arg is defined, then the function searches for end of string function searches for end of string first, after found, returns the next
first, after found, returns the next argument and adds zero to the argument and adds zero to the end. If you ever wish to use this feature,
end. If you ever wish to use this feature, remember to initialize all remember to initialize all items in the array to zero first.
items in the array to zero first.
*/ */
char *get_arg(char *line, my_bool get_next_arg) static char *get_arg(char *line, get_arg_mode mode)
{ {
char *ptr, *start; char *ptr, *start;
my_bool quoted= 0, valid_arg= 0; bool short_cmd= false;
char qtype= 0; char qtype= 0;
ptr= line; ptr= line;
if (get_next_arg) if (mode == GET_NEXT)
{ {
for (; *ptr; ptr++) ; for (; *ptr; ptr++) ;
if (*(ptr + 1)) if (*(ptr + 1))
@ -4514,7 +4514,7 @@ char *get_arg(char *line, my_bool get_next_arg)
/* skip leading white spaces */ /* skip leading white spaces */
while (my_isspace(charset_info, *ptr)) while (my_isspace(charset_info, *ptr))
ptr++; ptr++;
if (*ptr == '\\') // short command was used if ((short_cmd= *ptr == '\\')) // short command was used
ptr+= 2; ptr+= 2;
else else
while (*ptr &&!my_isspace(charset_info, *ptr)) // skip command while (*ptr &&!my_isspace(charset_info, *ptr)) // skip command
@ -4527,24 +4527,28 @@ char *get_arg(char *line, my_bool get_next_arg)
if (*ptr == '\'' || *ptr == '\"' || *ptr == '`') if (*ptr == '\'' || *ptr == '\"' || *ptr == '`')
{ {
qtype= *ptr; qtype= *ptr;
quoted= 1;
ptr++; ptr++;
} }
for (start=ptr ; *ptr; ptr++) for (start=ptr ; *ptr; ptr++)
{ {
if (*ptr == '\\' && ptr[1]) // escaped character if ((*ptr == '\\' && ptr[1]) || // escaped character
(!short_cmd && qtype && *ptr == qtype && ptr[1] == qtype)) // quote
{ {
// Remove the backslash // Remove (or skip) the backslash (or a second quote)
if (mode != CHECK)
strmov_overlapp(ptr, ptr+1); strmov_overlapp(ptr, ptr+1);
else
ptr++;
} }
else if ((!quoted && *ptr == ' ') || (quoted && *ptr == qtype)) else if (*ptr == (qtype ? qtype : ' '))
{ {
qtype= 0;
if (mode != CHECK)
*ptr= 0; *ptr= 0;
break; break;
} }
} }
valid_arg= ptr != start; return ptr != start && !qtype ? start : NullS;
return valid_arg ? start : NullS;
} }

View File

@ -575,9 +575,7 @@ static int dump_all_tablespaces();
static int dump_tablespaces_for_tables(char *db, char **table_names, int tables); static int dump_tablespaces_for_tables(char *db, char **table_names, int tables);
static int dump_tablespaces_for_databases(char** databases); static int dump_tablespaces_for_databases(char** databases);
static int dump_tablespaces(char* ts_where); static int dump_tablespaces(char* ts_where);
static void print_comment(FILE *sql_file, my_bool is_error, const char *format, static void print_comment(FILE *, my_bool, const char *, ...);
...);
/* /*
Print the supplied message if in verbose mode Print the supplied message if in verbose mode
@ -655,6 +653,30 @@ static void short_usage(FILE *f)
} }
/** returns a string fixed to be safely printed inside a -- comment
that is, any new line in it gets prefixed with --
*/
static const char *fix_for_comment(const char *ident)
{
static char buf[1024];
char c, *s= buf;
while ((c= *s++= *ident++))
{
if (s >= buf + sizeof(buf) - 10)
{
strmov(s, "...");
break;
}
if (c == '\n')
s= strmov(s, "-- ");
}
return buf;
}
static void write_header(FILE *sql_file, char *db_name) static void write_header(FILE *sql_file, char *db_name)
{ {
if (opt_xml) if (opt_xml)
@ -677,8 +699,8 @@ static void write_header(FILE *sql_file, char *db_name)
DUMP_VERSION, MYSQL_SERVER_VERSION, SYSTEM_TYPE, DUMP_VERSION, MYSQL_SERVER_VERSION, SYSTEM_TYPE,
MACHINE_TYPE); MACHINE_TYPE);
print_comment(sql_file, 0, "-- Host: %s Database: %s\n", print_comment(sql_file, 0, "-- Host: %s Database: %s\n",
current_host ? current_host : "localhost", fix_for_comment(current_host ? current_host : "localhost"),
db_name ? db_name : ""); fix_for_comment(db_name ? db_name : ""));
print_comment(sql_file, 0, print_comment(sql_file, 0,
"-- ------------------------------------------------------\n" "-- ------------------------------------------------------\n"
); );
@ -2224,7 +2246,8 @@ static uint dump_events_for_db(char *db)
/* nice comments */ /* nice comments */
print_comment(sql_file, 0, print_comment(sql_file, 0,
"\n--\n-- Dumping events for database '%s'\n--\n", db); "\n--\n-- Dumping events for database '%s'\n--\n",
fix_for_comment(db));
/* /*
not using "mysql_query_with_error_report" because we may have not not using "mysql_query_with_error_report" because we may have not
@ -2436,7 +2459,8 @@ static uint dump_routines_for_db(char *db)
/* nice comments */ /* nice comments */
print_comment(sql_file, 0, print_comment(sql_file, 0,
"\n--\n-- Dumping routines for database '%s'\n--\n", db); "\n--\n-- Dumping routines for database '%s'\n--\n",
fix_for_comment(db));
/* /*
not using "mysql_query_with_error_report" because we may have not not using "mysql_query_with_error_report" because we may have not
@ -2731,11 +2755,11 @@ static uint get_table_structure(char *table, char *db, char *table_type,
if (strcmp (table_type, "VIEW") == 0) /* view */ if (strcmp (table_type, "VIEW") == 0) /* view */
print_comment(sql_file, 0, print_comment(sql_file, 0,
"\n--\n-- Temporary table structure for view %s\n--\n\n", "\n--\n-- Temporary table structure for view %s\n--\n\n",
result_table); fix_for_comment(result_table));
else else
print_comment(sql_file, 0, print_comment(sql_file, 0,
"\n--\n-- Table structure for table %s\n--\n\n", "\n--\n-- Table structure for table %s\n--\n\n",
result_table); fix_for_comment(result_table));
if (opt_drop) if (opt_drop)
{ {
@ -2977,7 +3001,7 @@ static uint get_table_structure(char *table, char *db, char *table_type,
print_comment(sql_file, 0, print_comment(sql_file, 0,
"\n--\n-- Table structure for table %s\n--\n\n", "\n--\n-- Table structure for table %s\n--\n\n",
result_table); fix_for_comment(result_table));
if (opt_drop) if (opt_drop)
fprintf(sql_file, "DROP TABLE IF EXISTS %s;\n", result_table); fprintf(sql_file, "DROP TABLE IF EXISTS %s;\n", result_table);
if (!opt_xml) if (!opt_xml)
@ -3684,21 +3708,21 @@ static void dump_table(char *table, char *db)
{ {
print_comment(md_result_file, 0, print_comment(md_result_file, 0,
"\n--\n-- Dumping data for table %s\n--\n", "\n--\n-- Dumping data for table %s\n--\n",
result_table); fix_for_comment(result_table));
dynstr_append_checked(&query_string, "SELECT /*!40001 SQL_NO_CACHE */ * FROM "); dynstr_append_checked(&query_string, "SELECT /*!40001 SQL_NO_CACHE */ * FROM ");
dynstr_append_checked(&query_string, result_table); dynstr_append_checked(&query_string, result_table);
if (where) if (where)
{ {
print_comment(md_result_file, 0, "-- WHERE: %s\n", where); print_comment(md_result_file, 0, "-- WHERE: %s\n", fix_for_comment(where));
dynstr_append_checked(&query_string, " WHERE "); dynstr_append_checked(&query_string, " WHERE ");
dynstr_append_checked(&query_string, where); dynstr_append_checked(&query_string, where);
} }
if (order_by) if (order_by)
{ {
print_comment(md_result_file, 0, "-- ORDER BY: %s\n", order_by); print_comment(md_result_file, 0, "-- ORDER BY: %s\n", fix_for_comment(order_by));
dynstr_append_checked(&query_string, " ORDER BY "); dynstr_append_checked(&query_string, " ORDER BY ");
dynstr_append_checked(&query_string, order_by); dynstr_append_checked(&query_string, order_by);
@ -4208,7 +4232,7 @@ static int dump_tablespaces(char* ts_where)
if (first) if (first)
{ {
print_comment(md_result_file, 0, "\n--\n-- Logfile group: %s\n--\n", print_comment(md_result_file, 0, "\n--\n-- Logfile group: %s\n--\n",
row[0]); fix_for_comment(row[0]));
fprintf(md_result_file, "\nCREATE"); fprintf(md_result_file, "\nCREATE");
} }
@ -4277,7 +4301,8 @@ static int dump_tablespaces(char* ts_where)
first= 1; first= 1;
if (first) if (first)
{ {
print_comment(md_result_file, 0, "\n--\n-- Tablespace: %s\n--\n", row[0]); print_comment(md_result_file, 0, "\n--\n-- Tablespace: %s\n--\n",
fix_for_comment(row[0]));
fprintf(md_result_file, "\nCREATE"); fprintf(md_result_file, "\nCREATE");
} }
else else
@ -4481,7 +4506,8 @@ static int init_dumping(char *database, int init_func(char*))
char *qdatabase= quote_name(database,quoted_database_buf,opt_quoted); char *qdatabase= quote_name(database,quoted_database_buf,opt_quoted);
print_comment(md_result_file, 0, print_comment(md_result_file, 0,
"\n--\n-- Current Database: %s\n--\n", qdatabase); "\n--\n-- Current Database: %s\n--\n",
fix_for_comment(qdatabase));
/* Call the view or table specific function */ /* Call the view or table specific function */
init_func(qdatabase); init_func(qdatabase);
@ -5672,7 +5698,7 @@ static my_bool get_view_structure(char *table, char* db)
print_comment(sql_file, 0, print_comment(sql_file, 0,
"\n--\n-- Final view structure for view %s\n--\n\n", "\n--\n-- Final view structure for view %s\n--\n\n",
result_table); fix_for_comment(result_table));
/* Table might not exist if this view was dumped with --tab. */ /* Table might not exist if this view was dumped with --tab. */
fprintf(sql_file, "/*!50001 DROP TABLE IF EXISTS %s*/;\n", opt_quoted_table); fprintf(sql_file, "/*!50001 DROP TABLE IF EXISTS %s*/;\n", opt_quoted_table);

View File

@ -3373,10 +3373,6 @@ void do_exec(struct st_command *command)
#endif #endif
#endif #endif
/* exec command is interpreted externally and will not take newlines */
while(replace(&ds_cmd, "\n", 1, " ", 1) == 0)
;
DBUG_PRINT("info", ("Executing '%s' as '%s'", DBUG_PRINT("info", ("Executing '%s' as '%s'",
command->first_argument, ds_cmd.str)); command->first_argument, ds_cmd.str));

View File

@ -12,6 +12,24 @@ before calling SSL_new();
*** end Note *** *** end Note ***
yaSSL Release notes, version 2.4.2 (9/22/2016)
This release of yaSSL fixes a medium security vulnerability. A fix for
potential AES side channel leaks is included that a local user monitoring
the same CPU core cache could exploit. VM users, hyper-threading users,
and users where potential attackers have access to the CPU cache will need
to update if they utilize AES.
DSA padding fixes for unusual sizes is included as well. Users with DSA
certficiates should update.
yaSSL Release notes, version 2.4.0 (5/20/2016)
This release of yaSSL fixes the OpenSSL compatibility function
SSL_CTX_load_verify_locations() when using the path directory to allow
unlimited path sizes. Minor Windows build fixes are included.
No high level security fixes in this version but we always recommend
updating.
yaSSL Release notes, version 2.3.9b (2/03/2016) yaSSL Release notes, version 2.3.9b (2/03/2016)
This release of yaSSL fixes the OpenSSL compatibility function This release of yaSSL fixes the OpenSSL compatibility function
X509_NAME_get_index_by_NID() to use the actual index of the common name X509_NAME_get_index_by_NID() to use the actual index of the common name

View File

@ -1,22 +1,22 @@
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
MIIDqzCCA2ugAwIBAgIJAMGqrgDU6DyhMAkGByqGSM44BAMwgY4xCzAJBgNVBAYT MIIDrzCCA2+gAwIBAgIJAK1zRM7YFcNjMAkGByqGSM44BAMwgZAxCzAJBgNVBAYT
AlVTMQ8wDQYDVQQIDAZPcmVnb24xETAPBgNVBAcMCFBvcnRsYW5kMRAwDgYDVQQK AlVTMQ8wDQYDVQQIDAZPcmVnb24xETAPBgNVBAcMCFBvcnRsYW5kMRAwDgYDVQQK
DAd3b2xmU1NMMRAwDgYDVQQLDAd0ZXN0aW5nMRYwFAYDVQQDDA13d3cueWFzc2wu DAd3b2xmU1NMMRAwDgYDVQQLDAd0ZXN0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz
Y29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTEzMDQyMjIw bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMTYwOTIy
MDk0NFoXDTE2MDExNzIwMDk0NFowgY4xCzAJBgNVBAYTAlVTMQ8wDQYDVQQIDAZP MjEyMzA0WhcNMjIwMzE1MjEyMzA0WjCBkDELMAkGA1UEBhMCVVMxDzANBgNVBAgM
cmVnb24xETAPBgNVBAcMCFBvcnRsYW5kMRAwDgYDVQQKDAd3b2xmU1NMMRAwDgYD Bk9yZWdvbjERMA8GA1UEBwwIUG9ydGxhbmQxEDAOBgNVBAoMB3dvbGZTU0wxEDAO
VQQLDAd0ZXN0aW5nMRYwFAYDVQQDDA13d3cueWFzc2wuY29tMR8wHQYJKoZIhvcN BgNVBAsMB3Rlc3RpbmcxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqG
AQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBuDCCASwGByqGSM44BAEwggEfAoGBAL1R SIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCCAbgwggEsBgcqhkjOOAQBMIIBHwKB
7koy4IrH6sbh6nDEUUPPKgfhxxLCWCVexF2+qzANEr+hC9M002haJXFOfeS9DyoO gQC9Ue5KMuCKx+rG4epwxFFDzyoH4ccSwlglXsRdvqswDRK/oQvTNNNoWiVxTn3k
WFbL0qMZOuqv+22CaHnoUWl7q3PjJOAI3JH0P54ZyUPuU1909RzgTdIDp5+ikbr7 vQ8qDlhWy9KjGTrqr/ttgmh56FFpe6tz4yTgCNyR9D+eGclD7lNfdPUc4E3SA6ef
KYjnltL73FQVMbjTZQKthIpPn3MjYcF+4jp2W2zFAhUAkcntYND6MGf+eYzIJDN2 opG6+ymI55bS+9xUFTG402UCrYSKT59zI2HBfuI6dltsxQIVAJHJ7WDQ+jBn/nmM
L7SonHUCgYEAklpxErfqznIZjVvqqHFaq+mgAL5J8QrKVmdhYZh/Y8z4jCjoCA8o yCQzdi+0qJx1AoGBAJJacRK36s5yGY1b6qhxWqvpoAC+SfEKylZnYWGYf2PM+Iwo
TDoFKxf7s2ZzgaPKvglaEKiYqLqic9qY78DYJswzQMLFvjsF4sFZ+pYCBdWPQI4N 6AgPKEw6BSsX+7Nmc4Gjyr4JWhComKi6onPamO/A2CbMM0DCxb47BeLBWfqWAgXV
PgxCiznK6Ce+JH9ikSBvMvG+tevjr2UpawDIHX3+AWYaZBZwKADAaboDgYUAAoGB j0CODT4MQos5yugnviR/YpEgbzLxvrXr469lKWsAyB19/gFmGmQWcCgAwGm6A4GF
AJ3LY89yHyvQ/TsQ6zlYbovjbk/ogndsMqPdNUvL4RuPTgJP/caaDDa0XJ7ak6A7 AAKBgQCdy2PPch8r0P07EOs5WG6L425P6IJ3bDKj3TVLy+Ebj04CT/3Gmgw2tFye
TJ+QheLNwOXoZPYJC4EGFSDAXpYniGhbWIrVTCGe6lmZDfnx40WXS0kk3m/DHaC0 2pOgO0yfkIXizcDl6GT2CQuBBhUgwF6WJ4hoW1iK1UwhnupZmQ358eNFl0tJJN5v
3ElLAiybxVGxyqoUfbT3Zv1JwftWMuiqHH5uADhdXuXVo1AwTjAdBgNVHQ4EFgQU wx2gtNxJSwIsm8VRscqqFH2092b9ScH7VjLoqhx+bgA4XV7l1aNQME4wHQYDVR0O
IJjk416o4v8qpH9LBtXlR9v8gccwHwYDVR0jBBgwFoAUIJjk416o4v8qpH9LBtXl BBYEFCCY5ONeqOL/KqR/SwbV5Ufb/IHHMB8GA1UdIwQYMBaAFCCY5ONeqOL/KqR/
R9v8gccwDAYDVR0TBAUwAwEB/zAJBgcqhkjOOAQDAy8AMCwCFCjGKIdOSV12LcTu SwbV5Ufb/IHHMAwGA1UdEwQFMAMBAf8wCQYHKoZIzjgEAwMvADAsAhQRYSCVN/Ge
k08owGM6YkO1AhQe+K173VuaO/OsDNsxZlKpyH8+1g== agV3mffU3qNZ92fI0QIUPH7Jp+iASI7U1ocaYDc10qXGaGY=
-----END CERTIFICATE----- -----END CERTIFICATE-----

View File

@ -34,7 +34,7 @@
#include "rsa.h" #include "rsa.h"
#define YASSL_VERSION "2.3.9b" #define YASSL_VERSION "2.4.2"
#if defined(__cplusplus) #if defined(__cplusplus)

View File

@ -162,7 +162,7 @@ int read_file(SSL_CTX* ctx, const char* file, int format, CertType type)
TaoCrypt::DSA_PrivateKey dsaKey; TaoCrypt::DSA_PrivateKey dsaKey;
dsaKey.Initialize(dsaSource); dsaKey.Initialize(dsaSource);
if (rsaSource.GetError().What()) { if (dsaSource.GetError().What()) {
// neither worked // neither worked
ret = SSL_FAILURE; ret = SSL_FAILURE;
} }
@ -785,40 +785,67 @@ int SSL_CTX_load_verify_locations(SSL_CTX* ctx, const char* file,
WIN32_FIND_DATA FindFileData; WIN32_FIND_DATA FindFileData;
HANDLE hFind; HANDLE hFind;
char name[MAX_PATH + 1]; // directory specification const int DELIMITER_SZ = 2;
strncpy(name, path, MAX_PATH - 3); const int DELIMITER_STAR_SZ = 3;
strncat(name, "\\*", 3); int pathSz = (int)strlen(path);
int nameSz = pathSz + DELIMITER_STAR_SZ + 1; // plus 1 for terminator
char* name = NEW_YS char[nameSz]; // directory specification
memset(name, 0, nameSz);
strncpy(name, path, nameSz - DELIMITER_STAR_SZ - 1);
strncat(name, "\\*", DELIMITER_STAR_SZ);
hFind = FindFirstFile(name, &FindFileData); hFind = FindFirstFile(name, &FindFileData);
if (hFind == INVALID_HANDLE_VALUE) return SSL_BAD_PATH; if (hFind == INVALID_HANDLE_VALUE) {
ysArrayDelete(name);
return SSL_BAD_PATH;
}
do { do {
if (FindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY) { if (!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
strncpy(name, path, MAX_PATH - 2 - HALF_PATH); int curSz = (int)strlen(FindFileData.cFileName);
strncat(name, "\\", 2); if (pathSz + curSz + DELIMITER_SZ + 1 > nameSz) {
strncat(name, FindFileData.cFileName, HALF_PATH); ysArrayDelete(name);
// plus 1 for terminator
nameSz = pathSz + curSz + DELIMITER_SZ + 1;
name = NEW_YS char[nameSz];
}
memset(name, 0, nameSz);
strncpy(name, path, nameSz - curSz - DELIMITER_SZ - 1);
strncat(name, "\\", DELIMITER_SZ);
strncat(name, FindFileData.cFileName,
nameSz - pathSz - DELIMITER_SZ - 1);
ret = read_file(ctx, name, SSL_FILETYPE_PEM, CA); ret = read_file(ctx, name, SSL_FILETYPE_PEM, CA);
} }
} while (ret == SSL_SUCCESS && FindNextFile(hFind, &FindFileData)); } while (ret == SSL_SUCCESS && FindNextFile(hFind, &FindFileData));
ysArrayDelete(name);
FindClose(hFind); FindClose(hFind);
#else // _WIN32 #else // _WIN32
const int MAX_PATH = 260;
DIR* dir = opendir(path); DIR* dir = opendir(path);
if (!dir) return SSL_BAD_PATH; if (!dir) return SSL_BAD_PATH;
struct dirent* entry; struct dirent* entry;
struct stat buf; struct stat buf;
char name[MAX_PATH + 1]; const int DELIMITER_SZ = 1;
int pathSz = (int)strlen(path);
int nameSz = pathSz + DELIMITER_SZ + 1; //plus 1 for null terminator
char* name = NEW_YS char[nameSz]; // directory specification
while (ret == SSL_SUCCESS && (entry = readdir(dir))) { while (ret == SSL_SUCCESS && (entry = readdir(dir))) {
strncpy(name, path, MAX_PATH - 1 - HALF_PATH); int curSz = (int)strlen(entry->d_name);
strncat(name, "/", 1); if (pathSz + curSz + DELIMITER_SZ + 1 > nameSz) {
strncat(name, entry->d_name, HALF_PATH); ysArrayDelete(name);
nameSz = pathSz + DELIMITER_SZ + curSz + 1;
name = NEW_YS char[nameSz];
}
memset(name, 0, nameSz);
strncpy(name, path, nameSz - curSz - 1);
strncat(name, "/", DELIMITER_SZ);
strncat(name, entry->d_name, nameSz - pathSz - DELIMITER_SZ - 1);
if (stat(name, &buf) < 0) { if (stat(name, &buf) < 0) {
ysArrayDelete(name);
closedir(dir); closedir(dir);
return SSL_BAD_STAT; return SSL_BAD_STAT;
} }
@ -827,6 +854,7 @@ int SSL_CTX_load_verify_locations(SSL_CTX* ctx, const char* file,
ret = read_file(ctx, name, SSL_FILETYPE_PEM, CA); ret = read_file(ctx, name, SSL_FILETYPE_PEM, CA);
} }
ysArrayDelete(name);
closedir(dir); closedir(dir);
#endif #endif

View File

@ -60,6 +60,7 @@ private:
static const word32 Te[5][256]; static const word32 Te[5][256];
static const word32 Td[5][256]; static const word32 Td[5][256];
static const byte CTd4[256];
static const word32* Te0; static const word32* Te0;
static const word32* Te1; static const word32* Te1;
@ -80,11 +81,68 @@ private:
void ProcessAndXorBlock(const byte*, const byte*, byte*) const; void ProcessAndXorBlock(const byte*, const byte*, byte*) const;
word32 PreFetchTe() const;
word32 PreFetchTd() const;
word32 PreFetchCTd4() const;
AES(const AES&); // hide copy AES(const AES&); // hide copy
AES& operator=(const AES&); // and assign AES& operator=(const AES&); // and assign
}; };
#if defined(__x86_64__) || defined(_M_X64) || \
(defined(__ILP32__) && (__ILP32__ >= 1))
#define TC_CACHE_LINE_SZ 64
#else
/* default cache line size */
#define TC_CACHE_LINE_SZ 32
#endif
inline word32 AES::PreFetchTe() const
{
word32 x = 0;
/* 4 tables of 256 entries */
for (int i = 0; i < 4; i++) {
/* each entry is 4 bytes */
for (int j = 0; j < 256; j += TC_CACHE_LINE_SZ/4) {
x &= Te[i][j];
}
}
return x;
}
inline word32 AES::PreFetchTd() const
{
word32 x = 0;
/* 4 tables of 256 entries */
for (int i = 0; i < 4; i++) {
/* each entry is 4 bytes */
for (int j = 0; j < 256; j += TC_CACHE_LINE_SZ/4) {
x &= Td[i][j];
}
}
return x;
}
inline word32 AES::PreFetchCTd4() const
{
word32 x = 0;
int i;
for (i = 0; i < 256; i += TC_CACHE_LINE_SZ) {
x &= CTd4[i];
}
return x;
}
typedef BlockCipher<ENCRYPTION, AES, ECB> AES_ECB_Encryption; typedef BlockCipher<ENCRYPTION, AES, ECB> AES_ECB_Encryption;
typedef BlockCipher<DECRYPTION, AES, ECB> AES_ECB_Decryption; typedef BlockCipher<DECRYPTION, AES, ECB> AES_ECB_Decryption;

View File

@ -119,6 +119,9 @@ namespace TaoCrypt {
#ifdef _WIN32
#undef max // avoid name clash
#endif
// general MAX // general MAX
template<typename T> inline template<typename T> inline
const T& max(const T& a, const T& b) const T& max(const T& a, const T& b)

View File

@ -109,10 +109,10 @@ void AES::SetKey(const byte* userKey, word32 keylen, CipherDir /*dummy*/)
{ {
temp = rk[3]; temp = rk[3];
rk[4] = rk[0] ^ rk[4] = rk[0] ^
(Te4[GETBYTE(temp, 2)] & 0xff000000) ^ (Te2[GETBYTE(temp, 2)] & 0xff000000) ^
(Te4[GETBYTE(temp, 1)] & 0x00ff0000) ^ (Te3[GETBYTE(temp, 1)] & 0x00ff0000) ^
(Te4[GETBYTE(temp, 0)] & 0x0000ff00) ^ (Te0[GETBYTE(temp, 0)] & 0x0000ff00) ^
(Te4[GETBYTE(temp, 3)] & 0x000000ff) ^ (Te1[GETBYTE(temp, 3)] & 0x000000ff) ^
rcon_[i]; rcon_[i];
rk[5] = rk[1] ^ rk[4]; rk[5] = rk[1] ^ rk[4];
rk[6] = rk[2] ^ rk[5]; rk[6] = rk[2] ^ rk[5];
@ -128,10 +128,10 @@ void AES::SetKey(const byte* userKey, word32 keylen, CipherDir /*dummy*/)
{ {
temp = rk[ 5]; temp = rk[ 5];
rk[ 6] = rk[ 0] ^ rk[ 6] = rk[ 0] ^
(Te4[GETBYTE(temp, 2)] & 0xff000000) ^ (Te2[GETBYTE(temp, 2)] & 0xff000000) ^
(Te4[GETBYTE(temp, 1)] & 0x00ff0000) ^ (Te3[GETBYTE(temp, 1)] & 0x00ff0000) ^
(Te4[GETBYTE(temp, 0)] & 0x0000ff00) ^ (Te0[GETBYTE(temp, 0)] & 0x0000ff00) ^
(Te4[GETBYTE(temp, 3)] & 0x000000ff) ^ (Te1[GETBYTE(temp, 3)] & 0x000000ff) ^
rcon_[i]; rcon_[i];
rk[ 7] = rk[ 1] ^ rk[ 6]; rk[ 7] = rk[ 1] ^ rk[ 6];
rk[ 8] = rk[ 2] ^ rk[ 7]; rk[ 8] = rk[ 2] ^ rk[ 7];
@ -149,10 +149,10 @@ void AES::SetKey(const byte* userKey, word32 keylen, CipherDir /*dummy*/)
{ {
temp = rk[ 7]; temp = rk[ 7];
rk[ 8] = rk[ 0] ^ rk[ 8] = rk[ 0] ^
(Te4[GETBYTE(temp, 2)] & 0xff000000) ^ (Te2[GETBYTE(temp, 2)] & 0xff000000) ^
(Te4[GETBYTE(temp, 1)] & 0x00ff0000) ^ (Te3[GETBYTE(temp, 1)] & 0x00ff0000) ^
(Te4[GETBYTE(temp, 0)] & 0x0000ff00) ^ (Te0[GETBYTE(temp, 0)] & 0x0000ff00) ^
(Te4[GETBYTE(temp, 3)] & 0x000000ff) ^ (Te1[GETBYTE(temp, 3)] & 0x000000ff) ^
rcon_[i]; rcon_[i];
rk[ 9] = rk[ 1] ^ rk[ 8]; rk[ 9] = rk[ 1] ^ rk[ 8];
rk[10] = rk[ 2] ^ rk[ 9]; rk[10] = rk[ 2] ^ rk[ 9];
@ -161,10 +161,10 @@ void AES::SetKey(const byte* userKey, word32 keylen, CipherDir /*dummy*/)
break; break;
temp = rk[11]; temp = rk[11];
rk[12] = rk[ 4] ^ rk[12] = rk[ 4] ^
(Te4[GETBYTE(temp, 3)] & 0xff000000) ^ (Te2[GETBYTE(temp, 3)] & 0xff000000) ^
(Te4[GETBYTE(temp, 2)] & 0x00ff0000) ^ (Te3[GETBYTE(temp, 2)] & 0x00ff0000) ^
(Te4[GETBYTE(temp, 1)] & 0x0000ff00) ^ (Te0[GETBYTE(temp, 1)] & 0x0000ff00) ^
(Te4[GETBYTE(temp, 0)] & 0x000000ff); (Te1[GETBYTE(temp, 0)] & 0x000000ff);
rk[13] = rk[ 5] ^ rk[12]; rk[13] = rk[ 5] ^ rk[12];
rk[14] = rk[ 6] ^ rk[13]; rk[14] = rk[ 6] ^ rk[13];
rk[15] = rk[ 7] ^ rk[14]; rk[15] = rk[ 7] ^ rk[14];
@ -191,25 +191,25 @@ void AES::SetKey(const byte* userKey, word32 keylen, CipherDir /*dummy*/)
for (i = 1; i < rounds_; i++) { for (i = 1; i < rounds_; i++) {
rk += 4; rk += 4;
rk[0] = rk[0] =
Td0[Te4[GETBYTE(rk[0], 3)] & 0xff] ^ Td0[Te1[GETBYTE(rk[0], 3)] & 0xff] ^
Td1[Te4[GETBYTE(rk[0], 2)] & 0xff] ^ Td1[Te1[GETBYTE(rk[0], 2)] & 0xff] ^
Td2[Te4[GETBYTE(rk[0], 1)] & 0xff] ^ Td2[Te1[GETBYTE(rk[0], 1)] & 0xff] ^
Td3[Te4[GETBYTE(rk[0], 0)] & 0xff]; Td3[Te1[GETBYTE(rk[0], 0)] & 0xff];
rk[1] = rk[1] =
Td0[Te4[GETBYTE(rk[1], 3)] & 0xff] ^ Td0[Te1[GETBYTE(rk[1], 3)] & 0xff] ^
Td1[Te4[GETBYTE(rk[1], 2)] & 0xff] ^ Td1[Te1[GETBYTE(rk[1], 2)] & 0xff] ^
Td2[Te4[GETBYTE(rk[1], 1)] & 0xff] ^ Td2[Te1[GETBYTE(rk[1], 1)] & 0xff] ^
Td3[Te4[GETBYTE(rk[1], 0)] & 0xff]; Td3[Te1[GETBYTE(rk[1], 0)] & 0xff];
rk[2] = rk[2] =
Td0[Te4[GETBYTE(rk[2], 3)] & 0xff] ^ Td0[Te1[GETBYTE(rk[2], 3)] & 0xff] ^
Td1[Te4[GETBYTE(rk[2], 2)] & 0xff] ^ Td1[Te1[GETBYTE(rk[2], 2)] & 0xff] ^
Td2[Te4[GETBYTE(rk[2], 1)] & 0xff] ^ Td2[Te1[GETBYTE(rk[2], 1)] & 0xff] ^
Td3[Te4[GETBYTE(rk[2], 0)] & 0xff]; Td3[Te1[GETBYTE(rk[2], 0)] & 0xff];
rk[3] = rk[3] =
Td0[Te4[GETBYTE(rk[3], 3)] & 0xff] ^ Td0[Te1[GETBYTE(rk[3], 3)] & 0xff] ^
Td1[Te4[GETBYTE(rk[3], 2)] & 0xff] ^ Td1[Te1[GETBYTE(rk[3], 2)] & 0xff] ^
Td2[Te4[GETBYTE(rk[3], 1)] & 0xff] ^ Td2[Te1[GETBYTE(rk[3], 1)] & 0xff] ^
Td3[Te4[GETBYTE(rk[3], 0)] & 0xff]; Td3[Te1[GETBYTE(rk[3], 0)] & 0xff];
} }
} }
} }
@ -244,6 +244,7 @@ void AES::encrypt(const byte* inBlock, const byte* xorBlock,
s2 ^= rk[2]; s2 ^= rk[2];
s3 ^= rk[3]; s3 ^= rk[3];
s0 |= PreFetchTe();
/* /*
* Nr - 1 full rounds: * Nr - 1 full rounds:
*/ */
@ -312,28 +313,28 @@ void AES::encrypt(const byte* inBlock, const byte* xorBlock,
*/ */
s0 = s0 =
(Te4[GETBYTE(t0, 3)] & 0xff000000) ^ (Te2[GETBYTE(t0, 3)] & 0xff000000) ^
(Te4[GETBYTE(t1, 2)] & 0x00ff0000) ^ (Te3[GETBYTE(t1, 2)] & 0x00ff0000) ^
(Te4[GETBYTE(t2, 1)] & 0x0000ff00) ^ (Te0[GETBYTE(t2, 1)] & 0x0000ff00) ^
(Te4[GETBYTE(t3, 0)] & 0x000000ff) ^ (Te1[GETBYTE(t3, 0)] & 0x000000ff) ^
rk[0]; rk[0];
s1 = s1 =
(Te4[GETBYTE(t1, 3)] & 0xff000000) ^ (Te2[GETBYTE(t1, 3)] & 0xff000000) ^
(Te4[GETBYTE(t2, 2)] & 0x00ff0000) ^ (Te3[GETBYTE(t2, 2)] & 0x00ff0000) ^
(Te4[GETBYTE(t3, 1)] & 0x0000ff00) ^ (Te0[GETBYTE(t3, 1)] & 0x0000ff00) ^
(Te4[GETBYTE(t0, 0)] & 0x000000ff) ^ (Te1[GETBYTE(t0, 0)] & 0x000000ff) ^
rk[1]; rk[1];
s2 = s2 =
(Te4[GETBYTE(t2, 3)] & 0xff000000) ^ (Te2[GETBYTE(t2, 3)] & 0xff000000) ^
(Te4[GETBYTE(t3, 2)] & 0x00ff0000) ^ (Te3[GETBYTE(t3, 2)] & 0x00ff0000) ^
(Te4[GETBYTE(t0, 1)] & 0x0000ff00) ^ (Te0[GETBYTE(t0, 1)] & 0x0000ff00) ^
(Te4[GETBYTE(t1, 0)] & 0x000000ff) ^ (Te1[GETBYTE(t1, 0)] & 0x000000ff) ^
rk[2]; rk[2];
s3 = s3 =
(Te4[GETBYTE(t3, 3)] & 0xff000000) ^ (Te2[GETBYTE(t3, 3)] & 0xff000000) ^
(Te4[GETBYTE(t0, 2)] & 0x00ff0000) ^ (Te3[GETBYTE(t0, 2)] & 0x00ff0000) ^
(Te4[GETBYTE(t1, 1)] & 0x0000ff00) ^ (Te0[GETBYTE(t1, 1)] & 0x0000ff00) ^
(Te4[GETBYTE(t2, 0)] & 0x000000ff) ^ (Te1[GETBYTE(t2, 0)] & 0x000000ff) ^
rk[3]; rk[3];
@ -358,6 +359,8 @@ void AES::decrypt(const byte* inBlock, const byte* xorBlock,
s2 ^= rk[2]; s2 ^= rk[2];
s3 ^= rk[3]; s3 ^= rk[3];
s0 |= PreFetchTd();
/* /*
* Nr - 1 full rounds: * Nr - 1 full rounds:
*/ */
@ -423,29 +426,32 @@ void AES::decrypt(const byte* inBlock, const byte* xorBlock,
* apply last round and * apply last round and
* map cipher state to byte array block: * map cipher state to byte array block:
*/ */
t0 |= PreFetchCTd4();
s0 = s0 =
(Td4[GETBYTE(t0, 3)] & 0xff000000) ^ ((word32)CTd4[GETBYTE(t0, 3)] << 24) ^
(Td4[GETBYTE(t3, 2)] & 0x00ff0000) ^ ((word32)CTd4[GETBYTE(t3, 2)] << 16) ^
(Td4[GETBYTE(t2, 1)] & 0x0000ff00) ^ ((word32)CTd4[GETBYTE(t2, 1)] << 8) ^
(Td4[GETBYTE(t1, 0)] & 0x000000ff) ^ ((word32)CTd4[GETBYTE(t1, 0)]) ^
rk[0]; rk[0];
s1 = s1 =
(Td4[GETBYTE(t1, 3)] & 0xff000000) ^ ((word32)CTd4[GETBYTE(t1, 3)] << 24) ^
(Td4[GETBYTE(t0, 2)] & 0x00ff0000) ^ ((word32)CTd4[GETBYTE(t0, 2)] << 16) ^
(Td4[GETBYTE(t3, 1)] & 0x0000ff00) ^ ((word32)CTd4[GETBYTE(t3, 1)] << 8) ^
(Td4[GETBYTE(t2, 0)] & 0x000000ff) ^ ((word32)CTd4[GETBYTE(t2, 0)]) ^
rk[1]; rk[1];
s2 = s2 =
(Td4[GETBYTE(t2, 3)] & 0xff000000) ^ ((word32)CTd4[GETBYTE(t2, 3)] << 24 ) ^
(Td4[GETBYTE(t1, 2)] & 0x00ff0000) ^ ((word32)CTd4[GETBYTE(t1, 2)] << 16 ) ^
(Td4[GETBYTE(t0, 1)] & 0x0000ff00) ^ ((word32)CTd4[GETBYTE(t0, 1)] << 8 ) ^
(Td4[GETBYTE(t3, 0)] & 0x000000ff) ^ ((word32)CTd4[GETBYTE(t3, 0)]) ^
rk[2]; rk[2];
s3 = s3 =
(Td4[GETBYTE(t3, 3)] & 0xff000000) ^ ((word32)CTd4[GETBYTE(t3, 3)] << 24) ^
(Td4[GETBYTE(t2, 2)] & 0x00ff0000) ^ ((word32)CTd4[GETBYTE(t2, 2)] << 16) ^
(Td4[GETBYTE(t1, 1)] & 0x0000ff00) ^ ((word32)CTd4[GETBYTE(t1, 1)] << 8) ^
(Td4[GETBYTE(t0, 0)] & 0x000000ff) ^ ((word32)CTd4[GETBYTE(t0, 0)]) ^
rk[3]; rk[3];
gpBlock::Put(xorBlock, outBlock)(s0)(s1)(s2)(s3); gpBlock::Put(xorBlock, outBlock)(s0)(s1)(s2)(s3);
@ -1826,18 +1832,52 @@ const word32 AES::Td[5][256] = {
} }
}; };
const byte AES::CTd4[256] =
{
0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U,
0xbfU, 0x40U, 0xa3U, 0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU,
0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU, 0xffU, 0x87U,
0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU,
0x54U, 0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU,
0xeeU, 0x4cU, 0x95U, 0x0bU, 0x42U, 0xfaU, 0xc3U, 0x4eU,
0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U, 0xb2U,
0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U,
0x72U, 0xf8U, 0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U,
0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU, 0x65U, 0xb6U, 0x92U,
0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU,
0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U,
0x90U, 0xd8U, 0xabU, 0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU,
0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U, 0x45U, 0x06U,
0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U,
0xc1U, 0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU,
0x3aU, 0x91U, 0x11U, 0x41U, 0x4fU, 0x67U, 0xdcU, 0xeaU,
0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U, 0x73U,
0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U,
0xe2U, 0xf9U, 0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU,
0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU, 0x29U, 0xc5U, 0x89U,
0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU,
0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U,
0x9aU, 0xdbU, 0xc0U, 0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U,
0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U, 0xc7U, 0x31U,
0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU,
0x60U, 0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU,
0x2dU, 0xe5U, 0x7aU, 0x9fU, 0x93U, 0xc9U, 0x9cU, 0xefU,
0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U, 0xb0U,
0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U,
0x17U, 0x2bU, 0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U,
0xe1U, 0x69U, 0x14U, 0x63U, 0x55U, 0x21U, 0x0cU, 0x7dU,
};
const word32* AES::Te0 = AES::Te[0]; const word32* AES::Te0 = AES::Te[0];
const word32* AES::Te1 = AES::Te[1]; const word32* AES::Te1 = AES::Te[1];
const word32* AES::Te2 = AES::Te[2]; const word32* AES::Te2 = AES::Te[2];
const word32* AES::Te3 = AES::Te[3]; const word32* AES::Te3 = AES::Te[3];
const word32* AES::Te4 = AES::Te[4];
const word32* AES::Td0 = AES::Td[0]; const word32* AES::Td0 = AES::Td[0];
const word32* AES::Td1 = AES::Td[1]; const word32* AES::Td1 = AES::Td[1];
const word32* AES::Td2 = AES::Td[2]; const word32* AES::Td2 = AES::Td[2];
const word32* AES::Td3 = AES::Td[3]; const word32* AES::Td3 = AES::Td[3];
const word32* AES::Td4 = AES::Td[4];

View File

@ -1219,17 +1219,17 @@ word32 DecodeDSA_Signature(byte* decoded, const byte* encoded, word32 sz)
} }
word32 rLen = GetLength(source); word32 rLen = GetLength(source);
if (rLen != 20) { if (rLen != 20) {
if (rLen == 21) { // zero at front, eat while (rLen > 20 && source.remaining() > 0) { // zero's at front, eat
source.next(); source.next();
--rLen; --rLen;
} }
else if (rLen == 19) { // add zero to front so 20 bytes if (rLen < 20) { // add zero's to front so 20 bytes
word32 tmpLen = rLen;
while (tmpLen < 20) {
decoded[0] = 0; decoded[0] = 0;
decoded++; decoded++;
tmpLen++;
} }
else {
source.SetError(DSA_SZ_E);
return 0;
} }
} }
memcpy(decoded, source.get_buffer() + source.get_index(), rLen); memcpy(decoded, source.get_buffer() + source.get_index(), rLen);
@ -1242,17 +1242,17 @@ word32 DecodeDSA_Signature(byte* decoded, const byte* encoded, word32 sz)
} }
word32 sLen = GetLength(source); word32 sLen = GetLength(source);
if (sLen != 20) { if (sLen != 20) {
if (sLen == 21) { while (sLen > 20 && source.remaining() > 0) {
source.next(); // zero at front, eat source.next(); // zero's at front, eat
--sLen; --sLen;
} }
else if (sLen == 19) { if (sLen < 20) { // add zero's to front so 20 bytes
decoded[rLen] = 0; // add zero to front so 20 bytes word32 tmpLen = sLen;
while (tmpLen < 20) {
decoded[rLen] = 0;
decoded++; decoded++;
tmpLen++;
} }
else {
source.SetError(DSA_SZ_E);
return 0;
} }
} }
memcpy(decoded + rLen, source.get_buffer() + source.get_index(), sLen); memcpy(decoded + rLen, source.get_buffer() + source.get_index(), sLen);

View File

@ -172,6 +172,7 @@ word32 DSA_Signer::Sign(const byte* sha_digest, byte* sig,
const Integer& q = key_.GetSubGroupOrder(); const Integer& q = key_.GetSubGroupOrder();
const Integer& g = key_.GetSubGroupGenerator(); const Integer& g = key_.GetSubGroupGenerator();
const Integer& x = key_.GetPrivatePart(); const Integer& x = key_.GetPrivatePart();
byte* tmpPtr = sig; // initial signature output
Integer k(rng, 1, q - 1); Integer k(rng, 1, q - 1);
@ -187,22 +188,23 @@ word32 DSA_Signer::Sign(const byte* sha_digest, byte* sig,
return (word32) -1; return (word32) -1;
int rSz = r_.ByteCount(); int rSz = r_.ByteCount();
int tmpSz = rSz;
if (rSz == 19) { while (tmpSz++ < SHA::DIGEST_SIZE) {
sig[0] = 0; *sig++ = 0;
sig++;
} }
r_.Encode(sig, rSz); r_.Encode(sig, rSz);
sig = tmpPtr + SHA::DIGEST_SIZE; // advance sig output to s
int sSz = s_.ByteCount(); int sSz = s_.ByteCount();
tmpSz = sSz;
if (sSz == 19) { while (tmpSz++ < SHA::DIGEST_SIZE) {
sig[rSz] = 0; *sig++ = 0;
sig++;
} }
s_.Encode(sig + rSz, sSz); s_.Encode(sig, sSz);
return 40; return 40;
} }

View File

@ -1281,6 +1281,9 @@ int dsa_test()
if (!verifier.Verify(digest, decoded)) if (!verifier.Verify(digest, decoded))
return -90; return -90;
if (!verifier.Verify(digest, signature))
return -91;
return 0; return 0;
} }

View File

@ -22,7 +22,6 @@
#define yaSSL_TEST_HPP #define yaSSL_TEST_HPP
#include "runtime.hpp" #include "runtime.hpp"
#include "openssl/ssl.h" /* openssl compatibility test */
#include "error.hpp" #include "error.hpp"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -56,6 +55,7 @@
#endif #endif
#define SOCKET_T int #define SOCKET_T int
#endif /* _WIN32 */ #endif /* _WIN32 */
#include "openssl/ssl.h" /* openssl compatibility test */
#ifdef _MSC_VER #ifdef _MSC_VER

View File

@ -1004,19 +1004,19 @@ show grants;
Grants for user3@localhost Grants for user3@localhost
GRANT USAGE ON *.* TO 'user3'@'localhost' GRANT USAGE ON *.* TO 'user3'@'localhost'
GRANT SELECT ON `mysqltest`.* TO 'user3'@'localhost' GRANT SELECT ON `mysqltest`.* TO 'user3'@'localhost'
select * from information_schema.column_privileges where grantee like '%user%' select * from information_schema.column_privileges where grantee like '\'user%'
order by grantee; order by grantee;
GRANTEE TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME PRIVILEGE_TYPE IS_GRANTABLE GRANTEE TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME PRIVILEGE_TYPE IS_GRANTABLE
'user1'@'localhost' def mysqltest t1 f1 SELECT NO 'user1'@'localhost' def mysqltest t1 f1 SELECT NO
select * from information_schema.table_privileges where grantee like '%user%' select * from information_schema.table_privileges where grantee like '\'user%'
order by grantee; order by grantee;
GRANTEE TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PRIVILEGE_TYPE IS_GRANTABLE GRANTEE TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PRIVILEGE_TYPE IS_GRANTABLE
'user2'@'localhost' def mysqltest t2 SELECT NO 'user2'@'localhost' def mysqltest t2 SELECT NO
select * from information_schema.schema_privileges where grantee like '%user%' select * from information_schema.schema_privileges where grantee like '\'user%'
order by grantee; order by grantee;
GRANTEE TABLE_CATALOG TABLE_SCHEMA PRIVILEGE_TYPE IS_GRANTABLE GRANTEE TABLE_CATALOG TABLE_SCHEMA PRIVILEGE_TYPE IS_GRANTABLE
'user3'@'localhost' def mysqltest SELECT NO 'user3'@'localhost' def mysqltest SELECT NO
select * from information_schema.user_privileges where grantee like '%user%' select * from information_schema.user_privileges where grantee like '\'user%'
order by grantee; order by grantee;
GRANTEE TABLE_CATALOG PRIVILEGE_TYPE IS_GRANTABLE GRANTEE TABLE_CATALOG PRIVILEGE_TYPE IS_GRANTABLE
'user1'@'localhost' def USAGE NO 'user1'@'localhost' def USAGE NO

View File

@ -512,6 +512,14 @@ DROP DATABASE connected_db;
create database `aa``bb````cc`; create database `aa``bb````cc`;
DATABASE() DATABASE()
aa`bb``cc aa`bb``cc
DATABASE()
test
DATABASE()
aa`bb``cc
DATABASE()
test
DATABASE()
aa`bb``cc
drop database `aa``bb````cc`; drop database `aa``bb````cc`;
a a
>>\ndelimiter\n<< >>\ndelimiter\n<<

View File

@ -3,3 +3,9 @@ a
1 1
End of tests End of tests
1
1
2
2
X
3

View File

@ -0,0 +1,126 @@
create database `mysqltest1
1tsetlqsym`;
use `mysqltest1
1tsetlqsym`;
create table `t1
1t` (`foobar
raboof` int);
create view `v1
1v` as select * from `t1
1t`;
create procedure sp() select * from `v1
1v`;
flush tables;
use test;
--
-- Current Database: `mysqltest1
-- 1tsetlqsym`
--
/*!40000 DROP DATABASE IF EXISTS `mysqltest1
1tsetlqsym`*/;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest1
1tsetlqsym` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `mysqltest1
1tsetlqsym`;
--
-- Table structure for table `t1
-- 1t`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1
1t` (
`foobar
raboof` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `t1
-- 1t`
--
--
-- Temporary table structure for view `v1
-- 1v`
--
SET @saved_cs_client = @@character_set_client;
SET character_set_client = utf8;
/*!50001 CREATE TABLE `v1
1v` (
`foobar
raboof` tinyint NOT NULL
) ENGINE=MyISAM */;
SET character_set_client = @saved_cs_client;
--
-- Dumping routines for database 'mysqltest1
-- 1tsetlqsym'
--
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = latin1 */ ;
/*!50003 SET character_set_results = latin1 */ ;
/*!50003 SET collation_connection = latin1_swedish_ci */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = '' */ ;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp`()
select * from `v1
1v` ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
--
-- Current Database: `mysqltest1
-- 1tsetlqsym`
--
USE `mysqltest1
1tsetlqsym`;
--
-- Final view structure for view `v1
-- 1v`
--
/*!50001 DROP TABLE IF EXISTS `v1
1v`*/;
/*!50001 SET @saved_cs_client = @@character_set_client */;
/*!50001 SET @saved_cs_results = @@character_set_results */;
/*!50001 SET @saved_col_connection = @@collation_connection */;
/*!50001 SET character_set_client = latin1 */;
/*!50001 SET character_set_results = latin1 */;
/*!50001 SET collation_connection = latin1_swedish_ci */;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `v1
1v` AS select `t1
1t`.`foobar
raboof` AS `foobar
raboof` from `t1
1t` */;
/*!50001 SET character_set_client = @saved_cs_client */;
/*!50001 SET character_set_results = @saved_cs_results */;
/*!50001 SET collation_connection = @saved_col_connection */;
show tables from `mysqltest1
1tsetlqsym`;
Tables_in_mysqltest1
1tsetlqsym
t1
1t
v1
1v
drop database `mysqltest1
1tsetlqsym`;

View File

@ -269,12 +269,6 @@ source database
echo message echo message echo message echo message
mysqltest: At line 1: Missing argument in exec mysqltest: At line 1: Missing argument in exec
1
1
2
2
X
3
MySQL MySQL
"MySQL" "MySQL"
MySQL: The MySQL: The

View File

@ -612,13 +612,13 @@ select * from information_schema.schema_privileges order by grantee;
select * from information_schema.user_privileges order by grantee; select * from information_schema.user_privileges order by grantee;
show grants; show grants;
connection con4; connection con4;
select * from information_schema.column_privileges where grantee like '%user%' select * from information_schema.column_privileges where grantee like '\'user%'
order by grantee; order by grantee;
select * from information_schema.table_privileges where grantee like '%user%' select * from information_schema.table_privileges where grantee like '\'user%'
order by grantee; order by grantee;
select * from information_schema.schema_privileges where grantee like '%user%' select * from information_schema.schema_privileges where grantee like '\'user%'
order by grantee; order by grantee;
select * from information_schema.user_privileges where grantee like '%user%' select * from information_schema.user_privileges where grantee like '\'user%'
order by grantee; order by grantee;
show grants; show grants;
connection default; connection default;

View File

@ -586,8 +586,16 @@ DROP DATABASE connected_db;
# USE and names with backticks # USE and names with backticks
# #
--write_file $MYSQLTEST_VARDIR/tmp/backticks.sql --write_file $MYSQLTEST_VARDIR/tmp/backticks.sql
\u aa`bb``cc
SELECT DATABASE();
USE test
SELECT DATABASE();
USE aa`bb``cc USE aa`bb``cc
SELECT DATABASE(); SELECT DATABASE();
USE test
SELECT DATABASE();
USE `aa``bb````cc`
SELECT DATABASE();
EOF EOF
create database `aa``bb````cc`; create database `aa``bb````cc`;
--exec $MYSQL < $MYSQLTEST_VARDIR/tmp/backticks.sql --exec $MYSQL < $MYSQLTEST_VARDIR/tmp/backticks.sql

View File

@ -13,3 +13,12 @@
--echo --echo
--echo End of tests --echo End of tests
# Multi-line exec
exec $MYSQL \
test -e "select 1";
exec $MYSQL test -e "select
2";
let $query = select 3
as X;
exec $MYSQL test -e "$query";

View File

@ -0,0 +1,38 @@
#
# New lines in identifiers
#
# embedded server doesn't support external clients
--source include/not_embedded.inc
# cmd.exe doesn't like new lines on the command line
--source include/not_windows.inc
create database `mysqltest1
1tsetlqsym`;
use `mysqltest1
1tsetlqsym`;
create table `t1
1t` (`foobar
raboof` int);
create view `v1
1v` as select * from `t1
1t`;
create procedure sp() select * from `v1
1v`;
flush tables;
use test;
exec $MYSQL_DUMP --compact --comment --routines --add-drop-database --databases 'mysqltest1
1tsetlqsym';
exec $MYSQL_DUMP --compact --comment --routines --add-drop-database --databases 'mysqltest1
1tsetlqsym' | $MYSQL;
show tables from `mysqltest1
1tsetlqsym`;
drop database `mysqltest1
1tsetlqsym`;

View File

@ -741,15 +741,6 @@ echo ;
--error 1 --error 1
--exec echo "--exec " | $MYSQL_TEST 2>&1 --exec echo "--exec " | $MYSQL_TEST 2>&1
# Multi-line exec
exec $MYSQL
test -e "select 1";
exec $MYSQL test -e "select
2";
let $query = select 3
as X;
exec $MYSQL test -e "$query";
# ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------
# Test let command # Test let command
# ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------

View File

@ -792,7 +792,7 @@ int
innobase_get_parent_fk_list( innobase_get_parent_fk_list(
THD* thd, THD* thd,
const char* path, const char* path,
List<FOREIGN_KEY_INFO>* f_key_list); List<FOREIGN_KEY_INFO>* f_key_list) __attribute__((unused));
/******************************************************************//** /******************************************************************//**
Maps a MySQL trx isolation level code to the InnoDB isolation level code Maps a MySQL trx isolation level code to the InnoDB isolation level code