Prepare migrating max fragment length to session
Remove max_frag_len member so that reseting session by memset()ing it to zero
does the right thing.
diff --git a/library/ssl_tls.c b/library/ssl_tls.c
index d6be987..0374ee8 100644
--- a/library/ssl_tls.c
+++ b/library/ssl_tls.c
@@ -59,6 +59,23 @@
#define strcasecmp _stricmp
#endif
+/*
+ * Convert max_fragment_length codes to length.
+ * RFC 6066 says:
+ * enum{
+ * 2^9(1), 2^10(2), 2^11(3), 2^12(4), (255)
+ * } MaxFragmentLength;
+ * and we add 0 -> extension unused
+ */
+static unsigned int mfl_code_to_length[] =
+{
+ SSL_MAX_CONTENT_LEN, /* SSL_MAX_FRAG_LEN_NONE */
+ 512, /* SSL_MAX_FRAG_LEN_512 */
+ 1024, /* SSL_MAX_FRAG_LEN_1024 */
+ 2048, /* SSL_MAX_FRAG_LEN_2048 */
+ 4096, /* SSL_MAX_FRAG_LEN_4096 */
+};
+
#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
int (*ssl_hw_record_init)(ssl_context *ssl,
const unsigned char *key_enc, const unsigned char *key_dec,
@@ -2827,7 +2844,6 @@
memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
ssl->mfl_code = SSL_MAX_FRAG_LEN_NONE;
- ssl->max_frag_len = SSL_MAX_CONTENT_LEN;
ssl->hostname = NULL;
ssl->hostname_len = 0;
@@ -2871,7 +2887,6 @@
ssl->out_left = 0;
ssl->mfl_code = SSL_MAX_FRAG_LEN_NONE;
- ssl->max_frag_len = SSL_MAX_CONTENT_LEN;
ssl->transform_in = NULL;
ssl->transform_out = NULL;
@@ -3119,35 +3134,13 @@
int ssl_set_max_frag_len( ssl_context *ssl, unsigned char mfl_code )
{
- uint16_t max_frag_len;
-
- switch( mfl_code )
+ if( mfl_code >= sizeof( mfl_code_to_length ) ||
+ mfl_code_to_length[mfl_code] > SSL_MAX_CONTENT_LEN )
{
- case SSL_MAX_FRAG_LEN_512:
- max_frag_len = 512;
- break;
-
- case SSL_MAX_FRAG_LEN_1024:
- max_frag_len = 1024;
- break;
-
- case SSL_MAX_FRAG_LEN_2048:
- max_frag_len = 2048;
- break;
-
- case SSL_MAX_FRAG_LEN_4096:
- max_frag_len = 4096;
- break;
-
- default:
- return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
+ return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
}
- if( max_frag_len > SSL_MAX_CONTENT_LEN )
- return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
-
ssl->mfl_code = mfl_code;
- ssl->max_frag_len = max_frag_len;
return( 0 );
}
@@ -3413,6 +3406,7 @@
{
int ret;
size_t n;
+ unsigned int max_len;
SSL_DEBUG_MSG( 2, ( "=> write" ) );
@@ -3425,8 +3419,12 @@
}
}
- n = ( len < ssl->max_frag_len )
- ? len : ssl->max_frag_len;
+ /*
+ * Assume mfl_code is correct since it was checked when set
+ */
+ max_len = mfl_code_to_length[ssl->mfl_code];
+
+ n = ( len < max_len) ? len : max_len;
if( ssl->out_left != 0 )
{