forked from eden-emu/eden
		
	
		
			
	
	
		
			286 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			286 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
|  | /* BEGIN_HEADER */ | ||
|  | #include "mbedtls/chachapoly.h" | ||
|  | /* END_HEADER */ | ||
|  | 
 | ||
|  | /* BEGIN_DEPENDENCIES | ||
|  |  * depends_on:MBEDTLS_CHACHAPOLY_C | ||
|  |  * END_DEPENDENCIES | ||
|  |  */ | ||
|  | 
 | ||
|  | /* BEGIN_CASE */ | ||
|  | void mbedtls_chachapoly_enc( data_t *key_str, data_t *nonce_str, data_t *aad_str, data_t *input_str, data_t *output_str, data_t *mac_str ) | ||
|  | { | ||
|  |     unsigned char output[265]; | ||
|  |     unsigned char mac[16]; /* size set by the standard */ | ||
|  |     mbedtls_chachapoly_context ctx; | ||
|  | 
 | ||
|  |     TEST_ASSERT( key_str->len   == 32 ); | ||
|  |     TEST_ASSERT( nonce_str->len == 12 ); | ||
|  |     TEST_ASSERT( mac_str->len   == 16 ); | ||
|  | 
 | ||
|  |     mbedtls_chachapoly_init( &ctx ); | ||
|  | 
 | ||
|  |     TEST_ASSERT( mbedtls_chachapoly_setkey( &ctx, key_str->x ) == 0 ); | ||
|  | 
 | ||
|  |     TEST_ASSERT( mbedtls_chachapoly_encrypt_and_tag( &ctx, | ||
|  |                                       input_str->len, nonce_str->x, | ||
|  |                                       aad_str->x, aad_str->len, | ||
|  |                                       input_str->x, output, mac ) == 0 ); | ||
|  | 
 | ||
|  |     TEST_ASSERT( memcmp( output_str->x, output, output_str->len ) == 0 ); | ||
|  |     TEST_ASSERT( memcmp( mac_str->x, mac, 16U ) == 0 ); | ||
|  | 
 | ||
|  | exit: | ||
|  |     mbedtls_chachapoly_free( &ctx ); | ||
|  | } | ||
|  | /* END_CASE */ | ||
|  | 
 | ||
|  | /* BEGIN_CASE */ | ||
|  | void mbedtls_chachapoly_dec( data_t *key_str, data_t *nonce_str, data_t *aad_str, data_t *input_str, data_t *output_str, data_t *mac_str, int ret_exp ) | ||
|  | { | ||
|  |     unsigned char output[265]; | ||
|  |     int ret; | ||
|  |     mbedtls_chachapoly_context ctx; | ||
|  | 
 | ||
|  |     TEST_ASSERT( key_str->len   == 32 ); | ||
|  |     TEST_ASSERT( nonce_str->len == 12 ); | ||
|  |     TEST_ASSERT( mac_str->len   == 16 ); | ||
|  | 
 | ||
|  |     mbedtls_chachapoly_init( &ctx ); | ||
|  | 
 | ||
|  |     TEST_ASSERT( mbedtls_chachapoly_setkey( &ctx, key_str->x ) == 0 ); | ||
|  | 
 | ||
|  |     ret = mbedtls_chachapoly_auth_decrypt( &ctx, | ||
|  |                                            input_str->len, nonce_str->x, | ||
|  |                                            aad_str->x, aad_str->len, | ||
|  |                                            mac_str->x, input_str->x, output ); | ||
|  | 
 | ||
|  |     TEST_ASSERT( ret == ret_exp ); | ||
|  |     if( ret_exp == 0 ) | ||
|  |     { | ||
|  |         TEST_ASSERT( memcmp( output_str->x, output, output_str->len ) == 0 ); | ||
|  |     } | ||
|  | 
 | ||
|  | exit: | ||
|  |     mbedtls_chachapoly_free( &ctx ); | ||
|  | } | ||
|  | /* END_CASE */ | ||
|  | 
 | ||
