diff options
author | Matt Caswell <matt@openssl.org> | 2015-02-03 14:54:13 +0000 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2015-03-26 15:02:00 +0000 |
commit | 40f37188a63c988c66bfece95280b67158998e64 (patch) | |
tree | 18af081a80fa79ff6960bce8bbdb518d8cc18ed1 | |
parent | bb4203d97e7b3350fe501d90485526a6e5dc1e3e (diff) |
Introduce a DTLS_RECORD_LAYER type for DTLS record layer state
Reviewed-by: Richard Levitte <levitte@openssl.org>
-rw-r--r-- | ssl/d1_lib.c | 10 | ||||
-rw-r--r-- | ssl/record/d1_pkt.c | 29 | ||||
-rw-r--r-- | ssl/record/rec_layer.h | 10 |
3 files changed, 49 insertions, 0 deletions
diff --git a/ssl/d1_lib.c b/ssl/d1_lib.c index ad6561cb0d..717925811d 100644 --- a/ssl/d1_lib.c +++ b/ssl/d1_lib.c @@ -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; diff --git a/ssl/record/d1_pkt.c b/ssl/record/d1_pkt.c index 3d31699b29..02b0f52eb1 100644 --- a/ssl/record/d1_pkt.c +++ b/ssl/record/d1_pkt.c @@ -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) { diff --git a/ssl/record/rec_layer.h b/ssl/record/rec_layer.h index 6bba44d1d8..c64468f5f4 100644 --- a/ssl/record/rec_layer.h +++ b/ssl/record/rec_layer.h @@ -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, |