mirror of
				https://github.com/cuberite/polarssl.git
				synced 2025-11-04 04:32:24 -05:00 
			
		
		
		
	Merge branch 'psa-hash_clone' into psa-api-1.0-beta
Add psa_hash_clone.
This commit is contained in:
		
						commit
						b37af92eb9
					
				@ -1048,6 +1048,24 @@ psa_status_t psa_hash_verify(psa_hash_operation_t *operation,
 | 
			
		||||
 */
 | 
			
		||||
psa_status_t psa_hash_abort(psa_hash_operation_t *operation);
 | 
			
		||||
 | 
			
		||||
/** Clone a hash operation.
 | 
			
		||||
 *
 | 
			
		||||
 * \param[in] source_operation      The active hash operation to clone.
 | 
			
		||||
 * \param[in,out] target_operation  The operation object to set up.
 | 
			
		||||
 *                                  It must be initialized but not active.
 | 
			
		||||
 *
 | 
			
		||||
 * \retval #PSA_SUCCESS
 | 
			
		||||
 * \retval #PSA_ERROR_BAD_STATE
 | 
			
		||||
 *         \p source_operation is not an active hash operation.
 | 
			
		||||
 * \retval #PSA_ERROR_BAD_STATE
 | 
			
		||||
 *         \p source_operation is active.
 | 
			
		||||
 * \retval #PSA_ERROR_COMMUNICATION_FAILURE
 | 
			
		||||
 * \retval #PSA_ERROR_HARDWARE_FAILURE
 | 
			
		||||
 * \retval #PSA_ERROR_TAMPERING_DETECTED
 | 
			
		||||
 */
 | 
			
		||||
psa_status_t psa_hash_clone(const psa_hash_operation_t *source_operation,
 | 
			
		||||
                            psa_hash_operation_t *target_operation);
 | 
			
		||||
 | 
			
		||||
/**@}*/
 | 
			
		||||
 | 
			
		||||
/** \defgroup MAC Message authentication codes
 | 
			
		||||
 | 
			
		||||
@ -1507,6 +1507,67 @@ psa_status_t psa_hash_verify( psa_hash_operation_t *operation,
 | 
			
		||||
    return( PSA_SUCCESS );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
psa_status_t psa_hash_clone(const psa_hash_operation_t *source_operation,
 | 
			
		||||
                            psa_hash_operation_t *target_operation)
 | 
			
		||||
{
 | 
			
		||||
    if( target_operation->alg != 0 )
 | 
			
		||||
        return( PSA_ERROR_BAD_STATE );
 | 
			
		||||
 | 
			
		||||
    switch( source_operation->alg )
 | 
			
		||||
    {
 | 
			
		||||
        case 0:
 | 
			
		||||
            return( PSA_ERROR_BAD_STATE );
 | 
			
		||||
#if defined(MBEDTLS_MD2_C)
 | 
			
		||||
        case PSA_ALG_MD2:
 | 
			
		||||
            mbedtls_md2_clone( &target_operation->ctx.md2,
 | 
			
		||||
                               &source_operation->ctx.md2 );
 | 
			
		||||
            break;
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(MBEDTLS_MD4_C)
 | 
			
		||||
        case PSA_ALG_MD4:
 | 
			
		||||
            mbedtls_md4_clone( &target_operation->ctx.md4,
 | 
			
		||||
                               &source_operation->ctx.md4 );
 | 
			
		||||
            break;
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(MBEDTLS_MD5_C)
 | 
			
		||||
        case PSA_ALG_MD5:
 | 
			
		||||
            mbedtls_md5_clone( &target_operation->ctx.md5,
 | 
			
		||||
                               &source_operation->ctx.md5 );
 | 
			
		||||
            break;
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(MBEDTLS_RIPEMD160_C)
 | 
			
		||||
        case PSA_ALG_RIPEMD160:
 | 
			
		||||
            mbedtls_ripemd160_clone( &target_operation->ctx.ripemd160,
 | 
			
		||||
                                     &source_operation->ctx.ripemd160 );
 | 
			
		||||
            break;
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(MBEDTLS_SHA1_C)
 | 
			
		||||
        case PSA_ALG_SHA_1:
 | 
			
		||||
            mbedtls_sha1_clone( &target_operation->ctx.sha1,
 | 
			
		||||
                                &source_operation->ctx.sha1 );
 | 
			
		||||
            break;
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(MBEDTLS_SHA256_C)
 | 
			
		||||
        case PSA_ALG_SHA_224:
 | 
			
		||||
        case PSA_ALG_SHA_256:
 | 
			
		||||
            mbedtls_sha256_clone( &target_operation->ctx.sha256,
 | 
			
		||||
                                  &source_operation->ctx.sha256 );
 | 
			
		||||
            break;
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(MBEDTLS_SHA512_C)
 | 
			
		||||
        case PSA_ALG_SHA_384:
 | 
			
		||||
        case PSA_ALG_SHA_512:
 | 
			
		||||
            mbedtls_sha512_clone( &target_operation->ctx.sha512,
 | 
			
		||||
                                  &source_operation->ctx.sha512 );
 | 
			
		||||
            break;
 | 
			
		||||
#endif
 | 
			
		||||
        default:
 | 
			
		||||
            return( PSA_ERROR_NOT_SUPPORTED );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    target_operation->alg = source_operation->alg;
 | 
			
		||||
    return( PSA_SUCCESS );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************************************************************/
 | 
			
		||||
 | 
			
		||||
@ -544,6 +544,12 @@ hash_verify_bad_args:
 | 
			
		||||
PSA hash finish: bad arguments
 | 
			
		||||
hash_finish_bad_args:
 | 
			
		||||
 | 
			
		||||
PSA hash clone: source state
 | 
			
		||||
hash_clone_source_state:
 | 
			
		||||
 | 
			
		||||
PSA hash clone: target state
 | 
			
		||||
hash_clone_target_state:
 | 
			
		||||
 | 
			
		||||
MAC operation object initializers zero properly
 | 
			
		||||
mac_operation_init:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1924,6 +1924,92 @@ exit:
 | 
			
		||||
}
 | 
			
		||||
