diff options
author | Jonathan Bastien-Filiatrault <joe@x2a.org> | 2010-10-02 17:13:51 -0400 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2011-02-17 22:55:38 +0100 |
commit | 3bad71af582ab6971653ce71fffa16287f9646e5 (patch) | |
tree | 26a88930393e2b9b073659d81a58876241819d48 | |
parent | 8c72985cdd7b9435bb84b90dff8b8bef604a93e6 (diff) | |
download | gnutls-3bad71af582ab6971653ce71fffa16287f9646e5.tar.gz |
dtls: Add uint48 handling functions.
Signed-off-by: Nikos Mavrogiannopoulos <nmav@gnutls.org>
-rw-r--r-- | lib/gnutls_dtls.c | 10 | ||||
-rw-r--r-- | lib/gnutls_dtls.h | 1 | ||||
-rw-r--r-- | lib/gnutls_num.c | 30 | ||||
-rw-r--r-- | lib/gnutls_num.h | 2 |
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); |