Ejemplo n.º 1
0
/* This code is based heavily on the example provided in "Secure Programming
 * Cookbook for C and C++".
 */
int _mosquitto_verify_certificate_hostname(X509 *cert, const char *hostname)
{
	int i;
	char name[256];
	X509_NAME *subj;
	bool have_san_dns = false;
	STACK_OF(GENERAL_NAME) *san;
	const GENERAL_NAME *nval;
	const unsigned char *data;
	unsigned char ipv6_addr[16];
	unsigned char ipv4_addr[4];
	int ipv6_ok;
	int ipv4_ok;

#ifdef WIN32
	ipv6_ok = InetPton(AF_INET6, hostname, &ipv6_addr);
	ipv4_ok = InetPton(AF_INET, hostname, &ipv4_addr);
#else
	ipv6_ok = inet_pton(AF_INET6, hostname, &ipv6_addr);
	ipv4_ok = inet_pton(AF_INET, hostname, &ipv4_addr);
#endif

	san = X509_get_ext_d2i(cert, NID_subject_alt_name, NULL, NULL);
	if(san){
		for(i=0; i<sk_GENERAL_NAME_num(san); i++){
			nval = sk_GENERAL_NAME_value(san, i);
			if(nval->type == GEN_DNS){
				data = ASN1_STRING_data(nval->d.dNSName);
				if(data && match_hostname((char *)data, hostname)){
					return 1;
				}
				have_san_dns = true;
			}else if(nval->type == GEN_IPADD){
				data = ASN1_STRING_data(nval->d.iPAddress);
				if(nval->d.iPAddress->length == 4 && ipv4_ok){
					if(!memcmp(ipv4_addr, data, 4)){
						return 1;
					}
				}else if(nval->d.iPAddress->length == 16 && ipv6_ok){
					if(!memcmp(ipv6_addr, data, 16)){
						return 1;
					}
				}
			}
		}
		if(have_san_dns){
			/* Only check CN if subjectAltName DNS entry does not exist. */
			return 0;
		}
	}
	subj = X509_get_subject_name(cert);
	if(X509_NAME_get_text_by_NID(subj, NID_commonName, name, sizeof(name)) > 0){
		name[sizeof(name) - 1] = '\0';
		if (!strcasecmp(name, hostname)) return 1;
	}
	return 0;
}
Ejemplo n.º 2
0
    bool Bind(ConnectionWrapper *Connection, std::string LocalAddress, int32_t Port)
    {
#ifdef _WIN32
        InitializeWinsock();
#endif
        if (Port < 0)
            return false;

        // Create a new socket.
        if (Connection->Handle.Datagram.Socket == nullptr)
            Connection->Handle.Datagram.Socket = (void *)socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
        if (Connection->Handle.Datagram.Socket == nullptr)
            return false;

        // Prepare an address structure.
        sockaddr_in AddressInfo;
        AddressInfo.sin_family = AF_INET;
        AddressInfo.sin_port = htons(Port);
        if (LocalAddress.size() > 1)
            InetPton(AF_INET, LocalAddress.c_str(), &AddressInfo.sin_addr);
        else
            AddressInfo.sin_addr.S_un.S_addr = INADDR_ANY;

        // Bind to the port.
        return bind((SOCKET)Connection->Handle.Datagram.Socket, (sockaddr *)&AddressInfo, sizeof(AddressInfo)) != SOCKET_ERROR;
    }
