doubango/tinyIPSec/test/test.c
c732d49e
 #if HAVE_CRT
 #define _CRTDBG_MAP_ALLOC 
 #include <stdlib.h> 
 #include <crtdbg.h>
 #endif //HAVE_CRT
 /*
74ca6d11
 * Copyright (C) 2020, University of the Basque Country (UPV/EHU)
c732d49e
 * Contact for licensing options: <licensing-mcpttclient(at)mcopenplatform(dot)com>
 *
 * The original file was part of Open Source Doubango Framework
 * Copyright (C) 2010-2011 Mamadou Diop.
 * Copyright (C) 2012 Doubango Telecom <http://doubango.org>
 *
 * This file is part of Open Source Doubango Framework.
 *
 * DOUBANGO is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * DOUBANGO is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with DOUBANGO.
 *
 */
 
 #include "stdafx.h"
 #include "tipsec.h"
 #include "tsk_plugin.h"
 #include "tsk_debug.h"
 
 static tipsec_ipproto_t __ipproto = tipsec_ipproto_udp;
 static tsk_bool_t __use_ipv6 = tsk_false;
 static tipsec_mode_t __mode = tipsec_mode_trans;
 static tipsec_ealg_t __ealg = tipsec_ealg_aes;
 static tipsec_alg_t __alg = tipsec_alg_hmac_md5_96;
 static tipsec_proto_t __proto = tipsec_proto_esp;
 
 static const char* __addr_local = "192.168.0.37"; // overrided using command line args
 static const char* __addr_remote = "192.168.0.31"; // overrided using command line args
 static tipsec_port_t __port_local_in = 5064; // PORT_US
 static tipsec_port_t __port_local_out = 5062; // PORT_UC
 static tipsec_port_t __port_remote_in = 5068; // PORT_PS
 static tipsec_port_t __port_remote_out = 5066; // PORT_PC
 static tipsec_spi_t __spi_remote_out = 3333; // SPI_PC
 static tipsec_spi_t __spi_remote_in = 4444; // SPI_PS
 static tipsec_lifetime_t __lifetime = 1800; /* always set it to the maximum value. (Not possible to update the value after REGISTER 200OK. ) */
 
 static const char* __key_ik = "1234567890123456";
 static const char* __key_ck =	"1234567890121234";
 
 #if TIPSEC_UNDER_WINDOWS
 #include <Windows.h>
 
 static tsk_bool_t test_ipsec_is_winvista_or_later()
 {
 	/*
 	Version Number    Description
 	6.1               Windows 7     / Windows 2008 R2
 	6.0               Windows Vista / Windows 2008
 	5.2               Windows 2003 
 	5.1               Windows XP
 	5.0               Windows 2000
 	*/
 	static DWORD dwMajorVersion = -1;
 	static DWORD dwMinorVersion = -1;
 	
 	if(dwMajorVersion == -1 || dwMinorVersion == -1){
 		OSVERSIONINFO osvi;
 		ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
 		osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
 		GetVersionEx(&osvi);
 		dwMajorVersion = osvi.dwMajorVersion;
 		dwMinorVersion = osvi.dwMinorVersion;
 	}
 	
 	return (dwMajorVersion >= 6);
 }
 #else
 static tsk_bool_t test_ipsec_is_winvista_or_later() 
 {
 	return 0;
 }
 #endif
 
 #if defined(_WIN32_WCE)
 int _tmain()
 #else
 int main(int argc, const char* argv[])
 #endif
 {
 	int err = 0;
 	tsk_size_t i;
 	struct tsk_plugin_s* p_plugin = tsk_null;
 	tipsec_ctx_t* p_ctx = tsk_null;
 	static const char* __plugins_path[] = /* Visual Studio requires "Debugging" -> "Working Directory" = "$(OutDir)"  */
 	{
 		"pluginWinIPSecVista.DLL",
 		"pluginWinIPSecXP.DLL",
 		"pluginLinIPsecTools.so"
 	};
 	static const tsk_size_t __plugins_count = sizeof(__plugins_path)/sizeof(__plugins_path[0]);
 
 	#define BUF_SIZE 1024
 	char buffer[BUF_SIZE];
 
 	/* Set debug level to INFO */
 	tsk_debug_set_level(DEBUG_LEVEL_INFO);
 
 	// Command line "local_ip" "local_port_in" "local_port_out" "remote_ip"  "remote_port_in" "remote_port_out"
 	if (argc == (6 + 1)) {
 		__addr_local = argv[1];
 		__port_local_in = atoi(argv[2]);
 		__port_local_out = atoi(argv[3]);
 		__addr_remote = argv[4];
 		__port_remote_in = atoi(argv[5]);
 		__port_remote_out = atoi(argv[6]);
 	}
 
 	TSK_DEBUG_INFO("Local node=%s:%d/%d, remote node=%s:%d/%d", 
 		__addr_local, __port_local_in, __port_local_out,
 		__addr_remote, __port_remote_in, __port_remote_out);
 
 	/* Create the plugin */
 	for (i = 0; i < __plugins_count; ++i) {
 		if (tsk_plugin_file_exist(__plugins_path[i])) {
 			tipsec_plugin_register_file(__plugins_path[i], &p_plugin);
 			if (p_plugin) {
 				break;
 			}
 		}
 	}
 	if (!p_plugin) {
 		TSK_DEBUG_ERROR("Failed to create IPSec plugin");
 		err = -1; goto bail; 
 	}
 
 	/* Create the context */
 	err = tipsec_ctx_create(__ipproto, __use_ipv6, __mode, __ealg, __alg, __proto, &p_ctx);
 	if (err) {
 		goto bail;
 	}
 
 	/* Set local */
 	err = tipsec_ctx_set_local(p_ctx, __addr_local, __addr_remote, __port_local_out, __port_local_in);
 	if (err) {
 		goto bail;
 	}
 	// Dump SPIs created by the OS after calling set_local()
 	TSK_DEBUG_INFO("SPI-UC=%u, SPI-US=%u", p_ctx->spi_uc, p_ctx->spi_us);
 
 	// Enter Remote SPI in
 	TSK_DEBUG_INFO("Enter remote SPI in:");
 	if (fgets(buffer, BUF_SIZE, stdin)) {
 		if (buffer[0] != 10 && buffer[1] != 0) {
 			__spi_remote_in = strtoul (buffer, NULL, 0);
 		}
 	}
 
 	// Enter Remote SPI out
 	TSK_DEBUG_INFO("Enter remote SPI out:");
 	if (fgets(buffer, BUF_SIZE, stdin)) {
 		if (buffer[0] != 10 && buffer[1] != 0) {
 			__spi_remote_out = strtoul (buffer, NULL, 0);
 		}
 	}
 
 	TSK_DEBUG_INFO("SPI remote %u/%u", __spi_remote_in, __spi_remote_out);
 
 	/* Set remote */
 	err = tipsec_ctx_set_remote(p_ctx, __spi_remote_out, __spi_remote_in, __port_remote_out, __port_remote_in, __lifetime);
 	if (err) {
 		goto bail;
 	}
 
 	/* Set Integrity (IK) and Confidentiality (CK) keys */
 	err = tipsec_ctx_set_keys(p_ctx, __key_ik, __key_ck);
 	if (err) {
 		goto bail;
 	}
 
 	/* Start (Setup) the SAs */
 	err = tipsec_ctx_start(p_ctx);
 	if (err) {
 		goto bail;
 	}
 
 	TSK_DEBUG_INFO("!!! IPSec SAs started (Press any key to stop) !!!");
 
 	/* Wait */
 	getchar();
 
 bail:
 	// Stop the SAs, cleanup and destroy the context
 	TSK_OBJECT_SAFE_FREE(p_ctx); // must destroy the contect before unloading the plugin (*.DLL or *.SO)
 	
 	// Unregister the plugin and close the file handle
 	if (p_plugin) {
 		tipsec_plugin_unregister_file(p_plugin);
 		TSK_OBJECT_SAFE_FREE(p_plugin);
 	}
 	return err;
 }