13
13
* permissions and limitations under the License.
14
14
*/
15
15
16
+ #include "crypto/s2n_sequence.h"
16
17
#include "s2n_test.h"
17
18
#include "testlib/s2n_ktls_test_utils.h"
18
19
#include "testlib/s2n_mem_testlib.h"
@@ -62,6 +63,15 @@ static ssize_t s2n_test_ktls_recvmsg_eof(void *io_context, struct msghdr *msg)
62
63
return 0 ;
63
64
}
64
65
66
+ static ssize_t s2n_test_ktls_sendmsg_mark_all_sent (void * io_context , const struct msghdr * msg )
67
+ {
68
+ size_t sent = 0 ;
69
+ for (size_t i = 0 ; i < msg -> msg_iovlen ; i ++ ) {
70
+ sent += msg -> msg_iov [i ].iov_len ;
71
+ }
72
+ return sent ;
73
+ }
74
+
65
75
ssize_t s2n_test_ktls_recvmsg_io_stuffer_and_ctrunc (void * io_context , struct msghdr * msg )
66
76
{
67
77
POSIX_ENSURE_REF (msg );
@@ -74,6 +84,14 @@ ssize_t s2n_test_ktls_recvmsg_io_stuffer_and_ctrunc(void *io_context, struct msg
74
84
return ret ;
75
85
}
76
86
87
+ static S2N_RESULT s2n_assert_seq_num_equal (struct s2n_blob actual_blob , uint64_t expected )
88
+ {
89
+ uint64_t actual = 0 ;
90
+ RESULT_GUARD_POSIX (s2n_sequence_number_to_uint64 (& actual_blob , & actual ));
91
+ RESULT_ENSURE (actual == expected , S2N_ERR_TEST_ASSERTION );
92
+ return S2N_RESULT_OK ;
93
+ }
94
+
77
95
int main (int argc , char * * argv )
78
96
{
79
97
BEGIN_TEST ();
@@ -1185,5 +1203,120 @@ int main(int argc, char **argv)
1185
1203
};
1186
1204
};
1187
1205
1206
+ /* Test: key encryption limit tracked */
1207
+ {
1208
+ uint8_t large_test_data [S2N_TLS_MAXIMUM_FRAGMENT_LENGTH * 10 ] = { 0 };
1209
+ const size_t large_test_data_records = sizeof (large_test_data ) / S2N_TLS_MAXIMUM_FRAGMENT_LENGTH ;
1210
+ /* For simplicity, keep our test data a positive even multiple of the max frag size */
1211
+ EXPECT_TRUE (sizeof (large_test_data ) % S2N_TLS_MAXIMUM_FRAGMENT_LENGTH == 0 );
1212
+ EXPECT_TRUE (large_test_data_records > 0 );
1213
+ const size_t test_encryption_limit = large_test_data_records ;
1214
+
1215
+ struct s2n_record_algorithm test_record_alg = * s2n_tls13_aes_128_gcm_sha256 .record_alg ;
1216
+ test_record_alg .encryption_limit = test_encryption_limit ;
1217
+ struct s2n_cipher_suite test_cipher_suite = s2n_tls13_aes_128_gcm_sha256 ;
1218
+ test_cipher_suite .record_alg = & test_record_alg ;
1219
+
1220
+ for (s2n_mode mode = 0 ; mode <= 1 ; mode ++ ) {
1221
+ DEFER_CLEANUP (struct s2n_connection * conn = s2n_connection_new (mode ),
1222
+ s2n_connection_ptr_free );
1223
+ EXPECT_NOT_NULL (conn );
1224
+ EXPECT_OK (s2n_ktls_set_sendmsg_cb (conn , s2n_test_ktls_sendmsg_mark_all_sent , conn ));
1225
+ conn -> ktls_send_enabled = true;
1226
+ EXPECT_NOT_NULL (conn -> secure );
1227
+ conn -> secure -> cipher_suite = & test_cipher_suite ;
1228
+ conn -> actual_protocol_version = S2N_TLS13 ;
1229
+
1230
+ s2n_blocked_status blocked = S2N_NOT_BLOCKED ;
1231
+
1232
+ /* Test: Sequence number tracked correctly */
1233
+ {
1234
+ DEFER_CLEANUP (struct s2n_blob seq_num = { 0 }, s2n_blob_zero );
1235
+ EXPECT_OK (s2n_connection_get_sequence_number (conn , conn -> mode , & seq_num ));
1236
+
1237
+ /* Test: All connections start with zero records sent */
1238
+ uint64_t expected_seq_num = 0 ;
1239
+ EXPECT_OK (s2n_assert_seq_num_equal (seq_num , expected_seq_num ));
1240
+
1241
+ /* Test: Send no data */
1242
+ EXPECT_EQUAL (s2n_send (conn , large_test_data , 0 , & blocked ), 0 );
1243
+ EXPECT_OK (s2n_assert_seq_num_equal (seq_num , expected_seq_num ));
1244
+
1245
+ /* Test: Send one minimum sized record */
1246
+ expected_seq_num ++ ;
1247
+ EXPECT_EQUAL (s2n_send (conn , large_test_data , 1 , & blocked ), 1 );
1248
+ EXPECT_OK (s2n_assert_seq_num_equal (seq_num , expected_seq_num ));
1249
+
1250
+ /* Test: Send one maximum sized record */
1251
+ expected_seq_num ++ ;
1252
+ EXPECT_EQUAL (
1253
+ s2n_send (conn , large_test_data , S2N_TLS_MAXIMUM_FRAGMENT_LENGTH , & blocked ),
1254
+ S2N_TLS_MAXIMUM_FRAGMENT_LENGTH );
1255
+ EXPECT_OK (s2n_assert_seq_num_equal (seq_num , expected_seq_num ));
1256
+
1257
+ /* Test: Send multiple records */
1258
+ expected_seq_num += 2 ;
1259
+ EXPECT_EQUAL (
1260
+ s2n_send (conn , large_test_data , S2N_TLS_MAXIMUM_FRAGMENT_LENGTH + 1 , & blocked ),
1261
+ S2N_TLS_MAXIMUM_FRAGMENT_LENGTH + 1 );
1262
+ EXPECT_OK (s2n_assert_seq_num_equal (seq_num , expected_seq_num ));
1263
+
1264
+ /* Test: Send enough data to hit the encryption limit */
1265
+ EXPECT_FAILURE_WITH_ERRNO (
1266
+ s2n_send (conn , large_test_data , sizeof (large_test_data ), & blocked ),
1267
+ S2N_ERR_KTLS_KEY_LIMIT );
1268
+ EXPECT_OK (s2n_assert_seq_num_equal (seq_num , expected_seq_num ));
1269
+ };
1270
+
1271
+ /* Test: Exact encryption limit boundary */
1272
+ {
1273
+ DEFER_CLEANUP (struct s2n_blob seq_num = { 0 }, s2n_blob_zero );
1274
+ EXPECT_OK (s2n_connection_get_sequence_number (conn , conn -> mode , & seq_num ));
1275
+
1276
+ /* Send enough records to hit but not exceed the encryption limit */
1277
+ for (size_t i = 0 ; i < test_encryption_limit ; i ++ ) {
1278
+ EXPECT_EQUAL (s2n_send (conn , large_test_data , 1 , & blocked ), 1 );
1279
+ }
1280
+ EXPECT_OK (s2n_assert_seq_num_equal (seq_num , test_encryption_limit ));
1281
+
1282
+ /* One more record should exceed the encryption limit */
1283
+ EXPECT_FAILURE_WITH_ERRNO (
1284
+ s2n_send (conn , large_test_data , 1 , & blocked ),
1285
+ S2N_ERR_KTLS_KEY_LIMIT );
1286
+ EXPECT_OK (s2n_assert_seq_num_equal (seq_num , test_encryption_limit ));
1287
+ };
1288
+
1289
+ /* Test: Limit not tracked with TLS1.2 */
1290
+ {
1291
+ DEFER_CLEANUP (struct s2n_blob seq_num = { 0 }, s2n_blob_zero );
1292
+ EXPECT_OK (s2n_connection_get_sequence_number (conn , conn -> mode , & seq_num ));
1293
+
1294
+ /* Sequence number not incremented with TLS1.2 */
1295
+ conn -> actual_protocol_version = S2N_TLS12 ;
1296
+ EXPECT_EQUAL (
1297
+ s2n_send (conn , large_test_data , sizeof (large_test_data ), & blocked ),
1298
+ sizeof (large_test_data ));
1299
+ EXPECT_OK (s2n_assert_seq_num_equal (seq_num , 0 ));
1300
+
1301
+ /* Sequence number incremented with TLS1.3 */
1302
+ conn -> actual_protocol_version = S2N_TLS13 ;
1303
+ EXPECT_EQUAL (
1304
+ s2n_send (conn , large_test_data , sizeof (large_test_data ), & blocked ),
1305
+ sizeof (large_test_data ));
1306
+ EXPECT_OK (s2n_assert_seq_num_equal (seq_num , test_encryption_limit ));
1307
+
1308
+ /* Passing the limit with TLS1.3 is an error */
1309
+ conn -> actual_protocol_version = S2N_TLS13 ;
1310
+ EXPECT_FAILURE_WITH_ERRNO (
1311
+ s2n_send (conn , large_test_data , 1 , & blocked ),
1312
+ S2N_ERR_KTLS_KEY_LIMIT );
1313
+
1314
+ /* Passing the limit with TLS1.2 is NOT an error */
1315
+ conn -> actual_protocol_version = S2N_TLS12 ;
1316
+ EXPECT_EQUAL (s2n_send (conn , large_test_data , 1 , & blocked ), 1 );
1317
+ };
1318
+ }
1319
+ };
1320
+
1188
1321
END_TEST ();
1189
1322
}
0 commit comments