aboutsummaryrefslogtreecommitdiff
path: root/tests/suites/test_suite_psa_crypto_hash.function
blob: 6c577c06af4deedf57782eaf697861165d9ebf21 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/* BEGIN_HEADER */

#include <stdint.h>

#include "test/psa_crypto_helpers.h"

/* END_HEADER */

/* BEGIN_DEPENDENCIES
 * depends_on:MBEDTLS_PSA_CRYPTO_C
 * END_DEPENDENCIES
 */

/* BEGIN_CASE */
void hash_finish( int alg_arg, data_t *input, data_t *expected_hash )
{
    psa_algorithm_t alg = alg_arg;
    unsigned char actual_hash[PSA_HASH_MAX_SIZE];
    size_t actual_hash_length;
    psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;

    PSA_ASSERT( psa_crypto_init( ) );

    PSA_ASSERT( psa_hash_setup( &operation, alg ) );
    PSA_ASSERT( psa_hash_update( &operation,
                                 input->x, input->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 );

exit:
    PSA_DONE( );
}
/* END_CASE */

/* BEGIN_CASE */
void hash_verify( int alg_arg, data_t *input, data_t *expected_hash )
{
    psa_algorithm_t alg = alg_arg;
    psa_hash_operation_t operation = PSA_HASH_OPERATION_INIT;

    PSA_ASSERT( psa_crypto_init( ) );

    PSA_ASSERT( psa_hash_setup( &operation, alg ) );
    PSA_ASSERT( psa_hash_update( &operation,
                                 input->x,
                                 input->len ) );
    PSA_ASSERT( psa_hash_verify( &operation,
                                 expected_hash->x,
                                 expected_hash->len ) );

exit:
    PSA_DONE( );
}
/* END_CASE */

/* BEGIN_CASE */
void hash_multi_part( int alg_arg, data_t *input, data_t *expected_hash )
{
    psa_algorithm_t alg = alg_arg;
    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( ) );

    do
    {
        memset( actual_hash, 0, sizeof( actual_hash ) );
        PSA_ASSERT( psa_hash_setup( &operation, alg ) );

        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:
    PSA_DONE( );
}
/* END_CASE */