Ejemplo n.º 3
0
Void System::StringToNetAddress( NetAddress * outAddress, const GChar * strDottedFormat, NetAddressType iType ) const
{
    switch( iType ) {
        case NETADDRESS_IPv4: {
                NetAddressIPv4 * pAddr = (NetAddressIPv4*)outAddress;

                const GChar * strPort = StringFn->Find( strDottedFormat, TEXT(':') );
                DebugAssert( strPort != NULL );
                
                GChar strAddr[16];
                StringFn->NCopy( strAddr, strDottedFormat, (strPort - strDottedFormat) );
                ++strPort;

                in_addr ipAddr;
                Int iError = InetPton( AF_INET, strAddr, &ipAddr );
                DebugAssert( iError == 0 );

                Word wPort = (Word)( StringFn->ToUInt(strPort) );

                pAddr->iType = NETADDRESS_IPv4;
                pAddr->wPort = htons( wPort );
                pAddr->Addr.Value = ipAddr.S_un.S_addr;
            } break;
        case NETADDRESS_IPv6: {
                DebugAssert( false );
            } break;
        default: DebugAssert( false ); break;
    }
}
Ejemplo n.º 4
0
int main(void)
{
	WSADATA  w ;

	struct sockaddr_in si_other;
	int s, slen = sizeof(si_other);
	unsigned char data[BUFLEN];

	/* Open windows connection */
	if (WSAStartup(MAKEWORD(2, 2), &w) != 0) {
		fprintf(stderr, "could not initialise winsock\n");
		exit(0);
	}

	// create a udp socket
	if ((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) {
		die("socket create error");
	}

	// setup the target port/address
	memset((char *)&si_other, 0, sizeof(si_other));
	si_other.sin_family = AF_INET;
	si_other.sin_port = htons(PORT);


	// convert IP address string to numerical
	if (1 != InetPton(AF_INET, LIGHTS, &si_other.sin_addr)) {

		die("InetPton failed");

	}

	printf("press space to stop\n");

	// wait for a key press
	while (!_kbhit()) {

		// fill the buffer with a simple blue fade
		for (int i = 0; i < BUFLEN; i+=3) {

			data[i  ] = 0;		// red
			data[i+1] = 0;		// green
			data[i+2] = i>>1;    // blue
		}

		// send to ESP
		if (sendto(s, (const char*)data, BUFLEN, MSG_DONTROUTE, (struct sockaddr *) &si_other, slen) == -1) {
			die("couldn't sendto");
		}
	}

	//get rid of keypress (fflush)
	_getch();

	closesocket(s);

	WSACleanup();

	return 0;
}
Ejemplo n.º 5
0
	HERRCODE ChatClient::loginImpl(int type, const std::wstring& username, const std::wstring& credential)
	{
		sockaddr_in addr = { 0 };
		addr.sin_port = htons(serverPort_);
		addr.sin_family = AF_INET;
		IN_ADDR in_addr;
		InetPton(AF_INET, serverAddr_.c_str(), &in_addr);
		addr.sin_addr = in_addr;
		if (::connect(sock_, (const sockaddr*)&addr, sizeof(sockaddr_in)) != 0) {
			return H_NETWORK_ERROR;
		}

		SockStream stream;
		stream.writeInt(net::kCommandType_Login);
		stream.writeInt(0);
		stream.writeInt(type);
		stream.writeString(username);
		stream.writeString(credential);
		stream.flushSize();
		auto ret = ::send(sock_, stream.getBuf(), stream.getSize(), 0);
		if (ret == SOCKET_ERROR) {
			return H_NETWORK_ERROR;
		}
		buffer buf(200);
		int rc = ::recv(sock_, buf.data(), buf.size(), 0);
		if (rc) {
			SockStream ss(buf.data(), rc);
			assert(net::kCommandType_LoginAck == ss.getInt());
			auto size = ss.getInt();
			auto ack = ss.getInt();

			if (ack == net::kLoginAck_Succeeded) {
				email_ = username;
				authKey_ = ss.getString();
				auto hr = initSocks(sock_);
				if (hr != H_OK)
					return hr;
				return H_OK;
			} else {
				return H_AUTH_FAILED;
			}
		} else {
			return H_NETWORK_ERROR;
		}
	}
Ejemplo n.º 6
0
    bool Listen(ConnectionWrapper *Connection, std::string LocalAddress, int32_t Port)
    {
        // Streamed socket listener.
        if (Connection->Type == eConnection::STREAMED)
        {
            // Prepare an address structure.
            sockaddr_in AddressInfo;
            AddressInfo.sin_family = AF_INET;
            AddressInfo.sin_port = htons(Port);
            InetPton(AF_INET, LocalAddress.c_str(), &AddressInfo.sin_addr);

            // Bind to the address.
            if (bind((SOCKET)Connection->Handle.Streamed.Socket, (sockaddr *)&AddressInfo, sizeof(AddressInfo)) == SOCKET_ERROR)
                return false;

            // Start to listen.
            if (listen((SOCKET)Connection->Handle.Streamed.Socket, SOMAXCONN) == SOCKET_ERROR)
                return false;

            return true;
        }

        return false;
    }
double tcp_connect_overhead(bool bLoopback = 0) { //remote tcp by default
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;
	// Uses the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h 
	wVersionRequested = MAKEWORD(2, 2);
	err = WSAStartup(wVersionRequested, &wsaData);
	if (err != 0) {
#ifdef _DEBUG
		printf("WSAStartup failed with error: %d\n", err);
#endif
		return 1;
	}
	LPCTSTR targetAddr;
	struct sockaddr_in sockaddr;
	sockaddr.sin_family = AF_INET;
	sockaddr.sin_port = htons(TCP_PORT);
	if (bLoopback)
		targetAddr = TEXT(LOOPBACK_IP_ADDR);
	else
		targetAddr = TEXT(REMOTE_IP_ADDR);
	int success = InetPton(AF_INET, targetAddr, &sockaddr.sin_addr);
	if (!success) {
#ifdef _DEBUG
		printf("Error with InetPton\n");
#endif
		return -1;
	}
	__int64 iTotalTimeElapsed = 0;
	for (int i = 0; i < NUM_CONNECTS; i++) {
		SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
		if (sock == INVALID_SOCKET) {
#ifdef _DEBUG
			printf("Error with socket\n");
#endif
			return -1;
		}
		QueryPerformanceFrequency(&freq);
		QueryPerformanceCounter(&start_time_stamp);
		if (connect(sock, (struct sockaddr*)&sockaddr, sizeof(sockaddr)) == -1) {
#ifdef _DEBUG
			printf("Error with connect\n");
			printf("connect returned error: %ld\n", WSAGetLastError());
#endif
			return -1;
		}
		else { //successfully connected 
#ifdef _DEBUG
			printf("Success %d\n", i);
#endif
		}
		closesocket(sock);
		QueryPerformanceCounter(&end_time_stamp);
		iTotalTimeElapsed += time_elapsed();
	}
	WSACleanup();

	printf("total time: %I64u ms\n", iTotalTimeElapsed);
	double dtotalTime = static_cast<double>(iTotalTimeElapsed);
	return dtotalTime / NUM_CONNECTS;
}
Ejemplo n.º 8
0
/*
   Cliente
   Aplicacao simples de cliente tcp que se conecta num
   IP e PORTA passados por parametro, envia um comando ao 
   servidor e escreve na saida padrao o retorno
*/
int main(int argc, char **argv) {
   // Declaracao de variaveis
   int sockfd;
   char buf[MAXDATASIZE + 1], error[MAXDATASIZE + 1];
   char server[MAXDATASIZE + 1], server_reply[MAXDATASIZE + 1];
   struct sockaddr_in servaddr;

   // Checa a presenca do parametro de IP e Porta
   // caso ausente, fecha o programa
   if (argc != 3) {
      strcpy(error,"uso: ");
      strcat(error,argv[0]);
      strcat(error," <IPaddress> <Port>");
      perror(error);
      exit(1);
   }

   // Cria um socket
   sockfd = Socket(AF_INET, SOCK_STREAM, 0);

   // Limpa o que estiver no ponteiro do socket que representa o servidor
   // Seta o socket do servidor como IPv4 e seta a porta de conexao para a porta da aplicacao.
   bzero(&servaddr, sizeof(servaddr));
   servaddr.sin_family = AF_INET;
   servaddr.sin_port   = htons(atoi(argv[2]));
   
   // Converte o IP recebido na entrada para a forma binária da struct
   InetPton(AF_INET, argv[1], servaddr);
   
   // Conecta o socket local com o socket servidor
   Connect(sockfd, servaddr);
   
  	// Escrever IP e porta do servidor na saida padrao
   printf("Server: IP %s - Port %d\n", argv[1], atoi(argv[2]));
   
   // Coletar informacoes sobre o socket com o servidor
   servaddr = Getsockname(sockfd, servaddr);

   // Converter informacao do IP de binario para string
   // armazenar o resultado no buffer
   InetNtop(AF_INET, server, servaddr);
  	
  	// Escrever IP e porta do cliente no socket na saida padrao
  	printf("Client: IP %s - Port %d\n", server, ntohs(servaddr.sin_port));
  	
   // lê uma cadeia de caracteres do teclado
   printf("Digite um comando:\n");
   fgets(buf, MAXDATASIZE, stdin);
   
   // Imprime a linha de comando digitada pelo usuario
   printf("Linha de comando digitada: %s", buf);
   
   // envia os dados lidos ao servidor
   Write(sockfd , buf);

   // le os dados enviados pelo servidor
   Read(sockfd, server_reply);
   
   // Imprime a linha de comando devolvida pelo servidor
   printf("Linha de comando recebida: %s\n", server_reply);
   
   exit(0);
}
Ejemplo n.º 9
0
int _tmain(int argc, _TCHAR* argv[])
{
    WSADATA wsaData;
    int result;

    system("pause");

    result = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if(0 != result)
    {
        _tprintf(_T("WSAStartup error, code: %d"), WSAGetLastError());
        exit(0);
    }

    SOCKET socketForProbe = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if(INVALID_SOCKET == socketForProbe)
    {
        _tprintf(_T("socket error, code: %d"), WSAGetLastError());
        exit(0);
    }

    sockaddr_in sockaddrClient;
    memset(&sockaddrClient, 0x0, sizeof(sockaddr_in));
    sockaddrClient.sin_addr.s_addr = htonl(INADDR_ANY);
    sockaddrClient.sin_family = AF_INET;
    sockaddrClient.sin_port = htons(0);

    sockaddr_in sockaddrMulticastAddrForOnvif;
    memset(&sockaddrMulticastAddrForOnvif, 0x0, sizeof(sockaddr_in));
    InetPton(AF_INET, _T("239.255.255.250"), &sockaddrMulticastAddrForOnvif.sin_addr.s_addr);
    sockaddrMulticastAddrForOnvif.sin_family = AF_INET;
    sockaddrMulticastAddrForOnvif.sin_port = htons(3702);

    result = bind(socketForProbe, (struct sockaddr*)&sockaddrClient, sizeof(sockaddr_in));
    if(0 != result)
    {
        _tprintf(_T("bind error, code: %d"), WSAGetLastError());
        exit(0);
    }

    DWORD timeOut = 5000;

    result = setsockopt(socketForProbe, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeOut, sizeof(DWORD));
    if(0 != result)
    {
        _tprintf(_T("setsockopt error, code: %d"), WSAGetLastError());
        exit(0);
    }


    char* pProbeMessage = (char*)malloc(2048);
    if(NULL == pProbeMessage)
    {
        _tprintf(_T("malloc error"));
        exit(0);
    }

    receiveThreadParameter parameter;
    BOOL loop = TRUE;
    DWORD threadID;
    parameter.socketForProbe = &socketForProbe;
    parameter.bLoop = &loop;

    UUID uuid;
    RPC_STATUS rpcStatus = UuidCreate(&uuid);
    if(RPC_S_OK != rpcStatus)
    {
        _tprintf(_T("UuidCreate error, code: %d"), WSAGetLastError());
        exit(0);
    }

    RPC_CSTR RpcCstr;
    rpcStatus = UuidToStringA(&uuid, &RpcCstr);
    if(RPC_S_OK != rpcStatus)
    {
        _tprintf(_T("UuidCreate error, code: %d"), WSAGetLastError());
        exit(0);
    }

    result = _snprintf_s(pProbeMessage, 2048, _TRUNCATE, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:SOAP-ENC=\"http://www.w3.org/2003/05/soap-encoding\" xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\" xmlns:wsdd=\"http://schemas.xmlsoap.org/ws/2005/04/discovery\"><SOAP-ENV:Header><wsa:MessageID>urn:uuid:%s</wsa:MessageID><wsa:To SOAP-ENV:mustUnderstand=\"true\">urn:schemas-xmlsoap-org:ws:2005:04:discovery</wsa:To><wsa:Action SOAP-ENV:mustUnderstand=\"true\">http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</wsa:Action></SOAP-ENV:Header><SOAP-ENV:Body><wsdd:Probe></wsdd:Probe></SOAP-ENV:Body></SOAP-ENV:Envelope>", RpcCstr);
    if(-1 == result)
    {
        _tprintf(_T("_snprintf_s error"));
        exit(0);
    }

    rpcStatus = RpcStringFreeA(&RpcCstr);
    if(RPC_S_OK != rpcStatus)
    {
        _tprintf(_T("UuidCreate error, code: %d"), WSAGetLastError());
        exit(0);
    }

    //result = _snprintf_s(pProbeMessage, 2048, _TRUNCATE, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:SOAP-ENC=\"http://www.w3.org/2003/05/soap-encoding\" xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\" xmlns:wsdd=\"http://schemas.xmlsoap.org/ws/2005/04/discovery\"><SOAP-ENV:Header><wsa:MessageID>urn:uuid:bc9fb550-1dd1-11b2-807c-c056e3fb5481</wsa:MessageID><wsa:To SOAP-ENV:mustUnderstand=\"true\">urn:schemas-xmlsoap-org:ws:2005:04:discovery</wsa:To><wsa:Action SOAP-ENV:mustUnderstand=\"true\">http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</wsa:Action></SOAP-ENV:Header><SOAP-ENV:Body><wsdd:Probe><wsdd:Types>Device</wsdd:Types><wsdd:Scopes></wsdd:Scopes></wsdd:Probe></SOAP-ENV:Body></SOAP-ENV:Envelope>");
    //if(-1 == result)
    //{
    //    _tprintf(_T("_snprintf_s error"));
    //    exit(0);
    //}

    HANDLE hThread = CreateThread(NULL, 0, receiveThread, &parameter, 0, &threadID);
    if(NULL == hThread)
    {
        _tprintf(_T("CreateThread error, code: %d"), GetLastError());
        exit(0);
    }

    result = sendto(socketForProbe, pProbeMessage, result, 0, (sockaddr*)&sockaddrMulticastAddrForOnvif, sizeof(sockaddr_in));
    if(SOCKET_ERROR == result)
    {
        _tprintf(_T("sendto error, code: %d"), WSAGetLastError());
        exit(0);
    }


    Sleep(5000);

    loop = FALSE;

    WaitForMultipleObjects(1, &hThread, TRUE, INFINITE);

    CloseHandle(hThread);

    free(pProbeMessage);
    pProbeMessage = NULL;

    result = closesocket(socketForProbe);
    if(0 != result)
    {
        _tprintf(_T("closesocket error, code: %d"), WSAGetLastError());
        exit(0);
    }

    result = WSACleanup();
    if(0 != result)
    {
        _tprintf(_T("WSACleanup error, code: %d"), WSAGetLastError());
        exit(0);
    }

    system("pause");

    return 0;
}