|  | /* BEGIN_CASE depends_on:MBEDTLS_CHECK_PARAMS:!MBEDTLS_PARAM_FAILED_ALT */ | ||
|  | void chachapoly_bad_params() | ||
|  | { | ||
|  |     unsigned char key[32]; | ||
|  |     unsigned char nonce[12]; | ||
|  |     unsigned char aad[1]; | ||
|  |     unsigned char input[1]; | ||
|  |     unsigned char output[1]; | ||
|  |     unsigned char mac[16]; | ||
|  |     size_t input_len = sizeof( input ); | ||
|  |     size_t aad_len = sizeof( aad ); | ||
|  |     mbedtls_chachapoly_context ctx; | ||
|  | 
 | ||
|  |     memset( key,    0x00, sizeof( key ) ); | ||
|  |     memset( nonce,  0x00, sizeof( nonce ) ); | ||
|  |     memset( aad,    0x00, sizeof( aad ) ); | ||
|  |     memset( input,  0x00, sizeof( input ) ); | ||
|  |     memset( output, 0x00, sizeof( output ) ); | ||
|  |     memset( mac,    0x00, sizeof( mac ) ); | ||
|  | 
 | ||
|  |     TEST_INVALID_PARAM( mbedtls_chachapoly_init( NULL ) ); | ||
|  |     TEST_VALID_PARAM( mbedtls_chachapoly_free( NULL ) ); | ||
|  | 
 | ||
|  |     /* setkey */ | ||
|  |     TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA, | ||
|  |                             mbedtls_chachapoly_setkey( NULL, key ) ); | ||
|  |     TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA, | ||
|  |                             mbedtls_chachapoly_setkey( &ctx, NULL ) ); | ||
|  | 
 | ||
|  |     /* encrypt_and_tag */ | ||
|  |     TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA, | ||
|  |                             mbedtls_chachapoly_encrypt_and_tag( NULL, | ||
|  |                                       0, nonce, | ||
|  |                                       aad, 0, | ||
|  |                                       input, output, mac ) ); | ||
|  |     TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA, | ||
|  |                             mbedtls_chachapoly_encrypt_and_tag( &ctx, | ||
|  |                                       0, NULL, | ||
|  |                                       aad, 0, | ||
|  |                                       input, output, mac ) ); | ||
|  |     TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA, | ||
|  |                             mbedtls_chachapoly_encrypt_and_tag( &ctx, | ||
|  |                                       0, nonce, | ||
|  |                                       NULL, aad_len, | ||
|  |                                       input, output, mac ) ); | ||
|  |     TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA, | ||
|  |                             mbedtls_chachapoly_encrypt_and_tag( &ctx, | ||
|  |                                       input_len, nonce, | ||
|  |                                       aad, 0, | ||
|  |                                       NULL, output, mac ) ); | ||
|  |     TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA, | ||
|  |                             mbedtls_chachapoly_encrypt_and_tag( &ctx, | ||
|  |                                       input_len, nonce, | ||
|  |                                       aad, 0, | ||
|  |                                       input, NULL, mac ) ); | ||
|  |     TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA, | ||
|  |                             mbedtls_chachapoly_encrypt_and_tag( &ctx, | ||
|  |                                       0, nonce, | ||
|  |                                       aad, 0, | ||
|  |                                       input, output, NULL ) ); | ||
|  | 
 | ||
|  |     /* auth_decrypt */ | ||
|  |     TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA, | ||
|  |                             mbedtls_chachapoly_auth_decrypt( NULL, | ||
|  |                                            0, nonce, | ||
|  |                                            aad, 0, | ||
|  |                                            mac, input, output ) ); | ||
|  |     TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA, | ||
|  |                             mbedtls_chachapoly_auth_decrypt( &ctx, | ||
|  |                                            0, NULL, | ||
|  |                                            aad, 0, | ||
|  |                                            mac, input, output ) ); | ||
|  |     TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA, | ||
|  |                             mbedtls_chachapoly_auth_decrypt( &ctx, | ||
|  |                                            0, nonce, | ||
|  |                                            NULL, aad_len, | ||
|  |                                            mac, input, output ) ); | ||
|  |     TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA, | ||
|  |                             mbedtls_chachapoly_auth_decrypt( &ctx, | ||
|  |                                            0, nonce, | ||
|  |                                            aad, 0, | ||
|  |                                            NULL, input, output ) ); | ||
|  |     TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA, | ||
|  |                             mbedtls_chachapoly_auth_decrypt( &ctx, | ||
|  |                                            input_len, nonce, | ||
|  |                                            aad, 0, | ||
|  |                                            mac, NULL, output ) ); | ||
|  |     TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA, | ||
|  |                             mbedtls_chachapoly_auth_decrypt( &ctx, | ||
|  |                                            input_len, nonce, | ||
|  |                                            aad, 0, | ||
|  |                                            mac, input, NULL ) ); | ||
|  | 
 | ||
|  |     /* starts */ | ||
|  |     TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA, | ||
|  |                             mbedtls_chachapoly_starts( NULL, nonce, | ||
|  |                                                MBEDTLS_CHACHAPOLY_ENCRYPT ) ); | ||
|  |     TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA, | ||
|  |                             mbedtls_chachapoly_starts( &ctx, NULL, | ||
|  |                                                MBEDTLS_CHACHAPOLY_ENCRYPT ) ); | ||
|  | 
 | ||
|  |     /* update_aad */ | ||
|  |     TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA, | ||
|  |                             mbedtls_chachapoly_update_aad( NULL, aad, | ||
|  |                                                            aad_len ) ); | ||
|  |     TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA, | ||
|  |                             mbedtls_chachapoly_update_aad( &ctx, NULL, | ||
|  |                                                            aad_len ) ); | ||
|  | 
 | ||
|  |     /* update */ | ||
|  |     TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA, | ||
|  |                             mbedtls_chachapoly_update( NULL, input_len, | ||
|  |                                                        input, output ) ); | ||
|  |     TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA, | ||
|  |                             mbedtls_chachapoly_update( &ctx, input_len, | ||
|  |                                                        NULL, output ) ); | ||
|  |     TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA, | ||
|  |                             mbedtls_chachapoly_update( &ctx, input_len, | ||
|  |                                                        input, NULL ) ); | ||
|  | 
 | ||
|  |     /* finish */ | ||
|  |     TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA, | ||
|  |                             mbedtls_chachapoly_finish( NULL, mac ) ); | ||
|  |     TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA, | ||
|  |                             mbedtls_chachapoly_finish( &ctx, NULL ) ); | ||
|  | 
 | ||
|  | exit: | ||
|  |     return; | ||
|  | } | ||
|  | /* END_CASE */ | ||
|  | 
 | ||
