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_12-221-gd77d792


From: Nikos Mavrogiannopoulos
Subject: [SCM] GNU gnutls branch, master, updated. gnutls-3_0_12-221-gd77d792
Date: Tue, 14 Feb 2012 10:33:14 +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=d77d792c4abc6a198309501bd293dbf0252436b8

The branch, master has been updated
       via  d77d792c4abc6a198309501bd293dbf0252436b8 (commit)
       via  90dfb21d9d03a336a4a8ee4b747b2236ac8686ea (commit)
       via  fe48f95d6b5d9a2e8b51851528685801e27225b6 (commit)
       via  1148b8e34f5e0cb408f732f26af8132d88d5ee50 (commit)
       via  1d2466e9816a4cd7c1df69c029cbc2ea1eae763a (commit)
      from  6d9b794ba08cc26efc2298c9009b0b52d14b7b91 (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 d77d792c4abc6a198309501bd293dbf0252436b8
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Tue Feb 14 11:38:24 2012 +0100

    handle GNUTLS_E_INTERRUPTED when in DTLS mode.

commit 90dfb21d9d03a336a4a8ee4b747b2236ac8686ea
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Tue Feb 14 11:30:20 2012 +0100

    added a valid template

commit fe48f95d6b5d9a2e8b51851528685801e27225b6
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Tue Feb 14 11:23:04 2012 +0100

    Do not treat any message from the peer as an indication that the last 
flight was correctly received.
    Verify instead that the received handshake message has an expected sequence 
number.

commit 1148b8e34f5e0cb408f732f26af8132d88d5ee50
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Tue Feb 14 11:22:51 2012 +0100

    changecipherspec is correctly added into buffers.

commit 1d2466e9816a4cd7c1df69c029cbc2ea1eae763a
Author: Nikos Mavrogiannopoulos <address@hidden>
Date:   Sun Feb 12 19:35:09 2012 +0100

    use NEED_LIBOPTS_DIR=true instead of modifying libopts.m4

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

Summary of changes:
 configure.ac              |    1 +
 lib/ext/session_ticket.c  |    2 +-
 lib/gnutls_buffers.c      |   57 ++++++++++++-------------
 lib/gnutls_buffers.h      |    5 ++-
 lib/gnutls_dtls.c         |  103 ++++++++++++++++++++++++++++++++++-----------
 lib/gnutls_dtls.h         |    7 ++-
 lib/gnutls_handshake.c    |   22 ++++------
 lib/gnutls_handshake.h    |    5 +--
 lib/gnutls_int.h          |    3 +-
 lib/gnutls_kx.c           |   24 +++++-----
 lib/gnutls_record.c       |    4 +-
 src/libopts/m4/libopts.m4 |    3 +-
 tests/key-id/key-id       |    2 +-
 13 files changed, 145 insertions(+), 93 deletions(-)

diff --git a/configure.ac b/configure.ac
index 72f9014..f23c33c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -148,6 +148,7 @@ fi
 AM_CONDITIONAL(ENABLE_PKCS11, test "$with_p11_kit" != "no")
 
 dnl Checks for programs in src/ 
+NEED_LIBOPTS_DIR=true
 LIBOPTS_CHECK([src/libopts])
 
 AC_CHECK_TYPE(ssize_t,
diff --git a/lib/ext/session_ticket.c b/lib/ext/session_ticket.c
index 70f1299..626c976 100644
--- a/lib/ext/session_ticket.c
+++ b/lib/ext/session_ticket.c
@@ -691,7 +691,7 @@ _gnutls_recv_new_session_ticket (gnutls_session_t session)
 
   ret = _gnutls_recv_handshake (session, 
                                 GNUTLS_HANDSHAKE_NEW_SESSION_TICKET,
-                                MANDATORY_PACKET, &buf);
+                                0, &buf);
   if (ret < 0)
     return gnutls_assert_val_fatal(ret);
 
diff --git a/lib/gnutls_buffers.c b/lib/gnutls_buffers.c
index 755bb4c..80b5b22 100644
--- a/lib/gnutls_buffers.c
+++ b/lib/gnutls_buffers.c
@@ -736,8 +736,8 @@ const handshake_buffer_st* e2 = _e2;
 
 #define SSL2_HEADERS 1
 static int
-parse_handshake_header (gnutls_session_t session, mbuffer_st* bufel, 
gnutls_handshake_description_t htype, 
-    handshake_buffer_st* hsk)
+parse_handshake_header (gnutls_session_t session, mbuffer_st* bufel,
+                        handshake_buffer_st* hsk)
 {
   uint8_t *dataptr = NULL;      /* for realloc */
   size_t handshake_header_size = HANDSHAKE_HEADER_SIZE(session), data_size;
@@ -749,8 +749,7 @@ parse_handshake_header (gnutls_session_t session, 
mbuffer_st* bufel, gnutls_hand
   dataptr = _mbuffer_get_udata_ptr(bufel);
 
   /* if reading a client hello of SSLv2 */
-  if (!IS_DTLS(session) && htype == GNUTLS_HANDSHAKE_CLIENT_HELLO &&
-    bufel->htype == GNUTLS_HANDSHAKE_CLIENT_HELLO_V2)
+  if (!IS_DTLS(session) && bufel->htype == GNUTLS_HANDSHAKE_CLIENT_HELLO_V2)
     {
       handshake_header_size = SSL2_HEADERS; /* we've already read one byte */
 
@@ -913,7 +912,7 @@ inline static int 
cmp_hsk_types(gnutls_handshake_description_t expected, gnutls_
 /* returns the last stored handshake packet.
  */
 static int get_last_packet(gnutls_session_t session, 
gnutls_handshake_description_t htype,
-  handshake_buffer_st * hsk)
+                           handshake_buffer_st * hsk, unsigned int optional)
 {
 handshake_buffer_st* recv_buf = session->internals.handshake_recv_buffer;
 
@@ -925,7 +924,10 @@ handshake_buffer_st* recv_buf = 
session->internals.handshake_recv_buffer;
 
       if (htype != recv_buf[LAST_ELEMENT].htype)
         {
-          hsk->htype = recv_buf[LAST_ELEMENT].htype;
+          if (optional == 0)
+            _gnutls_audit_log(session, "Received unexpected handshake message 
'%s' (%d). Expected '%s' (%d)\n",
+                    _gnutls_handshake2str(recv_buf[0].htype), 
(int)recv_buf[0].htype, _gnutls_handshake2str(htype), (int)htype);
+
           return gnutls_assert_val(GNUTLS_E_UNEXPECTED_HANDSHAKE_PACKET);
         }
 
@@ -947,7 +949,6 @@ handshake_buffer_st* recv_buf = 
session->internals.handshake_recv_buffer;
         {
           if (cmp_hsk_types(htype, recv_buf[0].htype) == 0)
             {
-              hsk->htype = recv_buf[LAST_ELEMENT].htype;
               return gnutls_assert_val(GNUTLS_E_UNEXPECTED_HANDSHAKE_PACKET);
             }
 
@@ -960,16 +961,16 @@ handshake_buffer_st* recv_buf = 
session->internals.handshake_recv_buffer;
     }
 
 timeout:
-  RETURN_DTLS_EAGAIN_OR_TIMEOUT(session);
+  RETURN_DTLS_EAGAIN_OR_TIMEOUT(session, 0);
 }
 
 /* This is a receive function for the gnutls handshake 
  * protocol. Makes sure that we have received all data.
+ *
+ * htype is the next handshake packet expected.
  */
-static int
-parse_record_buffered_msgs (gnutls_session_t session,
-                               gnutls_handshake_description_t htype,
-                               handshake_buffer_st * hsk)
+int
+_gnutls_parse_record_buffered_msgs (gnutls_session_t session)
 {
   gnutls_datum_t msg;
   mbuffer_st* bufel = NULL, *prev = NULL;
@@ -1011,7 +1012,7 @@ parse_record_buffered_msgs (gnutls_session_t session,
             }
           else /* received new message */
             {
-              ret = parse_handshake_header(session, bufel, htype, 
&recv_buf[0]);
+              ret = parse_handshake_header(session, bufel, &recv_buf[0]);
               if (ret < 0)
                 return gnutls_assert_val(ret);
 
@@ -1026,13 +1027,6 @@ parse_record_buffered_msgs (gnutls_session_t session,
                 return gnutls_assert_val(ret);
               _mbuffer_set_uhead_size(bufel, 0);
               _mbuffer_head_remove_bytes(&session->internals.record_buffer, 
data_size+header_size);
-
-              if (cmp_hsk_types(htype, recv_buf[0].htype) == 0)
-                { /* an unexpected packet */
-                  hsk->htype = recv_buf[0].htype;
-                  return 
gnutls_assert_val(GNUTLS_E_UNEXPECTED_HANDSHAKE_PACKET);
-                }
-
             }
 
           /* if packet is complete then return it
@@ -1040,7 +1034,7 @@ parse_record_buffered_msgs (gnutls_session_t session,
           if (recv_buf[0].length ==
                 recv_buf[0].data.length)
             {
-              return get_last_packet(session, htype, hsk);
+              return 0;
             }
           bufel = _mbuffer_head_get_first(&session->internals.record_buffer, 
&msg);
         } 
@@ -1073,7 +1067,7 @@ parse_record_buffered_msgs (gnutls_session_t session,
 
               _gnutls_handshake_buffer_init(&tmp);
 
-              ret = parse_handshake_header(session, bufel, htype, &tmp);
+              ret = parse_handshake_header(session, bufel, &tmp);
               if (ret < 0)
                 {
                   gnutls_assert();
@@ -1115,14 +1109,14 @@ next:
           sizeof(recv_buf[0]), handshake_compare);
 
       while(session->internals.handshake_recv_buffer_size > 0 &&
-        recv_buf[LAST_ELEMENT].sequence < session->internals.dtls.hsk_read_seq)
+            recv_buf[LAST_ELEMENT].sequence < 
session->internals.dtls.hsk_read_seq)
         {
           _gnutls_audit_log(session, "Discarded replayed handshake packet with 
sequence %d\n", recv_buf[LAST_ELEMENT].sequence);
           _gnutls_handshake_buffer_clear(&recv_buf[LAST_ELEMENT]);
           session->internals.handshake_recv_buffer_size--;
         }
 
-        return get_last_packet(session, htype, hsk);
+        return 0;
     }
 }
 
@@ -1132,11 +1126,11 @@ next:
 ssize_t
 _gnutls_handshake_io_recv_int (gnutls_session_t session,
                                gnutls_handshake_description_t htype,
-                               handshake_buffer_st * hsk)
+                               handshake_buffer_st * hsk, unsigned int 
optional)
 {
   int ret;
 
-  ret = get_last_packet(session, htype, hsk);
+  ret = get_last_packet(session, htype, hsk, optional);
   if (ret != GNUTLS_E_AGAIN && ret != GNUTLS_E_INTERRUPTED && ret != 
GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
     {
       return gnutls_assert_val(ret);
@@ -1145,7 +1139,10 @@ _gnutls_handshake_io_recv_int (gnutls_session_t session,
   /* try using the already existing records before
    * trying to receive.
    */
-  ret = parse_record_buffered_msgs(session, htype, hsk);
+  ret = _gnutls_parse_record_buffered_msgs(session);
+
+  if (ret == 0) ret = get_last_packet(session, htype, hsk, optional);
+
   if (IS_DTLS(session))
     {
       if (ret >= 0)
@@ -1163,6 +1160,8 @@ _gnutls_handshake_io_recv_int (gnutls_session_t session,
   if (ret < 0)
     return gnutls_assert_val_fatal(ret);
 
-  return parse_record_buffered_msgs(session, htype, hsk); 
+  ret = _gnutls_parse_record_buffered_msgs(session);
+  if (ret == 0) ret = get_last_packet(session, htype, hsk, optional);
+  
+  return ret;
 }
-
diff --git a/lib/gnutls_buffers.h b/lib/gnutls_buffers.h
index 8a738b2..a34cc00 100644
--- a/lib/gnutls_buffers.h
+++ b/lib/gnutls_buffers.h
@@ -50,7 +50,7 @@ int _gnutls_handshake_io_cache_int (gnutls_session_t,
 ssize_t
 _gnutls_handshake_io_recv_int (gnutls_session_t session,
                                gnutls_handshake_description_t htype,
-                               handshake_buffer_st * hsk);
+                               handshake_buffer_st * hsk, unsigned int 
optional);
 
 ssize_t _gnutls_io_write_flush (gnutls_session_t session);
 int
@@ -88,6 +88,9 @@ int i;
   session->internals.handshake_recv_buffer_size = 0;
 }
 
+int
+_gnutls_parse_record_buffered_msgs (gnutls_session_t session);
+
 ssize_t
 _gnutls_recv_in_buffers (gnutls_session_t session, content_type_t type,
                   gnutls_handshake_description_t htype);
diff --git a/lib/gnutls_dtls.c b/lib/gnutls_dtls.c
index 694d2d0..62ac934 100644
--- a/lib/gnutls_dtls.c
+++ b/lib/gnutls_dtls.c
@@ -134,7 +134,8 @@ static int drop_usage_count(gnutls_session_t session, 
mbuffer_head_st *const sen
   return 0;
 }
 
-#define RETRANSMIT_WINDOW 2
+/* in ms */
+#define RETRANSMIT_WINDOW 600
 
 /* This function is to be called from record layer once
  * a handshake replay is detected. It will make sure
@@ -143,18 +144,33 @@ static int drop_usage_count(gnutls_session_t session, 
mbuffer_head_st *const sen
  */
 int _dtls_retransmit(gnutls_session_t session)
 {
-time_t now = gnutls_time (0);
+  return _dtls_transmit(session);
+}
+
+/* Checks whether the received packet contains a handshake
+ * packet with sequence higher that the previously received.
+ * It must be called only when an actual packet has been
+ * received.
+ *
+ * Returns: 0 if expected, negative value otherwise.
+ */
+static int is_next_hpacket_expected(gnutls_session_t session)
+{
 int ret;
 
-  if (now - session->internals.dtls.last_retransmit > RETRANSMIT_WINDOW)
-    {
-      ret = _dtls_transmit(session);
-      session->internals.dtls.last_retransmit = now;
-      return ret;
-    }
-  else
-    return 0;
+  /* htype is arbitrary */
+  ret = _gnutls_recv_in_buffers(session, GNUTLS_HANDSHAKE, 
GNUTLS_HANDSHAKE_FINISHED);
+  if (ret < 0)
+    return gnutls_assert_val(ret);
+  
+  ret = _gnutls_parse_record_buffered_msgs(session);
+  if (ret < 0)
+    return gnutls_assert_val(ret);
 
+  if (session->internals.handshake_recv_buffer_size > 0)
+    return 0;
+  else
+    return gnutls_assert_val(GNUTLS_E_UNEXPECTED_HANDSHAKE_PACKET);
 }
 
 #define UPDATE_TIMER { \
@@ -216,10 +232,23 @@ unsigned int timeout;
                   goto nb_timeout;
                 }
             }
-          else /* received ack */
+          else /* received something */
             {
-              ret = 0;
-              goto end_flight;
+              if (ret == 0)
+                {
+                  ret = is_next_hpacket_expected(session);
+                  if (ret == GNUTLS_E_AGAIN || ret == GNUTLS_E_INTERRUPTED)
+                    goto nb_timeout;
+                  if (ret < 0 && ret != GNUTLS_E_UNEXPECTED_HANDSHAKE_PACKET)
+                    {
+                      gnutls_assert();
+                      goto cleanup;
+                    }
+                  if (ret == 0) goto end_flight;
+                  /* if ret == GNUTLS_E_UNEXPECTED_HANDSHAKE_PACKET retransmit 
*/
+                }
+              else
+                goto nb_timeout;
             }
         }
       else /* last flight of an async party. Return immediately. */
@@ -236,19 +265,23 @@ unsigned int timeout;
           goto end_flight;
         }
 
-      _gnutls_dtls_log ("DTLS[%p]: %sStart of flight transmission.\n", 
session,  (session->internals.dtls.flight_init == 0)?"":"re-");
-
-      for (cur = send_buffer->head;
-           cur != NULL; cur = cur->next)
+      diff = timespec_sub_ms(&now, &session->internals.dtls.last_retransmit);
+      if (session->internals.dtls.flight_init == 0 || diff >= 
RETRANSMIT_WINDOW)
         {
-          ret = transmit_message (session, cur, &buf);
-          if (ret < 0)
+          _gnutls_dtls_log ("DTLS[%p]: %sStart of flight transmission.\n", 
session,  (session->internals.dtls.flight_init == 0)?"":"re-");
+          for (cur = send_buffer->head;
+               cur != NULL; cur = cur->next)
             {
-              gnutls_assert();
-              goto end_flight;
-            }
+              ret = transmit_message (session, cur, &buf);
+              if (ret < 0)
+                {
+                  gnutls_assert();
+                  goto end_flight;
+                }
 
-          last_type = cur->htype;
+              last_type = cur->htype;
+            }
+          gettime(&session->internals.dtls.last_retransmit);
         }
 
       if (session->internals.dtls.flight_init == 0)
@@ -304,8 +337,28 @@ unsigned int timeout;
                   goto nb_timeout;
                 }
             }
