diff --git a/doc/examples/Makefile.am b/doc/examples/Makefile.am index 9a19409..0a26ce7 100644 --- a/doc/examples/Makefile.am +++ b/doc/examples/Makefile.am @@ -55,7 +55,9 @@ noinst_PROGRAMS += ex-cxx endif if ENABLE_ANON -noinst_PROGRAMS += ex-client1 ex-serv-anon +ex_serv_anon_parse_SOURCES = ex-serv-anon-parse.c prsrserv.c scnrserv.c scanprse.h +ex_client1_parse_SOURCES = ex-client1-parse.c prsrclnt.c scnrclnt.c scanprse.h +noinst_PROGRAMS += ex-client1 ex-serv-anon ex-client1-parse ex-serv-anon-parse noinst_PROGRAMS += ex-client-tlsia endif @@ -79,3 +81,51 @@ noinst_LTLIBRARIES = libexamples.la libexamples_la_SOURCES = examples.h ex-alert.c ex-pkcs12.c \ ex-session-info.c ex-x509-info.c ex-verify.c \ tcp.c ex-cert-select-pkcs11.c + +prsrserv.c prsrserv.h : prsrserv.y scnrserv.h + $(YACC) --debug -d -o prsrserv.c $< + +prsrserv.o: prsrserv.c prsrserv.h scnrserv.h scanprse.h + $(CC) -c -o $@ $< + +scnrserv.o: scnrserv.c scnrserv.h prsrserv.h scanprse.h + $(CC) -c -o $@ $< + +scnrserv.c scnrserv.h : scnrserv.l + $(LEX) -o scnrserv.c $< + +prsrclnt.c prsrclnt.h : prsrclnt.y scnrclnt.h + $(YACC) --debug -d -o prsrclnt.c $< + +prsrclnt.o: prsrclnt.c prsrclnt.h scnrclnt.h scanprse.h + $(CC) -c -o $@ $< + +scnrclnt.o: scnrclnt.c scnrclnt.h prsrclnt.h + $(CC) -c -o $@ $< + +scnrclnt.c scnrclnt.h : scnrclnt.l + $(LEX) -o scnrclnt.c $< + +.PHONY: ttest + +ttest: ex-serv-anon-parse ex-client1-parse + +.PHONY: run-s + +run-s: ex-serv-anon-parse + ex-serv-anon-parse + +.PHONY: run-c + +run-c: ex-client1-parse + ex-client1-parse + + +.PHONY: query + +query: + @echo "LEX == $(LEX)" + @echo "YACC == $(YACC)" + + + diff --git a/doc/examples/ex-client1-parse.c b/doc/examples/ex-client1-parse.c new file mode 100644 index 0000000..ad8d38b --- /dev/null +++ b/doc/examples/ex-client1-parse.c @@ -0,0 +1,174 @@ +/* ex-client1-parse.c */ +/* Created by Laurence D. Finston (LDF) Fri Jul 30 13:16:38 CEST 2010 */ + +/* Copied from ex-client1.c and modified. LDF 2010.07.30. */ + + +/* This example code is placed in the public domain. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + + +#include "scanprse.h" + +#include "prsrclnt.h" +#include "scnrclnt.h" + + +/* A very basic TLS client, with anonymous authentication. + */ + + +#if 0 +#define MSG "GET / HTTP/1.0\r\n\r\n" +#else +#define MSG "Client Finished\r\n\r\n" +#endif + +extern int tcp_connect (void); +extern void tcp_close (int sd); + +int +zzparse(yyscan_t parameter); + +int +main (void) +{ + int ret, sd, ii; + gnutls_session_t session; + char buffer[MAX_BUF + 1]; + gnutls_anon_client_credentials_t anoncred; + /* Need to enable anonymous KX specifically. */ + + int status = 0; + + gnutls_global_init (); + + gnutls_anon_allocate_client_credentials (&anoncred); + + /* Initialize TLS session + */ + gnutls_init (&session, GNUTLS_CLIENT); + + /* Use default priorities */ + gnutls_priority_set_direct (session, "PERFORMANCE:+ANON-DH:!ARCFOUR-128", + NULL); + + /* put the anonymous credentials to the current session + */ + gnutls_credentials_set (session, GNUTLS_CRD_ANON, anoncred); + + /* connect to the peer + */ + sd = tcp_connect (); + + gnutls_transport_set_ptr (session, (gnutls_transport_ptr_t) sd); + + /* Perform the TLS handshake + */ + ret = gnutls_handshake (session); + + if (ret < 0) + { + fprintf (stderr, "*** Handshake failed\n"); + gnutls_perror (ret); + goto end; + } + else + { + printf ("- Handshake was completed\n"); + } + + gnutls_record_send (session, MSG, strlen (MSG)); + + + /* Added. LDF 2010.07.30. */ + + struct parameter_type param; + + param.peer_finished = 0; + + yyscan_t parameter; + + zzlex_init(¶meter); + + zzset_extra(¶m, parameter); + + YY_BUFFER_STATE zz_buffer_state; + + /* End of added code. LDF 2010.07.30. */ + + + + for (;;) + { + memset (buffer, 0, MAX_BUF + 1); + ret = gnutls_record_recv (session, buffer, MAX_BUF); + + if (ret == 0) + { + printf ("\n- Peer has closed the GnuTLS connection\n"); + break; + } + else if (ret < 0) + { + fprintf (stderr, "\n*** Received corrupted " + "data(%d). Closing the connection.\n\n", ret); + break; + } + else if (ret > 0) + { + + zz_buffer_state = zz_scan_string(buffer, parameter); + + status = zzparse(parameter); + + printf("In `main': `zzparse' returned %d\n", status); + + if (status != 0) + { + printf("Breaking.\n"); + break; + } + + else + { + printf("parameter.str == \"%s\"\n", param.str); + printf("Sending to server.\n"); + strcpy(buffer, param.str); + gnutls_record_send (session, buffer, strlen (buffer)); + + if (param.peer_finished > 0) + break; + + } + + + } + } + + gnutls_bye (session, GNUTLS_SHUT_RDWR); + +end: + + tcp_close (sd); + + gnutls_deinit (session); + + gnutls_anon_free_client_credentials (anoncred); + + gnutls_global_deinit (); + + return 0; +} diff --git a/doc/examples/ex-serv-anon-parse.c b/doc/examples/ex-serv-anon-parse.c new file mode 100644 index 0000000..3888d11 --- /dev/null +++ b/doc/examples/ex-serv-anon-parse.c @@ -0,0 +1,238 @@ +/* ex-serv-anon-parse.c */ +/* Created by Laurence D. Finston (LDF) Fri Jul 30 13:15:49 CEST 2010 */ + +/* Copied from ex-serv-anon.c and modified. LDF 2010.07.30. */ + +/* This example code is placed in the public domain. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Added. LDF 2010.07.30. */ + +#include "prsrserv.h" +#include "scnrserv.h" +#include "scanprse.h" + +/* End of added code. LDF 2010.07.30. */ + +/* This is a sample TLS 1.0 echo server, for anonymous authentication only. + */ + + +#define SA struct sockaddr +#define SOCKET_ERR(err,s) if(err==-1) {perror(s);return(1);} + +#define PORT 5556 /* listen to 5556 port */ +#define DH_BITS 1024 + + + +int +yyparse(yyscan_t parameter); + + + +/* These are global */ +gnutls_anon_server_credentials_t anoncred; + +static gnutls_session_t +initialize_tls_session (void) +{ + gnutls_session_t session; + + gnutls_init (&session, GNUTLS_SERVER); + + gnutls_priority_set_direct (session, "NORMAL:+ANON-DH", NULL); + + gnutls_credentials_set (session, GNUTLS_CRD_ANON, anoncred); + + gnutls_dh_set_prime_bits (session, DH_BITS); + + return session; +} + +static gnutls_dh_params_t dh_params; + +static int +generate_dh_params (void) +{ + + /* Generate Diffie-Hellman parameters - for use with DHE + * kx algorithms. These should be discarded and regenerated + * once a day, once a week or once a month. Depending on the + * security requirements. + */ + gnutls_dh_params_init (&dh_params); + gnutls_dh_params_generate2 (dh_params, DH_BITS); + + return 0; +} + +int +main (void) +{ + int err, listen_sd; + int sd, ret; + struct sockaddr_in sa_serv; + struct sockaddr_in sa_cli; + int client_len; + char topbuf[512]; + gnutls_session_t session; + char buffer[MAX_BUF + 1]; + int optval = 1; + + int status = 0; + + /* this must be called once in the program + */ + gnutls_global_init (); + + gnutls_anon_allocate_server_credentials (&anoncred); + + generate_dh_params (); + + gnutls_anon_set_server_dh_params (anoncred, dh_params); + + /* Socket operations + */ + listen_sd = socket (AF_INET, SOCK_STREAM, 0); + SOCKET_ERR (listen_sd, "socket"); + + memset (&sa_serv, '\0', sizeof (sa_serv)); + sa_serv.sin_family = AF_INET; + sa_serv.sin_addr.s_addr = INADDR_ANY; + sa_serv.sin_port = htons (PORT); /* Server Port number */ + + setsockopt (listen_sd, SOL_SOCKET, SO_REUSEADDR, (void *) &optval, + sizeof (int)); + + err = bind (listen_sd, (SA *) & sa_serv, sizeof (sa_serv)); + SOCKET_ERR (err, "bind"); + err = listen (listen_sd, 1024); + SOCKET_ERR (err, "listen"); + + printf ("Server ready. Listening to port '%d'.\n\n", PORT); + + client_len = sizeof (sa_cli); + + /* Added. LDF 2010.07.30. */ + + struct parameter_type param; + + param.peer_finished = 0; + + yyscan_t parameter; + + yylex_init(¶meter); + + yyset_extra(¶m, parameter); + + YY_BUFFER_STATE yy_buffer_state; + + /* End of added code. LDF 2010.07.30. */ + + for (;;) + { + session = initialize_tls_session (); + + sd = accept (listen_sd, (SA *) & sa_cli, &client_len); + + printf ("- connection from %s, port %d\n", + inet_ntop (AF_INET, &sa_cli.sin_addr, topbuf, + sizeof (topbuf)), ntohs (sa_cli.sin_port)); + + gnutls_transport_set_ptr (session, (gnutls_transport_ptr_t) sd); + ret = gnutls_handshake (session); + if (ret < 0) + { + close (sd); + gnutls_deinit (session); + fprintf (stderr, "*** Handshake has failed (%s)\n\n", + gnutls_strerror (ret)); + continue; + } + printf ("- Handshake was completed\n"); + + /* see the Getting peer's information example */ + /* print_info(session); */ + + for (;;) + { + memset (buffer, 0, MAX_BUF + 1); + ret = gnutls_record_recv (session, buffer, MAX_BUF); + + if (ret == 0) + { + printf ("\n- Peer has closed the GnuTLS connection\n"); + break; + } + else if (ret < 0) + { + fprintf (stderr, "\n*** Received corrupted " + "data(%d). Closing the connection.\n\n", ret); + break; + } + else if (ret > 0) + { + + yy_buffer_state = yy_scan_string(buffer, parameter); + + status = yyparse(parameter); + + printf("In `main': `yyparse' returned %d\n", status); + + if (status != 0) + { + printf("Breaking.\n"); + break; + } + + else + { + printf("parameter.str == \"%s\"\n", param.str); + printf("Sending to client.\n"); + strcpy(buffer, param.str); + gnutls_record_send (session, buffer, strlen (buffer)); + } + + } + } + printf ("\n"); + + + /* do not wait for the peer to close the connection. + */ + + + gnutls_bye (session, GNUTLS_SHUT_WR); + + + close (sd); + gnutls_deinit (session); + + } + + yylex_destroy(parameter); + + close (listen_sd); + + gnutls_anon_free_server_credentials (anoncred); + + gnutls_global_deinit (); + + return 0; + +} diff --git a/doc/examples/prsrclnt.y b/doc/examples/prsrclnt.y new file mode 100644 index 0000000..2754e61 --- /dev/null +++ b/doc/examples/prsrclnt.y @@ -0,0 +1,113 @@ +/* prsrclnt.y */ +/* Created by Laurence D. Finston (LDF) Fri Jul 30 13:54:08 2010 +0200 */ + +%{ + + +#include +#include +#include +#include +#include + +#include "scanprse.h" + +#include "prsrclnt.h" +#include "scnrclnt.h" + + + +int +zzlex(YYSTYPE*lvalp,yyscan_t parameter); + +int +zzwrap(yyscan_t parameter); + +int +zzerror(void*v,char const*s); + +%} + + +%verbose +%pure-parser +%parse-param {yyscan_t parameter} +%lex-param {yyscan_t parameter} +%name-prefix="zz" +%debug + +%union { + +int int_value; +unsigned int uint_value; +float float_value; +char string_value[256]; + +} + + +%token HYPHEN_ZZ +%token COLON_ZZ +%token SEMI_COLON_ZZ +%token EXCLAMATION_POINT_ZZ +%token END_ZZ +%token RECEIVE_ZZ +%token SUCCEEDED_ZZ +%token FAILED_ZZ +%token STRING_ZZ +%token SERVER_FINISHED_ZZ +%token CLIENT_ZZ +%token SERVER_ZZ +%token SENDING_ZZ +%token USER_ZZ +%token INTEGER_ZZ +%token UNSIGNED_INTEGER_ZZ +%token FLOAT_ZZ + + +%% + + +program: statement_list END_ZZ +{ + printf("In `zzparse': program: statement_list END_ZZ\n"); + + struct parameter_type *param = (struct parameter_type *) zzget_extra(parameter); + + printf("param->str == %s\n", param->str); + +#if 0 + printf("Type to continue.\n"); + getchar(); +#endif + + return 0; + +}; + + + + + + +statement_list: /* Empty */ +{ +}; + +statement_list: statement_list statement +{ + +}; + +statement: SERVER_FINISHED_ZZ +{ + printf("In `zzparse': program: statement_list END_ZZ\n"); + struct parameter_type *param = (struct parameter_type *) zzget_extra(parameter); + strcpy(param->str, "Client Finished"); + + param->peer_finished = 1; + + + +}; + diff --git a/doc/examples/prsrserv.y b/doc/examples/prsrserv.y new file mode 100644 index 0000000..f39ac41 --- /dev/null +++ b/doc/examples/prsrserv.y @@ -0,0 +1,111 @@ +/* prsrserv.y */ +/* Created by Laurence D. Finston (LDF) Fri Jul 30 13:53:00 2010 +0200 */ + + +%{ + + +#include +#include +#include +#include +#include + +#include "prsrserv.h" +#include "scnrserv.h" + +#include "scanprse.h" + +int +yylex(YYSTYPE*lvalp,yyscan_t parameter); + +int +yywrap(yyscan_t parameter); + +int +yyerror(void*v,char const*s); + +%} + + +%verbose +%pure-parser +%parse-param {yyscan_t parameter} +%lex-param {yyscan_t parameter} +%debug + +%union { + +int int_value; +unsigned int uint_value; +float float_value; +char string_value[256]; + +} + + +%token HYPHEN_YY +%token COLON_YY +%token SEMI_COLON_YY +%token EXCLAMATION_POINT_YY +%token END_YY +%token RECEIVE_YY +%token SUCCEEDED_YY +%token FAILED_YY +%token STRING_YY +%token CLIENT_FINISHED_YY +%token CLIENT_YY +%token SENDING_YY +%token SHOW_YY +%token USER_YY +%token SET_YY +%token INTEGER_YY +%token UNSIGNED_INTEGER_YY +%token FLOAT_YY + +%% + + + + + + + +program: statement_list END_YY +{ + printf("In `yyparse': program: statement_list END_YY\n"); + + + struct parameter_type *param = (struct parameter_type *) yyget_extra(parameter); + + printf("param->str == %s\n", param->str); + +#if 0 + printf("Type to continue.\n"); + getchar(); +#endif + + return 0; + +}; + +statement_list: /* Empty */ +{ +}; + +statement_list: statement_list statement +{ + +}; + +statement: CLIENT_FINISHED_YY +{ + printf("In `yyparse': statement: CLIENT_FINISHED_YY\n"); + struct parameter_type *param = (struct parameter_type *) yyget_extra(parameter); + strcpy(param->str, "Server Finished"); + + param->peer_finished = 1; + + +}; + diff --git a/doc/examples/scanprse.h b/doc/examples/scanprse.h new file mode 100644 index 0000000..654fe8a --- /dev/null +++ b/doc/examples/scanprse.h @@ -0,0 +1,12 @@ +/* scanprse.h */ +/* Created by Laurence D. Finston (LDF) Fri Jul 30 14:54:24 CEST 2010 */ + +#define MAX_BUF 1024 + +struct parameter_type /* Added. LDF 2010.07.30. */ +{ + int peer_finished; + char str[MAX_BUF + 1]; + +}; + diff --git a/doc/examples/scnrclnt.l b/doc/examples/scnrclnt.l new file mode 100644 index 0000000..4bb0751 --- /dev/null +++ b/doc/examples/scnrclnt.l @@ -0,0 +1,299 @@ +/* scnrclnt.l */ +/* Created by Laurence D. Finston (LDF) Fri Jul 30 13:54:20 2010 +0200 */ + + +%{ + + + + +#include +#include + +#include +#include + +#include + +#include "scanprse.h" + +#include "prsrclnt.h" + + +%} + + + +%option header-file="scnrclnt.h" +%option bison-bridge +%option reentrant +%option prefix="zz" + +%% + +%{ + + + +int DEBUG_SCANNER= 0; + + + + + + + + + +%} + + + + + + + + + + + + +[[:space:]]+ { + +} + + + + + + +\<[[:space:]]*\> { + + +} + + + + + +\"[[:space:]]*\" { + + +} + + + + + +#.*$ { + + +} + + + + + + + + + + + + + + + +END { + + +return END_ZZ; + +} + + + + + +"Server Finished" { + + +return SERVER_FINISHED_ZZ; + +} + + + + + +SERVER { + + +return SERVER_ZZ; + +} + + + + + +SENDING { + + +return SENDING_ZZ; + +} + + + + + +RECEIVE { + + +return RECEIVE_ZZ; + +} + + + + + +SUCCEEDED { + + +return SUCCEEDED_ZZ; + +} + + + + + +FAILED { + + +return FAILED_ZZ; + +} + + + + +USER { + + +return USER_ZZ; + +} + + + + + + +[0-9][0-9]* { + + +sscanf(yytext,"%d",&yylval->int_value); + +return INTEGER_ZZ; + +} + + + + + +[[:alnum:]./=;:address@hidden:alnum:]./:;address@hidden { + + +strcpy(yylval->string_value,yytext); +return STRING_ZZ; + + +} + + + + + +\<[[:alnum:]./;:address@hidden:blank:][:alnum:]./;:address@hidden> { + + +return STRING_ZZ; + +} + + + + + + +\"[[:alnum:].;:/address@hidden:blank:][:alnum:]./;:address@hidden" { + +return STRING_ZZ; + +} + + + + + +<> { + +return END_ZZ; + +} + + + + + +. { + + +} + + + + + + + +%% + + +int +zzwrap(yyscan_t parameter) +{ +return 1; +} + +int +zzerror(void*v,char const*s) +{ +return 0; +} + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/examples/scnrserv.l b/doc/examples/scnrserv.l new file mode 100644 index 0000000..8563081 --- /dev/null +++ b/doc/examples/scnrserv.l @@ -0,0 +1,272 @@ +/* scnrserv.l */ +/* Created by Laurence D. Finston (LDF) Fri Jul 30 13:52:51 2010 +0200 */ + + +%{ + + + + +#include +#include + +#include +#include + +#include + +#include "scanprse.h" + +#include "prsrserv.h" + +%} + + + +%option header-file="scnrserv.h" +%option bison-bridge +%option reentrant + +%% +%{ + + + + +int DEBUG_SCANNER= 0; + + + + + + + + + +%} + + + + + + + + + + + + +[[:space:]]+ { + +} + + + + + + +\<[[:space:]]*\> { + + +} + + + + + +\"[[:space:]]*\" { + + +} + + + + + +#.*$ { + + +} + + + + + +END { + + +return END_YY; + +} + +"Client Finished" { + + +return CLIENT_FINISHED_YY; + +} + + +CLIENT { + + +return CLIENT_YY; + +} + + +SENDING { + + +return SENDING_YY; + +} + + + + + +RECEIVE { + + +return RECEIVE_YY; + +} + + +SUCCEEDED { + + +return SUCCEEDED_YY; + +} + + + + + +FAILED { + + +return FAILED_YY; + +} + + + + + +USER { + + +return USER_YY; + +} + + + +[0-9][0-9]* { + + +sscanf(yytext,"%d",&yylval->int_value); + +return INTEGER_YY; + +} + + + + + +[[:alnum:]./=;:address@hidden:alnum:]./:;address@hidden { + + +strcpy(yylval->string_value,yytext); +return STRING_YY; + + +} + + + + + +\<[[:alnum:]./;:address@hidden:blank:][:alnum:]./;:address@hidden> { + + +return STRING_YY; + +} + + + + + + +\"[[:alnum:].;:/address@hidden:blank:][:alnum:]./;:address@hidden" { + +return STRING_YY; + +} + + + + + +<> { + +return END_YY; + +} + + + + + +. { + + +} + + + + + + + +%% + + +int +yywrap(yyscan_t parameter) +{ +return 1; +} + +int +yyerror(void*v,char const*s) +{ +return 0; +} + + + + + + + + + + + + + + + + + + + + + +