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

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