gnutls-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[SCM] GNU gnutls branch, master, updated. gnutls_3_0_15-7-g84fdabb


From: Nikos Mavrogiannopoulos
Subject: [SCM] GNU gnutls branch, master, updated. gnutls_3_0_15-7-g84fdabb
Date: Fri, 02 Mar 2012 21:24:29 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU gnutls".

http://git.savannah.gnu.org/cgit/gnutls.git/commit/?id=84fdabbb9661960caf3ddfd99678d2febd50d124

The branch, master has been updated
       via  84fdabbb9661960caf3ddfd99678d2febd50d124 (commit)
       via  c42b7e8de6c122a378e334f0646f000d73e83bd8 (commit)
       via  95102a4a1b25141bb768f7d10d2efc162ce451f3 (commit)
       via  3c7894afd1f2051a6bb4d36deae26d36b70d4d7d (commit)
       via  ac4a9e240ed3bc2445817c69466c629ef183a407 (commit)
      from  6eaea57ba48ffe1bd18cfeab88a1b4ff66bb7a12 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 84fdabbb9661960caf3ddfd99678d2febd50d124
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Fri Mar 2 22:30:27 2012 +0100

    documented fix

commit c42b7e8de6c122a378e334f0646f000d73e83bd8
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Fri Mar 2 22:29:42 2012 +0100

    Added ifdef HAVE_FCHMOD

commit 95102a4a1b25141bb768f7d10d2efc162ce451f3
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Fri Mar 2 22:03:03 2012 +0100

    More documentation on SRP

commit 3c7894afd1f2051a6bb4d36deae26d36b70d4d7d
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Fri Mar 2 21:55:51 2012 +0100

    Test SRP-RSA and plain SRP.

commit ac4a9e240ed3bc2445817c69466c629ef183a407
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Fri Mar 2 21:55:25 2012 +0100

    Corrected SRP-RSA in TLS 1.2

-----------------------------------------------------------------------

Summary of changes:
 NEWS                    |    8 +++++
 doc/cha-shared-key.texi |   18 ++++++-----
 lib/auth/srp_rsa.c      |   64 +++++++++++++++++++++++++++++++++++---
 src/libopts/makeshell.c |    2 +
 tests/srp/mini-srp.c    |   78 +++++++++++++++++++++++++++++++++++++++--------
 5 files changed, 144 insertions(+), 26 deletions(-)

diff --git a/NEWS b/NEWS
index 9e9122f..1280e3c 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,14 @@ GnuTLS NEWS -- History of user-visible changes.                
-*- outline -*-
 Copyright (C) 2000-2012 Free Software Foundation, Inc.
 See the end for copying conditions.
 
+* Version 3.0.16 (unreleased)
+
+** Corrected SRP-RSA ciphersuites when used under TLS 1.2.
+
+** API and ABI modifications:
+No changes since last version.
+
+
 * Version 3.0.15 (released 2012-03-02)
 
 ** test suite: Only run under valgrind in the development
diff --git a/doc/cha-shared-key.texi b/doc/cha-shared-key.texi
index a8730f4..c9605de 100644
--- a/doc/cha-shared-key.texi
+++ b/doc/cha-shared-key.texi
@@ -41,10 +41,16 @@ harm to the system security if they were revealed.  The 
@acronym{SRP}
 needs instead of the plain password something called a verifier, which
 is calculated using the user's password, and if stolen cannot be used
 to impersonate the user. 
-The Stanford @acronym{SRP} libraries, include a PAM module that synchronizes
-the system's users passwords with the @acronym{SRP} password
-files. That way @acronym{SRP} authentication could be used for all users
-of a system.
address@hidden The Stanford @acronym{SRP} libraries, include a PAM module that 
synchronizes
address@hidden the system's users passwords with the @acronym{SRP} password
address@hidden files. That way @acronym{SRP} authentication could be used for 
all users
address@hidden of a system.
+
+Typical conventions in SRP are a password file, called @file{tpasswd} that 
+holds the SRP verifiers (encoded passwords) and another file, 
@file{tpasswd.conf},
+which holds the allowed SRP parameters.  The included in GnuTLS helper 
+follow those conventions. The srptool program, discussed in the next section
+is a tool to manipulate the SRP parameters.
 
 The implementation in @acronym{GnuTLS} is based on @xcite{TLSSRP}. The
 supported key exchange methods are shown below.
@@ -64,10 +70,6 @@ authenticated using a certificate with RSA parameters.
 
 @end table
 
-Helper functions are included in @acronym{GnuTLS}, used to generate and
-maintain @acronym{SRP} verifiers and password files.  A program to
-manipulate the required parameters for @acronym{SRP} authentication is
-also included.  See @ref{srptool Invocation}, for more information.
 
 @showfuncdesc{gnutls_srp_verifier}
 
diff --git a/lib/auth/srp_rsa.c b/lib/auth/srp_rsa.c
index d425158..a18dc4f 100644
--- a/lib/auth/srp_rsa.c
+++ b/lib/auth/srp_rsa.c
@@ -38,6 +38,7 @@
 #include <gnutls_sig.h>
 #include <auth/srp.h>
 #include <gnutls_x509.h>
+#include <algorithms.h>
 
 static int gen_srp_cert_server_kx (gnutls_session_t, gnutls_buffer_st*);
 static int proc_srp_cert_server_kx (gnutls_session_t, uint8_t *, size_t);
@@ -86,6 +87,7 @@ gen_srp_cert_server_kx (gnutls_session_t session, 
gnutls_buffer_st* data)
   gnutls_privkey_t apr_pkey;
   int apr_cert_list_length;
   gnutls_sign_algorithm_t sign_algo;
+  gnutls_protocol_t ver = gnutls_protocol_get_version (session);
 
   ret = _gnutls_gen_srp_server_kx (session, data);
 
@@ -121,15 +123,49 @@ gen_srp_cert_server_kx (gnutls_session_t session, 
gnutls_buffer_st* data)
       return ret;
     }
 
-  ret = _gnutls_buffer_append_data_prefix( data, 16, signature.data, 
signature.size);
+  if (_gnutls_version_has_selectable_sighash (ver))
+    {
+      const sign_algorithm_st *aid;
+      uint8_t p[2];
+
+      if (sign_algo == GNUTLS_SIGN_UNKNOWN)
+        {
+          ret = GNUTLS_E_UNKNOWN_ALGORITHM;
+          goto cleanup;
+        }
+
+      aid = _gnutls_sign_to_tls_aid (sign_algo);
+      if (aid == NULL)
+        {
+          gnutls_assert();
+          ret = GNUTLS_E_UNKNOWN_ALGORITHM;
+          goto cleanup;
+        }
+      
+      p[0] = aid->hash_algorithm;
+      p[1] = aid->sign_algorithm;
+      
+      ret = _gnutls_buffer_append_data(data, p, 2);
+      if (ret < 0)
+        {
+          gnutls_assert();
+          goto cleanup;
+        }
+    }
 
-  _gnutls_free_datum (&signature);
+  ret = _gnutls_buffer_append_data_prefix( data, 16, signature.data, 
signature.size);
 
   if (ret < 0)
-    return gnutls_assert_val(ret);
+    {
+      gnutls_assert();
+      goto cleanup;
+    }
 
-  return data->length;
+  ret = data->length;
 
+cleanup:
+  _gnutls_free_datum (&signature);
+  return ret;
 }
 
 static int
