Проблема с handshake в версии 5.0.3

В версии 5.0.3 сильно переделан метод выполнения handshake при подключении, ошибка при заполнении m_sAuthData.

Раньше было так

	const char sHandshake4[] =	"\x15" // length of auth-plugin-data - 21 bytes
		"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // unuzed 10 bytes
		"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x00" // auth-plugin-data-part-2 (12 bytes + zero) (for auth, 4.1+)
		"mysql_native_password"; // auth plugin name. try to remove last z byte here...
...
tOut.SendBytes ( sHandshake4, sizeof ( sHandshake4 ) ); // incl. z-terminator

В новой версии стало

		tOut.SendBytes ( dFiller, sizeof ( dFiller ) );
		tOut.SendBytes ( m_sAuthData + 8, AUTH_DATA_LEN - 8 );
		tOut.SendBytes ( m_sAuthPluginName );

Проблема в том, что m_sAuthData не заканчивается теперь на 0x0, что приводит к проблеме подключения, например через .net connector пишется

Authentication method '' not supported by any of the available plugins

Скрин
HandShake

Можете поправить? Спасибо.

В старой версии просто даже комментарий :
"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x00" // auth-plugin-data-part-2 (12 bytes + zero) (for auth, 4.1+)

12 byte + zero

лучше было бы если бы вы создали текет на github - где бы выложили кейс, который можно было бы запустить на локальной машине и воспроизвести описываемое вами поведение, тк чинит что-то по словесному описанию, очень странно

Я могу и pull request сделать, но т.к. родной для меня всё-таки не C, а С#, боюсь что-нибудь наковырять не то.
Проблема локализуется в конструкторе HandshakeV10_c.

Строки :

		// fill scramble auth data (random)
		int i = 0;
		DWORD uRand = sphRand();
		for ( ; i < AUTH_DATA_LEN - sizeof ( DWORD ); i += sizeof ( DWORD ) )
		{
			memcpy ( m_sAuthData + i, &uRand, sizeof ( DWORD ) );
			uRand = sphRand();
		}
		if ( i < AUTH_DATA_LEN )
			memcpy ( m_sAuthData + i, &uRand, AUTH_DATA_LEN - i );

AUTH_DATA_LEN = 21, поэтому первые 5 dword (20 байт) в m_sAuthData заполняются случайными числами в цикле. Последний 1 байт заполняется по выходу из цикла в последней приведенной тут строке. В итоге содержимое m_sAuthData, которое должно заканчиваться на 0x0, заканчивается на случайное значение.

А это приводит к тому, что в момент отправки handshake когда отправляются последние 13 байт m_sAuthData, которые в конце должны содержать 0x0 вот тут :
tOut.SendBytes ( m_sAuthData + 8, AUTH_DATA_LEN - 8 );

отправляется не совсем то, что нужно. В итоге драйвера mysql при подключении, не считывают authentication method и это приводит к появлению сообщения
Authentication method '' not supported by any of the available plugins

Вариантом решения может быть добавление в конце :

// fill scramble auth data (random)
		int i = 0;
		DWORD uRand = sphRand();
		for ( ; i < AUTH_DATA_LEN - sizeof ( DWORD ); i += sizeof ( DWORD ) )
		{
			memcpy ( m_sAuthData + i, &uRand, sizeof ( DWORD ) );
			uRand = sphRand();
		}
		if ( i < AUTH_DATA_LEN )
			memcpy ( m_sAuthData + i, &uRand, AUTH_DATA_LEN - i );
                memset( m_sAuthData + AUTH_DATA_LEN - 1, 0, 1);

Хотя, немного подумав, решение с memset в конце не подходит, потенциально sphRand может вернуть DWORD с 0x0 в любом из 4 байт, что опять таки приведет к формированию неправильной последовательности, должно быть 12 ненулевых байт + 1 нулевой в конце.

Добавил еще OR 0x01010101 для чисел получаемых из sphRand, сделал новый pull request.

Здесь