@@ -181,13 +181,12 @@ static int tls_send_cmsg(int fd, unsigned char record_type,
181
181
return sendmsg (fd , & msg , flags );
182
182
}
183
183
184
- static int tls_recv_cmsg (struct __test_metadata * _metadata ,
185
- int fd , unsigned char record_type ,
186
- void * data , size_t len , int flags )
184
+ static int __tls_recv_cmsg (struct __test_metadata * _metadata ,
185
+ int fd , unsigned char * ctype ,
186
+ void * data , size_t len , int flags )
187
187
{
188
188
char cbuf [CMSG_SPACE (sizeof (char ))];
189
189
struct cmsghdr * cmsg ;
190
- unsigned char ctype ;
191
190
struct msghdr msg ;
192
191
struct iovec vec ;
193
192
int n ;
@@ -206,7 +205,20 @@ static int tls_recv_cmsg(struct __test_metadata *_metadata,
206
205
EXPECT_NE (cmsg , NULL );
207
206
EXPECT_EQ (cmsg -> cmsg_level , SOL_TLS );
208
207
EXPECT_EQ (cmsg -> cmsg_type , TLS_GET_RECORD_TYPE );
209
- ctype = * ((unsigned char * )CMSG_DATA (cmsg ));
208
+ if (ctype )
209
+ * ctype = * ((unsigned char * )CMSG_DATA (cmsg ));
210
+
211
+ return n ;
212
+ }
213
+
214
+ static int tls_recv_cmsg (struct __test_metadata * _metadata ,
215
+ int fd , unsigned char record_type ,
216
+ void * data , size_t len , int flags )
217
+ {
218
+ unsigned char ctype ;
219
+ int n ;
220
+
221
+ n = __tls_recv_cmsg (_metadata , fd , & ctype , data , len , flags );
210
222
EXPECT_EQ (ctype , record_type );
211
223
212
224
return n ;
@@ -2164,6 +2176,284 @@ TEST_F(tls, rekey_poll_delay)
2164
2176
}
2165
2177
}
2166
2178
2179
+ struct raw_rec {
2180
+ unsigned int plain_len ;
2181
+ unsigned char plain_data [100 ];
2182
+ unsigned int cipher_len ;
2183
+ unsigned char cipher_data [128 ];
2184
+ };
2185
+
2186
+ /* TLS 1.2, AES_CCM, data, seqno:0, plaintext: 'Hello world' */
2187
+ static const struct raw_rec id0_data_l11 = {
2188
+ .plain_len = 11 ,
2189
+ .plain_data = {
2190
+ 0x48 , 0x65 , 0x6c , 0x6c , 0x6f , 0x20 , 0x77 , 0x6f ,
2191
+ 0x72 , 0x6c , 0x64 ,
2192
+ },
2193
+ .cipher_len = 40 ,
2194
+ .cipher_data = {
2195
+ 0x17 , 0x03 , 0x03 , 0x00 , 0x23 , 0x00 , 0x00 , 0x00 ,
2196
+ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x26 , 0xa2 , 0x33 ,
2197
+ 0xde , 0x8d , 0x94 , 0xf0 , 0x29 , 0x6c , 0xb1 , 0xaf ,
2198
+ 0x6a , 0x75 , 0xb2 , 0x93 , 0xad , 0x45 , 0xd5 , 0xfd ,
2199
+ 0x03 , 0x51 , 0x57 , 0x8f , 0xf9 , 0xcc , 0x3b , 0x42 ,
2200
+ },
2201
+ };
2202
+
2203
+ /* TLS 1.2, AES_CCM, ctrl, seqno:0, plaintext: '' */
2204
+ static const struct raw_rec id0_ctrl_l0 = {
2205
+ .plain_len = 0 ,
2206
+ .plain_data = {
2207
+ },
2208
+ .cipher_len = 29 ,
2209
+ .cipher_data = {
2210
+ 0x16 , 0x03 , 0x03 , 0x00 , 0x18 , 0x00 , 0x00 , 0x00 ,
2211
+ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x13 , 0x38 , 0x7b ,
2212
+ 0xa6 , 0x1c , 0xdd , 0xa7 , 0x19 , 0x33 , 0xab , 0xae ,
2213
+ 0x88 , 0xe1 , 0xd2 , 0x08 , 0x4f ,
2214
+ },
2215
+ };
2216
+
2217
+ /* TLS 1.2, AES_CCM, data, seqno:0, plaintext: '' */
2218
+ static const struct raw_rec id0_data_l0 = {
2219
+ .plain_len = 0 ,
2220
+ .plain_data = {
2221
+ },
2222
+ .cipher_len = 29 ,
2223
+ .cipher_data = {
2224
+ 0x17 , 0x03 , 0x03 , 0x00 , 0x18 , 0x00 , 0x00 , 0x00 ,
2225
+ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xc5 , 0x37 , 0x90 ,
2226
+ 0x70 , 0x45 , 0x89 , 0xfb , 0x5c , 0xc7 , 0x89 , 0x03 ,
2227
+ 0x68 , 0x80 , 0xd3 , 0xd8 , 0xcc ,
2228
+ },
2229
+ };
2230
+
2231
+ /* TLS 1.2, AES_CCM, data, seqno:1, plaintext: 'Hello world' */
2232
+ static const struct raw_rec id1_data_l11 = {
2233
+ .plain_len = 11 ,
2234
+ .plain_data = {
2235
+ 0x48 , 0x65 , 0x6c , 0x6c , 0x6f , 0x20 , 0x77 , 0x6f ,
2236
+ 0x72 , 0x6c , 0x64 ,
2237
+ },
2238
+ .cipher_len = 40 ,
2239
+ .cipher_data = {
2240
+ 0x17 , 0x03 , 0x03 , 0x00 , 0x23 , 0x00 , 0x00 , 0x00 ,
2241
+ 0x00 , 0x00 , 0x00 , 0x00 , 0x01 , 0x3a , 0x1a , 0x9c ,
2242
+ 0xd0 , 0xa8 , 0x9a , 0xd6 , 0x69 , 0xd6 , 0x1a , 0xe3 ,
2243
+ 0xb5 , 0x1f , 0x0d , 0x2c , 0xe2 , 0x97 , 0x46 , 0xff ,
2244
+ 0x2b , 0xcc , 0x5a , 0xc4 , 0xa3 , 0xb9 , 0xef , 0xba ,
2245
+ },
2246
+ };
2247
+
2248
+ /* TLS 1.2, AES_CCM, ctrl, seqno:1, plaintext: '' */
2249
+ static const struct raw_rec id1_ctrl_l0 = {
2250
+ .plain_len = 0 ,
2251
+ .plain_data = {
2252
+ },
2253
+ .cipher_len = 29 ,
2254
+ .cipher_data = {
2255
+ 0x16 , 0x03 , 0x03 , 0x00 , 0x18 , 0x00 , 0x00 , 0x00 ,
2256
+ 0x00 , 0x00 , 0x00 , 0x00 , 0x01 , 0x3e , 0xf0 , 0xfe ,
2257
+ 0xee , 0xd9 , 0xe2 , 0x5d , 0xc7 , 0x11 , 0x4c , 0xe6 ,
2258
+ 0xb4 , 0x7e , 0xef , 0x40 , 0x2b ,
2259
+ },
2260
+ };
2261
+
2262
+ /* TLS 1.2, AES_CCM, data, seqno:1, plaintext: '' */
2263
+ static const struct raw_rec id1_data_l0 = {
2264
+ .plain_len = 0 ,
2265
+ .plain_data = {
2266
+ },
2267
+ .cipher_len = 29 ,
2268
+ .cipher_data = {
2269
+ 0x17 , 0x03 , 0x03 , 0x00 , 0x18 , 0x00 , 0x00 , 0x00 ,
2270
+ 0x00 , 0x00 , 0x00 , 0x00 , 0x01 , 0xce , 0xfc , 0x86 ,
2271
+ 0xc8 , 0xf0 , 0x55 , 0xf9 , 0x47 , 0x3f , 0x74 , 0xdc ,
2272
+ 0xc9 , 0xbf , 0xfe , 0x5b , 0xb1 ,
2273
+ },
2274
+ };
2275
+
2276
+ /* TLS 1.2, AES_CCM, ctrl, seqno:2, plaintext: 'Hello world' */
2277
+ static const struct raw_rec id2_ctrl_l11 = {
2278
+ .plain_len = 11 ,
2279
+ .plain_data = {
2280
+ 0x48 , 0x65 , 0x6c , 0x6c , 0x6f , 0x20 , 0x77 , 0x6f ,
2281
+ 0x72 , 0x6c , 0x64 ,
2282
+ },
2283
+ .cipher_len = 40 ,
2284
+ .cipher_data = {
2285
+ 0x16 , 0x03 , 0x03 , 0x00 , 0x23 , 0x00 , 0x00 , 0x00 ,
2286
+ 0x00 , 0x00 , 0x00 , 0x00 , 0x02 , 0xe5 , 0x3d , 0x19 ,
2287
+ 0x3d , 0xca , 0xb8 , 0x16 , 0xb6 , 0xff , 0x79 , 0x87 ,
2288
+ 0x2a , 0x04 , 0x11 , 0x3d , 0xf8 , 0x64 , 0x5f , 0x36 ,
2289
+ 0x8b , 0xa8 , 0xee , 0x4c , 0x6d , 0x62 , 0xa5 , 0x00 ,
2290
+ },
2291
+ };
2292
+
2293
+ /* TLS 1.2, AES_CCM, data, seqno:2, plaintext: 'Hello world' */
2294
+ static const struct raw_rec id2_data_l11 = {
2295
+ .plain_len = 11 ,
2296
+ .plain_data = {
2297
+ 0x48 , 0x65 , 0x6c , 0x6c , 0x6f , 0x20 , 0x77 , 0x6f ,
2298
+ 0x72 , 0x6c , 0x64 ,
2299
+ },
2300
+ .cipher_len = 40 ,
2301
+ .cipher_data = {
2302
+ 0x17 , 0x03 , 0x03 , 0x00 , 0x23 , 0x00 , 0x00 , 0x00 ,
2303
+ 0x00 , 0x00 , 0x00 , 0x00 , 0x02 , 0xe5 , 0x3d , 0x19 ,
2304
+ 0x3d , 0xca , 0xb8 , 0x16 , 0xb6 , 0xff , 0x79 , 0x87 ,
2305
+ 0x8e , 0xa1 , 0xd0 , 0xcd , 0x33 , 0xb5 , 0x86 , 0x2b ,
2306
+ 0x17 , 0xf1 , 0x52 , 0x2a , 0x55 , 0x62 , 0x65 , 0x11 ,
2307
+ },
2308
+ };
2309
+
2310
+ /* TLS 1.2, AES_CCM, ctrl, seqno:2, plaintext: '' */
2311
+ static const struct raw_rec id2_ctrl_l0 = {
2312
+ .plain_len = 0 ,
2313
+ .plain_data = {
2314
+ },
2315
+ .cipher_len = 29 ,
2316
+ .cipher_data = {
2317
+ 0x16 , 0x03 , 0x03 , 0x00 , 0x18 , 0x00 , 0x00 , 0x00 ,
2318
+ 0x00 , 0x00 , 0x00 , 0x00 , 0x02 , 0xdc , 0x5c , 0x0e ,
2319
+ 0x41 , 0xdd , 0xba , 0xd3 , 0xcc , 0xcf , 0x6d , 0xd9 ,
2320
+ 0x06 , 0xdb , 0x79 , 0xe5 , 0x5d ,
2321
+ },
2322
+ };
2323
+
2324
+ /* TLS 1.2, AES_CCM, data, seqno:2, plaintext: '' */
2325
+ static const struct raw_rec id2_data_l0 = {
2326
+ .plain_len = 0 ,
2327
+ .plain_data = {
2328
+ },
2329
+ .cipher_len = 29 ,
2330
+ .cipher_data = {
2331
+ 0x17 , 0x03 , 0x03 , 0x00 , 0x18 , 0x00 , 0x00 , 0x00 ,
2332
+ 0x00 , 0x00 , 0x00 , 0x00 , 0x02 , 0xc3 , 0xca , 0x26 ,
2333
+ 0x22 , 0xe4 , 0x25 , 0xfb , 0x5f , 0x6d , 0xbf , 0x83 ,
2334
+ 0x30 , 0x48 , 0x69 , 0x1a , 0x47 ,
2335
+ },
2336
+ };
2337
+
2338
+ FIXTURE (zero_len )
2339
+ {
2340
+ int fd , cfd ;
2341
+ bool notls ;
2342
+ };
2343
+
2344
+ FIXTURE_VARIANT (zero_len )
2345
+ {
2346
+ const struct raw_rec * recs [4 ];
2347
+ ssize_t recv_ret [4 ];
2348
+ };
2349
+
2350
+ FIXTURE_VARIANT_ADD (zero_len , data_data_data )
2351
+ {
2352
+ .recs = { & id0_data_l11 , & id1_data_l11 , & id2_data_l11 , },
2353
+ .recv_ret = { 33 , - EAGAIN , },
2354
+ };
2355
+
2356
+ FIXTURE_VARIANT_ADD (zero_len , data_0ctrl_data )
2357
+ {
2358
+ .recs = { & id0_data_l11 , & id1_ctrl_l0 , & id2_data_l11 , },
2359
+ .recv_ret = { 11 , 0 , 11 , - EAGAIN , },
2360
+ };
2361
+
2362
+ FIXTURE_VARIANT_ADD (zero_len , 0d ata_0data_0data )
2363
+ {
2364
+ .recs = { & id0_data_l0 , & id1_data_l0 , & id2_data_l0 , },
2365
+ .recv_ret = { - EAGAIN , },
2366
+ };
2367
+
2368
+ FIXTURE_VARIANT_ADD (zero_len , 0d ata_0data_ctrl )
2369
+ {
2370
+ .recs = { & id0_data_l0 , & id1_data_l0 , & id2_ctrl_l11 , },
2371
+ .recv_ret = { 0 , 11 , - EAGAIN , },
2372
+ };
2373
+
2374
+ FIXTURE_VARIANT_ADD (zero_len , 0d ata_0data_0ctrl )
2375
+ {
2376
+ .recs = { & id0_data_l0 , & id1_data_l0 , & id2_ctrl_l0 , },
2377
+ .recv_ret = { 0 , 0 , - EAGAIN , },
2378
+ };
2379
+
2380
+ FIXTURE_VARIANT_ADD (zero_len , 0 ctrl_0ctrl_0ctrl )
2381
+ {
2382
+ .recs = { & id0_ctrl_l0 , & id1_ctrl_l0 , & id2_ctrl_l0 , },
2383
+ .recv_ret = { 0 , 0 , 0 , - EAGAIN , },
2384
+ };
2385
+
2386
+ FIXTURE_VARIANT_ADD (zero_len , 0d ata_0data_data )
2387
+ {
2388
+ .recs = { & id0_data_l0 , & id1_data_l0 , & id2_data_l11 , },
2389
+ .recv_ret = { 11 , - EAGAIN , },
2390
+ };
2391
+
2392
+ FIXTURE_VARIANT_ADD (zero_len , data_0data_0data )
2393
+ {
2394
+ .recs = { & id0_data_l11 , & id1_data_l0 , & id2_data_l0 , },
2395
+ .recv_ret = { 11 , - EAGAIN , },
2396
+ };
2397
+
2398
+ FIXTURE_SETUP (zero_len )
2399
+ {
2400
+ struct tls_crypto_info_keys tls12 ;
2401
+ int ret ;
2402
+
2403
+ tls_crypto_info_init (TLS_1_2_VERSION , TLS_CIPHER_AES_CCM_128 ,
2404
+ & tls12 , 0 );
2405
+
2406
+ ulp_sock_pair (_metadata , & self -> fd , & self -> cfd , & self -> notls );
2407
+ if (self -> notls )
2408
+ return ;
2409
+
2410
+ /* Don't install keys on fd, we'll send raw records */
2411
+ ret = setsockopt (self -> cfd , SOL_TLS , TLS_RX , & tls12 , tls12 .len );
2412
+ ASSERT_EQ (ret , 0 );
2413
+ }
2414
+
2415
+ FIXTURE_TEARDOWN (zero_len )
2416
+ {
2417
+ close (self -> fd );
2418
+ close (self -> cfd );
2419
+ }
2420
+
2421
+ TEST_F (zero_len , test )
2422
+ {
2423
+ const struct raw_rec * const * rec ;
2424
+ unsigned char buf [128 ];
2425
+ int rec_off ;
2426
+ int i ;
2427
+
2428
+ for (i = 0 ; i < 4 && variant -> recs [i ]; i ++ )
2429
+ EXPECT_EQ (send (self -> fd , variant -> recs [i ]-> cipher_data ,
2430
+ variant -> recs [i ]-> cipher_len , 0 ),
2431
+ variant -> recs [i ]-> cipher_len );
2432
+
2433
+ rec = & variant -> recs [0 ];
2434
+ rec_off = 0 ;
2435
+ for (i = 0 ; i < 4 ; i ++ ) {
2436
+ int j , ret ;
2437
+
2438
+ ret = variant -> recv_ret [i ] >= 0 ? variant -> recv_ret [i ] : -1 ;
2439
+ EXPECT_EQ (__tls_recv_cmsg (_metadata , self -> cfd , NULL ,
2440
+ buf , sizeof (buf ), MSG_DONTWAIT ), ret );
2441
+ if (ret == -1 )
2442
+ EXPECT_EQ (errno , - variant -> recv_ret [i ]);
2443
+ if (variant -> recv_ret [i ] == - EAGAIN )
2444
+ break ;
2445
+
2446
+ for (j = 0 ; j < ret ; j ++ ) {
2447
+ while (rec_off == (* rec )-> plain_len ) {
2448
+ rec ++ ;
2449
+ rec_off = 0 ;
2450
+ }
2451
+ EXPECT_EQ (buf [j ], (* rec )-> plain_data [rec_off ]);
2452
+ rec_off ++ ;
2453
+ }
2454
+ }
2455
+ };
2456
+
2167
2457
FIXTURE (tls_err )
2168
2458
{
2169
2459
int fd , cfd ;
0 commit comments