@@ -143,6 +179,8 @@ proc_srp_cert_server_kx (gnutls_session_t session, uint8_t 
* data,
   cert_auth_info_t info;
   gnutls_pcert_st peer_cert;
   uint8_t *p;
+  gnutls_sign_algorithm_t sign_algo = GNUTLS_SIGN_UNKNOWN;
+  gnutls_protocol_t ver = gnutls_protocol_get_version (session);
 
   ret = _gnutls_proc_srp_server_kx (session, data, _data_size);
   if (ret < 0)
@@ -164,6 +202,22 @@ proc_srp_cert_server_kx (gnutls_session_t session, uint8_t 
* data,
   vparams.data = data;
 
   p = &data[vparams.size];
+  if (_gnutls_version_has_selectable_sighash (ver))
+    {
+      sign_algorithm_st aid;
+
+      DECR_LEN (data_size, 1);
+      aid.hash_algorithm = *p++;
+      DECR_LEN (data_size, 1);
+      aid.sign_algorithm = *p++;
+      sign_algo = _gnutls_tls_aid_to_sign (&aid);
+      if (sign_algo == GNUTLS_SIGN_UNKNOWN)
+        {
+          _gnutls_debug_log("unknown signature %d.%d\n", aid.sign_algorithm, 
aid.hash_algorithm);
+          gnutls_assert ();
+          return GNUTLS_E_UNSUPPORTED_SIGNATURE_ALGORITHM;
+        }
+    }
 
   DECR_LEN (data_size, 2);
   sigsize = _gnutls_read_uint16 (p);
@@ -185,7 +239,7 @@ proc_srp_cert_server_kx (gnutls_session_t session, uint8_t 
* data,
 
   ret =
     _gnutls_handshake_verify_data (session, &peer_cert, &vparams, &signature,
-                                   GNUTLS_SIGN_UNKNOWN);
+                                   sign_algo);
 
   gnutls_pcert_deinit (&peer_cert);
   if (ret < 0)
diff --git a/src/libopts/makeshell.c b/src/libopts/makeshell.c
index 1730c81..a2b0a2e 100644
--- a/src/libopts/makeshell.c
+++ b/src/libopts/makeshell.c
@@ -164,7 +164,9 @@ optionParseShell(tOptions * pOpts)
         printf(SHOW_PROG_ENV, pOpts->pzPROGNAME);
 
     fflush(stdout);
+#ifdef HAVE_FCHMOD
     fchmod(STDOUT_FILENO, 0755);
+#endif
     fclose(stdout);
     if (ferror(stdout)) {
         fputs(zOutputFail, stderr);
diff --git a/tests/srp/mini-srp.c b/tests/srp/mini-srp.c
index 79943ab..5ac7203 100644
--- a/tests/srp/mini-srp.c
+++ b/tests/srp/mini-srp.c
@@ -49,7 +49,7 @@ int main()
 
 static void terminate(void);
 
-/* This program tests the rehandshake in DTLS
+/* This program tests the SRP and SRP-RSA ciphersuites.
  */
 
 static void
@@ -64,16 +64,55 @@ client_log_func (int level, const char *str)
   fprintf (stderr, "client|<%d>| %s", level, str);
 }
 
-/* A very basic TLS client, with anonymous authentication.
- */
+static unsigned char server_cert_pem[] =
+  "-----BEGIN CERTIFICATE-----\n"
+  "MIICVjCCAcGgAwIBAgIERiYdMTALBgkqhkiG9w0BAQUwGTEXMBUGA1UEAxMOR251\n"
+  "VExTIHRlc3QgQ0EwHhcNMDcwNDE4MTMyOTIxWhcNMDgwNDE3MTMyOTIxWjA3MRsw\n"
+  "GQYDVQQKExJHbnVUTFMgdGVzdCBzZXJ2ZXIxGDAWBgNVBAMTD3Rlc3QuZ251dGxz\n"
+  "Lm9yZzCBnDALBgkqhkiG9w0BAQEDgYwAMIGIAoGA17pcr6MM8C6pJ1aqU46o63+B\n"
+  "dUxrmL5K6rce+EvDasTaDQC46kwTHzYWk95y78akXrJutsoKiFV1kJbtple8DDt2\n"
+  "DZcevensf9Op7PuFZKBroEjOd35znDET/z3IrqVgbtm2jFqab7a+n2q9p/CgMyf1\n"
+  "tx2S5Zacc1LWn9bIjrECAwEAAaOBkzCBkDAMBgNVHRMBAf8EAjAAMBoGA1UdEQQT\n"
+  "MBGCD3Rlc3QuZ251dGxzLm9yZzATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHQ8B\n"
+  "Af8EBQMDB6AAMB0GA1UdDgQWBBTrx0Vu5fglyoyNgw106YbU3VW0dTAfBgNVHSME\n"
+  "GDAWgBTpPBz7rZJu5gakViyi4cBTJ8jylTALBgkqhkiG9w0BAQUDgYEAaFEPTt+7\n"
+  "bzvBuOf7+QmeQcn29kT6Bsyh1RHJXf8KTk5QRfwp6ogbp94JQWcNQ/S7YDFHglD1\n"
+  "AwUNBRXwd3riUsMnsxgeSDxYBfJYbDLeohNBsqaPDJb7XailWbMQKfAbFQ8cnOxg\n"
+  "rOKLUQRWJ0K3HyXRMhbqjdLIaQiCvQLuizo=\n" "-----END CERTIFICATE-----\n";
+
+const gnutls_datum_t server_cert = { server_cert_pem,
+  sizeof (server_cert_pem)
+};
+
+static unsigned char server_key_pem[] =
+  "-----BEGIN RSA PRIVATE KEY-----\n"
+  "MIICXAIBAAKBgQDXulyvowzwLqknVqpTjqjrf4F1TGuYvkrqtx74S8NqxNoNALjq\n"
+  "TBMfNhaT3nLvxqResm62ygqIVXWQlu2mV7wMO3YNlx696ex/06ns+4VkoGugSM53\n"
+  "fnOcMRP/PciupWBu2baMWppvtr6far2n8KAzJ/W3HZLllpxzUtaf1siOsQIDAQAB\n"
+  "AoGAYAFyKkAYC/PYF8e7+X+tsVCHXppp8AoP8TEZuUqOZz/AArVlle/ROrypg5kl\n"
+  "8YunrvUdzH9R/KZ7saNZlAPLjZyFG9beL/am6Ai7q7Ma5HMqjGU8kTEGwD7K+lbG\n"
+  "iomokKMOl+kkbY/2sI5Czmbm+/PqLXOjtVc5RAsdbgvtmvkCQQDdV5QuU8jap8Hs\n"
+  "Eodv/tLJ2z4+SKCV2k/7FXSKWe0vlrq0cl2qZfoTUYRnKRBcWxc9o92DxK44wgPi\n"
+  "oMQS+O7fAkEA+YG+K9e60sj1K4NYbMPAbYILbZxORDecvP8lcphvwkOVUqbmxOGh\n"
+  "XRmTZUuhBrJhJKKf6u7gf3KWlPl6ShKEbwJASC118cF6nurTjuLf7YKARDjNTEws\n"
+  "qZEeQbdWYINAmCMj0RH2P0mvybrsXSOD5UoDAyO7aWuqkHGcCLv6FGG+qwJAOVqq\n"
+  "tXdUucl6GjOKKw5geIvRRrQMhb/m5scb+5iw8A4LEEHPgGiBaF5NtJZLALgWfo5n\n"
+  "hmC8+G8F0F78znQtPwJBANexu+Tg5KfOnzSILJMo3oXiXhf5PqXIDmbN0BKyCKAQ\n"
+  "LfkcEcUbVfmDaHpvzwY9VEaoMOKVLitETXdNSxVpvWM=\n"
+  "-----END RSA PRIVATE KEY-----\n";
+
+const gnutls_datum_t server_key = { server_key_pem,
+  sizeof (server_key_pem)
+};
 
 
 static void
-client (int fd)
+client (int fd, const char* prio)
 {
   int ret;
   gnutls_session_t session;
   gnutls_srp_client_credentials_t srp_cred;
+  gnutls_certificate_credentials_t x509_cred;
   /* Need to enable anonymous KX specifically. */
 
   gnutls_global_init ();
@@ -85,6 +124,8 @@ client (int fd)
     }
 
   gnutls_srp_allocate_client_credentials (&srp_cred);
+  gnutls_certificate_allocate_credentials (&x509_cred);
+
   gnutls_srp_set_client_credentials (srp_cred, "test", "test");
 
   /* Initialize TLS session
@@ -92,11 +133,12 @@ client (int fd)
   gnutls_init (&session, GNUTLS_CLIENT);
 
   /* Use default priorities */
-  gnutls_priority_set_direct (session, "NORMAL:+SRP", NULL);
+  gnutls_priority_set_direct (session, prio, NULL);
 
   /* put the anonymous credentials to the current session
    */
   gnutls_credentials_set (session, GNUTLS_CRD_SRP, srp_cred);
+  gnutls_credentials_set (session, GNUTLS_CRD_CERTIFICATE, x509_cred);
 
   gnutls_transport_set_ptr (session, (gnutls_transport_ptr_t) fd);
 
@@ -132,6 +174,7 @@ client (int fd)
   gnutls_deinit (session);
 
   gnutls_srp_free_client_credentials (srp_cred);
+  gnutls_certificate_free_credentials (x509_cred);
 
   gnutls_global_deinit ();
 }
@@ -139,10 +182,11 @@ client (int fd)
 
 /* These are global */
 gnutls_srp_server_credentials_t s_srp_cred;
+gnutls_certificate_credentials_t s_x509_cred;
 pid_t child;
 
 static gnutls_session_t
-initialize_tls_session (void)
+initialize_tls_session (const char* prio)
 {
   gnutls_session_t session;
 
@@ -151,9 +195,10 @@ initialize_tls_session (void)
   /* avoid calling all the priority functions, since the defaults
    * are adequate.
    */
-  gnutls_priority_set_direct (session, "NORMAL:+SRP", NULL);
+  gnutls_priority_set_direct (session, prio, NULL);
 
   gnutls_credentials_set (session, GNUTLS_CRD_SRP, s_srp_cred);
+  gnutls_credentials_set (session, GNUTLS_CRD_CERTIFICATE, s_x509_cred);
 
   return session;
 }
@@ -168,7 +213,7 @@ int status;
 }
 
 static void