|  | /* BEGIN_CASE */ | ||
|  | void chachapoly_state() | ||
|  | { | ||
|  |     unsigned char key[32]; | ||
|  |     unsigned char nonce[12]; | ||
|  |     unsigned char aad[1]; | ||
|  |     unsigned char input[1]; | ||
|  |     unsigned char output[1]; | ||
|  |     unsigned char mac[16]; | ||
|  |     size_t input_len = sizeof( input ); | ||
|  |     size_t aad_len = sizeof( aad ); | ||
|  |     mbedtls_chachapoly_context ctx; | ||
|  | 
 | ||
|  |     memset( key,    0x00, sizeof( key ) ); | ||
|  |     memset( nonce,  0x00, sizeof( nonce ) ); | ||
|  |     memset( aad,    0x00, sizeof( aad ) ); | ||
|  |     memset( input,  0x00, sizeof( input ) ); | ||
|  |     memset( output, 0x00, sizeof( output ) ); | ||
|  |     memset( mac,    0x00, sizeof( mac ) ); | ||
|  | 
 | ||
|  |     /* Initial state: finish, update, update_aad forbidden */ | ||
|  |     mbedtls_chachapoly_init( &ctx ); | ||
|  | 
 | ||
|  |     TEST_ASSERT( mbedtls_chachapoly_finish( &ctx, mac ) | ||
|  |                  == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE ); | ||
|  |     TEST_ASSERT( mbedtls_chachapoly_update( &ctx, input_len, input, output ) | ||
|  |                  == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE ); | ||
|  |     TEST_ASSERT( mbedtls_chachapoly_update_aad( &ctx, aad, aad_len ) | ||
|  |                  == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE ); | ||
|  | 
 | ||
|  |     /* Still initial state: finish, update, update_aad forbidden */ | ||
|  |     TEST_ASSERT( mbedtls_chachapoly_setkey( &ctx, key ) | ||
|  |                  == 0 ); | ||
|  | 
 | ||
|  |     TEST_ASSERT( mbedtls_chachapoly_finish( &ctx, mac ) | ||
|  |                  == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE ); | ||
|  |     TEST_ASSERT( mbedtls_chachapoly_update( &ctx, input_len, input, output ) | ||
|  |                  == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE ); | ||
|  |     TEST_ASSERT( mbedtls_chachapoly_update_aad( &ctx, aad, aad_len ) | ||
|  |                  == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE ); | ||
|  | 
 | ||
|  |     /* Starts -> finish OK */ | ||
|  |     TEST_ASSERT( mbedtls_chachapoly_starts( &ctx, nonce, MBEDTLS_CHACHAPOLY_ENCRYPT ) | ||
|  |                  == 0 ); | ||
|  |     TEST_ASSERT( mbedtls_chachapoly_finish( &ctx, mac ) | ||
|  |                  == 0 ); | ||
|  | 
 | ||
|  |     /* After finish: update, update_aad forbidden */ | ||
|  |     TEST_ASSERT( mbedtls_chachapoly_update( &ctx, input_len, input, output ) | ||
|  |                  == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE ); | ||
|  |     TEST_ASSERT( mbedtls_chachapoly_update_aad( &ctx, aad, aad_len ) | ||
|  |                  == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE ); | ||
|  | 
 | ||
|  |     /* Starts -> update* OK */ | ||
|  |     TEST_ASSERT( mbedtls_chachapoly_starts( &ctx, nonce, MBEDTLS_CHACHAPOLY_ENCRYPT ) | ||
|  |                  == 0 ); | ||
|  |     TEST_ASSERT( mbedtls_chachapoly_update( &ctx, input_len, input, output ) | ||
|  |                  == 0 ); | ||
|  |     TEST_ASSERT( mbedtls_chachapoly_update( &ctx, input_len, input, output ) | ||
|  |                  == 0 ); | ||
|  | 
 | ||
|  |     /* After update: update_aad forbidden */ | ||
|  |     TEST_ASSERT( mbedtls_chachapoly_update_aad( &ctx, aad, aad_len ) | ||
|  |                  == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE ); | ||
|  | 
 | ||
|  |     /* Starts -> update_aad* -> finish OK */ | ||
|  |     TEST_ASSERT( mbedtls_chachapoly_starts( &ctx, nonce, MBEDTLS_CHACHAPOLY_ENCRYPT ) | ||
|  |                  == 0 ); | ||
|  |     TEST_ASSERT( mbedtls_chachapoly_update_aad( &ctx, aad, aad_len ) | ||
|  |                  == 0 ); | ||
|  |     TEST_ASSERT( mbedtls_chachapoly_update_aad( &ctx, aad, aad_len ) | ||
|  |                  == 0 ); | ||
|  |     TEST_ASSERT( mbedtls_chachapoly_finish( &ctx, mac ) | ||
|  |                  == 0 ); | ||
|  | 
 | ||
|  | exit: | ||
|  |     mbedtls_chachapoly_free( &ctx ); | ||
|  | } | ||
|  | /* END_CASE */ | ||
|  | 
 | ||
|  | /* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */ | ||
|  | void chachapoly_selftest() | ||
|  | { | ||
|  |     TEST_ASSERT( mbedtls_chachapoly_self_test( 1 ) == 0 ); | ||
|  | } | ||
|  | /* END_CASE */ |