/* END_CASE */
 | 
			
		||||
 | 
			
		||||
/* BEGIN_CASE depends_on:MBEDTLS_SHA256_C */
 | 
			
		||||
void hash_clone_source_state( )
 | 
			
		||||
{
 | 
			
		||||
    psa_algorithm_t alg = PSA_ALG_SHA_256;
 | 
			
		||||
    unsigned char hash[PSA_HASH_MAX_SIZE];
 | 
			
		||||
    psa_hash_operation_t op_source = PSA_HASH_OPERATION_INIT;
 | 
			
		||||
    psa_hash_operation_t op_init = PSA_HASH_OPERATION_INIT;
 | 
			
		||||
    psa_hash_operation_t op_setup = PSA_HASH_OPERATION_INIT;
 | 
			
		||||
    psa_hash_operation_t op_finished = PSA_HASH_OPERATION_INIT;
 | 
			
		||||
    psa_hash_operation_t op_aborted = PSA_HASH_OPERATION_INIT;
 | 
			
		||||
    size_t hash_len;
 | 
			
		||||
 | 
			
		||||
    PSA_ASSERT( psa_crypto_init( ) );
 | 
			
		||||
    PSA_ASSERT( psa_hash_setup( &op_source, alg ) );
 | 
			
		||||
 | 
			
		||||
    PSA_ASSERT( psa_hash_setup( &op_setup, alg ) );
 | 
			
		||||
    PSA_ASSERT( psa_hash_setup( &op_finished, alg ) );
 | 
			
		||||
    PSA_ASSERT( psa_hash_finish( &op_finished,
 | 
			
		||||
                                 hash, sizeof( hash ), &hash_len ) );
 | 
			
		||||
    PSA_ASSERT( psa_hash_setup( &op_aborted, alg ) );
 | 
			
		||||
    PSA_ASSERT( psa_hash_abort( &op_aborted ) );
 | 
			
		||||
 | 
			
		||||
    TEST_EQUAL( psa_hash_clone( &op_source, &op_setup ),
 | 
			
		||||
                PSA_ERROR_BAD_STATE );
 | 
			
		||||
 | 
			
		||||
    PSA_ASSERT( psa_hash_clone( &op_source, &op_init ) );
 | 
			
		||||
    PSA_ASSERT( psa_hash_finish( &op_init,
 | 
			
		||||
                                 hash, sizeof( hash ), &hash_len ) );
 | 
			
		||||
    PSA_ASSERT( psa_hash_clone( &op_source, &op_finished ) );
 | 
			
		||||
    PSA_ASSERT( psa_hash_finish( &op_finished,
 | 
			
		||||
                                 hash, sizeof( hash ), &hash_len ) );
 | 
			
		||||
    PSA_ASSERT( psa_hash_clone( &op_source, &op_aborted ) );
 | 
			
		||||
    PSA_ASSERT( psa_hash_finish( &op_aborted,
 | 
			
		||||
                                 hash, sizeof( hash ), &hash_len ) );
 | 
			
		||||
 | 
			
		||||
exit:
 | 
			
		||||
    psa_hash_abort( &op_source );
 | 
			
		||||
    psa_hash_abort( &op_init );
 | 
			
		||||
    psa_hash_abort( &op_setup );
 | 
			
		||||
    psa_hash_abort( &op_finished );
 | 
			
		||||
    psa_hash_abort( &op_aborted );
 | 
			
		||||
    mbedtls_psa_crypto_free( );
 | 
			
		||||
}
 | 
			
		||||
/* END_CASE */
 | 
			
		||||
 | 
			
		||||
/* BEGIN_CASE depends_on:MBEDTLS_SHA256_C */
 | 
			
		||||