-server (int fd)
+server (int fd, const char* prio)
 {
 int ret;
 gnutls_session_t session;
@@ -187,7 +232,12 @@ gnutls_session_t session;
   gnutls_srp_set_server_credentials_file (s_srp_cred, "tpasswd",
                                           "tpasswd.conf");
 
-  session = initialize_tls_session ();
+  gnutls_certificate_allocate_credentials (&s_x509_cred);
+  gnutls_certificate_set_x509_key_mem (s_x509_cred,
+                                       &server_cert, &server_key,
+                                       GNUTLS_X509_FMT_PEM);
+
+  session = initialize_tls_session (prio);
 
   gnutls_transport_set_ptr (session, (gnutls_transport_ptr_t) fd);
 
@@ -219,6 +269,7 @@ gnutls_session_t session;
   gnutls_deinit (session);
 
   gnutls_srp_free_server_credentials (s_srp_cred);
+  gnutls_certificate_free_credentials (s_x509_cred);
 
   gnutls_global_deinit ();
 
@@ -226,7 +277,7 @@ gnutls_session_t session;
     success ("server: finished\n");
 }
 
-static void start (void)
+static void start (const char* prio)
 {
   int fd[2];
   int ret;
@@ -250,14 +301,14 @@ static void start (void)
     {
       int status;
       /* parent */
-      server (fd[0]);
+      server (fd[0], prio);
       wait (&status);
       if (WEXITSTATUS(status) != 0)
         fail("Child died with status %d\n", WEXITSTATUS(status));
     }
   else 
     {
-      client (fd[1]);
+      client (fd[1], prio);
       exit(0);
     }
 }
@@ -265,7 +316,8 @@ static void start (void)
 void
 doit (void)
 {
-  start();
+  start("NORMAL:-KX-ALL:+SRP");
+  start("NORMAL:-KX-ALL:+SRP-RSA");
 }
 
 #endif /* _WIN32 */


hooks/post-receive
-- 
GNU gnutls



reply via email to

[Prev in Thread] Current Thread [Next in Thread]