Introduce a DTLS_RECORD_LAYER type for DTLS record layer state

Reviewed-by: Richard Levitte <levitte@openssl.org>
This commit is contained in:
Matt Caswell 2015-02-03 14:54:13 +00:00
parent bb4203d97e
commit 40f37188a6
3 changed files with 49 additions and 0 deletions

View file

@ -131,6 +131,12 @@ int dtls1_new(SSL *s)
return (0);
}
memset(d1, 0, sizeof *d1);
if(!DTLS_RECORD_LAYER_new(&s->rlayer)) {
OPENSSL_free(d1);
ssl3_free(s);
return 0;
}
/* d1->handshake_epoch=0; */
@ -218,6 +224,8 @@ static void dtls1_clear_queues(SSL *s)
void dtls1_free(SSL *s)
{
DTLS_RECORD_LAYER_free(&s->rlayer);
ssl3_free(s);
dtls1_clear_queues(s);
@ -242,6 +250,8 @@ void dtls1_clear(SSL *s)
unsigned int mtu;
unsigned int link_mtu;
DTLS_RECORD_LAYER_clear(&s->rlayer);
if (s->d1) {
unprocessed_rcds = s->d1->unprocessed_rcds.q;
processed_rcds = s->d1->processed_rcds.q;

View file

@ -122,6 +122,35 @@
#include <openssl/pqueue.h>
#include <openssl/rand.h>
int DTLS_RECORD_LAYER_new(RECORD_LAYER *rl)
{
DTLS_RECORD_LAYER *d;
if ((d = OPENSSL_malloc(sizeof *d)) == NULL) {
return (0);
}
rl->d = d;
DTLS_RECORD_LAYER_clear(rl);
return 1;
}
void DTLS_RECORD_LAYER_free(RECORD_LAYER *rl)
{
OPENSSL_free(rl->d);
rl->d = NULL;
}
void DTLS_RECORD_LAYER_clear(RECORD_LAYER *rl)
{
DTLS_RECORD_LAYER *d;
d = rl->d;
memset(d, 0, sizeof *d);
}
/* mod 128 saturating subtract of two 64-bit values in big-endian order */
static int satsub64be(const unsigned char *v1, const unsigned char *v2)
{

View file

@ -142,6 +142,11 @@ typedef struct dtls1_record_data_st {
# endif
} DTLS1_RECORD_DATA;
typedef struct dtls_record_layer_st {
/* Temporary member to be removed by subsequent commits */
int dummy;
} DTLS_RECORD_LAYER;
typedef struct record_layer_st {
/* The parent SSL structure */
SSL *s;
@ -187,6 +192,8 @@ typedef struct record_layer_st {
unsigned char read_sequence[8];
unsigned char write_sequence[8];
DTLS_RECORD_LAYER *d;
} RECORD_LAYER;
@ -223,6 +230,9 @@ __owur int ssl3_write_bytes(SSL *s, int type, const void *buf, int len);
__owur int do_ssl3_write(SSL *s, int type, const unsigned char *buf,
unsigned int len, int create_empty_fragment);
__owur int ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek);
int DTLS_RECORD_LAYER_new(RECORD_LAYER *rl);
void DTLS_RECORD_LAYER_free(RECORD_LAYER *rl);
void DTLS_RECORD_LAYER_clear(RECORD_LAYER *rl);
__owur int dtls1_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek);
int dtls1_write_bytes(SSL *s, int type, const void *buf, int len);
__owur int do_dtls1_write(SSL *s, int type, const unsigned char *buf,