Fix epoch swapping
diff --git a/library/ssl_tls.c b/library/ssl_tls.c
index d6f8264..3b39ef2 100644
--- a/library/ssl_tls.c
+++ b/library/ssl_tls.c
@@ -2113,13 +2113,36 @@
SSL_DEBUG_MSG( 3, ( "swap epochs" ) );
+ /* Swap transforms */
tmp_transform = ssl->transform_out;
ssl->transform_out = ssl->handshake->alt_transform_out;
ssl->handshake->alt_transform_out = tmp_transform;
+ /* Swap epoch + sequence_number */
memcpy( tmp_out_ctr, ssl->out_ctr, 8 );
memcpy( ssl->out_ctr, ssl->handshake->alt_out_ctr, 8 );
memcpy( ssl->handshake->alt_out_ctr, tmp_out_ctr, 8 );
+
+ /* Adjust to the newly activated transform */
+ if( ssl->transform_out != NULL &&
+ ssl->minor_ver >= SSL_MINOR_VERSION_2 )
+ {
+ ssl->out_msg = ssl->out_iv + ssl->transform_out->ivlen -
+ ssl->transform_out->fixed_ivlen;
+ }
+ else
+ ssl->out_msg = ssl->out_iv;
+
+#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
+ if( ssl_hw_record_activate != NULL )
+ {
+ if( ( ret = ssl_hw_record_activate( ssl, SSL_CHANNEL_OUTBOUND ) ) != 0 )
+ {
+ SSL_DEBUG_RET( 1, "ssl_hw_record_activate", ret );
+ return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
+ }
+ }
+#endif
}
/*
@@ -2148,6 +2171,15 @@
int ret;
ssl_flight_item *cur = ssl->handshake->cur_msg;
+ /* Swap epochs before sending Finished: we can't do it after
+ * sending ChangeCipherSpec, in case write returns WANT_READ.
+ * Must be done before copying, may change out_msg pointer */
+ if( cur->type == SSL_MSG_HANDSHAKE &&
+ cur->p[0] == SSL_HS_FINISHED )
+ {
+ ssl_swap_epochs( ssl );
+ }
+
memcpy( ssl->out_msg, cur->p, cur->len );
ssl->out_msglen = cur->len;
ssl->out_msgtype = cur->type;
@@ -2156,14 +2188,6 @@
SSL_DEBUG_BUF( 3, "resent handshake message header", ssl->out_msg, 12 );
- /* Swap epochs before sending Finished: we can't do it right after
- * sending ChangeCipherSpec, in case write returns WANT_READ */
- if( ssl->out_msgtype == SSL_MSG_HANDSHAKE &&
- ssl->out_msg[0] == SSL_HS_FINISHED )
- {
- ssl_swap_epochs( ssl );
- }
-
if( ( ret = ssl_write_record( ssl ) ) != 0 )
{
SSL_DEBUG_RET( 1, "ssl_write_record", ret );