]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
dtls: Add uint48 handling functions.
authorJonathan Bastien-Filiatrault <joe@x2a.org>
Sat, 2 Oct 2010 21:13:51 +0000 (17:13 -0400)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Thu, 17 Feb 2011 21:55:38 +0000 (22:55 +0100)
Signed-off-by: Nikos Mavrogiannopoulos <nmav@gnutls.org>
lib/gnutls_dtls.c
lib/gnutls_dtls.h
lib/gnutls_num.c
lib/gnutls_num.h

index 8840998929169533e1e6b4485b186c3069da3d4a..d0934a516f5311caac46ec6585eff1c332cc10ad 100644 (file)
@@ -192,3 +192,13 @@ _gnutls_dtls_clear_outgoing_buffer (gnutls_session_t session)
   session->internals.dtls.retransmit_end = &session->internals.dtls.retransmit;
   session->internals.dtls.retransmit = NULL;
 }
+
+void
+_gnutls_dtls_split_sequence (const uint64 *input,
+                            uint16_t *epoch, uint64_t *sequence)
+{
+  *epoch = _gnutls_read_uint16 (UINT64DATA(*input));
+  *sequence = _gnutls_read_uint48 (&UINT64DATA(*input)[2]);
+
+  fprintf(stderr, "%04x:%012lx\n", *epoch, *sequence);
+}
index e1b7ade049ce3505c5841bc26eeab479f4a66c50..f870c1bc7bc4e767626581bbf1df1bb97f9d033d 100644 (file)
@@ -35,5 +35,6 @@ int _gnutls_dtls_handshake_enqueue(gnutls_session_t session,
 
 int _gnutls_dtls_transmit(gnutls_session_t session);
 void _gnutls_dtls_clear_outgoing_buffer(gnutls_session_t session);
+void _gnutls_dtls_split_sequence(const uint64 *input, uint16_t *epoch, uint64_t *sequence);
 
 #endif
index eeadd3e280f810da83741ee08d58d3a128b38be6..786cf4d007c1df4f0b328dfbe8a6e15e8938665f 100644 (file)
@@ -114,6 +114,20 @@ _gnutls_uint32touint24 (uint32_t num)
 
 }
 
+uint64_t
+_gnutls_uint48touint64 (uint48 num)
+{
+  uint64_t ret=0;
+
+  ((uint8_t *) & ret)[2] = num.i[0];
+  ((uint8_t *) & ret)[3] = num.i[1];
+  ((uint8_t *) & ret)[4] = num.i[2];
+  ((uint8_t *) & ret)[5] = num.i[3];
+  ((uint8_t *) & ret)[6] = num.i[4];
+  ((uint8_t *) & ret)[7] = num.i[5];
+  return ret;
+}
+
 /* data should be at least 3 bytes */
 uint32_t
 _gnutls_read_uint24 (const opaque * data)
@@ -222,3 +236,19 @@ _gnutls_uint64touint32 (const uint64 * num)
 
   return ret;
 }
+
+uint64_t
+_gnutls_read_uint48 (const opaque * data)
+{
+  uint64_t ret;
+  uint48 num;
+
+  memcpy(num.i, data, 6);
+
+  ret = _gnutls_uint48touint64 (num);
+#ifndef WORDS_BIGENDIAN
+  ret = bswap_64 (ret);
+#endif
+
+  return ret;
+}
index 2157804c57d424c789af7c827846f03be4683368..8e8aaea977efe0ab9341ad7ded019faffdd64a41 100644 (file)
@@ -32,6 +32,8 @@
 
 uint32_t _gnutls_uint24touint32 (uint24 num);
 uint24 _gnutls_uint32touint24 (uint32_t num);
+uint64_t _gnutls_uint48touint64 (uint48 num);
+uint64_t _gnutls_read_uint48 (const opaque * data);
 uint32_t _gnutls_read_uint32 (const opaque * data);
 uint16_t _gnutls_read_uint16 (const opaque * data);
 uint32_t _gnutls_conv_uint32 (uint32_t data);