1 
2 #ifdef HAVE_CONFIG_H
3 # include <config.h>
4 #endif
5 
6 #include <gwenhywfar/syncio_socket.h>
7 #include <gwenhywfar/syncio_tls.h>
8 #include <gwenhywfar/buffer.h>
9 
10 #include <unistd.h>
11 #include <sys/types.h>
12 #include <sys/stat.h>
13 #include <fcntl.h>
14 #include <stdio.h>
15 #include <errno.h>
16 #include <string.h>
17 
18 
19 #define TEST_PATTERN1 \
20   "GET / HTTP/1.1\r\n" \
21   "host: sourceforge.net\r\n" \
22   "Connection: close\r\n" \
23   "\r\n"
24 
25 
26 
27 
check_syncio_tls1()28 static int check_syncio_tls1()
29 {
30   GWEN_SYNCIO *sio;
31   GWEN_SYNCIO *baseLayer;
32   int rv;
33   char buffer[2048];
34 
35 
36   /* create socket layer */
37   sio=GWEN_SyncIo_Socket_new(GWEN_SocketTypeTCP, GWEN_AddressFamilyIP);
38   if (sio==NULL) {
39     fprintf(stderr,
40             "ERROR in check_io_tls1: Could not create socket io layer.\n");
41     return 2;
42   }
43   GWEN_SyncIo_Socket_SetAddress(sio, "sourceforge.net");
44   GWEN_SyncIo_Socket_SetPort(sio, 443);
45 
46   baseLayer=sio;
47 
48   sio=GWEN_SyncIo_Tls_new(baseLayer);
49   if (sio==NULL) {
50     fprintf(stderr,
51             "ERROR in check_io_tls1: Could not create TLS io layer.\n");
52     return 2;
53   }
54   //GWEN_SyncIo_Tls_SetLocalTrustFile(sio, "test.crt");
55 
56   rv=GWEN_SyncIo_Connect(sio);
57   if (rv) {
58     fprintf(stderr,
59             "ERROR in check_io_tls1: Could not connect (%d)\n", rv);
60     return 2;
61   }
62 
63   rv=GWEN_SyncIo_WriteForced(sio, (const uint8_t *)TEST_PATTERN1, strlen(TEST_PATTERN1));
64   if (rv<1) {
65     fprintf(stderr,
66             "ERROR in check_io_tls1: Could not write (%d)\n", rv);
67     return 2;
68   }
69 
70   for (;;) {
71     rv=GWEN_SyncIo_Read(sio, (uint8_t *)buffer, sizeof(buffer)-1);
72     if (rv==0)
73       break;
74     else if (rv<1) {
75       if (rv==GWEN_ERROR_TIMEOUT || rv==GWEN_ERROR_EOF || rv==GWEN_ERROR_SSL_PREMATURE_CLOSE)
76         break;
77       fprintf(stderr,
78               "ERROR in check_io_tls1: Could not read (%d)\n", rv);
79       return 2;
80     }
81     else {
82       buffer[rv]=0;
83       fprintf(stderr, "Data received: %s\n", buffer);
84     }
85   }
86 
87   rv=GWEN_SyncIo_Disconnect(sio);
88   if (rv) {
89     fprintf(stderr,
90             "WARNING in check_io_tls1: Could not disconnect (%d)\n", rv);
91   }
92 
93   return 0;
94 }
95 
96 
97 
check_syncio_tls()98 int check_syncio_tls()
99 {
100   int errs=0;
101   int chks=0;
102 
103   fprintf(stderr, "IO tls checks... ");
104   chks++;
105   if (check_syncio_tls1())
106     errs++;
107 
108   if (chks) {
109     if (chks==errs) {
110       fprintf(stderr, "IO tls checks: all failed.\n");
111     }
112     else if (errs) {
113       fprintf(stderr, "IO tls checks: some failed.\n");
114     }
115     else {
116       fprintf(stderr, "passed.\n");
117     }
118   }
119 
120   return errs;
121 }
122 
123 
124 
125 
126 
127