summaryrefslogtreecommitdiff
path: root/src/cli.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cli.c')
-rw-r--r--src/cli.c925
1 files changed, 480 insertions, 445 deletions
diff --git a/src/cli.c b/src/cli.c
index 10d7595cae..a9b5aa069e 100644
--- a/src/cli.c
+++ b/src/cli.c
@@ -32,7 +32,7 @@
#include <signal.h>
#include <netdb.h>
#include <common.h>
-#include <cli-gaa.h>
+#include "cli-gaa.h"
#ifndef SHUT_WR
# define SHUT_WR 1
@@ -49,18 +49,32 @@
/* global stuff here */
int resume;
-char *hostname=NULL;
+char *hostname = NULL;
int port;
int record_max_size;
int fingerprint;
+char *srp_passwd;
+char *srp_username;
+char *pgp_keyfile;
+char *pgp_certfile;
+char *pgp_keyring;
+char *pgp_trustdb;
+char *x509_keyfile;
+char *x509_certfile;
+char *x509_cafile;
+char *x509_crlfile = NULL;
+
+
int protocol_priority[16] = { GNUTLS_TLS1, GNUTLS_SSL3, 0 };
int kx_priority[16] =
{ GNUTLS_KX_RSA, GNUTLS_KX_DHE_DSS, GNUTLS_KX_DHE_RSA, GNUTLS_KX_SRP,
-GNUTLS_KX_ANON_DH, 0 };
+ GNUTLS_KX_ANON_DH, 0
+};
int cipher_priority[16] =
{ GNUTLS_CIPHER_RIJNDAEL_128_CBC, GNUTLS_CIPHER_3DES_CBC,
-GNUTLS_CIPHER_ARCFOUR, 0 };
+ GNUTLS_CIPHER_ARCFOUR, 0
+};
int comp_priority[16] = { GNUTLS_COMP_ZLIB, GNUTLS_COMP_NULL, 0 };
int mac_priority[16] = { GNUTLS_MAC_SHA, GNUTLS_MAC_MD5, 0 };
int cert_type_priority[16] = { GNUTLS_CRT_X509, GNUTLS_CRT_OPENPGP, 0 };
@@ -68,46 +82,48 @@ int cert_type_priority[16] = { GNUTLS_CRT_X509, GNUTLS_CRT_OPENPGP, 0 };
/* end of global stuff */
#define MAX(X,Y) (X >= Y ? X : Y);
-#define CAFILE "x509/ca.pem"
-#define CRLFILE NULL
-#define CLIKEYFILE2 "x509/clikey-dsa.pem"
-#define CLICERTFILE2 "x509/clicert-dsa.pem"
+#define DEFAULT_X509_CAFILE "x509/ca.pem"
+#define DEFAULT_X509_KEYFILE2 "x509/clikey-dsa.pem"
+#define DEFAULT_X509_CERTFILE2 "x509/clicert-dsa.pem"
-#define CLIKEYFILE1 "x509/clikey.pem"
-#define CLICERTFILE1 "x509/clicert.pem"
+#define DEFAULT_X509_KEYFILE "x509/clikey.pem"
+#define DEFAULT_X509_CERTFILE "x509/clicert.pem"
-#define CLIKEYFILE_PGP "openpgp/cli_sec.asc"
-#define CLICERTFILE_PGP "openpgp/cli_pub.asc"
-#define CLIRINGFILE_PGP "openpgp/cli_ring.gpg"
+#define DEFAULT_PGP_KEYFILE "openpgp/cli_sec.asc"
+#define DEFAULT_PGP_CERTFILE "openpgp/cli_pub.asc"
+#define DEFAULT_PGP_KEYRING "openpgp/cli_ring.gpg"
+
+#define DEFAULT_SRP_USERNAME "test"
+#define DEFAULT_SRP_PASSWD "test"
static int cert_callback(GNUTLS_STATE state,
const gnutls_datum * client_certs, int ncerts,
const gnutls_datum * req_ca_cert, int nreqs)
{
- if (client_certs == NULL) {
- return 0; /* means the we will only be called again
+ if (client_certs == NULL) {
+ return 0; /* means the we will only be called again
* if the library cannot determine which
* certificate to send
*/
- }
+ }
#if 0
- /* here we should prompt the user and ask him
- * which certificate to choose. Too bored to
- * implement that. --nmav
- */
- for (i = 0; i < ncerts; i++) {
- fprintf(stderr, "%s.", client_cert->common_name);
- fprintf(stderr, "%s\n", issuer_cert->common_name);
- }
- for (i = 0; i < nreqs; i++) {
- fprintf(stderr, "%s.", req_ca_cert->common_name);
- }
- fprintf(stderr, "\n");
- return 0;
+ /* here we should prompt the user and ask him
+ * which certificate to choose. Too bored to
+ * implement that. --nmav
+ */
+ for (i = 0; i < ncerts; i++) {
+ fprintf(stderr, "%s.", client_cert->common_name);
+ fprintf(stderr, "%s\n", issuer_cert->common_name);
+ }
+ for (i = 0; i < nreqs; i++) {
+ fprintf(stderr, "%s.", req_ca_cert->common_name);
+ }
+ fprintf(stderr, "\n");
+ return 0;
#endif
- return -1; /* send no certificate to the peer */
+ return -1; /* send no certificate to the peer */
}
@@ -115,445 +131,464 @@ static void gaa_parser(int argc, char **argv);
int main(int argc, char **argv)
{
- int err, ret;
- int sd, ii, i;
- struct sockaddr_in sa;
- GNUTLS_STATE state;
- char buffer[MAX_BUF + 1];
- char *session;
- char *session_id;
- int session_size, alert;
- int session_id_size;
- char *tmp_session_id;
- int tmp_session_id_size;
- fd_set rset;
- int maxfd;
- struct timeval tv;
- int user_term = 0;
- GNUTLS_SRP_CLIENT_CREDENTIALS cred;
- GNUTLS_ANON_CLIENT_CREDENTIALS anon_cred;
- GNUTLS_CERTIFICATE_CLIENT_CREDENTIALS xcred;
- struct hostent *server_host;
-
- gaa_parser(argc, argv);
-
- signal(SIGPIPE, SIG_IGN);
-
- if (gnutls_global_init() < 0) {
- fprintf(stderr, "global state initialization error\n");
- exit(1);
- }
-
- printf("Resolving '%s'...\n", hostname);
- /* get server name */
- server_host = gethostbyname(hostname);
- if (server_host == NULL) {
- fprintf(stderr, "Cannot resolve %s\n", hostname);
- exit(1);
- }
-
- /* X509 stuff */
- if (gnutls_certificate_allocate_sc(&xcred) < 0) { /* space for 2 certificates */
- fprintf(stderr, "memory error\n");
- exit(1);
- }
-
- ret =
- gnutls_certificate_set_x509_trust_file(xcred, CAFILE, CRLFILE);
- if (ret < 0) {
- fprintf(stderr, "Error setting the x509 trust file\n");
- exit(1);
- }
-
- ret =
- gnutls_certificate_set_x509_key_file(xcred, CLICERTFILE1,
- CLIKEYFILE1);
- if (ret < 0) {
- fprintf(stderr, "Error setting the x509 key file\n");
- exit(1);
- }
-
- ret =
- gnutls_certificate_set_x509_key_file(xcred, CLICERTFILE2,
- CLIKEYFILE2);
- if (ret < 0) {
- fprintf(stderr, "Error setting the x509 key file\n");
- exit(1);
- }
-
- ret =
- gnutls_certificate_set_openpgp_key_file(xcred, CLICERTFILE_PGP,
- CLIKEYFILE_PGP);
- if (ret < 0) {
- fprintf(stderr, "Error setting the OpenPGP key file\n");
- }
-
- ret =
- gnutls_certificate_set_openpgp_keyring_file(xcred,
- CLIRINGFILE_PGP);
- if (ret < 0) {
- fprintf(stderr,
- "Error setting the OpenPGP keyring file\n");
- }
+ int err, ret;
+ int sd, ii, i;
+ struct sockaddr_in sa;
+ GNUTLS_STATE state;
+ char buffer[MAX_BUF + 1];
+ char *session;
+ char *session_id;
+ int session_size, alert;
+ int session_id_size;
+ char *tmp_session_id;
+ int tmp_session_id_size;
+ fd_set rset;
+ int maxfd;
+ struct timeval tv;
+ int user_term = 0;
+ GNUTLS_SRP_CLIENT_CREDENTIALS cred;
+ GNUTLS_ANON_CLIENT_CREDENTIALS anon_cred;
+ GNUTLS_CERTIFICATE_CLIENT_CREDENTIALS xcred;
+ struct hostent *server_host;
+
+ gaa_parser(argc, argv);
+
+ signal(SIGPIPE, SIG_IGN);
+
+ if (gnutls_global_init() < 0) {
+ fprintf(stderr, "global state initialization error\n");
+ exit(1);
+ }
+
+ printf("Resolving '%s'...\n", hostname);
+ /* get server name */
+ server_host = gethostbyname(hostname);
+ if (server_host == NULL) {
+ fprintf(stderr, "Cannot resolve %s\n", hostname);
+ exit(1);
+ }
+
+ /* X509 stuff */
+ if (gnutls_certificate_allocate_sc(&xcred) < 0) { /* space for 2 certificates */
+ fprintf(stderr, "memory error\n");
+ exit(1);
+ }
+
+ if (x509_cafile != NULL) {
+ ret =
+ gnutls_certificate_set_x509_trust_file(xcred, x509_cafile,
+ x509_crlfile);
+ if (ret < 0) {
+ fprintf(stderr, "Error setting the x509 trust file\n");
+ exit(1);
+ }
+ }
+
+ if (x509_certfile != NULL) {
+ ret =
+ gnutls_certificate_set_x509_key_file(xcred, x509_certfile,
+ x509_keyfile);
+ if (ret < 0) {
+ fprintf(stderr, "Error setting the x509 key files ('%s', '%s'\n",
+ x509_certfile, x509_keyfile);
+ exit(1);
+ }
+ }
+
+ if (pgp_certfile != NULL) {
+ ret =
+ gnutls_certificate_set_openpgp_key_file(xcred, pgp_certfile,
+ pgp_keyfile);
+ if (ret < 0) {
+ fprintf(stderr, "Error setting the x509 key files ('%s', '%s'\n",
+ pgp_certfile, pgp_keyfile);
+ }
+ }
+
+ if (pgp_keyring != NULL) {
+ ret =
+ gnutls_certificate_set_openpgp_keyring_file(xcred, pgp_keyring);
+ if (ret < 0) {
+ fprintf(stderr, "Error setting the OpenPGP keyring file\n");
+ }
+ }
+
+ if (pgp_trustdb != NULL) {
+ gnutls_certificate_set_openpgp_trustdb(xcred, pgp_trustdb);
+ }
/* gnutls_certificate_client_callback_func( xcred, cert_callback); */
- /* SRP stuff */
- if (gnutls_srp_allocate_client_sc(&cred) < 0) {
- fprintf(stderr, "memory error\n");
- exit(1);
- }
- gnutls_srp_set_client_cred(cred, "test", "test");
+ /* SRP stuff */
+ if (gnutls_srp_allocate_client_sc(&cred) < 0) {
+ fprintf(stderr, "memory error\n");
+ exit(1);
+ }
+ gnutls_srp_set_client_cred(cred, srp_username, srp_passwd);
- /* ANON stuff */
- if (gnutls_anon_allocate_client_sc(&anon_cred) < 0) {
- fprintf(stderr, "memory error\n");
- exit(1);
- }
+ /* ANON stuff */
+ if (gnutls_anon_allocate_client_sc(&anon_cred) < 0) {
+ fprintf(stderr, "memory error\n");
+ exit(1);
+ }
- sd = socket(AF_INET, SOCK_STREAM, 0);
- ERR(sd, "socket");
+ sd = socket(AF_INET, SOCK_STREAM, 0);
+ ERR(sd, "socket");
- memset(&sa, '\0', sizeof(sa));
- sa.sin_family = AF_INET;
- sa.sin_port = htons(port);
+ memset(&sa, '\0', sizeof(sa));
+ sa.sin_family = AF_INET;
+ sa.sin_port = htons(port);
- sa.sin_addr.s_addr = *((unsigned int *) server_host->h_addr);
+ sa.sin_addr.s_addr = *((unsigned int *) server_host->h_addr);
- inet_ntop(AF_INET, &sa.sin_addr, buffer, MAX_BUF);
- fprintf(stderr, "Connecting to '%s'...\n", buffer);
+ inet_ntop(AF_INET, &sa.sin_addr, buffer, MAX_BUF);
+ fprintf(stderr, "Connecting to '%s'...\n", buffer);
- err = connect(sd, (SA *) & sa, sizeof(sa));
- ERR(err, "connect");
+ err = connect(sd, (SA *) & sa, sizeof(sa));
+ ERR(err, "connect");
- for (i=0;i<2;i++) {
- gnutls_init(&state, GNUTLS_CLIENT);
+ for (i = 0; i < 2; i++) {
+ gnutls_init(&state, GNUTLS_CLIENT);
- if (i == 1) {
- gnutls_session_set_data(state, session, session_size);
- free(session);
- }
+ if (i == 1) {
+ gnutls_session_set_data(state, session, session_size);
+ free(session);
+ }
- gnutls_cipher_set_priority(state, cipher_priority);
- gnutls_compression_set_priority(state, comp_priority);
- gnutls_kx_set_priority(state, kx_priority);
- gnutls_protocol_set_priority(state, protocol_priority);
- gnutls_mac_set_priority(state, mac_priority);
- gnutls_cert_type_set_priority(state, cert_type_priority);
+ gnutls_cipher_set_priority(state, cipher_priority);
+ gnutls_compression_set_priority(state, comp_priority);
+ gnutls_kx_set_priority(state, kx_priority);
+ gnutls_protocol_set_priority(state, protocol_priority);
+ gnutls_mac_set_priority(state, mac_priority);
+ gnutls_cert_type_set_priority(state, cert_type_priority);
- gnutls_dh_set_prime_bits(state, 1024);
+ gnutls_dh_set_prime_bits(state, 1024);
- gnutls_cred_set(state, GNUTLS_CRD_ANON, anon_cred);
- gnutls_cred_set(state, GNUTLS_CRD_SRP, cred);
- gnutls_cred_set(state, GNUTLS_CRD_CERTIFICATE, xcred);
+ gnutls_cred_set(state, GNUTLS_CRD_ANON, anon_cred);
+ gnutls_cred_set(state, GNUTLS_CRD_SRP, cred);
+ gnutls_cred_set(state, GNUTLS_CRD_CERTIFICATE, xcred);
- /* send the fingerprint */
- if (fingerprint!=0)
- gnutls_openpgp_send_key( state, GNUTLS_OPENPGP_KEY_FINGERPRINT);
+ /* send the fingerprint */
+ if (fingerprint != 0)
+ gnutls_openpgp_send_key(state, GNUTLS_OPENPGP_KEY_FINGERPRINT);
- /* use the max record size extension */
- if (record_max_size > 0) {
- if (gnutls_record_set_max_size(state, record_max_size) < 0) {
- fprintf(stderr, "Cannot set the maximum record size to %d.\n", record_max_size);
- exit(1);
- }
- }
+ /* use the max record size extension */
+ if (record_max_size > 0) {
+ if (gnutls_record_set_max_size(state, record_max_size) < 0) {
+ fprintf(stderr, "Cannot set the maximum record size to %d.\n",
+ record_max_size);
+ exit(1);
+ }
+ }
/* This TLS extension may break old implementations.
*/
- gnutls_transport_set_ptr(state, sd);
- do {
- ret = gnutls_handshake(state);
- } while (ret == GNUTLS_E_INTERRUPTED
- || ret == GNUTLS_E_AGAIN);
-
- if (ret < 0) {
- if (ret == GNUTLS_E_WARNING_ALERT_RECEIVED
- || ret == GNUTLS_E_FATAL_ALERT_RECEIVED) {
- alert = gnutls_alert_get( state);
- printf("*** Received alert [%d]: %s\n",
- alert, gnutls_alert_get_name( alert));
- }
- fprintf(stderr, "*** Handshake has failed\n");
- gnutls_perror(ret);
- gnutls_deinit(state);
- return 1;
- } else {
- printf("- Handshake was completed\n");
- }
-
- if (i == 1) { /* resume */
- /* check if we actually resumed the previous session */
-
- gnutls_session_get_id(state, NULL, &tmp_session_id_size);
- tmp_session_id = malloc(tmp_session_id_size);
- gnutls_session_get_id(state, tmp_session_id, &tmp_session_id_size);
-
- if (memcmp(tmp_session_id, session_id, session_id_size) ==
- 0) {
- printf("- Previous session was resumed\n");
- } else {
- fprintf(stderr,
- "*** Previous session was NOT resumed\n");
- }
- free(tmp_session_id);
- free(session_id);
- }
-
-
-
- if (resume!=0 && i==0) {
-
- gnutls_session_get_data(state, NULL, &session_size);
- session = malloc(session_size);
- gnutls_session_get_data(state, session, &session_size);
-
- gnutls_session_get_id(state, NULL, &session_id_size);
- session_id = malloc(session_id_size);
- gnutls_session_get_id(state, session_id, &session_id_size);
-
- /* print some information */
- print_info(state);
-
- printf("- Disconnecting\n");
- do {
- ret = gnutls_bye(state, GNUTLS_SHUT_RDWR);
- } while (ret == GNUTLS_E_INTERRUPTED
- || ret == GNUTLS_E_AGAIN);
-
- shutdown(sd, SHUT_WR);
- close(sd);
-
- gnutls_deinit(state);
-
- printf
- ("\n\n- Connecting again- trying to resume previous session\n");
- sd = socket(AF_INET, SOCK_STREAM, 0);
- ERR(sd, "socket");
-
- err = connect(sd, (SA *) & sa, sizeof(sa));
- ERR(err, "connect");
- } else {
- break;
- }
-
- }
+ gnutls_transport_set_ptr(state, sd);
+ do {
+ ret = gnutls_handshake(state);
+ } while (ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN);
+
+ if (ret < 0) {
+ if (ret == GNUTLS_E_WARNING_ALERT_RECEIVED
+ || ret == GNUTLS_E_FATAL_ALERT_RECEIVED) {
+ alert = gnutls_alert_get(state);
+ printf("*** Received alert [%d]: %s\n",
+ alert, gnutls_alert_get_name(alert));
+ }
+ fprintf(stderr, "*** Handshake has failed\n");
+ gnutls_perror(ret);
+ gnutls_deinit(state);
+ return 1;
+ } else {
+ printf("- Handshake was completed\n");
+ }
+
+ if (i == 1) { /* resume */
+ /* check if we actually resumed the previous session */
+
+ gnutls_session_get_id(state, NULL, &tmp_session_id_size);
+ tmp_session_id = malloc(tmp_session_id_size);
+ gnutls_session_get_id(state, tmp_session_id,
+ &tmp_session_id_size);
+
+ if (memcmp(tmp_session_id, session_id, session_id_size) == 0) {
+ printf("- Previous session was resumed\n");
+ } else {
+ fprintf(stderr, "*** Previous session was NOT resumed\n");
+ }
+ free(tmp_session_id);
+ free(session_id);
+ }
+
+
+
+ if (resume != 0 && i == 0) {
+
+ gnutls_session_get_data(state, NULL, &session_size);
+ session = malloc(session_size);
+ gnutls_session_get_data(state, session, &session_size);
+
+ gnutls_session_get_id(state, NULL, &session_id_size);
+ session_id = malloc(session_id_size);
+ gnutls_session_get_id(state, session_id, &session_id_size);
+
+ /* print some information */
+ print_info(state);
+
+ printf("- Disconnecting\n");
+ do {
+ ret = gnutls_bye(state, GNUTLS_SHUT_RDWR);
+ } while (ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN);
+
+ shutdown(sd, SHUT_WR);
+ close(sd);
+
+ gnutls_deinit(state);
+
+ printf
+ ("\n\n- Connecting again- trying to resume previous session\n");
+ sd = socket(AF_INET, SOCK_STREAM, 0);
+ ERR(sd, "socket");
+
+ err = connect(sd, (SA *) & sa, sizeof(sa));
+ ERR(err, "connect");
+ } else {
+ break;
+ }
+
+ }
/* print some information */
- print_info(state);
-
- printf("\n- Simple Client Mode:\n\n");
-
- FD_ZERO(&rset);
- for (;;) {
- FD_SET(fileno(stdin), &rset);
- FD_SET(sd, &rset);
-
- maxfd = MAX(fileno(stdin), sd);
- tv.tv_sec = 3;
- tv.tv_usec = 0;
- select(maxfd + 1, &rset, NULL, NULL, &tv);
-
- if (FD_ISSET(sd, &rset)) {
- bzero(buffer, MAX_BUF + 1);
- do {
- ret = gnutls_record_recv(state, buffer, MAX_BUF);
- } while (ret == GNUTLS_E_INTERRUPTED
- || ret == GNUTLS_E_AGAIN);
- /* remove new line */
-
- if (gnutls_error_is_fatal(ret) == 1 || ret == 0) {
- if (ret == 0) {
- printf
- ("- Peer has closed the GNUTLS connection\n");
- break;
- } else {
- fprintf(stderr,
- "*** Received corrupted data(%d) - server has terminated the connection abnormally\n",
- ret);
- break;
- }
- } else {
- if (ret == GNUTLS_E_WARNING_ALERT_RECEIVED
- || ret ==
- GNUTLS_E_FATAL_ALERT_RECEIVED)
- printf("* Received alert [%d]\n",
- gnutls_alert_get
- (state));
- if (ret == GNUTLS_E_REHANDSHAKE) {
-
- /* There is a race condition here. If application
- * data is sent after the rehandshake request,
- * the server thinks we ignored his request.
- * This is a bad design of this client.
- */
- printf
- ("* Received rehandshake request\n");
- /* gnutls_alert_send( state, GNUTLS_AL_WARNING, GNUTLS_A_NO_RENEGOTIATION); */
- do {
- ret =
- gnutls_handshake
- (state);
- } while (ret == GNUTLS_E_AGAIN
- || ret ==
- GNUTLS_E_INTERRUPTED);
-
- if (ret == 0)
- printf
- ("* Rehandshake was performed\n");
- else {
- printf
- ("* Rehandshake Failed [%d]\n",
- ret);
- }
- }
- if (ret > 0) {
- printf("- Received[%d]: ", ret);
- for (ii = 0; ii < ret; ii++) {
- fputc(buffer[ii], stdout);
- }
- fputs("\n", stdout);
- }
- }
- if (user_term != 0)
- break;
- }
-
- if (FD_ISSET(fileno(stdin), &rset)) {
- if (fgets(buffer, MAX_BUF, stdin) == NULL) {
- do {
- ret =
- gnutls_bye(state,
- GNUTLS_SHUT_WR);
- } while (ret == GNUTLS_E_INTERRUPTED
- || ret == GNUTLS_E_AGAIN);
- user_term = 1;
- continue;
- }
- do {
- ret =
- gnutls_record_send(state, buffer,
- strlen(buffer));
- } while (ret == GNUTLS_E_AGAIN
- || ret == GNUTLS_E_INTERRUPTED);
- if (ret > 0)
- printf("- Sent: %d bytes\n", ret);
- else
- GERR( ret);
-
- }
- }
- if (user_term != 0)
- do
- ret = gnutls_bye(state, GNUTLS_SHUT_RDWR);
- while (ret == GNUTLS_E_INTERRUPTED
- || ret == GNUTLS_E_AGAIN);
-
- shutdown(sd, SHUT_RDWR); /* no more receptions */
- close(sd);
-
- gnutls_deinit(state);
-
- gnutls_srp_free_client_sc(cred);
- gnutls_certificate_free_sc(xcred);
- gnutls_anon_free_client_sc(anon_cred);
-
- gnutls_global_deinit();
-
- return 0;
+ print_info(state);
+
+ printf("\n- Simple Client Mode:\n\n");
+
+ FD_ZERO(&rset);
+ for (;;) {
+ FD_SET(fileno(stdin), &rset);
+ FD_SET(sd, &rset);
+
+ maxfd = MAX(fileno(stdin), sd);
+ tv.tv_sec = 3;
+ tv.tv_usec = 0;
+ select(maxfd + 1, &rset, NULL, NULL, &tv);
+
+ if (FD_ISSET(sd, &rset)) {
+ bzero(buffer, MAX_BUF + 1);
+ do {
+ ret = gnutls_record_recv(state, buffer, MAX_BUF);
+ } while (ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN);
+ /* remove new line */
+
+ if (gnutls_error_is_fatal(ret) == 1 || ret == 0) {
+ if (ret == 0) {
+ printf("- Peer has closed the GNUTLS connection\n");
+ break;
+ } else {
+ fprintf(stderr,
+ "*** Received corrupted data(%d) - server has terminated the connection abnormally\n",
+ ret);
+ break;
+ }
+ } else {
+ if (ret == GNUTLS_E_WARNING_ALERT_RECEIVED
+ || ret == GNUTLS_E_FATAL_ALERT_RECEIVED)
+ printf("* Received alert [%d]\n", gnutls_alert_get(state));
+ if (ret == GNUTLS_E_REHANDSHAKE) {
+
+ /* There is a race condition here. If application
+ * data is sent after the rehandshake request,
+ * the server thinks we ignored his request.
+ * This is a bad design of this client.
+ */
+ printf("* Received rehandshake request\n");
+ /* gnutls_alert_send( state, GNUTLS_AL_WARNING, GNUTLS_A_NO_RENEGOTIATION); */
+ do {
+ ret = gnutls_handshake(state);
+ } while (ret == GNUTLS_E_AGAIN
+ || ret == GNUTLS_E_INTERRUPTED);
+
+ if (ret == 0)
+ printf("* Rehandshake was performed\n");
+ else {
+ printf("* Rehandshake Failed [%d]\n", ret);
+ }
+ }
+ if (ret > 0) {
+ printf("- Received[%d]: ", ret);
+ for (ii = 0; ii < ret; ii++) {
+ fputc(buffer[ii], stdout);
+ }
+ fputs("\n", stdout);
+ }
+ }
+ if (user_term != 0)
+ break;
+ }
+
+ if (FD_ISSET(fileno(stdin), &rset)) {
+ if (fgets(buffer, MAX_BUF, stdin) == NULL) {
+ do {
+ ret = gnutls_bye(state, GNUTLS_SHUT_WR);
+ } while (ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN);
+ user_term = 1;
+ continue;
+ }
+ do {
+ ret = gnutls_record_send(state, buffer, strlen(buffer));
+ } while (ret == GNUTLS_E_AGAIN || ret == GNUTLS_E_INTERRUPTED);
+ if (ret > 0)
+ printf("- Sent: %d bytes\n", ret);
+ else
+ GERR(ret);
+
+ }
+ }
+ if (user_term != 0)
+ do
+ ret = gnutls_bye(state, GNUTLS_SHUT_RDWR);
+ while (ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN);
+
+ shutdown(sd, SHUT_RDWR); /* no more receptions */
+ close(sd);
+
+ gnutls_deinit(state);
+
+ gnutls_srp_free_client_sc(cred);
+ gnutls_certificate_free_sc(xcred);
+ gnutls_anon_free_client_sc(anon_cred);
+
+ gnutls_global_deinit();
+
+ return 0;
}
static gaainfo info;
void gaa_parser(int argc, char **argv)
{
- int i, j;
-
- if (gaa(argc, argv, &info) != -1) {
- fprintf(stderr, "Error in the arguments. Use the --help or -h parameters to get more information.\n");
- exit(1);
- }
-
- resume = info.resume;
- port = info.port;
- record_max_size = info.record_size;
- fingerprint = info.fingerprint;
-
- if (info.nrest_args==0) hostname="localhost";
- else hostname = info.rest_args[0];
-
- if (info.proto != NULL && info.nproto > 0) {
- for (j = i = 0; i < info.nproto; i++) {
- if (strncasecmp(info.proto[i], "SSL", 3) == 0)
- protocol_priority[j++] = GNUTLS_SSL3;
- if (strncasecmp(info.proto[i], "TLS", 3) == 0)
- protocol_priority[j++] = GNUTLS_TLS1;
- }
- protocol_priority[j] = 0;
- }
-
- if (info.ciphers != NULL && info.nciphers > 0) {
- for (j = i = 0; i < info.nciphers; i++) {
- if (strncasecmp(info.ciphers[i], "RIJ", 3) == 0)
- cipher_priority[j++] =
- GNUTLS_CIPHER_RIJNDAEL_128_CBC;
- if (strncasecmp(info.ciphers[i], "TWO", 3) == 0)
- cipher_priority[j++] =
- GNUTLS_CIPHER_TWOFISH_128_CBC;
- if (strncasecmp(info.ciphers[i], "3DE", 3) == 0)
- cipher_priority[j++] =
- GNUTLS_CIPHER_3DES_CBC;
- if (strncasecmp(info.ciphers[i], "ARC", 3) == 0)
- cipher_priority[j++] =
- GNUTLS_CIPHER_ARCFOUR;
- }
- cipher_priority[j] = 0;
- }
-
- if (info.macs != NULL && info.nmacs > 0) {
- for (j = i = 0; i < info.nmacs; i++) {
- if (strncasecmp(info.macs[i], "MD5", 3) == 0)
- mac_priority[j++] = GNUTLS_MAC_MD5;
- if (strncasecmp(info.macs[i], "SHA", 3) == 0)
- mac_priority[j++] = GNUTLS_MAC_SHA;
- }
- mac_priority[j] = 0;
- }
-
- if (info.ctype != NULL && info.nctype > 0) {
- for (j = i = 0; i < info.nctype; i++) {
- if (strncasecmp(info.ctype[i], "OPE", 3) == 0)
- cert_type_priority[j++] =
- GNUTLS_CRT_OPENPGP;
- if (strncasecmp(info.ctype[i], "X", 1) == 0)
- cert_type_priority[j++] = GNUTLS_CRT_X509;
- }
- cert_type_priority[j] = 0;
- }
-
- if (info.kx != NULL && info.nkx > 0) {
- for (j = i = 0; i < info.nkx; i++) {
- if (strncasecmp(info.kx[i], "SRP", 3) == 0)
- kx_priority[j++] = GNUTLS_KX_SRP;
- if (strncasecmp(info.kx[i], "RSA", 3) == 0)
- kx_priority[j++] = GNUTLS_KX_RSA;
- if (strncasecmp(info.kx[i], "DHE_RSA", 7) == 0)
- kx_priority[j++] = GNUTLS_KX_DHE_RSA;
- if (strncasecmp(info.kx[i], "DHE_DSS", 7) == 0)
- kx_priority[j++] = GNUTLS_KX_DHE_DSS;
- if (strncasecmp(info.kx[i], "ANON", 4) == 0)
- kx_priority[j++] = GNUTLS_KX_ANON_DH;
- }
- kx_priority[j] = 0;
- }
-
- if (info.comp != NULL && info.ncomp > 0) {
- for (j = i = 0; i < info.ncomp; i++) {
- if (strncasecmp(info.comp[i], "NUL", 3) == 0)
- comp_priority[j++] = GNUTLS_COMP_NULL;
- if (strncasecmp(info.comp[i], "ZLI", 1) == 0)
- comp_priority[j++] = GNUTLS_COMP_ZLIB;
- }
- comp_priority[j] = 0;
- }
+ int i, j;
+
+ if (gaa(argc, argv, &info) != -1) {
+ fprintf(stderr,
+ "Error in the arguments. Use the --help or -h parameters to get more information.\n");
+ exit(1);
+ }
+
+ resume = info.resume;
+ port = info.port;
+ record_max_size = info.record_size;
+ fingerprint = info.fingerprint;
+
+ if (info.x509_certfile != NULL)
+ x509_certfile = info.x509_certfile;
+ else
+ x509_certfile = DEFAULT_X509_CERTFILE;
+
+ if (info.x509_keyfile != NULL)
+ x509_keyfile = info.x509_keyfile;
+ else
+ x509_keyfile = DEFAULT_X509_KEYFILE;
+
+ if (info.x509_cafile != NULL)
+ x509_cafile = info.x509_certfile;
+ else
+ x509_cafile = DEFAULT_X509_CAFILE;
+
+ if (info.pgp_certfile != NULL)
+ pgp_certfile = info.pgp_certfile;
+ else
+ pgp_certfile = DEFAULT_PGP_CERTFILE;
+
+ if (info.pgp_keyfile != NULL)
+ pgp_keyfile = info.pgp_keyfile;
+ else
+ pgp_keyfile = DEFAULT_PGP_KEYFILE;
+
+ if (info.srp_passwd != NULL)
+ srp_passwd = info.srp_passwd;
+ else
+ srp_passwd = DEFAULT_SRP_PASSWD;
+
+ if (info.srp_username != NULL)
+ srp_username = info.srp_username;
+ else
+ srp_username = DEFAULT_SRP_USERNAME;
+
+ pgp_keyring = info.pgp_keyring;
+ pgp_trustdb = info.pgp_trustdb;
+
+ if (info.nrest_args == 0)
+ hostname = "localhost";
+ else
+ hostname = info.rest_args[0];
+
+ if (info.proto != NULL && info.nproto > 0) {
+ for (j = i = 0; i < info.nproto; i++) {
+ if (strncasecmp(info.proto[i], "SSL", 3) == 0)
+ protocol_priority[j++] = GNUTLS_SSL3;
+ if (strncasecmp(info.proto[i], "TLS", 3) == 0)
+ protocol_priority[j++] = GNUTLS_TLS1;
+ }
+ protocol_priority[j] = 0;
+ }
+
+ if (info.ciphers != NULL && info.nciphers > 0) {
+ for (j = i = 0; i < info.nciphers; i++) {
+ if (strncasecmp(info.ciphers[i], "RIJ", 3) == 0)
+ cipher_priority[j++] = GNUTLS_CIPHER_RIJNDAEL_128_CBC;
+ if (strncasecmp(info.ciphers[i], "TWO", 3) == 0)
+ cipher_priority[j++] = GNUTLS_CIPHER_TWOFISH_128_CBC;
+ if (strncasecmp(info.ciphers[i], "3DE", 3) == 0)
+ cipher_priority[j++] = GNUTLS_CIPHER_3DES_CBC;
+ if (strncasecmp(info.ciphers[i], "ARC", 3) == 0)
+ cipher_priority[j++] = GNUTLS_CIPHER_ARCFOUR;
+ }
+ cipher_priority[j] = 0;
+ }
+
+ if (info.macs != NULL && info.nmacs > 0) {
+ for (j = i = 0; i < info.nmacs; i++) {
+ if (strncasecmp(info.macs[i], "MD5", 3) == 0)
+ mac_priority[j++] = GNUTLS_MAC_MD5;
+ if (strncasecmp(info.macs[i], "SHA", 3) == 0)
+ mac_priority[j++] = GNUTLS_MAC_SHA;
+ }
+ mac_priority[j] = 0;
+ }
+
+ if (info.ctype != NULL && info.nctype > 0) {
+ for (j = i = 0; i < info.nctype; i++) {
+ if (strncasecmp(info.ctype[i], "OPE", 3) == 0)
+ cert_type_priority[j++] = GNUTLS_CRT_OPENPGP;
+ if (strncasecmp(info.ctype[i], "X", 1) == 0)
+ cert_type_priority[j++] = GNUTLS_CRT_X509;
+ }
+ cert_type_priority[j] = 0;
+ }
+
+ if (info.kx != NULL && info.nkx > 0) {
+ for (j = i = 0; i < info.nkx; i++) {
+ if (strncasecmp(info.kx[i], "SRP", 3) == 0)
+ kx_priority[j++] = GNUTLS_KX_SRP;
+ if (strncasecmp(info.kx[i], "RSA", 3) == 0)
+ kx_priority[j++] = GNUTLS_KX_RSA;
+ if (strncasecmp(info.kx[i], "DHE_RSA", 7) == 0)
+ kx_priority[j++] = GNUTLS_KX_DHE_RSA;
+ if (strncasecmp(info.kx[i], "DHE_DSS", 7) == 0)
+ kx_priority[j++] = GNUTLS_KX_DHE_DSS;
+ if (strncasecmp(info.kx[i], "ANON", 4) == 0)
+ kx_priority[j++] = GNUTLS_KX_ANON_DH;
+ }
+ kx_priority[j] = 0;
+ }
+
+ if (info.comp != NULL && info.ncomp > 0) {
+ for (j = i = 0; i < info.ncomp; i++) {
+ if (strncasecmp(info.comp[i], "NUL", 3) == 0)
+ comp_priority[j++] = GNUTLS_COMP_NULL;
+ if (strncasecmp(info.comp[i], "ZLI", 1) == 0)
+ comp_priority[j++] = GNUTLS_COMP_ZLIB;
+ }
+ comp_priority[j] = 0;
+ }
}
-