Esempio n. 1
0
    int main(int argc, char** argv)
    {
        func_args args;

        StartTCP();

        args.argc = argc;
        args.argv = argv;

        InitCyaSSL();
        echoclient_test(&args);
        FreeCyaSSL();

        return args.return_code;
    }
Esempio n. 2
0
    int main(int argc, char** argv)
    {
        func_args args;

        StartTCP();

        args.argc = argc;
        args.argv = argv;

        InitCyaSSL();
#ifdef DEBUG_CYASSL
        CyaSSL_Debugging_ON();
#endif
        echoserver_test(&args);
        FreeCyaSSL();

        return args.return_code;
    }
Esempio n. 3
0
int Curl_cyassl_init(void)
{
  InitCyaSSL();

  return 1;
}
Esempio n. 4
0
int YellHttp_ExecRequest(YellHttp_Ctx *ctx, char *url)
{
	int retval;
	int i=0;
	int endi;
	int hostnamei;
	int porti = 0;
	int recvlen;
	int stop = 0;
	int headerspos = 0;
	int linenum = 0;
	int pos=0, pos2 = 0;
	char *hdrfield, *hdrval;
	struct hostent *host;
	struct sockaddr_in client_addr;
	FILE *fhttpdump;
	struct stat filestatus;
	char modifiedsincedate[512];
	char hdrstr[512];
	int send_modifiedsince_hdr = 0;
	int valid_domain_name;
	unsigned long serverip;
	char request_type[8];
	unsigned int content_len;
	int err;
	char errbuffer[80];

	if(url==NULL)return YELLHTTP_EINVAL;
	memset(ctx->url, 0, 512);
	strncpy(ctx->url, url, 511);	
	ctx->server_flags &= YELLHTTP_SRVFLAG_USRFLAGS;

	if(strncmp(ctx->url, "https", 5)==0)
	{
		#ifdef ENABLESSL
		ctx->SSL = 1;
		#else
		return YELLHTTP_ESSLDISABLED;
		#endif
		i+= 8;
	}
	else if(strncmp(ctx->url, "http", 4)==0)
	{
		ctx->SSL = 0;
		i+= 7;
	}
	else
	{
		return YELLHTTP_EINVAL;
	}
	hostnamei = i;

	memset(ctx->hostname, 0, 512);
	while(ctx->url[i]!='/' && ctx->url[i]!=':' && i<strlen(ctx->url))i++;
	if(i>255)return YELLHTTP_EINVAL;
	strncpy(ctx->hostname, &ctx->url[hostnamei], i - hostnamei);

	memset(ctx->uri, 0, 512);
	memset(ctx->portstr, 0, 8);
	ctx->port = 80;
	if(ctx->SSL)ctx->port = 443;
	if(ctx->url[i]==':')
	{
		i++;
		memset(ctx->portstr, 0, 8);
		while((ctx->url[i]>('0'-1) && ctx->url[i]<('9'+1)) && porti<8 && i<strlen(ctx->url))
		{
			ctx->portstr[porti] = ctx->url[i];
			i++;
			porti++;
		}
		sscanf(ctx->portstr, "%hd", &ctx->port);
	}
	strcpy(ctx->uri, &ctx->url[i]);
	i = strlen(ctx->uri) - 1;
	if(i==-1)
	{
		ctx->uri[0] = '/';
		i = 0;
	}
	endi = i;

	memset(ctx->filename, 0, 512);
	while(ctx->uri[i]!='/' && i>0)
	{
		if(ctx->uri[i]=='?')endi = i - 1;
		i--;
	}

	if(strcmp(&ctx->uri[i], "/")==0)
	{
		strncpy(ctx->filename, "index.html", 512);
	}
	else
	{
		i++;
		strncpy(ctx->filename, &ctx->uri[i], (endi + 1) - i);
	}

	printf("Looking up %s...\n", ctx->hostname);
	valid_domain_name = 0;
	for(hostnamei=0; hostnamei<strlen(ctx->hostname); hostnamei++)
	{
		if(ctx->hostname[hostnamei]>='A' && ctx->hostname[hostnamei]<='z')
		{
			valid_domain_name = 1;
			break;
		}
	}

	if(valid_domain_name)
	{
		if((host = gethostbyname(ctx->hostname)) == NULL)
        	{
			return YELLHTTP_EDNSRESOLV;
        	}
		serverip = *((unsigned long *) host->h_addr_list[0]);
	}
	else
	{
		serverip = inet_addr(ctx->hostname);
	}

	client_addr.sin_family = AF_INET;
	client_addr.sin_port = htons(ctx->port);
	client_addr.sin_addr.s_addr = serverip;

	ctx->sock_client = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
	if(ctx->sock_client<0)
	{
		if(ctx->sock_client == -1)
		{
			printf("Failed to create socket: %d\n", ctx->sock_client);
			return YELLHTTP_ESOCK;
		}
		else
		{
			printf("socket() returned %d, ignoring...\n", ctx->sock_client);
		}
	}
	printf("Connecting to %s...\n", ctx->hostname);
	if((retval = connect(ctx->sock_client, (struct sockaddr *)&client_addr, sizeof(client_addr)))<0)
	{
		printf("Failed: %d\n", retval);
		return YELLHTTP_ECONN;
	}

	#ifdef ENABLESSL
	SSL_METHOD* method;
	SSL_CTX* sslctx;
	SSL* ssl;
	if(ctx->SSL)
	{
		InitCyaSSL();
		CyaSSL_Debugging_ON();
		method = SSLv3_client_method();
    		if(method)sslctx = SSL_CTX_new(method);
		if(sslctx)SSL_CTX_set_verify(sslctx, SSL_VERIFY_NONE, 0);
        	if(sslctx)ssl = SSL_new(sslctx);
		if(ssl)SSL_set_fd(ssl, ctx->sock_client);
		
		if(method==NULL || sslctx==NULL || ssl==NULL)
		{
			if(method==NULL)printf("Method init failure ");
			if(method==NULL)printf("SSL ctx init failure ");
			if(method==NULL)printf("SSL init failure ");
			err = SSL_get_error(ssl, 0);
			printf("sslerr = %d, %s\n", err, ERR_error_string(err, errbuffer));
			shutdown(ctx->sock_client,0);
			close(ctx->sock_client);
			if(sslctx)SSL_CTX_free(sslctx);
     			if(ssl)SSL_free(ssl);
			FreeCyaSSL();
			return err;
		}		
		printf("Connecting to %s with SSL...\n", ctx->hostname);
     		if(SSL_connect(ssl)!=SSL_SUCCESS)
		{
			err = SSL_get_error(ssl, 0);
			printf("sslerr = %d, %s\n", err, ERR_error_string(err, errbuffer));
			shutdown(ctx->sock_client,0);
			close(ctx->sock_client);
			SSL_CTX_free(sslctx);
     			SSL_free(ssl);
			FreeCyaSSL();
			return err;
		}
	}	
	#endif

	if(stat(ctx->filename, &filestatus)==0 && !(ctx->server_flags & YELLHTTP_SRVFLAG_NOCACHE))
	{
		memset(modifiedsincedate, 0, 512);
		memset(hdrstr, 0, 512);
		YellHttp_GenDate(modifiedsincedate, filestatus.st_mtime, ctx);
		sprintf(hdrstr, "If-Modified-Since: %s\r\n", modifiedsincedate);
		send_modifiedsince_hdr = 1;
	}

	memset(request_type, 0, 8);
	if(strlen(ctx->request_type)>0)
	{
		strncpy(request_type, ctx->request_type, 8);
		if(strncmp(request_type, "HEAD", 4)==0)stop = 1;
	}
	else
	{
		strncpy(request_type, "GET", 8);
	}
	snprintf((char*)ctx->sendbuf, SENDBUFSZ, "%s %s HTTP/%s\r\nHost: %s\r\nUser-Agent: %s\r\nConnection: close\r\n",  request_type, ctx->uri, ctx->httpversion, ctx->hostname, ctx->useragent);
	
	if(send_modifiedsince_hdr)strncat((char*)ctx->sendbuf, hdrstr, SENDBUFSZ);
	if(ctx->range_end!=0)
	{
		memset(hdrstr, 0, 512);
		snprintf(hdrstr, 512, "Range: bytes=%d-%d\r\n", ctx->range_start, ctx->range_end);
		strncat((char*)ctx->sendbuf, hdrstr, SENDBUFSZ);
	}
	if(ctx->authenticated)
	{
		#ifdef ENABLESSL
		if(ctx->auth_type==1)YellHttp_GenDigestAuthHdr(ctx);
		#endif
		strncat((char*)ctx->sendbuf, ctx->authorization_header, SENDBUFSZ);
	}
	if(strncmp(ctx->request_type, "POST", 4)==0)
	{
		if(ctx->postdata && ctx->postdata>0)
		{
			snprintf(hdrstr, 512, "Content-Type: %s\r\nContent-Length: %d\r\n", ctx->content_type, ctx->postdata_length);
			strncat((char*)ctx->sendbuf, hdrstr, SENDBUFSZ);
		}
	}
	if(strlen(ctx->headers)>0)strncat((char*)ctx->sendbuf, ctx->headers, SENDBUFSZ);

	strncat((char*)ctx->sendbuf, "\r\n", SENDBUFSZ);
	printf("Sending request...\n");
	if(!ctx->SSL)
	{
		YellHttp_SendData(ctx->sock_client, ctx->sendbuf, strlen((char*)ctx->sendbuf));
	}
	else
	{
		#ifdef ENABLESSL
		SSL_write(ssl, ctx->sendbuf, strlen((char*)ctx->sendbuf));
		#endif
	}

	if(strncmp(ctx->request_type, "POST", 4)==0)
	{
		printf("Sending POST data...\n");
		if(ctx->postdata==NULL || ctx->postdata_length==0)
		{
			printf("Ctx->postdata is NULL, or postdata_length is zero.\n");
			shutdown(ctx->sock_client,0);
			close(ctx->sock_client);
			SSL_CTX_free(sslctx);
     			SSL_free(ssl);
			FreeCyaSSL();
			return YELLHTTP_EINVAL;
		}

		if(!ctx->SSL)
		{
			YellHttp_SendData(ctx->sock_client, ctx->postdata, ctx->postdata_length);
		}
		else
		{
			#ifdef ENABLESSL
			SSL_write(ssl, ctx->postdata, ctx->postdata_length);
			#endif
		}
	}

	hdrfield = (char*)malloc(512);
	hdrval = (char*)malloc(512);

	printf("Waiting for response...(Headers)\n");
	fhttpdump = fopen("httpheaders", "wb");
	if(fhttpdump==NULL)
	{
		#ifdef ENABLESSL
		if(ctx->SSL)
		{
			SSL_CTX_free(sslctx);
     			SSL_free(ssl);
			FreeCyaSSL();
		}	
		#endif
		shutdown(ctx->sock_client,0);
		close(ctx->sock_client);
		free(hdrfield);
		free(hdrval);
		return YELLHTTP_EFILE;
	}
	while(1)
	{
		if(!ctx->SSL)
		{
			recvlen = YellHttp_RecvData(ctx->sock_client, &ctx->recvbuf[headerspos], 1);
		}
		else
		{
			#ifdef ENABLESSL
			recvlen = SSL_read(ssl, &ctx->recvbuf[headerspos], 1);
			#endif
		}
		if(recvlen<=0)
		{
			stop = 1;
			break;
		}
		fwrite(&ctx->recvbuf[headerspos], 1, 1, fhttpdump);
		if(ctx->recvbuf[headerspos]==0x0a)
		{
			ctx->recvbuf[headerspos+1]=0;
			if(strlen((char*)ctx->recvbuf)<3)
			{
				headerspos = 0;
				break;
			}

			if(headerspos>4)
			{
				if(linenum==0)
				{
					sscanf((char*)&ctx->recvbuf[9], "%d", &ctx->http_status);
					memcpy(ctx->httpversion, &ctx->recvbuf[5], 3);
					printf("HTTP status: %d\n", ctx->http_status);
					if(ctx->http_status==304)stop = 1;
					if(ctx->http_status==401)
					{
						ctx->auth_requirederrors++;
					}
					else
					{
						ctx->auth_requirederrors = 0;
					}
				}
				else
				{
					memset(hdrfield, 0, 512);
					memset(hdrval, 0, 512);
					pos = 0;
					pos2 = 0;
					while(ctx->recvbuf[pos]!=':' && ctx->recvbuf[pos]!=0x0d && pos2<255)
					{
						hdrfield[pos2] = ctx->recvbuf[pos];
						pos++;
						pos2++;
					}

					if(ctx->recvbuf[pos]==':')
					{
						pos+=2;
						pos2 = 0;
						while(ctx->recvbuf[pos]!=0x0d && pos2<255)
						{
							hdrval[pos2] = ctx->recvbuf[pos];
							pos++;
							pos2++;
						}
					}

					for(i=0; i<32; i++)
					{
						if(headercb_array[i].cb==NULL)continue;
						if(strcmp(headercb_array[i].hdrfield, hdrfield)==0)
						{
							headercb_array[i].cb((char*)ctx->recvbuf, hdrfield, hdrval, ctx, headercb_array[i].usrarg);
						}
					}
				}
				linenum++;
				headerspos = 0;
				continue;
			}
		}
		headerspos++;
	}
	fclose(fhttpdump);
	free(hdrfield);
	free(hdrval);

	if(!stop)
	{
		printf("Receiving content, filename %s ...\n", ctx->filename);
		fhttpdump = fopen(ctx->filename, "wb");
		content_len = ctx->content_length;
		if(fhttpdump==NULL)
		{
			#ifdef ENABLESSL
			if(ctx->SSL)
			{
				SSL_CTX_free(sslctx);
     				SSL_free(ssl);
			FreeCyaSSL();
			}	
			#endif
			shutdown(ctx->sock_client,0);
			close(ctx->sock_client);
			return YELLHTTP_EFILE;
		}

		if(!ctx->SSL)
		{
			if(content_len)
			{
				while(content_len)
				{
					recvlen = YellHttp_RecvData(ctx->sock_client, ctx->recvbuf, RECVBUFSZ);
					fwrite(ctx->recvbuf, 1, recvlen, fhttpdump);
					content_len-= recvlen;
				}
			}
			else
			{
				while((recvlen = YellHttp_RecvData(ctx->sock_client, ctx->recvbuf, RECVBUFSZ))!=0)
				{
					fwrite(ctx->recvbuf, 1, recvlen, fhttpdump);
				}
			}
		}
		else
		{
			#ifdef ENABLESSL
			if(content_len)
			{
				while(content_len)
				{
					recvlen = SSL_read(ssl, ctx->recvbuf, RECVBUFSZ);
					fwrite(ctx->recvbuf, 1, recvlen, fhttpdump);
					content_len-= recvlen;
				}
			}
			else
			{
				while((recvlen = SSL_read(ssl, ctx->recvbuf, RECVBUFSZ))!=0)
				{
					fwrite(ctx->recvbuf, 1, recvlen, fhttpdump);
				}
			}
			#endif
		}
		fclose(fhttpdump);
	}

	#ifdef ENABLESSL
	if(ctx->SSL)
	{
		SSL_CTX_free(sslctx);
     		SSL_free(ssl);
		FreeCyaSSL();
	}	
	#endif
	shutdown(ctx->sock_client,0);
	close(ctx->sock_client);

	if((ctx->http_status>=301 && ctx->http_status<=303) && !(ctx->server_flags & YELLHTTP_SRVFLAG_DISABLEREDIR))
	{
		printf("Redirected: %s\n", ctx->redirecturl);
		return YellHttp_ExecRequest(ctx, ctx->redirecturl);
	}
	if(ctx->http_status==401 && ctx->authenticated)
	{
		if(ctx->authenticated==1)
		{
			return YellHttp_ExecRequest(ctx, url);
		}
	}
	if(ctx->http_status>=400)return -ctx->http_status;
	if(ctx->authenticated)
	{
		ctx->auth_nc++;
	}	
	return 0;
}
Esempio n. 5
0
int main(int argc, char** argv)
{
    func_args args;
    func_args server_args;

    tcp_ready ready;
    THREAD_TYPE serverThread;

    StartTCP();

    args.argc = server_args.argc = argc;
    args.argv = server_args.argv = argv;

    /* CTaoCrypt test */
    ctaocrypt_test(&args);
    if (args.return_code != 0) return args.return_code;

    /* Simple CyaSSL client server test */
    InitCyaSSL();
    InitTcpReady(&ready);
    server_args.signal = &ready;
    start_thread(server_test, &server_args, &serverThread);
    wait_tcp_ready(&server_args);

    client_test(&args);
    if (args.return_code != 0) return args.return_code;
    join_thread(serverThread);
    if (server_args.return_code != 0) return server_args.return_code;

    /* Echo input yaSSL client server test */
    start_thread(echoserver_test, &server_args, &serverThread);
    wait_tcp_ready(&server_args);
    {
        func_args echo_args;
        char* myArgv[NUMARGS];

        char argc0[32];
        char argc1[32];
        char argc2[32];

        myArgv[0] = argc0;
        myArgv[1] = argc1;
        myArgv[2] = argc2;

        echo_args.argc = NUMARGS;
        echo_args.argv = myArgv;

        strcpy(echo_args.argv[0], "echoclient");
        strcpy(echo_args.argv[1], "input");
        strcpy(echo_args.argv[2], "output");
        remove("output");

        /* make sure OK */
        echoclient_test(&echo_args);
        if (echo_args.return_code != 0) return echo_args.return_code;

#ifdef CYASSL_DTLS
        wait_tcp_ready(&server_args);
#endif
        /* send quit to echoserver */
        echo_args.argc = 2;
        strcpy(echo_args.argv[1], "quit");

        echoclient_test(&echo_args);
        if (echo_args.return_code != 0) return echo_args.return_code;
        join_thread(serverThread);
        if (server_args.return_code != 0) return server_args.return_code;
    }

    /* validate output equals input */
    {
        byte input[MD5_DIGEST_SIZE];
        byte output[MD5_DIGEST_SIZE];

        file_test("input",  input);
        file_test("output", output);
        if (memcmp(input, output, sizeof(input)) != 0)
            return -1;
    }

    FreeCyaSSL();
    FreeTcpReady(&ready);

    printf("\nAll tests passed!\n");
    return 0;
}