Move updating the internal rec ptrs to outside of rec hdr parsing
The stack maintains pointers mbedtls_ssl_context::in_xxx pointing to various parts of the [D]TLS record header. Originally, these fields were determined and set in ssl_parse_record_header(). By now, ssl_parse_record_header() has been modularized to setup an instance of the internal SSL record structure mbedtls_record, and to derive the old in_xxx fields from that. This commit takes a further step towards removing the in_xxx fields by deriving them from the established record structure _outside_ of ssl_parse_record_header() after the latter has succeeded. One exception is the handling of possible client reconnects, which happens in the case then ssl_parse_record_header() returns MBEDTLS_ERR_SSL_UNEXPECTED_RECORD; since ssl_check_client_reconnect() so far uses the in_xxx fields, they need to be derived from the record structure beforehand.
This commit is contained in:
parent
605949f84c
commit
7ae20e0f4c
1 changed files with 16 additions and 5 deletions
|
@ -4950,7 +4950,6 @@ static int ssl_parse_record_header( mbedtls_ssl_context *ssl,
|
|||
*/
|
||||
|
||||
rec->type = buf[ rec_hdr_type_offset ];
|
||||
ssl->in_msgtype = rec->type;
|
||||
|
||||
/* Check record content type */
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
|
@ -4988,9 +4987,6 @@ static int ssl_parse_record_header( mbedtls_ssl_context *ssl,
|
|||
|
||||
rec->cid_len = rec_hdr_cid_len;
|
||||
memcpy( rec->cid, buf + rec_hdr_cid_offset, rec_hdr_cid_len );
|
||||
|
||||
ssl->in_len = ssl->in_cid + mbedtls_ssl_conf_get_cid_len( ssl->conf );
|
||||
ssl->in_iv = ssl->in_msg = ssl->in_len + 2;
|
||||
}
|
||||
else
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
@ -5056,7 +5052,6 @@ static int ssl_parse_record_header( mbedtls_ssl_context *ssl,
|
|||
rec->data_len = (size_t) READ_UINT16_BE( buf + rec_hdr_len_offset );
|
||||
MBEDTLS_SSL_DEBUG_BUF( 4, "input record header", buf, rec->data_offset );
|
||||
|
||||
ssl->in_msglen = rec->data_len;
|
||||
MBEDTLS_SSL_DEBUG_MSG( 3, ( "input record: msgtype = %d, "
|
||||
"version = [%d:%d], msglen = %d",
|
||||
rec->type,
|
||||
|
@ -6033,6 +6028,14 @@ static int ssl_get_next_record( mbedtls_ssl_context *ssl )
|
|||
if( ret == MBEDTLS_ERR_SSL_UNEXPECTED_RECORD )
|
||||
{
|
||||
#if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && defined(MBEDTLS_SSL_SRV_C)
|
||||
/* Setup internal message pointers from record structure. */
|
||||
ssl->in_msgtype = rec.type;
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
ssl->in_len = ssl->in_cid + rec.cid_len;
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
ssl->in_iv = ssl->in_msg = ssl->in_len + 2;
|
||||
ssl->in_msglen = rec.data_len;
|
||||
|
||||
ret = ssl_check_client_reconnect( ssl );
|
||||
if( ret != 0 )
|
||||
return( ret );
|
||||
|
@ -6064,6 +6067,14 @@ static int ssl_get_next_record( mbedtls_ssl_context *ssl )
|
|||
}
|
||||
}
|
||||
|
||||
/* Setup internal message pointers from record structure. */
|
||||
ssl->in_msgtype = rec.type;
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
ssl->in_len = ssl->in_cid + rec.cid_len;
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
ssl->in_iv = ssl->in_msg = ssl->in_len + 2;
|
||||
ssl->in_msglen = rec.data_len;
|
||||
|
||||
#if defined(MBEDTLS_SSL_PROTO_DTLS)
|
||||
if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue