@@ -2296,6 +2296,148 @@ static void cryptoUnitTest(void) {
22962296}
22972297
22982298
2299+ static void checkHexDecode (const u_char * encoded , size_t encoded_len ,
2300+ const u_char * expected , size_t expected_len ) {
2301+ size_t out_len = 0 ;
2302+ u_char * decoded ;
2303+
2304+ decoded = ndpi_hex_decode (encoded , encoded_len , & out_len );
2305+ assert (decoded != NULL );
2306+ assert (out_len == expected_len );
2307+ assert (memcmp (decoded , expected , expected_len ) == 0 );
2308+ assert (decoded [out_len ] == '\0' );
2309+
2310+ ndpi_free (decoded );
2311+ }
2312+
2313+ static void checkTlsBlocksDecode (const u_char * encoded , size_t encoded_len ,
2314+ const struct ndpi_tls_block * expected_blocks ,
2315+ u_int8_t expected_num_blocks ) {
2316+ u_int8_t num_blocks = 0 ;
2317+ u_int8_t i ;
2318+ struct ndpi_tls_block * decoded ;
2319+
2320+ decoded = ndpi_decode_tls_blocks (encoded , encoded_len , & num_blocks );
2321+ assert (decoded != NULL );
2322+ assert (num_blocks == expected_num_blocks );
2323+
2324+ for (i = 0 ; i < num_blocks ; i ++ ) {
2325+ assert (decoded [i ].block_type == expected_blocks [i ].block_type );
2326+ assert (decoded [i ].same_pkt == expected_blocks [i ].same_pkt );
2327+ assert (decoded [i ].len == expected_blocks [i ].len );
2328+ }
2329+
2330+ ndpi_free (decoded );
2331+ }
2332+
2333+ static void rewriteHexCase (u_char * encoded , size_t encoded_len ) {
2334+ size_t i ;
2335+
2336+ for (i = 0 ; i < encoded_len ; i ++ ) {
2337+ if (encoded [i ] >= 'a' && encoded [i ] <= 'f' ) {
2338+ if ((i & 0x1 ) == 0 )
2339+ encoded [i ] -= 'a' - 'A' ;
2340+ } else if (encoded [i ] >= 'A' && encoded [i ] <= 'F' ) {
2341+ if ((i & 0x1 ) == 1 )
2342+ encoded [i ] += 'a' - 'A' ;
2343+ }
2344+ }
2345+ }
2346+
2347+ static void hexDecodeUnitTest (void ) {
2348+ static const u_char lower_hex [] = { 'a' , 'f' };
2349+ static const u_char upper_hex [] = { 'A' , 'F' };
2350+ static const u_char mixed_hex [] = { '0' , '1' , 'a' , 'B' , 'c' , 'D' };
2351+ static const u_char zero_hex [] = { '0' , '0' , 'f' , 'F' };
2352+ static const u_char invalid_hex [] = { '0' , 'g' };
2353+ static const u_char odd_hex [] = { '0' };
2354+ static const u_char lower_expected [] = { 0xAF };
2355+ static const u_char upper_expected [] = { 0xAF };
2356+ static const u_char mixed_expected [] = { 0x01 , 0xAB , 0xCD };
2357+ static const u_char zero_expected [] = { 0x00 , 0xFF };
2358+ size_t out_len = 123 ;
2359+ u_char * decoded ;
2360+
2361+ checkHexDecode (lower_hex , sizeof (lower_hex ), lower_expected , sizeof (lower_expected ));
2362+ checkHexDecode (upper_hex , sizeof (upper_hex ), upper_expected , sizeof (upper_expected ));
2363+ checkHexDecode (mixed_hex , sizeof (mixed_hex ), mixed_expected , sizeof (mixed_expected ));
2364+ checkHexDecode (zero_hex , sizeof (zero_hex ), zero_expected , sizeof (zero_expected ));
2365+
2366+ decoded = ndpi_hex_decode (invalid_hex , sizeof (invalid_hex ), & out_len );
2367+ assert (decoded == NULL );
2368+ assert (out_len == 0 );
2369+
2370+ out_len = 123 ;
2371+ decoded = ndpi_hex_decode (odd_hex , sizeof (odd_hex ), & out_len );
2372+ assert (decoded == NULL );
2373+ assert (out_len == 0 );
2374+
2375+ out_len = 123 ;
2376+ decoded = ndpi_hex_decode ((const u_char * )"" , 0 , & out_len );
2377+ assert (decoded != NULL );
2378+ assert (out_len == 0 );
2379+ assert (decoded [0 ] == '\0' );
2380+ ndpi_free (decoded );
2381+ }
2382+
2383+ static void tlsBlocksUnitTest (void ) {
2384+ struct ndpi_tls_block expected_blocks [] = {
2385+ { .block_type = tls_handshake_client_hello , .len = 0x0000 , .same_pkt = 1 },
2386+ { .block_type = tls_application_data , .len = 0xFFFF , .same_pkt = 0 },
2387+ { .block_type = tls_application_data , .len = 0x00AF , .same_pkt = 1 }
2388+ };
2389+ static const u_char truncated_tls_blocks [] = { '0' , '0' , '0' , '1' };
2390+ static const u_char invalid_tls_blocks [] = { '0' , 'g' , '0' , '0' , '0' , '0' };
2391+ static const u_char odd_tls_blocks [] = { '0' , '0' , '0' };
2392+ u_int8_t expected_num_blocks = sizeof (expected_blocks ) / sizeof (expected_blocks [0 ]);
2393+ u_int8_t num_blocks = 0 ;
2394+ size_t encoded_len ;
2395+ size_t oversized_encoded_len = (size_t )256 * 6 ;
2396+ u_char * encoded ;
2397+ u_char * encoded_no_nul ;
2398+ u_char * oversized_encoded ;
2399+
2400+ encoded = ndpi_encode_tls_blocks (expected_blocks , expected_num_blocks );
2401+ assert (encoded != NULL );
2402+
2403+ encoded_len = strlen ((const char * )encoded );
2404+ encoded_no_nul = ndpi_malloc (encoded_len );
2405+ assert (encoded_no_nul != NULL );
2406+
2407+ memcpy (encoded_no_nul , encoded , encoded_len );
2408+
2409+ checkTlsBlocksDecode (encoded_no_nul , encoded_len , expected_blocks , expected_num_blocks );
2410+ rewriteHexCase (encoded_no_nul , encoded_len );
2411+ checkTlsBlocksDecode (encoded_no_nul , encoded_len , expected_blocks , expected_num_blocks );
2412+ ndpi_free (encoded_no_nul );
2413+ ndpi_free (encoded );
2414+
2415+ num_blocks = expected_num_blocks ;
2416+ assert (ndpi_decode_tls_blocks (truncated_tls_blocks , sizeof (truncated_tls_blocks ), & num_blocks ) == NULL );
2417+ assert (num_blocks == 0 );
2418+
2419+ num_blocks = expected_num_blocks ;
2420+ assert (ndpi_decode_tls_blocks (invalid_tls_blocks , sizeof (invalid_tls_blocks ), & num_blocks ) == NULL );
2421+ assert (num_blocks == 0 );
2422+
2423+ num_blocks = expected_num_blocks ;
2424+ assert (ndpi_decode_tls_blocks (odd_tls_blocks , sizeof (odd_tls_blocks ), & num_blocks ) == NULL );
2425+ assert (num_blocks == 0 );
2426+
2427+ oversized_encoded = ndpi_malloc (oversized_encoded_len );
2428+ assert (oversized_encoded != NULL );
2429+ memset (oversized_encoded , '0' , oversized_encoded_len );
2430+
2431+ num_blocks = expected_num_blocks ;
2432+ assert (ndpi_decode_tls_blocks (oversized_encoded , oversized_encoded_len , & num_blocks ) == NULL );
2433+ assert (num_blocks == 0 );
2434+ ndpi_free (oversized_encoded );
2435+
2436+ num_blocks = expected_num_blocks ;
2437+ assert (ndpi_decode_tls_blocks ((const u_char * )"" , 0 , & num_blocks ) == NULL );
2438+ assert (num_blocks == 0 );
2439+ }
2440+
22992441void run_unit_tests () {
23002442
23012443 checkRankingUnitTest (false);
@@ -2352,5 +2494,7 @@ void run_unit_tests() {
23522494 bitmap64FuseUnitTest ();
23532495 riskUtilsUnitTest ();
23542496 cryptoUnitTest ();
2497+ hexDecodeUnitTest ();
2498+ tlsBlocksUnitTest ();
23552499
23562500}
0 commit comments