aboutsummaryrefslogtreecommitdiffstats
path: root/roms/skiboot/libstb/crypto/mbedtls/tests/suites/test_suite_poly1305.function
blob: 066bb39425ae3e63233509240fc98eed8f0ecfbf (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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/* BEGIN_HEADER */
#include "mbedtls/poly1305.h"
#include <stddef.h>
/* END_HEADER */

/* BEGIN_DEPENDENCIES
 * depends_on:MBEDTLS_POLY1305_C
 * END_DEPENDENCIES
 */

/* BEGIN_CASE */
void mbedtls_poly1305( char *hex_key_string, char *hex_mac_string, char *hex_src_string  )
{
    unsigned char src_str[375]; /* max size of binary input */
    unsigned char key[32]; /* size set by the standard */
    unsigned char mac[16]; /* size set by the standard */
    unsigned char mac_str[33]; /* hex expansion of the above */
    size_t src_len;
    mbedtls_poly1305_context ctx;

    memset( src_str, 0x00, sizeof( src_str ) );
    memset( mac_str, 0x00, sizeof( mac_str ) );
    memset( key,     0x00, sizeof( key ) );
    memset( mac,     0x00, sizeof( mac ) );

    src_len = unhexify( src_str, hex_src_string );
    unhexify( key, hex_key_string );

    /*
     * Test the integrated API
     */
    TEST_ASSERT( mbedtls_poly1305_mac( key, src_str, src_len, mac ) == 0 );

    hexify( mac_str, mac, 16 );
    TEST_ASSERT( strcmp( (char *) mac_str, hex_mac_string ) == 0 );

    /*
     * Test the streaming API
     */
    mbedtls_poly1305_init( &ctx );

    TEST_ASSERT( mbedtls_poly1305_starts( &ctx, key ) == 0 );

    TEST_ASSERT( mbedtls_poly1305_update( &ctx, src_str, src_len ) == 0 );

    TEST_ASSERT( mbedtls_poly1305_finish( &ctx, mac ) == 0 );

    hexify( mac_str, mac, 16 );
    TEST_ASSERT( strcmp( (char *) mac_str, hex_mac_string ) == 0 );

    /*
     * Test the streaming API again, piecewise
     */

    /* Don't free/init the context, in order to test that starts() does the
     * right thing. */
    if( src_len >= 1 )
    {
        TEST_ASSERT( mbedtls_poly1305_starts( &ctx, key ) == 0 );

        TEST_ASSERT( mbedtls_poly1305_update( &ctx, src_str, 1 ) == 0 );
        TEST_ASSERT( mbedtls_poly1305_update( &ctx, src_str + 1, src_len - 1 ) == 0 );

        TEST_ASSERT( mbedtls_poly1305_finish( &ctx, mac ) == 0 );

        hexify( mac_str, mac, 16 );
        TEST_ASSERT( strcmp( (char *) mac_str, hex_mac_string ) == 0 );
    }

    /*
     * Again with more pieces
     */
    if( src_len >= 2 )
    {
        TEST_ASSERT( mbedtls_poly1305_starts( &ctx, key ) == 0 );

        TEST_ASSERT( mbedtls_poly1305_update( &ctx, src_str, 1 ) == 0 );
        TEST_ASSERT( mbedtls_poly1305_update( &ctx, src_str + 1, 1 ) == 0 );
        TEST_ASSERT( mbedtls_poly1305_update( &ctx, src_str + 2, src_len - 2 ) == 0 );

        TEST_ASSERT( mbedtls_poly1305_finish( &ctx, mac ) == 0 );

        hexify( mac_str, mac, 16 );
        TEST_ASSERT( strcmp( (char *) mac_str, hex_mac_string ) == 0 );
    }

    mbedtls_poly1305_free( &ctx );
}
/* END_CASE */

/* BEGIN_CASE depends_on:MBEDTLS_CHECK_PARAMS:!MBEDTLS_PARAM_FAILED_ALT */
void poly1305_bad_params()
{
    unsigned char src[1];
    unsigned char key[32];
    unsigned char mac[16];
    size_t src_len = sizeof( src );
    mbedtls_poly1305_context ctx;

    TEST_INVALID_PARAM( mbedtls_poly1305_init( NULL ) );
    TEST_VALID_PARAM( mbedtls_poly1305_free( NULL ) );

    TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA,
                 mbedtls_poly1305_starts( NULL, key ) );
    TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA,
                 mbedtls_poly1305_starts( &ctx, NULL ) );

    TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA,
                 mbedtls_poly1305_update( NULL, src, 0 ) );
    TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA,
                 mbedtls_poly1305_update( &ctx, NULL, src_len ) );

    TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA,
                 mbedtls_poly1305_finish( NULL, mac ) );
    TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA,
                 mbedtls_poly1305_finish( &ctx, NULL ) );

    TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA,
                 mbedtls_poly1305_mac( NULL, src, 0, mac ) );
    TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA,
                 mbedtls_poly1305_mac( key, NULL, src_len, mac ) );
    TEST_INVALID_PARAM_RET( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA,
                 mbedtls_poly1305_mac( key, src, 0, NULL ) );

exit:
    return;
}
/* END_CASE */

/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
void poly1305_selftest()
{
    TEST_ASSERT( mbedtls_poly1305_self_test( 1 ) == 0 );
}
/* END_CASE */