Imported Upstream version 3.0.30
[platform/upstream/gnutls.git] / tests / mini-eagain-dtls.c
1 /*
2  * Copyright (C) 2008-2012 Free Software Foundation, Inc.
3  *
4  * Author: Simon Josefsson, Nikos Mavrogiannopoulos
5  *
6  * This file is part of GnuTLS.
7  *
8  * GnuTLS is free software; you can redistribute it and/or modify it
9  * under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * GnuTLS is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with GnuTLS; if not, write to the Free Software Foundation,
20  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
21  */
22
23 #ifdef HAVE_CONFIG_H
24 #include <config.h>
25 #endif
26
27 #include <stdio.h>
28 #include <stdlib.h>
29 #include <string.h>
30 #include <errno.h>
31 #include <gnutls/gnutls.h>
32 #include <gnutls/crypto.h>
33 #include "utils.h"
34 #define RANDOMIZE
35 #include "eagain-common.h"
36
37 const char* side = "";
38
39 static void
40 tls_log_func (int level, const char *str)
41 {
42   fprintf (stderr, "%s|<%d>| %s", side, level, str);
43 }
44
45 static int handshake = 0;
46
47 #define MAX_BUF 1024
48 #define MSG "Hello TLS, and hi and how are you and more data here... and more... and even more and even more more data..."
49
50 void
51 doit (void)
52 {
53   /* Server stuff. */
54   gnutls_anon_server_credentials_t s_anoncred;
55   const gnutls_datum_t p3 = { (void *) pkcs3, strlen (pkcs3) };
56   static gnutls_dh_params_t dh_params;
57   gnutls_session_t server;
58   int sret, cret;
59   /* Client stuff. */
60   gnutls_anon_client_credentials_t c_anoncred;
61   gnutls_session_t client;
62   /* Need to enable anonymous KX specifically. */
63   char buffer[MAX_BUF + 1];
64   ssize_t ns;
65   int ret, transferred = 0, msglen;
66
67   /* General init. */
68   gnutls_global_init ();
69   gnutls_global_set_log_function (tls_log_func);
70   if (debug)
71     gnutls_global_set_log_level (99);
72
73   /* Init server */
74   gnutls_anon_allocate_server_credentials (&s_anoncred);
75   gnutls_dh_params_init (&dh_params);
76   gnutls_dh_params_import_pkcs3 (dh_params, &p3, GNUTLS_X509_FMT_PEM);
77   gnutls_anon_set_server_dh_params (s_anoncred, dh_params);
78   gnutls_init (&server, GNUTLS_SERVER|GNUTLS_DATAGRAM|GNUTLS_NONBLOCK);
79   ret = gnutls_priority_set_direct (server, "NONE:+VERS-DTLS1.0:+CIPHER-ALL:+MAC-ALL:+SIGN-ALL:+COMP-ALL:+ANON-DH", NULL);
80   if (ret < 0)
81     exit(1);
82   gnutls_credentials_set (server, GNUTLS_CRD_ANON, s_anoncred);
83   gnutls_dh_set_prime_bits (server, 1024);
84   gnutls_transport_set_push_function (server, server_push);
85   gnutls_transport_set_pull_function (server, server_pull);
86   gnutls_transport_set_pull_timeout_function (server, server_pull_timeout_func);
87   gnutls_transport_set_ptr (server, (gnutls_transport_ptr_t)server);
88
89   /* Init client */
90   gnutls_anon_allocate_client_credentials (&c_anoncred);
91   gnutls_init (&client, GNUTLS_CLIENT|GNUTLS_DATAGRAM|GNUTLS_NONBLOCK);
92   cret = gnutls_priority_set_direct (client, "NONE:+VERS-DTLS1.0:+CIPHER-ALL:+MAC-ALL:+SIGN-ALL:+COMP-ALL:+ANON-DH", NULL);
93   if (cret < 0)
94     exit(1);
95   gnutls_credentials_set (client, GNUTLS_CRD_ANON, c_anoncred);
96   gnutls_transport_set_push_function (client, client_push);
97   gnutls_transport_set_pull_function (client, client_pull);
98   gnutls_transport_set_pull_timeout_function (client, client_pull_timeout_func);
99   gnutls_transport_set_ptr (client, (gnutls_transport_ptr_t)client);
100
101   handshake = 1;
102   HANDSHAKE(client, server);
103
104   handshake = 0;
105   if (debug)
106     success ("Handshake established\n");
107
108   do
109     {
110       ret = gnutls_record_send (client, MSG, strlen (MSG));
111     }
112   while(ret == GNUTLS_E_AGAIN);
113   //success ("client: sent %d\n", ns);
114
115   msglen = strlen(MSG);
116   TRANSFER(client, server, MSG, msglen, buffer, MAX_BUF);
117
118   if (debug)
119     fputs ("\n", stdout);
120
121   gnutls_bye (client, GNUTLS_SHUT_WR);
122   gnutls_bye (server, GNUTLS_SHUT_WR);
123
124   gnutls_deinit (client);
125   gnutls_deinit (server);
126
127   gnutls_anon_free_client_credentials (c_anoncred);
128   gnutls_anon_free_server_credentials (s_anoncred);
129
130   gnutls_dh_params_deinit (dh_params);
131
132   gnutls_global_deinit ();
133 }