diff --git a/lib/gnutls_dtls.c b/lib/gnutls_dtls.c index 884099892..d0934a516 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 e1b7ade04..f870c1bc7 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 b98702283..b4d9470c5 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 9815235e6..19337b7ad 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);