*
*/
+#include <openssl/pqueue.h>
+
/*****************************************************************************
* *
* These structures should be considered PRIVATE to the record layer. No *
int left;
} SSL3_BUFFER;
+#define SEQ_NUM_SIZE 8
+
typedef struct ssl3_record_st {
+ /* Record layer version */
+ /* r */
+ int rec_version;
+
/* type of record */
- /*
- * r
- */ int type;
+ /* r */
+ int type;
+
/* How many bytes available */
- /*
- * rw
- */ unsigned int length;
+ /* rw */
+ unsigned int length;
+
/*
* How many bytes were available before padding was removed? This is used
* to implement the MAC check in constant time for CBC records.
*/
- /*
- * rw
- */ unsigned int orig_len;
+ /* rw */
+ unsigned int orig_len;
+
/* read/write offset into 'buf' */
- /*
- * r
- */ unsigned int off;
+ /* r */
+ unsigned int off;
+
/* pointer to the record data */
- /*
- * rw
- */ unsigned char *data;
+ /* rw */
+ unsigned char *data;
+
/* where the decode bytes are */
- /*
- * rw
- */ unsigned char *input;
+ /* rw */
+ unsigned char *input;
+
/* only used with decompression - malloc()ed */
- /*
- * r
- */ unsigned char *comp;
+ /* r */
+ unsigned char *comp;
+
/* epoch number, needed by DTLS1 */
- /*
- * r
- */ unsigned long epoch;
+ /* r */
+ unsigned long epoch;
+
/* sequence number, needed by DTLS1 */
- /*
- * r
- */ unsigned char seq_num[8];
+ /* r */
+ unsigned char seq_num[SEQ_NUM_SIZE];
} SSL3_RECORD;
typedef struct dtls1_bitmap_st {
- unsigned long map; /* track 32 packets on 32-bit systems and 64
- * - on 64-bit systems */
+ /* Track 32 packets on 32-bit systems and 64 - on 64-bit systems */
+ unsigned long map;
- unsigned char max_seq_num[8]; /* max record number seen so far, 64-bit
- * value in big-endian encoding */
+ /* Max record number seen so far, 64-bit value in big-endian encoding */
+ unsigned char max_seq_num[SEQ_NUM_SIZE];
} DTLS1_BITMAP;
typedef struct record_pqueue_st {
int wpend_ret;
const unsigned char *wpend_buf;
- unsigned char read_sequence[8];
- unsigned char write_sequence[8];
+ unsigned char read_sequence[SEQ_NUM_SIZE];
+ unsigned char write_sequence[SEQ_NUM_SIZE];
DTLS_RECORD_LAYER *d;
} RECORD_LAYER;
* *
*****************************************************************************/
+#define MIN_SSL2_RECORD_LEN 9
+
#define RECORD_LAYER_set_read_ahead(rl, ra) ((rl)->read_ahead = (ra))
#define RECORD_LAYER_get_read_ahead(rl) ((rl)->read_ahead)
#define RECORD_LAYER_get_packet(rl) ((rl)->packet)
void RECORD_LAYER_reset_read_sequence(RECORD_LAYER *rl);
void RECORD_LAYER_reset_write_sequence(RECORD_LAYER *rl);
int RECORD_LAYER_setup_comp_buffer(RECORD_LAYER *rl);
+int RECORD_LAYER_is_sslv2_record(RECORD_LAYER *rl);
+unsigned int RECORD_LAYER_get_rrec_length(RECORD_LAYER *rl);
__owur int ssl3_pending(const SSL *s);
-__owur int ssl23_read_bytes(SSL *s, int n);
-__owur int ssl23_write_bytes(SSL *s);
__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);
+__owur int ssl3_read_bytes(SSL *s, int type, int *recvd_type,
+ unsigned char *buf, int len, int peek);
__owur int ssl3_setup_buffers(SSL *s);
__owur int ssl3_enc(SSL *s, int send_data);
__owur int n_ssl3_mac(SSL *ssl, unsigned char *md, int send_data);
void DTLS_RECORD_LAYER_set_saved_w_epoch(RECORD_LAYER *rl, unsigned short e);
void DTLS_RECORD_LAYER_clear(RECORD_LAYER *rl);
void DTLS_RECORD_LAYER_resync_write(RECORD_LAYER *rl);
-__owur int dtls1_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek);
+void DTLS_RECORD_LAYER_set_write_sequence(RECORD_LAYER *rl, unsigned char *seq);
+__owur int dtls1_read_bytes(SSL *s, int type, int *recvd_type,
+ unsigned char *buf, int len, int peek);
__owur 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,
unsigned int len, int create_empty_fragement);