Blame winpr/libwinpr/sspi/test/TestSchannel.c

Packit 1fb8d4
Packit 1fb8d4
#include <winpr/crt.h>
Packit 1fb8d4
#include <winpr/sspi.h>
Packit 1fb8d4
#include <winpr/file.h>
Packit 1fb8d4
#include <winpr/pipe.h>
Packit 1fb8d4
#include <winpr/path.h>
Packit 1fb8d4
#include <winpr/tchar.h>
Packit 1fb8d4
#include <winpr/print.h>
Packit 1fb8d4
#include <winpr/synch.h>
Packit 1fb8d4
#include <winpr/thread.h>
Packit 1fb8d4
#include <winpr/crypto.h>
Packit 1fb8d4
#include <winpr/wlog.h>
Packit 1fb8d4
#include <winpr/schannel.h>
Packit 1fb8d4
Packit 1fb8d4
static BOOL g_ClientWait = FALSE;
Packit 1fb8d4
static BOOL g_ServerWait = FALSE;
Packit 1fb8d4
Packit 1fb8d4
static HANDLE g_ClientReadPipe = NULL;
Packit 1fb8d4
static HANDLE g_ClientWritePipe = NULL;
Packit 1fb8d4
static HANDLE g_ServerReadPipe = NULL;
Packit 1fb8d4
static HANDLE g_ServerWritePipe = NULL;
Packit 1fb8d4
Packit 1fb8d4
static const BYTE test_localhost_crt[1029] =
Packit 1fb8d4
{
Packit 1fb8d4
	0x2D,0x2D,0x2D,0x2D,0x2D,0x42,0x45,0x47,0x49,0x4E,0x20,0x43,0x45,0x52,0x54,
Packit 1fb8d4
	0x49,0x46,0x49,0x43,0x41,0x54,0x45,0x2D,0x2D,0x2D,0x2D,0x2D,0x0A,0x4D,0x49,
Packit 1fb8d4
	0x49,0x43,0x79,0x6A,0x43,0x43,0x41,0x62,0x4B,0x67,0x41,0x77,0x49,0x42,0x41,
Packit 1fb8d4
	0x67,0x49,0x45,0x63,0x61,0x64,0x63,0x72,0x7A,0x41,0x4E,0x42,0x67,0x6B,0x71,
Packit 1fb8d4
	0x68,0x6B,0x69,0x47,0x39,0x77,0x30,0x42,0x41,0x51,0x55,0x46,0x41,0x44,0x41,
Packit 1fb8d4
	0x55,0x4D,0x52,0x49,0x77,0x45,0x41,0x59,0x44,0x56,0x51,0x51,0x44,0x45,0x77,
Packit 1fb8d4
	0x6C,0x73,0x0A,0x62,0x32,0x4E,0x68,0x62,0x47,0x68,0x76,0x63,0x33,0x51,0x77,
Packit 1fb8d4
	0x48,0x68,0x63,0x4E,0x4D,0x54,0x4D,0x78,0x4D,0x44,0x45,0x78,0x4D,0x44,0x59,
Packit 1fb8d4
	0x78,0x4E,0x7A,0x55,0x31,0x57,0x68,0x63,0x4E,0x4D,0x54,0x51,0x78,0x4D,0x44,
Packit 1fb8d4
	0x45,0x78,0x4D,0x44,0x59,0x78,0x4E,0x7A,0x55,0x31,0x57,0x6A,0x41,0x55,0x4D,
Packit 1fb8d4
	0x52,0x49,0x77,0x45,0x41,0x59,0x44,0x0A,0x56,0x51,0x51,0x44,0x45,0x77,0x6C,
Packit 1fb8d4
	0x73,0x62,0x32,0x4E,0x68,0x62,0x47,0x68,0x76,0x63,0x33,0x51,0x77,0x67,0x67,
Packit 1fb8d4
	0x45,0x69,0x4D,0x41,0x30,0x47,0x43,0x53,0x71,0x47,0x53,0x49,0x62,0x33,0x44,
Packit 1fb8d4
	0x51,0x45,0x42,0x41,0x51,0x55,0x41,0x41,0x34,0x49,0x42,0x44,0x77,0x41,0x77,
Packit 1fb8d4
	0x67,0x67,0x45,0x4B,0x41,0x6F,0x49,0x42,0x41,0x51,0x43,0x33,0x0A,0x65,0x6E,
Packit 1fb8d4
	0x33,0x68,0x5A,0x4F,0x53,0x33,0x6B,0x51,0x2F,0x55,0x54,0x30,0x53,0x45,0x6C,
Packit 1fb8d4
	0x30,0x48,0x6E,0x50,0x79,0x64,0x48,0x75,0x35,0x39,0x61,0x69,0x71,0x64,0x73,
Packit 1fb8d4
	0x64,0x53,0x55,0x74,0x6E,0x43,0x41,0x37,0x46,0x66,0x74,0x30,0x4F,0x36,0x51,
Packit 1fb8d4
	0x79,0x68,0x49,0x71,0x58,0x7A,0x30,0x47,0x32,0x53,0x76,0x77,0x4C,0x54,0x62,
Packit 1fb8d4
	0x79,0x68,0x0A,0x59,0x54,0x68,0x31,0x36,0x78,0x31,0x72,0x45,0x48,0x68,0x31,
Packit 1fb8d4
	0x57,0x47,0x5A,0x6D,0x36,0x77,0x64,0x2B,0x4B,0x76,0x38,0x6B,0x31,0x6B,0x2F,
Packit 1fb8d4
	0x36,0x6F,0x41,0x2F,0x4F,0x51,0x76,0x65,0x61,0x38,0x6B,0x63,0x45,0x64,0x53,
Packit 1fb8d4
	0x72,0x54,0x64,0x75,0x71,0x4A,0x33,0x65,0x66,0x74,0x48,0x4A,0x4A,0x6E,0x43,
Packit 1fb8d4
	0x4B,0x30,0x41,0x62,0x68,0x34,0x39,0x0A,0x41,0x47,0x41,0x50,0x39,0x79,0x58,
Packit 1fb8d4
	0x77,0x77,0x59,0x41,0x6A,0x51,0x49,0x52,0x6E,0x38,0x2B,0x4F,0x63,0x63,0x48,
Packit 1fb8d4
	0x74,0x6F,0x4E,0x75,0x75,0x79,0x52,0x63,0x6B,0x49,0x50,0x71,0x75,0x70,0x78,
Packit 1fb8d4
	0x79,0x31,0x4A,0x5A,0x4B,0x39,0x64,0x76,0x76,0x62,0x34,0x79,0x53,0x6B,0x49,
Packit 1fb8d4
	0x75,0x7A,0x62,0x79,0x50,0x6F,0x54,0x41,0x79,0x61,0x55,0x2B,0x0A,0x51,0x72,
Packit 1fb8d4
	0x70,0x34,0x78,0x67,0x64,0x4B,0x46,0x54,0x70,0x6B,0x50,0x46,0x34,0x33,0x6A,
Packit 1fb8d4
	0x32,0x4D,0x6D,0x5A,0x72,0x46,0x63,0x42,0x76,0x79,0x6A,0x69,0x35,0x6A,0x4F,
Packit 1fb8d4
	0x37,0x74,0x66,0x6F,0x56,0x61,0x6B,0x59,0x47,0x53,0x2F,0x4C,0x63,0x78,0x77,
Packit 1fb8d4
	0x47,0x2B,0x77,0x51,0x77,0x63,0x4F,0x43,0x54,0x42,0x45,0x78,0x2F,0x7A,0x31,
Packit 1fb8d4
	0x53,0x30,0x0A,0x37,0x49,0x2F,0x6A,0x62,0x44,0x79,0x53,0x4E,0x68,0x44,0x35,
Packit 1fb8d4
	0x63,0x61,0x63,0x54,0x75,0x4E,0x36,0x50,0x68,0x33,0x58,0x30,0x71,0x70,0x47,
Packit 1fb8d4
	0x73,0x37,0x79,0x50,0x6B,0x4E,0x79,0x69,0x4A,0x33,0x57,0x52,0x69,0x6C,0x35,
Packit 1fb8d4
	0x75,0x57,0x73,0x4B,0x65,0x79,0x63,0x64,0x71,0x42,0x4E,0x72,0x34,0x75,0x32,
Packit 1fb8d4
	0x62,0x49,0x52,0x6E,0x63,0x54,0x51,0x0A,0x46,0x72,0x68,0x73,0x58,0x39,0x69,
Packit 1fb8d4
	0x77,0x37,0x35,0x76,0x75,0x53,0x64,0x35,0x46,0x39,0x37,0x56,0x70,0x41,0x67,
Packit 1fb8d4
	0x4D,0x42,0x41,0x41,0x47,0x6A,0x4A,0x44,0x41,0x69,0x4D,0x42,0x4D,0x47,0x41,
Packit 1fb8d4
	0x31,0x55,0x64,0x4A,0x51,0x51,0x4D,0x4D,0x41,0x6F,0x47,0x43,0x43,0x73,0x47,
Packit 1fb8d4
	0x41,0x51,0x55,0x46,0x42,0x77,0x4D,0x42,0x4D,0x41,0x73,0x47,0x0A,0x41,0x31,
Packit 1fb8d4
	0x55,0x64,0x44,0x77,0x51,0x45,0x41,0x77,0x49,0x45,0x4D,0x44,0x41,0x4E,0x42,
Packit 1fb8d4
	0x67,0x6B,0x71,0x68,0x6B,0x69,0x47,0x39,0x77,0x30,0x42,0x41,0x51,0x55,0x46,
Packit 1fb8d4
	0x41,0x41,0x4F,0x43,0x41,0x51,0x45,0x41,0x49,0x51,0x66,0x75,0x2F,0x77,0x39,
Packit 1fb8d4
	0x45,0x34,0x4C,0x6F,0x67,0x30,0x71,0x35,0x4B,0x53,0x38,0x71,0x46,0x78,0x62,
Packit 1fb8d4
	0x36,0x6F,0x0A,0x36,0x31,0x62,0x35,0x37,0x6F,0x6D,0x6E,0x46,0x59,0x52,0x34,
Packit 1fb8d4
	0x47,0x43,0x67,0x33,0x6F,0x6A,0x4F,0x4C,0x54,0x66,0x38,0x7A,0x6A,0x4D,0x43,
Packit 1fb8d4
	0x52,0x6D,0x75,0x59,0x32,0x76,0x30,0x4E,0x34,0x78,0x66,0x68,0x69,0x35,0x4B,
Packit 1fb8d4
	0x69,0x59,0x67,0x64,0x76,0x4E,0x4C,0x4F,0x33,0x52,0x42,0x6D,0x4E,0x50,0x76,
Packit 1fb8d4
	0x59,0x58,0x50,0x52,0x46,0x41,0x76,0x0A,0x66,0x61,0x76,0x66,0x57,0x75,0x6C,
Packit 1fb8d4
	0x44,0x31,0x64,0x50,0x36,0x31,0x69,0x35,0x62,0x36,0x59,0x66,0x56,0x6C,0x78,
Packit 1fb8d4
	0x62,0x31,0x61,0x57,0x46,0x37,0x4C,0x5A,0x44,0x32,0x55,0x6E,0x63,0x41,0x6A,
Packit 1fb8d4
	0x37,0x4E,0x38,0x78,0x38,0x2B,0x36,0x58,0x6B,0x30,0x6B,0x63,0x70,0x58,0x46,
Packit 1fb8d4
	0x38,0x6C,0x77,0x58,0x48,0x55,0x57,0x57,0x55,0x6D,0x73,0x2B,0x0A,0x4B,0x56,
Packit 1fb8d4
	0x44,0x34,0x34,0x39,0x68,0x6F,0x4D,0x2B,0x77,0x4E,0x4A,0x49,0x61,0x4F,0x52,
Packit 1fb8d4
	0x39,0x4C,0x46,0x2B,0x6B,0x6F,0x32,0x32,0x37,0x7A,0x74,0x37,0x54,0x41,0x47,
Packit 1fb8d4
	0x64,0x56,0x35,0x4A,0x75,0x7A,0x71,0x38,0x32,0x2F,0x6B,0x75,0x73,0x6F,0x65,
Packit 1fb8d4
	0x32,0x69,0x75,0x57,0x77,0x54,0x65,0x42,0x6C,0x53,0x5A,0x6E,0x6B,0x42,0x38,
Packit 1fb8d4
	0x63,0x64,0x0A,0x77,0x4D,0x30,0x5A,0x42,0x58,0x6D,0x34,0x35,0x48,0x38,0x6F,
Packit 1fb8d4
	0x79,0x75,0x36,0x4A,0x71,0x59,0x71,0x45,0x6D,0x75,0x4A,0x51,0x64,0x67,0x79,
Packit 1fb8d4
	0x52,0x2B,0x63,0x53,0x53,0x41,0x7A,0x2B,0x4F,0x32,0x6D,0x61,0x62,0x68,0x50,
Packit 1fb8d4
	0x5A,0x65,0x49,0x76,0x78,0x65,0x67,0x6A,0x6A,0x61,0x5A,0x61,0x46,0x4F,0x71,
Packit 1fb8d4
	0x74,0x73,0x2B,0x64,0x33,0x72,0x39,0x0A,0x79,0x71,0x4A,0x78,0x67,0x75,0x39,
Packit 1fb8d4
	0x43,0x38,0x39,0x5A,0x69,0x33,0x39,0x57,0x34,0x38,0x46,0x66,0x46,0x63,0x49,
Packit 1fb8d4
	0x58,0x4A,0x4F,0x6B,0x39,0x43,0x4E,0x46,0x41,0x2F,0x69,0x70,0x54,0x57,0x6A,
Packit 1fb8d4
	0x74,0x74,0x4E,0x2F,0x6B,0x4F,0x6B,0x5A,0x42,0x70,0x6F,0x6A,0x2F,0x32,0x6A,
Packit 1fb8d4
	0x4E,0x45,0x62,0x4F,0x59,0x7A,0x7A,0x6E,0x4B,0x77,0x3D,0x3D,0x0A,0x2D,0x2D,
Packit 1fb8d4
	0x2D,0x2D,0x2D,0x45,0x4E,0x44,0x20,0x43,0x45,0x52,0x54,0x49,0x46,0x49,0x43,
Packit 1fb8d4
	0x41,0x54,0x45,0x2D,0x2D,0x2D,0x2D,0x2D,0x0A
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
static const BYTE test_localhost_key[1704] =
Packit 1fb8d4
{
Packit 1fb8d4
	0x2D,0x2D,0x2D,0x2D,0x2D,0x42,0x45,0x47,0x49,0x4E,0x20,0x50,0x52,0x49,0x56,
Packit 1fb8d4
	0x41,0x54,0x45,0x20,0x4B,0x45,0x59,0x2D,0x2D,0x2D,0x2D,0x2D,0x0A,0x4D,0x49,
Packit 1fb8d4
	0x49,0x45,0x76,0x51,0x49,0x42,0x41,0x44,0x41,0x4E,0x42,0x67,0x6B,0x71,0x68,
Packit 1fb8d4
	0x6B,0x69,0x47,0x39,0x77,0x30,0x42,0x41,0x51,0x45,0x46,0x41,0x41,0x53,0x43,
Packit 1fb8d4
	0x42,0x4B,0x63,0x77,0x67,0x67,0x53,0x6A,0x41,0x67,0x45,0x41,0x41,0x6F,0x49,
Packit 1fb8d4
	0x42,0x41,0x51,0x43,0x33,0x65,0x6E,0x33,0x68,0x5A,0x4F,0x53,0x33,0x6B,0x51,
Packit 1fb8d4
	0x2F,0x55,0x0A,0x54,0x30,0x53,0x45,0x6C,0x30,0x48,0x6E,0x50,0x79,0x64,0x48,
Packit 1fb8d4
	0x75,0x35,0x39,0x61,0x69,0x71,0x64,0x73,0x64,0x53,0x55,0x74,0x6E,0x43,0x41,
Packit 1fb8d4
	0x37,0x46,0x66,0x74,0x30,0x4F,0x36,0x51,0x79,0x68,0x49,0x71,0x58,0x7A,0x30,
Packit 1fb8d4
	0x47,0x32,0x53,0x76,0x77,0x4C,0x54,0x62,0x79,0x68,0x59,0x54,0x68,0x31,0x36,
Packit 1fb8d4
	0x78,0x31,0x72,0x45,0x48,0x68,0x31,0x0A,0x57,0x47,0x5A,0x6D,0x36,0x77,0x64,
Packit 1fb8d4
	0x2B,0x4B,0x76,0x38,0x6B,0x31,0x6B,0x2F,0x36,0x6F,0x41,0x2F,0x4F,0x51,0x76,
Packit 1fb8d4
	0x65,0x61,0x38,0x6B,0x63,0x45,0x64,0x53,0x72,0x54,0x64,0x75,0x71,0x4A,0x33,
Packit 1fb8d4
	0x65,0x66,0x74,0x48,0x4A,0x4A,0x6E,0x43,0x4B,0x30,0x41,0x62,0x68,0x34,0x39,
Packit 1fb8d4
	0x41,0x47,0x41,0x50,0x39,0x79,0x58,0x77,0x77,0x59,0x41,0x6A,0x0A,0x51,0x49,
Packit 1fb8d4
	0x52,0x6E,0x38,0x2B,0x4F,0x63,0x63,0x48,0x74,0x6F,0x4E,0x75,0x75,0x79,0x52,
Packit 1fb8d4
	0x63,0x6B,0x49,0x50,0x71,0x75,0x70,0x78,0x79,0x31,0x4A,0x5A,0x4B,0x39,0x64,
Packit 1fb8d4
	0x76,0x76,0x62,0x34,0x79,0x53,0x6B,0x49,0x75,0x7A,0x62,0x79,0x50,0x6F,0x54,
Packit 1fb8d4
	0x41,0x79,0x61,0x55,0x2B,0x51,0x72,0x70,0x34,0x78,0x67,0x64,0x4B,0x46,0x54,
Packit 1fb8d4
	0x70,0x6B,0x0A,0x50,0x46,0x34,0x33,0x6A,0x32,0x4D,0x6D,0x5A,0x72,0x46,0x63,
Packit 1fb8d4
	0x42,0x76,0x79,0x6A,0x69,0x35,0x6A,0x4F,0x37,0x74,0x66,0x6F,0x56,0x61,0x6B,
Packit 1fb8d4
	0x59,0x47,0x53,0x2F,0x4C,0x63,0x78,0x77,0x47,0x2B,0x77,0x51,0x77,0x63,0x4F,
Packit 1fb8d4
	0x43,0x54,0x42,0x45,0x78,0x2F,0x7A,0x31,0x53,0x30,0x37,0x49,0x2F,0x6A,0x62,
Packit 1fb8d4
	0x44,0x79,0x53,0x4E,0x68,0x44,0x35,0x0A,0x63,0x61,0x63,0x54,0x75,0x4E,0x36,
Packit 1fb8d4
	0x50,0x68,0x33,0x58,0x30,0x71,0x70,0x47,0x73,0x37,0x79,0x50,0x6B,0x4E,0x79,
Packit 1fb8d4
	0x69,0x4A,0x33,0x57,0x52,0x69,0x6C,0x35,0x75,0x57,0x73,0x4B,0x65,0x79,0x63,
Packit 1fb8d4
	0x64,0x71,0x42,0x4E,0x72,0x34,0x75,0x32,0x62,0x49,0x52,0x6E,0x63,0x54,0x51,
Packit 1fb8d4
	0x46,0x72,0x68,0x73,0x58,0x39,0x69,0x77,0x37,0x35,0x76,0x75,0x0A,0x53,0x64,
Packit 1fb8d4
	0x35,0x46,0x39,0x37,0x56,0x70,0x41,0x67,0x4D,0x42,0x41,0x41,0x45,0x43,0x67,
Packit 1fb8d4
	0x67,0x45,0x41,0x42,0x36,0x6A,0x6C,0x65,0x48,0x4E,0x74,0x32,0x50,0x77,0x46,
Packit 1fb8d4
	0x58,0x53,0x65,0x79,0x42,0x4A,0x63,0x4C,0x2B,0x55,0x74,0x35,0x71,0x46,0x54,
Packit 1fb8d4
	0x38,0x34,0x68,0x72,0x48,0x77,0x6F,0x39,0x68,0x62,0x66,0x59,0x47,0x6F,0x6E,
Packit 1fb8d4
	0x44,0x59,0x0A,0x66,0x70,0x47,0x2B,0x32,0x52,0x30,0x50,0x62,0x43,0x63,0x4B,
Packit 1fb8d4
	0x35,0x30,0x46,0x61,0x4A,0x46,0x36,0x71,0x63,0x56,0x4A,0x4E,0x75,0x52,0x36,
Packit 1fb8d4
	0x48,0x71,0x2B,0x43,0x55,0x4A,0x74,0x48,0x35,0x39,0x48,0x48,0x37,0x62,0x68,
Packit 1fb8d4
	0x6A,0x39,0x62,0x64,0x78,0x45,0x6D,0x6F,0x48,0x30,0x4A,0x76,0x68,0x45,0x76,
Packit 1fb8d4
	0x67,0x4D,0x2F,0x55,0x38,0x42,0x51,0x0A,0x65,0x57,0x4F,0x4E,0x68,0x78,0x50,
Packit 1fb8d4
	0x73,0x69,0x73,0x6D,0x57,0x6B,0x78,0x61,0x5A,0x6F,0x6C,0x72,0x32,0x69,0x44,
Packit 1fb8d4
	0x56,0x72,0x7A,0x54,0x37,0x55,0x4A,0x71,0x6A,0x74,0x59,0x49,0x74,0x67,0x2B,
Packit 1fb8d4
	0x37,0x59,0x43,0x32,0x70,0x55,0x58,0x6B,0x64,0x49,0x35,0x4A,0x4D,0x67,0x6C,
Packit 1fb8d4
	0x44,0x47,0x4D,0x52,0x5A,0x35,0x55,0x5A,0x48,0x75,0x63,0x7A,0x0A,0x41,0x56,
Packit 1fb8d4
	0x2B,0x71,0x77,0x77,0x33,0x65,0x45,0x52,0x74,0x78,0x44,0x50,0x61,0x61,0x61,
Packit 1fb8d4
	0x34,0x54,0x39,0x50,0x64,0x33,0x44,0x31,0x6D,0x62,0x71,0x58,0x66,0x75,0x45,
Packit 1fb8d4
	0x68,0x42,0x6D,0x33,0x51,0x6F,0x2B,0x75,0x7A,0x51,0x32,0x36,0x76,0x73,0x66,
Packit 1fb8d4
	0x48,0x75,0x56,0x76,0x61,0x39,0x38,0x32,0x4F,0x6A,0x41,0x55,0x6A,0x6E,0x64,
Packit 1fb8d4
	0x30,0x70,0x0A,0x77,0x43,0x53,0x6E,0x42,0x49,0x48,0x67,0x70,0x73,0x30,0x79,
Packit 1fb8d4
	0x61,0x45,0x50,0x63,0x37,0x46,0x78,0x39,0x71,0x45,0x63,0x6D,0x33,0x70,0x7A,
Packit 1fb8d4
	0x41,0x56,0x31,0x69,0x72,0x31,0x4E,0x4E,0x63,0x51,0x47,0x55,0x45,0x75,0x45,
Packit 1fb8d4
	0x6C,0x4A,0x78,0x76,0x2B,0x69,0x57,0x34,0x6D,0x35,0x70,0x7A,0x4C,0x6A,0x64,
Packit 1fb8d4
	0x53,0x63,0x49,0x30,0x59,0x45,0x73,0x0A,0x4D,0x61,0x33,0x78,0x32,0x79,0x48,
Packit 1fb8d4
	0x74,0x6E,0x77,0x79,0x65,0x4C,0x4D,0x54,0x4B,0x6C,0x72,0x46,0x4B,0x70,0x55,
Packit 1fb8d4
	0x4E,0x4A,0x62,0x78,0x73,0x35,0x32,0x62,0x5A,0x4B,0x71,0x49,0x56,0x33,0x33,
Packit 1fb8d4
	0x4A,0x53,0x34,0x41,0x51,0x4B,0x42,0x67,0x51,0x44,0x73,0x4C,0x54,0x49,0x68,
Packit 1fb8d4
	0x35,0x59,0x38,0x4C,0x2F,0x48,0x33,0x64,0x74,0x68,0x63,0x62,0x0A,0x53,0x43,
Packit 1fb8d4
	0x45,0x77,0x32,0x64,0x42,0x49,0x76,0x49,0x79,0x54,0x7A,0x39,0x53,0x72,0x62,
Packit 1fb8d4
	0x33,0x58,0x37,0x37,0x41,0x77,0x57,0x45,0x4C,0x53,0x4D,0x49,0x57,0x53,0x50,
Packit 1fb8d4
	0x55,0x43,0x4B,0x54,0x49,0x70,0x6A,0x4D,0x73,0x6E,0x7A,0x6B,0x46,0x67,0x32,
Packit 1fb8d4
	0x32,0x59,0x32,0x53,0x75,0x47,0x38,0x4C,0x72,0x50,0x6D,0x76,0x73,0x46,0x4A,
Packit 1fb8d4
	0x34,0x30,0x0A,0x32,0x67,0x35,0x44,0x55,0x6C,0x59,0x33,0x59,0x6D,0x53,0x4F,
Packit 1fb8d4
	0x46,0x61,0x45,0x4A,0x54,0x70,0x55,0x47,0x44,0x4D,0x79,0x65,0x33,0x74,0x36,
Packit 1fb8d4
	0x4F,0x30,0x6C,0x63,0x51,0x41,0x66,0x79,0x6D,0x58,0x66,0x41,0x38,0x74,0x50,
Packit 1fb8d4
	0x42,0x48,0x6A,0x5A,0x78,0x56,0x61,0x38,0x78,0x78,0x52,0x5A,0x6E,0x56,0x43,
Packit 1fb8d4
	0x31,0x41,0x62,0x75,0x49,0x49,0x52,0x0A,0x6E,0x77,0x72,0x4E,0x46,0x2B,0x42,
Packit 1fb8d4
	0x6F,0x53,0x4B,0x55,0x41,0x73,0x78,0x2B,0x46,0x75,0x35,0x5A,0x4A,0x4B,0x4F,
Packit 1fb8d4
	0x66,0x79,0x4D,0x51,0x4B,0x42,0x67,0x51,0x44,0x47,0x34,0x50,0x52,0x39,0x2F,
Packit 1fb8d4
	0x58,0x58,0x6B,0x51,0x54,0x36,0x6B,0x7A,0x4B,0x64,0x34,0x50,0x6C,0x50,0x4D,
Packit 1fb8d4
	0x63,0x2B,0x4B,0x51,0x79,0x4C,0x45,0x6C,0x4B,0x39,0x71,0x47,0x0A,0x41,0x6D,
Packit 1fb8d4
	0x6E,0x2F,0x31,0x68,0x64,0x69,0x57,0x57,0x4F,0x52,0x57,0x46,0x62,0x32,0x38,
Packit 1fb8d4
	0x30,0x4D,0x77,0x76,0x77,0x41,0x64,0x78,0x72,0x66,0x65,0x4C,0x57,0x4D,0x57,
Packit 1fb8d4
	0x32,0x66,0x76,0x4C,0x59,0x4B,0x66,0x6C,0x4F,0x35,0x50,0x51,0x44,0x59,0x67,
Packit 1fb8d4
	0x4B,0x4A,0x78,0x35,0x79,0x50,0x37,0x52,0x64,0x38,0x2F,0x64,0x50,0x79,0x5A,
Packit 1fb8d4
	0x59,0x36,0x0A,0x7A,0x56,0x37,0x47,0x47,0x6B,0x51,0x5A,0x42,0x4B,0x36,0x79,
Packit 1fb8d4
	0x74,0x61,0x66,0x32,0x35,0x44,0x50,0x67,0x50,0x72,0x32,0x77,0x73,0x59,0x4D,
Packit 1fb8d4
	0x43,0x6C,0x53,0x74,0x6C,0x56,0x74,0x72,0x6D,0x4F,0x78,0x59,0x55,0x56,0x77,
Packit 1fb8d4
	0x42,0x59,0x4F,0x69,0x36,0x45,0x62,0x50,0x69,0x6B,0x78,0x47,0x48,0x5A,0x70,
Packit 1fb8d4
	0x59,0x6F,0x5A,0x5A,0x70,0x68,0x4A,0x0A,0x4E,0x61,0x38,0x4F,0x4C,0x31,0x69,
Packit 1fb8d4
	0x77,0x75,0x51,0x4B,0x42,0x67,0x51,0x44,0x42,0x55,0x55,0x31,0x54,0x79,0x5A,
Packit 1fb8d4
	0x2B,0x4A,0x5A,0x43,0x64,0x79,0x72,0x33,0x58,0x43,0x63,0x77,0x77,0x58,0x2F,
Packit 1fb8d4
	0x48,0x49,0x73,0x31,0x34,0x6B,0x4B,0x42,0x48,0x68,0x44,0x79,0x33,0x78,0x37,
Packit 1fb8d4
	0x74,0x50,0x38,0x2F,0x6F,0x48,0x54,0x6F,0x72,0x76,0x79,0x74,0x0A,0x41,0x68,
Packit 1fb8d4
	0x38,0x4B,0x36,0x4B,0x72,0x43,0x41,0x75,0x65,0x50,0x6D,0x79,0x32,0x6D,0x4F,
Packit 1fb8d4
	0x54,0x31,0x54,0x39,0x6F,0x31,0x61,0x47,0x55,0x49,0x6C,0x66,0x38,0x72,0x76,
Packit 1fb8d4
	0x33,0x2F,0x30,0x45,0x78,0x67,0x53,0x6B,0x57,0x50,0x6D,0x4F,0x41,0x38,0x35,
Packit 1fb8d4
	0x49,0x32,0x2F,0x58,0x48,0x65,0x66,0x71,0x54,0x6F,0x45,0x48,0x30,0x44,0x65,
Packit 1fb8d4
	0x41,0x4E,0x0A,0x7A,0x6C,0x4B,0x4C,0x71,0x79,0x44,0x56,0x30,0x42,0x56,0x4E,
Packit 1fb8d4
	0x76,0x48,0x42,0x57,0x79,0x32,0x49,0x51,0x35,0x62,0x50,0x42,0x57,0x76,0x30,
Packit 1fb8d4
	0x37,0x63,0x34,0x2B,0x6A,0x39,0x4E,0x62,0x57,0x67,0x64,0x44,0x43,0x43,0x35,
Packit 1fb8d4
	0x52,0x6B,0x4F,0x6A,0x70,0x33,0x4D,0x4E,0x45,0x58,0x47,0x56,0x43,0x69,0x51,
Packit 1fb8d4
	0x51,0x4B,0x42,0x67,0x43,0x7A,0x4D,0x0A,0x77,0x65,0x61,0x62,0x73,0x50,0x48,
Packit 1fb8d4
	0x68,0x44,0x4B,0x5A,0x38,0x2F,0x34,0x43,0x6A,0x73,0x61,0x62,0x4E,0x75,0x41,
Packit 1fb8d4
	0x7A,0x62,0x57,0x4B,0x52,0x42,0x38,0x37,0x44,0x61,0x58,0x46,0x78,0x6F,0x4D,
Packit 1fb8d4
	0x73,0x35,0x52,0x79,0x6F,0x38,0x55,0x4D,0x6B,0x72,0x67,0x30,0x35,0x4C,0x6F,
Packit 1fb8d4
	0x67,0x37,0x4D,0x78,0x62,0x33,0x76,0x61,0x42,0x34,0x63,0x2F,0x0A,0x52,0x57,
Packit 1fb8d4
	0x77,0x7A,0x38,0x72,0x34,0x39,0x70,0x48,0x64,0x71,0x68,0x4F,0x6D,0x63,0x6C,
Packit 1fb8d4
	0x45,0x77,0x79,0x4D,0x34,0x51,0x79,0x6A,0x39,0x52,0x6D,0x57,0x62,0x51,0x58,
Packit 1fb8d4
	0x54,0x54,0x45,0x63,0x2B,0x35,0x67,0x54,0x4B,0x50,0x4E,0x53,0x33,0x6D,0x70,
Packit 1fb8d4
	0x4D,0x54,0x36,0x39,0x46,0x45,0x74,0x2F,0x35,0x72,0x4D,0x52,0x70,0x4B,0x2B,
Packit 1fb8d4
	0x52,0x68,0x0A,0x49,0x32,0x42,0x58,0x6B,0x51,0x71,0x31,0x36,0x6E,0x72,0x31,
Packit 1fb8d4
	0x61,0x45,0x4D,0x6D,0x64,0x51,0x42,0x51,0x79,0x4B,0x59,0x4A,0x6C,0x30,0x6C,
Packit 1fb8d4
	0x50,0x68,0x69,0x42,0x2F,0x75,0x6C,0x5A,0x63,0x72,0x67,0x4C,0x70,0x41,0x6F,
Packit 1fb8d4
	0x47,0x41,0x65,0x30,0x65,0x74,0x50,0x4A,0x77,0x6D,0x51,0x46,0x6B,0x6A,0x4D,
Packit 1fb8d4
	0x70,0x66,0x4D,0x44,0x61,0x4E,0x34,0x0A,0x70,0x7A,0x71,0x45,0x51,0x72,0x52,
Packit 1fb8d4
	0x35,0x4B,0x35,0x4D,0x6E,0x54,0x48,0x76,0x47,0x67,0x2F,0x70,0x6A,0x57,0x6A,
Packit 1fb8d4
	0x43,0x57,0x58,0x56,0x48,0x67,0x35,0x76,0x36,0x46,0x6F,0x5A,0x48,0x35,0x6E,
Packit 1fb8d4
	0x59,0x2B,0x56,0x2F,0x57,0x75,0x57,0x38,0x38,0x6A,0x6C,0x4B,0x53,0x50,0x6C,
Packit 1fb8d4
	0x77,0x6A,0x50,0x7A,0x41,0x67,0x7A,0x47,0x33,0x45,0x41,0x55,0x0A,0x71,0x57,
Packit 1fb8d4
	0x6B,0x42,0x67,0x30,0x71,0x75,0x50,0x4D,0x72,0x54,0x6B,0x73,0x69,0x6E,0x58,
Packit 1fb8d4
	0x50,0x2B,0x58,0x6B,0x51,0x65,0x46,0x66,0x58,0x61,0x33,0x38,0x6A,0x72,0x70,
Packit 1fb8d4
	0x62,0x4B,0x46,0x4F,0x72,0x7A,0x49,0x6F,0x6A,0x69,0x65,0x6C,0x4B,0x55,0x4D,
Packit 1fb8d4
	0x50,0x4D,0x78,0x2F,0x78,0x70,0x53,0x6A,0x63,0x55,0x42,0x68,0x62,0x4E,0x34,
Packit 1fb8d4
	0x45,0x54,0x0A,0x4F,0x30,0x66,0x63,0x57,0x47,0x6F,0x61,0x56,0x50,0x72,0x63,
Packit 1fb8d4
	0x6E,0x38,0x62,0x58,0x4D,0x54,0x45,0x4E,0x53,0x31,0x41,0x3D,0x0A,0x2D,0x2D,
Packit 1fb8d4
	0x2D,0x2D,0x2D,0x45,0x4E,0x44,0x20,0x50,0x52,0x49,0x56,0x41,0x54,0x45,0x20,
Packit 1fb8d4
	0x4B,0x45,0x59,0x2D,0x2D,0x2D,0x2D,0x2D,0x0A
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
static const BYTE test_DummyMessage[64] =
Packit 1fb8d4
{
Packit 1fb8d4
	0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
Packit 1fb8d4
	0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
Packit 1fb8d4
	0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
Packit 1fb8d4
	0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
static const BYTE test_LastDummyMessage[64] =
Packit 1fb8d4
{
Packit 1fb8d4
	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
Packit 1fb8d4
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 1fb8d4
	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
Packit 1fb8d4
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
static int schannel_send(PSecurityFunctionTable table, HANDLE hPipe, PCtxtHandle phContext, BYTE* buffer, UINT32 length)
Packit 1fb8d4
{
Packit 1fb8d4
	BYTE* ioBuffer;
Packit 1fb8d4
	UINT32 ioBufferLength;
Packit 1fb8d4
	BYTE* pMessageBuffer;
Packit 1fb8d4
	SecBuffer Buffers[4];
Packit 1fb8d4
	SecBufferDesc Message;
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	DWORD NumberOfBytesWritten;
Packit 1fb8d4
	SecPkgContext_StreamSizes StreamSizes;
Packit 1fb8d4
	ZeroMemory(&StreamSizes, sizeof(SecPkgContext_StreamSizes));
Packit 1fb8d4
	status = table->QueryContextAttributes(phContext, SECPKG_ATTR_STREAM_SIZES, &StreamSizes);
Packit 1fb8d4
	ioBufferLength = StreamSizes.cbHeader + StreamSizes.cbMaximumMessage + StreamSizes.cbTrailer;
Packit 1fb8d4
	ioBuffer = (BYTE*) calloc(1, ioBufferLength);
Packit 1fb8d4
	if (!ioBuffer)
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	pMessageBuffer = ioBuffer + StreamSizes.cbHeader;
Packit 1fb8d4
	CopyMemory(pMessageBuffer, buffer, length);
Packit 1fb8d4
	Buffers[0].pvBuffer = ioBuffer;
Packit 1fb8d4
	Buffers[0].cbBuffer = StreamSizes.cbHeader;
Packit 1fb8d4
	Buffers[0].BufferType = SECBUFFER_STREAM_HEADER;
Packit 1fb8d4
	Buffers[1].pvBuffer = pMessageBuffer;
Packit 1fb8d4
	Buffers[1].cbBuffer = length;
Packit 1fb8d4
	Buffers[1].BufferType = SECBUFFER_DATA;
Packit 1fb8d4
	Buffers[2].pvBuffer = pMessageBuffer + length;
Packit 1fb8d4
	Buffers[2].cbBuffer = StreamSizes.cbTrailer;
Packit 1fb8d4
	Buffers[2].BufferType = SECBUFFER_STREAM_TRAILER;
Packit 1fb8d4
	Buffers[3].pvBuffer = NULL;
Packit 1fb8d4
	Buffers[3].cbBuffer = 0;
Packit 1fb8d4
	Buffers[3].BufferType = SECBUFFER_EMPTY;
Packit 1fb8d4
	Message.ulVersion = SECBUFFER_VERSION;
Packit 1fb8d4
	Message.cBuffers = 4;
Packit 1fb8d4
	Message.pBuffers = Buffers;
Packit 1fb8d4
	ioBufferLength = Message.pBuffers[0].cbBuffer + Message.pBuffers[1].cbBuffer + Message.pBuffers[2].cbBuffer;
Packit 1fb8d4
	status = table->EncryptMessage(phContext, 0, &Message, 0);
Packit 1fb8d4
	printf("EncryptMessage status: 0x%08"PRIX32"\n", status);
Packit 1fb8d4
	printf("EncryptMessage output: cBuffers: %"PRIu32" [0]: %"PRIu32" / %"PRIu32" [1]: %"PRIu32" / %"PRIu32" [2]: %"PRIu32" / %"PRIu32" [3]: %"PRIu32" / %"PRIu32"\n", Message.cBuffers,
Packit 1fb8d4
		   Message.pBuffers[0].cbBuffer, Message.pBuffers[0].BufferType,
Packit 1fb8d4
		   Message.pBuffers[1].cbBuffer, Message.pBuffers[1].BufferType,
Packit 1fb8d4
		   Message.pBuffers[2].cbBuffer, Message.pBuffers[2].BufferType,
Packit 1fb8d4
		   Message.pBuffers[3].cbBuffer, Message.pBuffers[3].BufferType);
Packit 1fb8d4
Packit 1fb8d4
	if (status != SEC_E_OK)
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit 1fb8d4
	printf("Client > Server (%"PRIu32")\n", ioBufferLength);
Packit 1fb8d4
	winpr_HexDump("sspi.test", WLOG_DEBUG, ioBuffer, ioBufferLength);
Packit 1fb8d4
Packit 1fb8d4
	if (!WriteFile(hPipe, ioBuffer, ioBufferLength, &NumberOfBytesWritten, NULL))
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("schannel_send: failed to write to pipe\n");
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static int schannel_recv(PSecurityFunctionTable table, HANDLE hPipe, PCtxtHandle phContext)
Packit 1fb8d4
{
Packit 1fb8d4
	BYTE* ioBuffer;
Packit 1fb8d4
	UINT32 ioBufferLength;
Packit 1fb8d4
	//BYTE* pMessageBuffer;
Packit 1fb8d4
	SecBuffer Buffers[4];
Packit 1fb8d4
	SecBufferDesc Message;
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	DWORD NumberOfBytesRead;
Packit 1fb8d4
	SecPkgContext_StreamSizes StreamSizes;
Packit 1fb8d4
	ZeroMemory(&StreamSizes, sizeof(SecPkgContext_StreamSizes));
Packit 1fb8d4
	status = table->QueryContextAttributes(phContext, SECPKG_ATTR_STREAM_SIZES, &StreamSizes);
Packit 1fb8d4
	ioBufferLength = StreamSizes.cbHeader + StreamSizes.cbMaximumMessage + StreamSizes.cbTrailer;
Packit 1fb8d4
	ioBuffer = (BYTE*) calloc(1, ioBufferLength);
Packit 1fb8d4
	if (!ioBuffer)
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit 1fb8d4
	if (!ReadFile(hPipe, ioBuffer, ioBufferLength, &NumberOfBytesRead, NULL))
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("schannel_recv: failed to read from pipe\n");
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	Buffers[0].pvBuffer = ioBuffer;
Packit 1fb8d4
	Buffers[0].cbBuffer = NumberOfBytesRead;
Packit 1fb8d4
	Buffers[0].BufferType = SECBUFFER_DATA;
Packit 1fb8d4
	Buffers[1].pvBuffer = NULL;
Packit 1fb8d4
	Buffers[1].cbBuffer = 0;
Packit 1fb8d4
	Buffers[1].BufferType = SECBUFFER_EMPTY;
Packit 1fb8d4
	Buffers[2].pvBuffer = NULL;
Packit 1fb8d4
	Buffers[2].cbBuffer = 0;
Packit 1fb8d4
	Buffers[2].BufferType = SECBUFFER_EMPTY;
Packit 1fb8d4
	Buffers[3].pvBuffer = NULL;
Packit 1fb8d4
	Buffers[3].cbBuffer = 0;
Packit 1fb8d4
	Buffers[3].BufferType = SECBUFFER_EMPTY;
Packit 1fb8d4
	Message.ulVersion = SECBUFFER_VERSION;
Packit 1fb8d4
	Message.cBuffers = 4;
Packit 1fb8d4
	Message.pBuffers = Buffers;
Packit 1fb8d4
	status = table->DecryptMessage(phContext, &Message, 0, NULL);
Packit 1fb8d4
	printf("DecryptMessage status: 0x%08"PRIX32"\n", status);
Packit 1fb8d4
	printf("DecryptMessage output: cBuffers: %"PRIu32" [0]: %"PRIu32" / %"PRIu32" [1]: %"PRIu32" / %"PRIu32" [2]: %"PRIu32" / %"PRIu32" [3]: %"PRIu32" / %"PRIu32"\n", Message.cBuffers,
Packit 1fb8d4
		   Message.pBuffers[0].cbBuffer, Message.pBuffers[0].BufferType,
Packit 1fb8d4
		   Message.pBuffers[1].cbBuffer, Message.pBuffers[1].BufferType,
Packit 1fb8d4
		   Message.pBuffers[2].cbBuffer, Message.pBuffers[2].BufferType,
Packit 1fb8d4
		   Message.pBuffers[3].cbBuffer, Message.pBuffers[3].BufferType);
Packit 1fb8d4
Packit 1fb8d4
	if (status != SEC_E_OK)
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit 1fb8d4
	printf("Decrypted Message (%"PRIu32")\n", Message.pBuffers[1].cbBuffer);
Packit 1fb8d4
	winpr_HexDump("sspi.test", WLOG_DEBUG, (BYTE*) Message.pBuffers[1].pvBuffer, Message.pBuffers[1].cbBuffer);
Packit 1fb8d4
Packit 1fb8d4
	if (memcmp(Message.pBuffers[1].pvBuffer, test_LastDummyMessage, sizeof(test_LastDummyMessage)) == 0)
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static DWORD WINAPI schannel_test_server_thread(LPVOID arg)
Packit 1fb8d4
{
Packit 1fb8d4
	BOOL extraData;
Packit 1fb8d4
	BYTE* lpTokenIn;
Packit 1fb8d4
	BYTE* lpTokenOut;
Packit 1fb8d4
	TimeStamp expiry;
Packit 1fb8d4
	UINT32 cbMaxToken;
Packit 1fb8d4
	UINT32 fContextReq;
Packit 1fb8d4
	ULONG fContextAttr;
Packit 1fb8d4
	SCHANNEL_CRED cred;
Packit 1fb8d4
	CtxtHandle context;
Packit 1fb8d4
	CredHandle credentials;
Packit 1fb8d4
	DWORD cchNameString;
Packit 1fb8d4
	LPTSTR pszNameString;
Packit 1fb8d4
	HCERTSTORE hCertStore;
Packit 1fb8d4
	PCCERT_CONTEXT pCertContext;
Packit 1fb8d4
	PSecBuffer pSecBuffer;
Packit 1fb8d4
	SecBuffer SecBuffer_in[2];
Packit 1fb8d4
	SecBuffer SecBuffer_out[2];
Packit 1fb8d4
	SecBufferDesc SecBufferDesc_in;
Packit 1fb8d4
	SecBufferDesc SecBufferDesc_out;
Packit 1fb8d4
	DWORD NumberOfBytesRead;
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	PSecPkgInfo pPackageInfo;
Packit 1fb8d4
	PSecurityFunctionTable table;
Packit 1fb8d4
	DWORD NumberOfBytesWritten;
Packit 1fb8d4
	printf("Starting Server\n");
Packit 1fb8d4
	SecInvalidateHandle(&context);
Packit 1fb8d4
	SecInvalidateHandle(&credentials);
Packit 1fb8d4
	table = InitSecurityInterface();
Packit 1fb8d4
	status = QuerySecurityPackageInfo(SCHANNEL_NAME, &pPackageInfo);
Packit 1fb8d4
Packit 1fb8d4
	if (status != SEC_E_OK)
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("QuerySecurityPackageInfo failure: 0x%08"PRIX32"\n", status);
Packit 1fb8d4
		return 0;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	cbMaxToken = pPackageInfo->cbMaxToken;
Packit 1fb8d4
	hCertStore = CertOpenSystemStore(0, _T("MY"));
Packit 1fb8d4
Packit 1fb8d4
	if (!hCertStore)
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("Error opening system store\n");
Packit 1fb8d4
		//return NULL;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
#ifdef CERT_FIND_HAS_PRIVATE_KEY
Packit 1fb8d4
	pCertContext = CertFindCertificateInStore(hCertStore, X509_ASN_ENCODING, 0, CERT_FIND_HAS_PRIVATE_KEY, NULL, NULL);
Packit 1fb8d4
#else
Packit 1fb8d4
	pCertContext = CertFindCertificateInStore(hCertStore, X509_ASN_ENCODING, 0, CERT_FIND_ANY, NULL, NULL);
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
	if (!pCertContext)
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("Error finding certificate in store\n");
Packit 1fb8d4
		//return NULL;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	cchNameString = CertGetNameString(pCertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, NULL, NULL, 0);
Packit 1fb8d4
	pszNameString = (LPTSTR) malloc(cchNameString * sizeof(TCHAR));
Packit 1fb8d4
	if (!pszNameString)
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("Memory allocation failed\n");
Packit 1fb8d4
		return 0;
Packit 1fb8d4
	}
Packit 1fb8d4
	cchNameString = CertGetNameString(pCertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, NULL, pszNameString, cchNameString);
Packit 1fb8d4
	_tprintf(_T("Certificate Name: %s\n"), pszNameString);
Packit 1fb8d4
	ZeroMemory(&cred, sizeof(SCHANNEL_CRED));
Packit 1fb8d4
	cred.dwVersion = SCHANNEL_CRED_VERSION;
Packit 1fb8d4
	cred.cCreds = 1;
Packit 1fb8d4
	cred.paCred = &pCertContext;
Packit 1fb8d4
	cred.cSupportedAlgs = 0;
Packit 1fb8d4
	cred.palgSupportedAlgs = NULL;
Packit 1fb8d4
	cred.grbitEnabledProtocols = SP_PROT_TLS1_SERVER;
Packit 1fb8d4
	cred.dwFlags = SCH_CRED_NO_SYSTEM_MAPPER;
Packit 1fb8d4
	status = table->AcquireCredentialsHandle(NULL, SCHANNEL_NAME,
Packit 1fb8d4
			 SECPKG_CRED_INBOUND, NULL, &cred, NULL, NULL, &credentials, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (status != SEC_E_OK)
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("AcquireCredentialsHandle failure: 0x%08"PRIX32"\n", status);
Packit 1fb8d4
		return 0;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	extraData = FALSE;
Packit 1fb8d4
	g_ServerWait = TRUE;
Packit 1fb8d4
	if (!(lpTokenIn = (BYTE*) malloc(cbMaxToken)))
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("Memory allocation failed\n");
Packit 1fb8d4
		return 0;
Packit 1fb8d4
	}
Packit 1fb8d4
	if (!(lpTokenOut = (BYTE*) malloc(cbMaxToken)))
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("Memory allocation failed\n");
Packit 1fb8d4
		free(lpTokenIn);
Packit 1fb8d4
		return 0;
Packit 1fb8d4
	}
Packit 1fb8d4
	fContextReq = ASC_REQ_STREAM |
Packit 1fb8d4
				  ASC_REQ_SEQUENCE_DETECT | ASC_REQ_REPLAY_DETECT |
Packit 1fb8d4
				  ASC_REQ_CONFIDENTIALITY | ASC_REQ_EXTENDED_ERROR;
Packit 1fb8d4
Packit 1fb8d4
	do
Packit 1fb8d4
	{
Packit 1fb8d4
		if (!extraData)
Packit 1fb8d4
		{
Packit 1fb8d4
			if (g_ServerWait)
Packit 1fb8d4
			{
Packit 1fb8d4
				if (!ReadFile(g_ServerReadPipe, lpTokenIn, cbMaxToken, &NumberOfBytesRead, NULL))
Packit 1fb8d4
				{
Packit 1fb8d4
					printf("Failed to read from server pipe\n");
Packit 1fb8d4
					return NULL;
Packit 1fb8d4
				}
Packit 1fb8d4
			}
Packit 1fb8d4
			else
Packit 1fb8d4
			{
Packit 1fb8d4
				NumberOfBytesRead = 0;
Packit 1fb8d4
			}
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		extraData = FALSE;
Packit 1fb8d4
		g_ServerWait = TRUE;
Packit 1fb8d4
		SecBuffer_in[0].BufferType = SECBUFFER_TOKEN;
Packit 1fb8d4
		SecBuffer_in[0].pvBuffer = lpTokenIn;
Packit 1fb8d4
		SecBuffer_in[0].cbBuffer = NumberOfBytesRead;
Packit 1fb8d4
		SecBuffer_in[1].BufferType = SECBUFFER_EMPTY;
Packit 1fb8d4
		SecBuffer_in[1].pvBuffer = NULL;
Packit 1fb8d4
		SecBuffer_in[1].cbBuffer = 0;
Packit 1fb8d4
		SecBufferDesc_in.ulVersion = SECBUFFER_VERSION;
Packit 1fb8d4
		SecBufferDesc_in.cBuffers = 2;
Packit 1fb8d4
		SecBufferDesc_in.pBuffers = SecBuffer_in;
Packit 1fb8d4
		SecBuffer_out[0].BufferType = SECBUFFER_TOKEN;
Packit 1fb8d4
		SecBuffer_out[0].pvBuffer = lpTokenOut;
Packit 1fb8d4
		SecBuffer_out[0].cbBuffer = cbMaxToken;
Packit 1fb8d4
		SecBufferDesc_out.ulVersion = SECBUFFER_VERSION;
Packit 1fb8d4
		SecBufferDesc_out.cBuffers = 1;
Packit 1fb8d4
		SecBufferDesc_out.pBuffers = SecBuffer_out;
Packit 1fb8d4
		status = table->AcceptSecurityContext(&credentials, SecIsValidHandle(&context) ? &context : NULL,
Packit 1fb8d4
											  &SecBufferDesc_in, fContextReq, 0, &context, &SecBufferDesc_out, &fContextAttr, &expiry);
Packit 1fb8d4
Packit 1fb8d4
		if ((status != SEC_E_OK) && (status != SEC_I_CONTINUE_NEEDED) && (status != SEC_E_INCOMPLETE_MESSAGE))
Packit 1fb8d4
		{
Packit 1fb8d4
			printf("AcceptSecurityContext unexpected status: 0x%08"PRIX32"\n", status);
Packit 1fb8d4
			return NULL;
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		NumberOfBytesWritten = 0;
Packit 1fb8d4
Packit 1fb8d4
		if (status == SEC_E_OK)
Packit 1fb8d4
			printf("AcceptSecurityContext status: SEC_E_OK\n");
Packit 1fb8d4
		else if (status == SEC_I_CONTINUE_NEEDED)
Packit 1fb8d4
			printf("AcceptSecurityContext status: SEC_I_CONTINUE_NEEDED\n");
Packit 1fb8d4
		else if (status == SEC_E_INCOMPLETE_MESSAGE)
Packit 1fb8d4
			printf("AcceptSecurityContext status: SEC_E_INCOMPLETE_MESSAGE\n");
Packit 1fb8d4
Packit 1fb8d4
		printf("Server cBuffers: %"PRIu32" pBuffers[0]: %"PRIu32" type: %"PRIu32"\n",
Packit 1fb8d4
			   SecBufferDesc_out.cBuffers, SecBufferDesc_out.pBuffers[0].cbBuffer, SecBufferDesc_out.pBuffers[0].BufferType);
Packit 1fb8d4
		printf("Server Input cBuffers: %"PRIu32" pBuffers[0]: %"PRIu32" type: %"PRIu32" pBuffers[1]: %"PRIu32" type: %"PRIu32"\n", SecBufferDesc_in.cBuffers,
Packit 1fb8d4
			   SecBufferDesc_in.pBuffers[0].cbBuffer, SecBufferDesc_in.pBuffers[0].BufferType,
Packit 1fb8d4
			   SecBufferDesc_in.pBuffers[1].cbBuffer, SecBufferDesc_in.pBuffers[1].BufferType);
Packit 1fb8d4
Packit 1fb8d4
		if (SecBufferDesc_in.pBuffers[1].BufferType == SECBUFFER_EXTRA)
Packit 1fb8d4
		{
Packit 1fb8d4
			printf("AcceptSecurityContext SECBUFFER_EXTRA\n");
Packit 1fb8d4
			pSecBuffer = &SecBufferDesc_in.pBuffers[1];
Packit 1fb8d4
			CopyMemory(lpTokenIn, &lpTokenIn[NumberOfBytesRead - pSecBuffer->cbBuffer], pSecBuffer->cbBuffer);
Packit 1fb8d4
			NumberOfBytesRead = pSecBuffer->cbBuffer;
Packit 1fb8d4
			continue;
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		if (status != SEC_E_INCOMPLETE_MESSAGE)
Packit 1fb8d4
		{
Packit 1fb8d4
			pSecBuffer = &SecBufferDesc_out.pBuffers[0];
Packit 1fb8d4
Packit 1fb8d4
			if (pSecBuffer->cbBuffer > 0)
Packit 1fb8d4
			{
Packit 1fb8d4
				printf("Server > Client (%"PRIu32")\n", pSecBuffer->cbBuffer);
Packit 1fb8d4
				winpr_HexDump("sspi.test", WLOG_DEBUG, (BYTE*) pSecBuffer->pvBuffer, pSecBuffer->cbBuffer);
Packit 1fb8d4
Packit 1fb8d4
				if (!WriteFile(g_ClientWritePipe, pSecBuffer->pvBuffer, pSecBuffer->cbBuffer, &NumberOfBytesWritten, NULL))
Packit 1fb8d4
				{
Packit 1fb8d4
					printf("failed to write to client pipe\n");
Packit 1fb8d4
					return NULL;
Packit 1fb8d4
				}
Packit 1fb8d4
			}
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		if (status == SEC_E_OK)
Packit 1fb8d4
		{
Packit 1fb8d4
			printf("Server Handshake Complete\n");
Packit 1fb8d4
			break;
Packit 1fb8d4
		}
Packit 1fb8d4
	}
Packit 1fb8d4
	while (1);
Packit 1fb8d4
Packit 1fb8d4
	do
Packit 1fb8d4
	{
Packit 1fb8d4
		if (schannel_recv(table, g_ServerReadPipe, &context) < 0)
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
	while (1);
Packit 1fb8d4
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static int dump_test_certificate_files(void)
Packit 1fb8d4
{
Packit 1fb8d4
	FILE* fp;
Packit 1fb8d4
	char* fullpath = NULL;
Packit 1fb8d4
	int ret = -1;
Packit 1fb8d4
Packit 1fb8d4
	/*
Packit 1fb8d4
	 * Output Certificate File
Packit 1fb8d4
	 */
Packit 1fb8d4
	fullpath = GetCombinedPath("/tmp", "localhost.crt");
Packit 1fb8d4
	if (!fullpath)
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit 1fb8d4
	fp = fopen(fullpath, "w+");
Packit 1fb8d4
	if (fp)
Packit 1fb8d4
	{
Packit 1fb8d4
		if (fwrite((void*) test_localhost_crt, sizeof(test_localhost_crt), 1, fp) != 1)
Packit 1fb8d4
			goto out_fail;
Packit 1fb8d4
		fclose(fp);
Packit 1fb8d4
		fp = NULL;
Packit 1fb8d4
	}
Packit 1fb8d4
	free(fullpath);
Packit 1fb8d4
Packit 1fb8d4
	/*
Packit 1fb8d4
	 * Output Private Key File
Packit 1fb8d4
	 */
Packit 1fb8d4
	fullpath = GetCombinedPath("/tmp", "localhost.key");
Packit 1fb8d4
	if (!fullpath)
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	fp = fopen(fullpath, "w+");
Packit 1fb8d4
	if (fp && fwrite((void*) test_localhost_key, sizeof(test_localhost_key), 1, fp) != 1)
Packit 1fb8d4
			goto out_fail;
Packit 1fb8d4
Packit 1fb8d4
	ret = 1;
Packit 1fb8d4
out_fail:
Packit 1fb8d4
	free(fullpath);
Packit 1fb8d4
	if (fp)
Packit 1fb8d4
		fclose(fp);
Packit 1fb8d4
	return ret;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int TestSchannel(int argc, char* argv[])
Packit 1fb8d4
{
Packit 1fb8d4
	int count;
Packit 1fb8d4
	DWORD index;
Packit 1fb8d4
	ALG_ID algId;
Packit 1fb8d4
	HANDLE thread;
Packit 1fb8d4
	BYTE* lpTokenIn;
Packit 1fb8d4
	BYTE* lpTokenOut;
Packit 1fb8d4
	TimeStamp expiry;
Packit 1fb8d4
	UINT32 cbMaxToken;
Packit 1fb8d4
	SCHANNEL_CRED cred;
Packit 1fb8d4
	UINT32 fContextReq;
Packit 1fb8d4
	ULONG fContextAttr;
Packit 1fb8d4
	CtxtHandle context;
Packit 1fb8d4
	CredHandle credentials;
Packit 1fb8d4
	SECURITY_STATUS status;
Packit 1fb8d4
	PSecPkgInfo pPackageInfo;
Packit 1fb8d4
	PSecBuffer pSecBuffer;
Packit 1fb8d4
	SecBuffer SecBuffer_in[2];
Packit 1fb8d4
	SecBuffer SecBuffer_out[1];
Packit 1fb8d4
	SecBufferDesc SecBufferDesc_in;
Packit 1fb8d4
	SecBufferDesc SecBufferDesc_out;
Packit 1fb8d4
	PSecurityFunctionTable table;
Packit 1fb8d4
	DWORD NumberOfBytesRead;
Packit 1fb8d4
	DWORD NumberOfBytesWritten;
Packit 1fb8d4
	SecPkgCred_SupportedAlgs SupportedAlgs;
Packit 1fb8d4
	SecPkgCred_CipherStrengths CipherStrengths;
Packit 1fb8d4
	SecPkgCred_SupportedProtocols SupportedProtocols;
Packit 1fb8d4
	return 0; /* disable by default - causes crash */
Packit 1fb8d4
	sspi_GlobalInit();
Packit 1fb8d4
	dump_test_certificate_files();
Packit 1fb8d4
	SecInvalidateHandle(&context);
Packit 1fb8d4
	SecInvalidateHandle(&credentials);
Packit 1fb8d4
Packit 1fb8d4
	if (!CreatePipe(&g_ClientReadPipe, &g_ClientWritePipe, NULL, 0))
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("Failed to create client pipe\n");
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (!CreatePipe(&g_ServerReadPipe, &g_ServerWritePipe, NULL, 0))
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("Failed to create server pipe\n");
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (!(thread = CreateThread(NULL, 0, schannel_test_server_thread, NULL, 0, NULL)))
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("Failed to create server thread\n");
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	table = InitSecurityInterface();
Packit 1fb8d4
	status = QuerySecurityPackageInfo(SCHANNEL_NAME, &pPackageInfo);
Packit 1fb8d4
Packit 1fb8d4
	if (status != SEC_E_OK)
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("QuerySecurityPackageInfo failure: 0x%08"PRIX32"\n", status);
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	cbMaxToken = pPackageInfo->cbMaxToken;
Packit 1fb8d4
	ZeroMemory(&cred, sizeof(SCHANNEL_CRED));
Packit 1fb8d4
	cred.dwVersion = SCHANNEL_CRED_VERSION;
Packit 1fb8d4
	cred.cCreds = 0;
Packit 1fb8d4
	cred.paCred = NULL;
Packit 1fb8d4
	cred.cSupportedAlgs = 0;
Packit 1fb8d4
	cred.palgSupportedAlgs = NULL;
Packit 1fb8d4
	cred.grbitEnabledProtocols = SP_PROT_SSL3TLS1_CLIENTS;
Packit 1fb8d4
	cred.dwFlags = SCH_CRED_NO_DEFAULT_CREDS;
Packit 1fb8d4
	cred.dwFlags |= SCH_CRED_MANUAL_CRED_VALIDATION;
Packit 1fb8d4
	cred.dwFlags |= SCH_CRED_NO_SERVERNAME_CHECK;
Packit 1fb8d4
	status = table->AcquireCredentialsHandle(NULL, SCHANNEL_NAME,
Packit 1fb8d4
			 SECPKG_CRED_OUTBOUND, NULL, &cred, NULL, NULL, &credentials, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (status != SEC_E_OK)
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("AcquireCredentialsHandle failure: 0x%08"PRIX32"\n", status);
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	ZeroMemory(&SupportedAlgs, sizeof(SecPkgCred_SupportedAlgs));
Packit 1fb8d4
	status = table->QueryCredentialsAttributes(&credentials, SECPKG_ATTR_SUPPORTED_ALGS, &SupportedAlgs);
Packit 1fb8d4
Packit 1fb8d4
	if (status != SEC_E_OK)
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("QueryCredentialsAttributes SECPKG_ATTR_SUPPORTED_ALGS failure: 0x%08"PRIX32"\n", status);
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	/**
Packit 1fb8d4
	 * SupportedAlgs: 15
Packit 1fb8d4
	 * 0x660E 0x6610 0x6801 0x6603 0x6601 0x8003 0x8004
Packit 1fb8d4
	 * 0x800C 0x800D 0x800E 0x2400 0xAA02 0xAE06 0x2200 0x2203
Packit 1fb8d4
	 */
Packit 1fb8d4
	printf("SupportedAlgs: %"PRIu32"\n", SupportedAlgs.cSupportedAlgs);
Packit 1fb8d4
Packit 1fb8d4
	for (index = 0; index < SupportedAlgs.cSupportedAlgs; index++)
Packit 1fb8d4
	{
Packit 1fb8d4
		algId = SupportedAlgs.palgSupportedAlgs[index];
Packit 1fb8d4
		printf("\t0x%08"PRIX32" CLASS: %"PRIu32" TYPE: %"PRIu32" SID: %"PRIu32"\n", algId,
Packit 1fb8d4
			   ((GET_ALG_CLASS(algId)) >> 13), ((GET_ALG_TYPE(algId)) >> 9), GET_ALG_SID(algId));
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	printf("\n");
Packit 1fb8d4
	ZeroMemory(&CipherStrengths, sizeof(SecPkgCred_CipherStrengths));
Packit 1fb8d4
	status = table->QueryCredentialsAttributes(&credentials, SECPKG_ATTR_CIPHER_STRENGTHS, &CipherStrengths);
Packit 1fb8d4
Packit 1fb8d4
	if (status != SEC_E_OK)
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("QueryCredentialsAttributes SECPKG_ATTR_CIPHER_STRENGTHS failure: 0x%08"PRIX32"\n", status);
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	/* CipherStrengths: Minimum: 40 Maximum: 256 */
Packit 1fb8d4
	printf("CipherStrengths: Minimum: %"PRIu32" Maximum: %"PRIu32"\n",
Packit 1fb8d4
		   CipherStrengths.dwMinimumCipherStrength, CipherStrengths.dwMaximumCipherStrength);
Packit 1fb8d4
	ZeroMemory(&SupportedProtocols, sizeof(SecPkgCred_SupportedProtocols));
Packit 1fb8d4
	status = table->QueryCredentialsAttributes(&credentials, SECPKG_ATTR_SUPPORTED_PROTOCOLS, &SupportedProtocols);
Packit 1fb8d4
Packit 1fb8d4
	if (status != SEC_E_OK)
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("QueryCredentialsAttributes SECPKG_ATTR_SUPPORTED_PROTOCOLS failure: 0x%08"PRIX32"\n", status);
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	/* SupportedProtocols: 0x208A0 */
Packit 1fb8d4
	printf("SupportedProtocols: 0x%08"PRIX32"\n", SupportedProtocols.grbitProtocol);
Packit 1fb8d4
	fContextReq = ISC_REQ_STREAM |
Packit 1fb8d4
				  ISC_REQ_SEQUENCE_DETECT | ISC_REQ_REPLAY_DETECT |
Packit 1fb8d4
				  ISC_REQ_CONFIDENTIALITY | ISC_RET_EXTENDED_ERROR |
Packit 1fb8d4
				  ISC_REQ_MANUAL_CRED_VALIDATION | ISC_REQ_INTEGRITY;
Packit 1fb8d4
	if (!(lpTokenIn = (BYTE*) malloc(cbMaxToken)))
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("Memory allocation failed\n");
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
	if (!(lpTokenOut = (BYTE*) malloc(cbMaxToken)))
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("Memory allocation failed\n");
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
	ZeroMemory(&SecBuffer_in, sizeof(SecBuffer_in));
Packit 1fb8d4
	ZeroMemory(&SecBuffer_out, sizeof(SecBuffer_out));
Packit 1fb8d4
	ZeroMemory(&SecBufferDesc_in, sizeof(SecBufferDesc));
Packit 1fb8d4
	ZeroMemory(&SecBufferDesc_out, sizeof(SecBufferDesc));
Packit 1fb8d4
	g_ClientWait = FALSE;
Packit 1fb8d4
Packit 1fb8d4
	do
Packit 1fb8d4
	{
Packit 1fb8d4
		if (g_ClientWait)
Packit 1fb8d4
		{
Packit 1fb8d4
			if (!ReadFile(g_ClientReadPipe, lpTokenIn, cbMaxToken, &NumberOfBytesRead, NULL))
Packit 1fb8d4
			{
Packit 1fb8d4
				printf("failed to read from server pipe\n");
Packit 1fb8d4
				return -1;
Packit 1fb8d4
			}
Packit 1fb8d4
		}
Packit 1fb8d4
		else
Packit 1fb8d4
		{
Packit 1fb8d4
			NumberOfBytesRead = 0;
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		g_ClientWait = TRUE;
Packit 1fb8d4
		printf("NumberOfBytesRead: %"PRIu32"\n", NumberOfBytesRead);
Packit 1fb8d4
		SecBuffer_in[0].BufferType = SECBUFFER_TOKEN;
Packit 1fb8d4
		SecBuffer_in[0].pvBuffer = lpTokenIn;
Packit 1fb8d4
		SecBuffer_in[0].cbBuffer = NumberOfBytesRead;
Packit 1fb8d4
		SecBuffer_in[1].pvBuffer   = NULL;
Packit 1fb8d4
		SecBuffer_in[1].cbBuffer   = 0;
Packit 1fb8d4
		SecBuffer_in[1].BufferType = SECBUFFER_EMPTY;
Packit 1fb8d4
		SecBufferDesc_in.ulVersion = SECBUFFER_VERSION;
Packit 1fb8d4
		SecBufferDesc_in.cBuffers = 2;
Packit 1fb8d4
		SecBufferDesc_in.pBuffers = SecBuffer_in;
Packit 1fb8d4
		SecBuffer_out[0].BufferType = SECBUFFER_TOKEN;
Packit 1fb8d4
		SecBuffer_out[0].pvBuffer = lpTokenOut;
Packit 1fb8d4
		SecBuffer_out[0].cbBuffer = cbMaxToken;
Packit 1fb8d4
		SecBufferDesc_out.ulVersion = SECBUFFER_VERSION;
Packit 1fb8d4
		SecBufferDesc_out.cBuffers = 1;
Packit 1fb8d4
		SecBufferDesc_out.pBuffers = SecBuffer_out;
Packit 1fb8d4
		status = table->InitializeSecurityContext(&credentials, SecIsValidHandle(&context) ? &context : NULL, _T("localhost"),
Packit 1fb8d4
				 fContextReq, 0, 0, &SecBufferDesc_in, 0, &context, &SecBufferDesc_out, &fContextAttr, &expiry);
Packit 1fb8d4
Packit 1fb8d4
		if ((status != SEC_E_OK) && (status != SEC_I_CONTINUE_NEEDED) && (status != SEC_E_INCOMPLETE_MESSAGE))
Packit 1fb8d4
		{
Packit 1fb8d4
			printf("InitializeSecurityContext unexpected status: 0x%08"PRIX32"\n", status);
Packit 1fb8d4
			return -1;
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		NumberOfBytesWritten = 0;
Packit 1fb8d4
Packit 1fb8d4
		if (status == SEC_E_OK)
Packit 1fb8d4
			printf("InitializeSecurityContext status: SEC_E_OK\n");
Packit 1fb8d4
		else if (status == SEC_I_CONTINUE_NEEDED)
Packit 1fb8d4
			printf("InitializeSecurityContext status: SEC_I_CONTINUE_NEEDED\n");
Packit 1fb8d4
		else if (status == SEC_E_INCOMPLETE_MESSAGE)
Packit 1fb8d4
			printf("InitializeSecurityContext status: SEC_E_INCOMPLETE_MESSAGE\n");
Packit 1fb8d4
Packit 1fb8d4
		printf("Client Output cBuffers: %"PRIu32" pBuffers[0]: %"PRIu32" type: %"PRIu32"\n",
Packit 1fb8d4
			   SecBufferDesc_out.cBuffers, SecBufferDesc_out.pBuffers[0].cbBuffer, SecBufferDesc_out.pBuffers[0].BufferType);
Packit 1fb8d4
		printf("Client Input cBuffers: %"PRIu32" pBuffers[0]: %"PRIu32" type: %"PRIu32" pBuffers[1]: %"PRIu32" type: %"PRIu32"\n", SecBufferDesc_in.cBuffers,
Packit 1fb8d4
			   SecBufferDesc_in.pBuffers[0].cbBuffer, SecBufferDesc_in.pBuffers[0].BufferType,
Packit 1fb8d4
			   SecBufferDesc_in.pBuffers[1].cbBuffer, SecBufferDesc_in.pBuffers[1].BufferType);
Packit 1fb8d4
Packit 1fb8d4
		if (status != SEC_E_INCOMPLETE_MESSAGE)
Packit 1fb8d4
		{
Packit 1fb8d4
			pSecBuffer = &SecBufferDesc_out.pBuffers[0];
Packit 1fb8d4
Packit 1fb8d4
			if (pSecBuffer->cbBuffer > 0)
Packit 1fb8d4
			{
Packit 1fb8d4
				printf("Client > Server (%"PRIu32")\n", pSecBuffer->cbBuffer);
Packit 1fb8d4
				winpr_HexDump("sspi.test", WLOG_DEBUG, (BYTE*) pSecBuffer->pvBuffer, pSecBuffer->cbBuffer);
Packit 1fb8d4
Packit 1fb8d4
				if (!WriteFile(g_ServerWritePipe, pSecBuffer->pvBuffer, pSecBuffer->cbBuffer, &NumberOfBytesWritten, NULL))
Packit 1fb8d4
				{
Packit 1fb8d4
					printf("failed to write to server pipe\n");
Packit 1fb8d4
					return -1;
Packit 1fb8d4
				}
Packit 1fb8d4
			}
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		if (status == SEC_E_OK)
Packit 1fb8d4
		{
Packit 1fb8d4
			printf("Client Handshake Complete\n");
Packit 1fb8d4
			break;
Packit 1fb8d4
		}
Packit 1fb8d4
	}
Packit 1fb8d4
	while (1);
Packit 1fb8d4
Packit 1fb8d4
	count = 0;
Packit 1fb8d4
Packit 1fb8d4
	do
Packit 1fb8d4
	{
Packit 1fb8d4
		if (schannel_send(table, g_ServerWritePipe, &context, test_DummyMessage, sizeof(test_DummyMessage)) < 0)
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		for (index = 0; index < sizeof(test_DummyMessage); index++)
Packit 1fb8d4
		{
Packit 1fb8d4
			BYTE b, ln, hn;
Packit 1fb8d4
			b = test_DummyMessage[index];
Packit 1fb8d4
			ln = (b & 0x0F);
Packit 1fb8d4
			hn = ((b & 0xF0) >> 4);
Packit 1fb8d4
			ln = (ln + 1) % 0xF;
Packit 1fb8d4
			hn = (ln + 1) % 0xF;
Packit 1fb8d4
			b = (ln | (hn << 4));
Packit 1fb8d4
			test_DummyMessage[index] = b;
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		Sleep(100);
Packit 1fb8d4
		count++;
Packit 1fb8d4
	}
Packit 1fb8d4
	while (count < 3);
Packit 1fb8d4
Packit 1fb8d4
	schannel_send(table, g_ServerWritePipe, &context, test_LastDummyMessage, sizeof(test_LastDummyMessage));
Packit 1fb8d4
	WaitForSingleObject(thread, INFINITE);
Packit 1fb8d4
	sspi_GlobalFinish();
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}