+          
+          if (ret == 0)
+            {
+              ret = is_next_hpacket_expected(session);
+              if (ret == GNUTLS_E_AGAIN || ret == GNUTLS_E_INTERRUPTED)
+                goto nb_timeout;
+
+              if (ret == GNUTLS_E_UNEXPECTED_HANDSHAKE_PACKET)
+                {
+                  ret = GNUTLS_E_TIMEDOUT;
+                  goto keep_up;
+                }
+              if (ret < 0)
+                {
+                  gnutls_assert();
+                  goto cleanup;
+                }
+              goto end_flight;
+            }
         }
 
+keep_up:
       gettime(&now);
     } while(ret == GNUTLS_E_TIMEDOUT);
 
@@ -335,7 +388,7 @@ nb_timeout:
   if (buf != NULL)
     gnutls_free(buf);
 
-  RETURN_DTLS_EAGAIN_OR_TIMEOUT(session);
+  RETURN_DTLS_EAGAIN_OR_TIMEOUT(session, ret);
 }
 
 /* Waits for the last flight or retransmits
@@ -356,7 +409,7 @@ int ret;
       ret = _dtls_retransmit(session);
       if (ret == 0)
         {
-          RETURN_DTLS_EAGAIN_OR_TIMEOUT(session);
+          RETURN_DTLS_EAGAIN_OR_TIMEOUT(session, 0);
         }
       else
         return gnutls_assert_val(ret);
diff --git a/lib/gnutls_dtls.h b/lib/gnutls_dtls.h
index b910d3d..467b3e9 100644
--- a/lib/gnutls_dtls.h
+++ b/lib/gnutls_dtls.h
@@ -42,7 +42,7 @@ inline static unsigned int timespec_sub_ms(struct timespec 
*a, struct timespec *
           (b->tv_sec * 1000 + b->tv_nsec / (1000 * 1000)));
 }
 
-#define RETURN_DTLS_EAGAIN_OR_TIMEOUT(session) { \
+#define RETURN_DTLS_EAGAIN_OR_TIMEOUT(session, r) { \
   struct timespec now; \
   unsigned int diff; \
   gettime(&now); \
@@ -55,9 +55,12 @@ inline static unsigned int timespec_sub_ms(struct timespec 
*a, struct timespec *
     } \
   else \
     { \
+      int rr; \
+      if (r != GNUTLS_E_INTERRUPTED) rr = GNUTLS_E_AGAIN; \
+      else rr = r; \
       if (session->internals.dtls.blocking != 0) \
         millisleep(50); \
-      return gnutls_assert_val(GNUTLS_E_AGAIN); \
+      return gnutls_assert_val(rr); \
     } \
   }
 
diff --git a/lib/gnutls_handshake.c b/lib/gnutls_handshake.c
index 60434fa..573635a 100644
--- a/lib/gnutls_handshake.c
+++ b/lib/gnutls_handshake.c
@@ -678,7 +678,7 @@ _gnutls_recv_finished (gnutls_session_t session)
 
   ret =
     _gnutls_recv_handshake (session, GNUTLS_HANDSHAKE_FINISHED, 
-      MANDATORY_PACKET, &buf);
+                            0, &buf);
   if (ret < 0)
     {
       ERR ("recv finished int", ret);
@@ -1251,25 +1251,21 @@ _gnutls_handshake_hash_add_sent (gnutls_session_t 
session,
 int
 _gnutls_recv_handshake (gnutls_session_t session, 
                         gnutls_handshake_description_t type,
-                        optional_t optional, gnutls_buffer_st* buf)
+                        unsigned int optional, gnutls_buffer_st* buf)
 {
   int ret;
   handshake_buffer_st hsk;
 
   ret =
-    _gnutls_handshake_io_recv_int (session, type, &hsk);
+    _gnutls_handshake_io_recv_int (session, type, &hsk, optional);
   if (ret < 0)
     {
-      if (optional == OPTIONAL_PACKET && ret == 
GNUTLS_E_UNEXPECTED_HANDSHAKE_PACKET)
+      if (optional != 0 && ret == GNUTLS_E_UNEXPECTED_HANDSHAKE_PACKET)
         {
           if (buf) _gnutls_buffer_init(buf);
           return 0;
         }
 
-       if (ret == GNUTLS_E_UNEXPECTED_HANDSHAKE_PACKET)
-        _gnutls_audit_log(session, "Received unexpected handshake message '%s' 
(%d). Expected '%s' (%d)\n",
-         _gnutls_handshake2str(hsk.htype), (int)hsk.htype, 
_gnutls_handshake2str(type), (int)type);
-
       return gnutls_assert_val_fatal(ret);
     }
 
@@ -2292,7 +2288,7 @@ _gnutls_recv_supplemental (gnutls_session_t session)
   _gnutls_debug_log ("EXT[%p]: Expecting supplemental data\n", session);
 
   ret = _gnutls_recv_handshake (session, GNUTLS_HANDSHAKE_SUPPLEMENTAL,
-                                OPTIONAL_PACKET, &buf);
+                                1, &buf);
   if (ret < 0)
     {
       gnutls_assert ();
@@ -2464,7 +2460,7 @@ _gnutls_handshake_client (gnutls_session_t session)
           ret =
             _gnutls_recv_handshake (session, 
                   GNUTLS_HANDSHAKE_HELLO_VERIFY_REQUEST,
-                  OPTIONAL_PACKET, NULL);
+                  1, NULL);
           STATE = STATE11;
           IMED_RET ("recv hello verify", ret, 1);
 
@@ -2479,7 +2475,7 @@ _gnutls_handshake_client (gnutls_session_t session)
       ret =
         _gnutls_recv_handshake (session,
                                 GNUTLS_HANDSHAKE_SERVER_HELLO,
-                                MANDATORY_PACKET, NULL);
+                                0, NULL);
       STATE = STATE2;
       IMED_RET ("recv hello", ret, 1);
 
@@ -2520,7 +2516,7 @@ _gnutls_handshake_client (gnutls_session_t session)
         ret =
           _gnutls_recv_handshake (session,
                                   GNUTLS_HANDSHAKE_SERVER_HELLO_DONE,
-                                  MANDATORY_PACKET, NULL);
+                                  0, NULL);
       STATE = STATE6;
       IMED_RET ("recv server hello done", ret, 1);
     case STATE71:
@@ -2757,7 +2753,7 @@ _gnutls_handshake_server (gnutls_session_t session)
       ret =
         _gnutls_recv_handshake (session,
                                 GNUTLS_HANDSHAKE_CLIENT_HELLO,
-                                MANDATORY_PACKET, NULL);
+                                0, NULL);
       STATE = STATE1;
       IMED_RET ("recv hello", ret, 1);
 
diff --git a/lib/gnutls_handshake.h b/lib/gnutls_handshake.h
index 42e5b61..39c9c8a 100644
--- a/lib/gnutls_handshake.h
+++ b/lib/gnutls_handshake.h
@@ -23,9 +23,6 @@
 #ifndef HANDSHAKE_H
 #define HANDSHAKE_H
 
-typedef enum Optional
-{ OPTIONAL_PACKET, MANDATORY_PACKET } optional_t;
-
 int _gnutls_send_handshake (gnutls_session_t session, mbuffer_st * bufel,
                             gnutls_handshake_description_t type);
 int _gnutls_recv_hello_request (gnutls_session_t session, void *data,
@@ -34,7 +31,7 @@ int _gnutls_send_hello (gnutls_session_t session, int again);
 int _gnutls_recv_hello (gnutls_session_t session, uint8_t * data, int datalen);
 int _gnutls_recv_handshake (gnutls_session_t session, 
                         gnutls_handshake_description_t type,
-                        optional_t optional, gnutls_buffer_st* buf);
+                        unsigned int optional, gnutls_buffer_st* buf);
 int _gnutls_generate_session_id (uint8_t * session_id, uint8_t * len);
 int _gnutls_handshake_common (gnutls_session_t session);
 int _gnutls_handshake_client (gnutls_session_t session);
diff --git a/lib/gnutls_int.h b/lib/gnutls_int.h
index 578e355..3069eb9 100644
--- a/lib/gnutls_int.h
+++ b/lib/gnutls_int.h
@@ -605,6 +605,7 @@ typedef struct
 
   /* For DTLS handshake fragmentation and reassembly. */
   uint16_t hsk_write_seq;
