summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Bastien-Filiatrault <joe@x2a.org>2010-10-02 17:13:51 -0400
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2011-02-17 22:55:38 +0100
commit3bad71af582ab6971653ce71fffa16287f9646e5 (patch)
tree26a88930393e2b9b073659d81a58876241819d48
parent8c72985cdd7b9435bb84b90dff8b8bef604a93e6 (diff)
downloadgnutls-3bad71af582ab6971653ce71fffa16287f9646e5.tar.gz
dtls: Add uint48 handling functions.
Signed-off-by: Nikos Mavrogiannopoulos <nmav@gnutls.org>
-rw-r--r--lib/gnutls_dtls.c10
-rw-r--r--lib/gnutls_dtls.h1
-rw-r--r--lib/gnutls_num.c30
-rw-r--r--lib/gnutls_num.h2
4 files changed, 43 insertions, 0 deletions
diff --git a/lib/gnutls_dtls.c b/lib/gnutls_dtls.c
index 8840998929..d0934a516f 100644
--- a/lib/gnutls_dtls.c
+++ b/lib/gnutls_dtls.c
@@ -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);
+}
diff --git a/lib/gnutls_dtls.h b/lib/gnutls_dtls.h
index e1b7ade049..f870c1bc7b 100644
--- a/lib/gnutls_dtls.h
+++ b/lib/gnutls_dtls.h
@@ -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
diff --git a/lib/gnutls_num.c b/lib/gnutls_num.c
index eeadd3e280..786cf4d007 100644
--- a/lib/gnutls_num.c
+++ b/lib/gnutls_num.c
@@ -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;
+}
diff --git a/lib/gnutls_num.h b/lib/gnutls_num.h
index 2157804c57..8e8aaea977 100644
--- a/lib/gnutls_num.h
+++ b/lib/gnutls_num.h
@@ -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);