// testi2.cpp : Defines the entry point for the application. // #define FD_SETSIZE 5000 #include "stdafx.h" #include "resource.h" #include #include extern "C" { #define FD_SETSIZE 5000 #include "silcincludes.h" #include "clientlibincludes.h" } #define MAX_LOADSTRING 100 // Global Variables: HINSTANCE hInst; // current instance TCHAR szTitle[MAX_LOADSTRING]; // The title bar text TCHAR szWindowClass[MAX_LOADSTRING]; // The title bar text // Foward declarations of functions included in this code module: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM); void silc_op_say(SilcClient client, SilcClientConnection conn, SilcClientMessageType type, char *msg, ...) { va_list vp; char message[2048]; memset(message, 0, sizeof(message)); strncat(message, "\n*** ", 5); va_start(vp, msg); vsprintf(message + 5, msg, vp); va_end(vp); MessageBox( NULL, (char *)message, "say", MB_OK | MB_ICONINFORMATION ); } void silc_notify(SilcClient client, SilcClientConnection conn, SilcNotifyType type, ...) { } void silc_connect(SilcClient client, SilcClientConnection conn, int success) { } int silc_auth_meth(SilcClient client, SilcClientConnection conn, char *hostname, SilcUInt16 port, SilcProtocolAuthMeth *auth_meth, unsigned char **auth_data, SilcUInt32 *auth_data_len) { *auth_meth = SILC_AUTH_NONE; return TRUE; } void silc_verify_public_key(SilcClient client, SilcClientConnection conn, SilcSocketType conn_type, unsigned char *pk, SilcUInt32 pk_len, SilcSKEPKType pk_type, SilcVerifyPublicKey completion, void *context) { completion(TRUE, context); } void silc_command_reply(SilcClient client, SilcClientConnection conn, SilcCommandPayload cmd_payload, int success, SilcCommand command, SilcCommandStatus status, ...) { } /* SILC client operations */ SilcClientOperations ops = { silc_op_say, NULL, NULL, silc_notify, NULL, silc_command_reply, silc_connect, NULL, silc_auth_meth, silc_verify_public_key, }; SILC_TASK_CALLBACK(connect_client) { SilcClient client = (SilcClient)context; silc_client_connect_to_server(client, 1334, "leevi.kuo.fi.ssh.com", NULL); } void silc_log(char *message) { } void silc_debugl(char *file, char *function, int line, char *message) { char m[5000]; memcpy(m, message, strlen(message)); m[strlen(message)] = '\n'; m[strlen(message) + 1] = 0; OutputDebugString(m); } void silc_hexdumpl(char *file, char *function, int line, unsigned char *data_in, SilcUInt32 data_len, char *message) { int i, k; int off, pos, count; unsigned char *data = (unsigned char *)data_in; char m[10000], *cp; int len = data_len; // memset(m, 0, sizeof(m)); cp = m; snprintf(cp, 10000, "%s:%d: %s\n", function, line, message); cp += strlen(cp); k = 0; off = len % 16; pos = 0; count = 16; while (1) { if (off) { if ((len - pos) < 16 && (len - pos <= len - off)) count = off; } else { if (pos == len) count = 0; } if (off == len) count = len; if (count) { snprintf(cp, sizeof(m), "%08X ", k++ * 16); cp += strlen(cp); } for (i = 0; i < count; i++) { snprintf(cp, sizeof(m), "%02X ", data[pos + i]); cp += strlen(cp); if ((i + 1) % 4 == 0) { snprintf(cp, sizeof(m), " "); cp += strlen(cp); } } if (count && count < 16) { int j; for (j = 0; j < 16 - count; j++) { snprintf(cp, sizeof(m), " "); cp += strlen(cp); if ((j + count + 1) % 4 == 0) { snprintf(cp, sizeof(m), " "); cp += strlen(cp); } } } for (i = 0; i < count; i++) { char ch; if (data[pos] < 32 || data[pos] >= 127) ch = '.'; else ch = data[pos]; snprintf(cp, sizeof(m), "%c", ch); cp += strlen(cp); pos++; } if (count) { snprintf(cp, sizeof(m), "\n"); cp += strlen(cp); } if (count < 16) break; } OutputDebugString(m); MessageBox( NULL, (char *)m, "hexdump", MB_OK | MB_ICONINFORMATION ); } static int silc_create_key_pair(char *pkcs_name, int bits, char *path, char *identifier, SilcPublicKey *ret_pub_key, SilcPrivateKey *ret_prv_key) { SilcPKCS pkcs; SilcPublicKey pub_key; SilcPrivateKey prv_key; SilcRng rng; unsigned char *key; SilcUInt32 key_len; char pkfile[256], prvfile[256]; if (!pkcs_name || !path) return FALSE; if (!bits) bits = 1024; rng = silc_rng_alloc(); silc_rng_init(rng); silc_rng_global_init(rng); /* Generate keys */ silc_pkcs_alloc((const unsigned char *)pkcs_name, &pkcs); pkcs->pkcs->init(pkcs->context, bits, rng); /* Save public key into file */ key = silc_pkcs_get_public_key(pkcs, &key_len); pub_key = silc_pkcs_public_key_alloc(pkcs->pkcs->name, identifier, key, key_len); *ret_pub_key = pub_key; memset(key, 0, sizeof(key_len)); silc_free(key); /* Save private key into file */ key = silc_pkcs_get_private_key(pkcs, &key_len); prv_key = silc_pkcs_private_key_alloc(pkcs->pkcs->name, key, key_len); *ret_prv_key = prv_key; memset(key, 0, sizeof(key_len)); silc_free(key); silc_rng_free(rng); silc_pkcs_free(pkcs); return TRUE; } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // TODO: Place code here. MSG msg; HACCEL hAccelTable; HANDLE h; HANDLE handles[100]; SOCKET s; unsigned int k; WSAEVENT e, e2, e3; int ret; DWORD ready; HMODULE mod; // Initialize global strings LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_TESTI2, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); // Perform application initialization: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_TESTI2); { SilcSchedule sched; SilcClient client; silc_net_win32_init(); client = silc_client_alloc(&ops, NULL, NULL, "SILC-1.0-0.5.1"); client->realname = "pekka riikonen"; client->username = "priikone"; client->hostname = "leevi.kuo.fi.ssh.com"; silc_cipher_register_default(); silc_pkcs_register_default(); silc_hash_register_default(); silc_hmac_register_default(); silc_debug = TRUE; silc_log_set_debug_callbacks(silc_debugl, silc_hexdumpl); silc_create_key_pair("rsa", 1024, "kk", "UN=priikone, HN=pelle.kuo.fi.ssh.com", &client->public_key, &client->private_key); silc_client_init(client); silc_schedule_task_add(client->schedule, 0, connect_client, client, 0, 1, SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL); silc_client_run(client); } return msg.wParam; } // // FUNCTION: MyRegisterClass() // // PURPOSE: Registers the window class. // // COMMENTS: // // This function and its usage is only necessary if you want this code // to be compatible with Win32 systems prior to the 'RegisterClassEx' // function that was added to Windows 95. It is important to call this function // so that the application will get 'well formed' small icons associated // with it. // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_TESTI2); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = (LPCSTR)IDC_TESTI2; wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); return RegisterClassEx(&wcex); } // // FUNCTION: InitInstance(HANDLE, int) // // PURPOSE: Saves instance handle and creates main window // // COMMENTS: // // In this function, we save the instance handle in a global variable and // create and display the main program window. // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; // Store instance handle in our global variable hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), 0, // Default language (LPTSTR) &lpMsgBuf, 0, NULL ); // Process any inserts in lpMsgBuf. // ... // Display the string. MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION ); // Free the buffer. LocalFree( lpMsgBuf ); return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } // // FUNCTION: WndProc(HWND, unsigned, WORD, LONG) // // PURPOSE: Processes messages for the main window. // // WM_COMMAND - process the application menu // WM_PAINT - Paint the main window // WM_DESTROY - post a quit message and return // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; TCHAR szHello[MAX_LOADSTRING]; LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING); switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: Add any drawing code here... RECT rt; GetClientRect(hWnd, &rt); DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER); EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // Mesage handler for about box. LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return TRUE; } break; } return FALSE; }