void hash_clone_target_state( )
 | 
			
		||||
{
 | 
			
		||||
    psa_algorithm_t alg = PSA_ALG_SHA_256;
 | 
			
		||||
    unsigned char hash[PSA_HASH_MAX_SIZE];
 | 
			
		||||
    psa_hash_operation_t op_init = PSA_HASH_OPERATION_INIT;
 | 
			
		||||
    psa_hash_operation_t op_setup = PSA_HASH_OPERATION_INIT;
 | 
			
		||||
    psa_hash_operation_t op_finished = PSA_HASH_OPERATION_INIT;
 | 
			
		||||
    psa_hash_operation_t op_aborted = PSA_HASH_OPERATION_INIT;
 | 
			
		||||
    psa_hash_operation_t op_target = PSA_HASH_OPERATION_INIT;
 | 
			
		||||
    size_t hash_len;
 | 
			
		||||
 | 
			
		||||
    PSA_ASSERT( psa_crypto_init( ) );
 | 
			
		||||
 | 
			
		||||
    PSA_ASSERT( psa_hash_setup( &op_setup, alg ) );
 | 
			
		||||
    PSA_ASSERT( psa_hash_setup( &op_finished, alg ) );
 | 
			
		||||
    PSA_ASSERT( psa_hash_finish( &op_finished,
 | 
			
		||||
                                 hash, sizeof( hash ), &hash_len ) );
 | 
			
		||||
    PSA_ASSERT( psa_hash_setup( &op_aborted, alg ) );
 | 
			
		||||
    PSA_ASSERT( psa_hash_abort( &op_aborted ) );
 | 
			
		||||
 | 
			
		||||
    PSA_ASSERT( psa_hash_clone( &op_setup, &op_target ) );
 | 
			
		||||
    PSA_ASSERT( psa_hash_finish( &op_target,
 | 
			
		||||
                                 hash, sizeof( hash ), &hash_len ) );
 | 
			
		||||
 | 
			
		||||
    TEST_EQUAL( psa_hash_clone( &op_init, &op_target ), PSA_ERROR_BAD_STATE );
 | 
			
		||||
    TEST_EQUAL( psa_hash_clone( &op_finished, &op_target ),
 | 
			
		||||
                PSA_ERROR_BAD_STATE );
 | 
			
		||||
    TEST_EQUAL( psa_hash_clone( &op_aborted, &op_target ),
 | 
			
		||||
                PSA_ERROR_BAD_STATE );
 | 
			
		||||
 | 
			
		||||
exit:
 | 
			
		||||
    psa_hash_abort( &op_target );
 | 
			
		||||
    psa_hash_abort( &op_init );
 | 
			
		||||
    psa_hash_abort( &op_setup );
 | 
			
		||||
    psa_hash_abort( &op_finished );
 | 
			
		||||
    psa_hash_abort( &op_aborted );
 | 
			
		||||
    mbedtls_psa_crypto_free( );
 | 
			
		||||
}
 | 
			
		||||
/* END_CASE */
 | 
			
		||||
 | 
			
		||||
/* BEGIN_CASE */
 | 
			
		||||
void mac_operation_init( )
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@ -67,6 +67,7 @@ void hash_multi_part( int alg_arg, data_t *input, data_t *expected_hash )
 | 
			
		||||
    unsigned char actual_hash[PSA_HASH_MAX_SIZE];
 | 
			
		||||
    size_t actual_hash_length;
 | 
			
		||||
    psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;
 | 
			
		||||
    psa_hash_operation_t operation2 = PSA_HASH_OPERATION_INIT;
 | 
			
		||||
    uint32_t len = 0;
 | 
			
		||||
 | 
			
		||||
    PSA_ASSERT( psa_crypto_init( ) );
 | 
			
		||||
@ -78,16 +79,23 @@ void hash_multi_part( int alg_arg, data_t *input, data_t *expected_hash )
 | 
			
		||||
 | 
			
		||||
        PSA_ASSERT( psa_hash_update( &operation,
 | 
			
		||||
                                     input->x, len ) );
 | 
			
		||||
        PSA_ASSERT( psa_hash_clone( &operation, &operation2 ) );
 | 
			
		||||
        PSA_ASSERT( psa_hash_update( &operation,
 | 
			
		||||
                                     input->x + len, input->len - len ) );
 | 
			
		||||
        PSA_ASSERT( psa_hash_update( &operation2,
 | 
			
		||||
                                     input->x + len, input->len - len ) );
 | 
			
		||||
 | 
			
		||||
        PSA_ASSERT( psa_hash_finish( &operation,
 | 
			
		||||
                                     actual_hash, sizeof( actual_hash ),
 | 
			
		||||
                                     &actual_hash_length ) );
 | 
			
		||||
 | 
			
		||||
        ASSERT_COMPARE( expected_hash->x, expected_hash->len,
 | 
			
		||||
                        actual_hash, actual_hash_length );
 | 
			
		||||
 | 
			
		||||
        PSA_ASSERT( psa_hash_finish( &operation2,
 | 
			
		||||
                                     actual_hash, sizeof( actual_hash ),
 | 
			
		||||
                                     &actual_hash_length ) );
 | 
			
		||||
        ASSERT_COMPARE( expected_hash->x, expected_hash->len,
 | 
			
		||||
                        actual_hash, actual_hash_length );
 | 
			
		||||
    } while( len++ != input->len );
 | 
			
		||||
 | 
			
		||||
exit:
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user