+  /* the sequence number of the expected packet */
   unsigned int hsk_read_seq;
   uint16_t mtu;
 
@@ -638,7 +639,7 @@ typedef struct
   time_t async_term;
   
   /* last retransmission triggered by record layer */
-  time_t last_retransmit;
+  struct timespec last_retransmit;
   unsigned int packets_dropped;
 } dtls_st;
 
diff --git a/lib/gnutls_kx.c b/lib/gnutls_kx.c
index fc920b5..6ab71c9 100644
--- a/lib/gnutls_kx.c
+++ b/lib/gnutls_kx.c
@@ -448,7 +448,7 @@ _gnutls_recv_server_kx_message (gnutls_session_t session)
 {
   gnutls_buffer_st buf;
   int ret = 0;
-  optional_t optflag = MANDATORY_PACKET;
+  unsigned int optflag = 0;
 
   if (session->internals.auth_struct->gnutls_process_server_kx != NULL)
     {
@@ -464,7 +464,7 @@ _gnutls_recv_server_kx_message (gnutls_session_t session)
 
       /* Server key exchange packet is optional for PSK. */
       if (_gnutls_session_is_psk (session))
-        optflag = OPTIONAL_PACKET;
+        optflag = 1;
 
       ret =
         _gnutls_recv_handshake (session, 
@@ -505,7 +505,7 @@ _gnutls_recv_server_certificate_request (gnutls_session_t 
session)
       ret =
         _gnutls_recv_handshake (session, 
                                 GNUTLS_HANDSHAKE_CERTIFICATE_REQUEST,
-                                OPTIONAL_PACKET, &buf);
+                                1, &buf);
       if (ret < 0)
         return ret;
 
@@ -541,7 +541,7 @@ _gnutls_recv_client_kx_message (gnutls_session_t session)
       ret =
         _gnutls_recv_handshake (session, 
                                 GNUTLS_HANDSHAKE_CLIENT_KEY_EXCHANGE,
-                                MANDATORY_PACKET, &buf);
+                                0, &buf);
       if (ret < 0)
         return ret;
 
@@ -578,9 +578,9 @@ _gnutls_recv_client_certificate (gnutls_session_t session)
     }
 
   if (session->internals.send_cert_req == GNUTLS_CERT_REQUIRE)
