~ubuntu-branches/ubuntu/trusty/gnutls26/trusty-security

« back to all changes in this revision

Viewing changes to src/cli.c

  • Committer: Bazaar Package Importer
  • Author(s): Andreas Metzler
  • Date: 2010-04-22 19:29:52 UTC
  • mto: (12.4.3 experimental) (1.5.1)
  • mto: This revision was merged to the branch mainline in revision 26.
  • Revision ID: james.westby@ubuntu.com-20100422192952-gbj6cvaan8e4ejck
Tags: upstream-2.9.10
ImportĀ upstreamĀ versionĀ 2.9.10

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
 
 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation
3
 
 * Copyright (C) 2000,2001,2002,2003 Nikos Mavrogiannopoulos
 
2
 * Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
 
3
 * 2009, 2010  Free Software Foundation, Inc.
4
4
 *
5
5
 * This file is part of GNUTLS.
6
6
 *
53
53
#define MAX_BUF 4096
54
54
 
55
55
/* global stuff here */
56
 
int resume, starttls, insecure;
 
56
int resume, starttls, insecure, rehandshake;
57
57
const char *hostname = NULL;
58
58
char *service;
59
59
int record_max_size;
318
318
 
319
319
}
320
320
 
321
 
 
 
321
static int
 
322
cert_verify_callback (gnutls_session_t session)
 
323
{
 
324
  int rc;
 
325
  unsigned int status;
 
326
 
 
327
  if (!x509_cafile && !pgp_keyring)
 
328
    return 0;
 
329
 
 
330
  rc = gnutls_certificate_verify_peers2 (session, &status);
 
331
  if (rc != 0 || status != 0)
 
332
    {
 
333
      printf ("*** Verifying server certificate failed...\n");
 
334
      if (!insecure)
 
335
        return -1;
 
336
    }
 
337
 
 
338
  return 0;
 
339
}
322
340
 
323
341
/* This callback should be associated with a session by calling
324
342
 * gnutls_certificate_client_set_retrieve_function( session, cert_callback),
493
511
  gnutls_credentials_set (session, GNUTLS_CRD_CERTIFICATE, xcred);
494
512
 
495
513
  gnutls_certificate_client_set_retrieve_function (xcred, cert_callback);
 
514
  gnutls_certificate_set_verify_function (xcred, cert_verify_callback);
496
515
 
497
516
  /* send the fingerprint */
498
517
#ifdef ENABLE_OPENPGP
606
625
  struct timeval tv;
607
626
  int user_term = 0, retval = 0;
608
627
  socket_st hd;
 
628
  ssize_t bytes;
609
629
 
610
630
  set_program_name (argv[0]);
611
631
 
725
745
     programs to search for when gnutls-cli has reached this point. */
726
746
  printf ("\n- Simple Client Mode:\n\n");
727
747
 
 
748
  if (rehandshake)
 
749
    {
 
750
      ret = do_handshake (&hd);
 
751
 
 
752
      if (ret < 0)
 
753
        {
 
754
          fprintf (stderr, "*** ReHandshake has failed\n");
 
755
          gnutls_perror (ret);
 
756
          gnutls_deinit (hd.session);
 
757
          return 1;
 
758
        }
 
759
      else
 
760
        {
 
761
          printf ("- ReHandshake was completed\n");
 
762
        }
 
763
    }
 
764
 
728
765
#ifndef _WIN32
729
766
  signal (SIGALRM, &starttls_alarm);
730
767
#endif
800
837
 
801
838
      if (FD_ISSET (fileno (stdin), &rset))
802
839
        {
803
 
          if (fgets (buffer, MAX_BUF, stdin) == NULL)
 
840
          if ((bytes = read (fileno (stdin), buffer, MAX_BUF - 1)) < 0)
804
841
            {
805
842
              if (hd.secure == 0)
806
843
                {
830
867
            {
831
868
              char *b = strchr (buffer, '\n');
832
869
              if (b != NULL)
833
 
                strcpy (b, "\r\n");
 
870
                {
 
871
                  strcpy (b, "\r\n");
 
872
                  bytes++;
 
873
                }
834
874
            }
835
875
 
836
 
          ret = socket_send (&hd, buffer, strlen (buffer));
 
876
          ret = socket_send (&hd, buffer, bytes);
837
877
 
838
878
          if (ret > 0)
839
879
            {
889
929
  print_cert = info.print_cert;
890
930
  starttls = info.starttls;
891
931
  resume = info.resume;
 
932
  rehandshake = info.rehandshake;
892
933
  insecure = info.insecure;
893
934
  service = info.port;
894
935
  record_max_size = info.record_size;
996
1037
      /* print some information */
997
1038
      print_info (socket->session, socket->hostname, info.insecure);
998
1039
 
999
 
      if ((x509_cafile || pgp_keyring) && !insecure)
1000
 
        {
1001
 
          int rc;
1002
 
          unsigned int status;
1003
 
 
1004
 
          /* abort if verification fail  */
1005
 
          rc = gnutls_certificate_verify_peers2 (socket->session, &status);
1006
 
          if (rc != 0 || status != 0)
1007
 
            {
1008
 
              printf ("*** Verifying server certificate failed...\n");
1009
 
              exit (1);
1010
 
            }
1011
 
        }
1012
1040
 
1013
1041
      socket->secure = 1;
1014
1042
 
1015
1043
    }
 
1044
  else
 
1045
    {
 
1046
      gnutls_alert_send_appropriate (socket->session, ret);
 
1047
      shutdown (socket->fd, SHUT_RDWR);
 
1048
    }
1016
1049
  return ret;
1017
1050
}
1018
1051