-    optional = MANDATORY_PACKET;
+    optional = 0;
   else
-    optional = OPTIONAL_PACKET;
+    optional = 1;
 
   ret =
     _gnutls_recv_handshake (session, GNUTLS_HANDSHAKE_CERTIFICATE_PKT, 
@@ -592,7 +592,7 @@ _gnutls_recv_client_certificate (gnutls_session_t session)
        * a warning alert instead of an empty certificate to indicate
        * no certificate.
        */
-      if (optional == OPTIONAL_PACKET &&
+      if (optional != 0 &&
           ret == GNUTLS_E_WARNING_ALERT_RECEIVED &&
           gnutls_protocol_get_version (session) == GNUTLS_SSL3 &&
           gnutls_alert_get (session) == GNUTLS_A_SSL3_NO_CERTIFICATE)
@@ -609,7 +609,7 @@ _gnutls_recv_client_certificate (gnutls_session_t session)
        */
       if ((ret == GNUTLS_E_WARNING_ALERT_RECEIVED
            || ret == GNUTLS_E_FATAL_ALERT_RECEIVED)
-          && optional == MANDATORY_PACKET)
+          && optional == 0)
         {
           gnutls_assert ();
           return GNUTLS_E_NO_CERTIFICATE_FOUND;
@@ -618,7 +618,7 @@ _gnutls_recv_client_certificate (gnutls_session_t session)
       return ret;
     }
 
-  if (ret == 0 && buf.length == 0 && optional == OPTIONAL_PACKET)
+  if (ret == 0 && buf.length == 0 && optional != 0)
     {
       /* Client has not sent the certificate message.
        * well I'm not sure we should accept this
@@ -641,7 +641,7 @@ _gnutls_recv_client_certificate (gnutls_session_t session)
 
   /* ok we should expect a certificate verify message now 
    */
-  if (ret == GNUTLS_E_NO_CERTIFICATE_FOUND && optional == OPTIONAL_PACKET)
+  if (ret == GNUTLS_E_NO_CERTIFICATE_FOUND && optional != 0)
     ret = 0;
   else
     session->key->certificate_requested = 1;
@@ -664,7 +664,7 @@ _gnutls_recv_server_certificate (gnutls_session_t session)
       ret =
         _gnutls_recv_handshake (session, 
                                 GNUTLS_HANDSHAKE_CERTIFICATE_PKT,
-                                MANDATORY_PACKET, &buf);
+                                0, &buf);
       if (ret < 0)
         {
           gnutls_assert ();
@@ -709,7 +709,7 @@ _gnutls_recv_client_certificate_verify_message 
(gnutls_session_t session)
   ret =
     _gnutls_recv_handshake (session, 
                             GNUTLS_HANDSHAKE_CERTIFICATE_VERIFY,
-                            OPTIONAL_PACKET, &buf);
+                            1, &buf);
   if (ret < 0)
     return ret;
 
diff --git a/lib/gnutls_record.c b/lib/gnutls_record.c
index d55fb04..ebe1b1a 100644
--- a/lib/gnutls_record.c
+++ b/lib/gnutls_record.c
@@ -627,7 +627,7 @@ record_add_to_buffers (gnutls_session_t session,
           if (!(IS_DTLS(session)))
             return gnutls_assert_val(GNUTLS_E_UNEXPECTED_PACKET);
             
-          _gnutls_record_buffer_put (session, type, seq, bufel);
+          _gnutls_record_buffer_put (session, recv->type, seq, bufel);
 
           break;
         case GNUTLS_APPLICATION_DATA:
@@ -731,7 +731,7 @@ unexpected_packet:
   if (IS_DTLS(session) && ret != GNUTLS_E_REHANDSHAKE)
     {
       _mbuffer_xfree(&bufel);
-      RETURN_DTLS_EAGAIN_OR_TIMEOUT(session);
+      RETURN_DTLS_EAGAIN_OR_TIMEOUT(session, ret);
     }
 
 cleanup:
diff --git a/src/libopts/m4/libopts.m4 b/src/libopts/m4/libopts.m4
index c8f89ec..1f981aa 100644
--- a/src/libopts/m4/libopts.m4
+++ b/src/libopts/m4/libopts.m4
@@ -574,9 +574,8 @@ AC_DEFUN([LIBOPTS_CHECK], [
   LIBOPTS_CHECK_COMMON(AO_Libopts_Dir)
   AM_COND_IF([NEED_LIBOPTS], [
     INVOKE_LIBOPTS_MACROS
+    AC_CONFIG_FILES(AO_Libopts_Dir/Makefile)
   ])dnl
-
-  AC_CONFIG_FILES(AO_Libopts_Dir/Makefile)
   m4_popdef([AO_Libopts_Dir])dnl
 # end of AC_DEFUN of LIBOPTS_CHECK
 ])
diff --git a/tests/key-id/key-id b/tests/key-id/key-id
index 2bee9b8..9bad211 100755
--- a/tests/key-id/key-id
+++ b/tests/key-id/key-id
@@ -27,7 +27,7 @@ CERTTOOL=${CERTTOOL:-../../src/certtool$EXEEXT}
 
 PARAMS="--generate-certificate --load-privkey $srcdir/key-user.pem 
--load-ca-privkey $srcdir/key-ca.pem --template tmpl"
 
-echo "#empty" > tmpl
+echo "serial = 0" > tmpl
 
 #$CERTTOOL $PARAMS --load-ca-certificate $srcdir/ca-gnutls-keyid.pem \
 #    --outfile user-gnutls-keyid.pem 2> /dev/null


hooks/post-receive
-- 
GNU gnutls



reply via email to

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