blob: 95dfd8a910ff3d9a72c2907d9e077bd953f7e149 [file] [log] [blame]
Daniel Kingb8025c52016-05-17 14:43:01 -03001/* BEGIN_HEADER */
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +02002#include "mbedtls/chachapoly.h"
Daniel Kingb8025c52016-05-17 14:43:01 -03003/* END_HEADER */
4
5/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +02006 * depends_on:MBEDTLS_CHACHAPOLY_C
Daniel Kingb8025c52016-05-17 14:43:01 -03007 * END_DEPENDENCIES
8 */
9
10/* BEGIN_CASE */
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +020011void mbedtls_chachapoly_enc( char *hex_key_string, char *hex_nonce_string, char *hex_aad_string, char *hex_input_string, char *hex_output_string, char *hex_mac_string )
Daniel Kingb8025c52016-05-17 14:43:01 -030012{
Manuel Pégourié-Gonnard528524b2018-05-09 11:21:21 +020013 unsigned char key_str[32]; /* size set by the standard */
14 unsigned char nonce_str[12]; /* size set by the standard */
15 unsigned char aad_str[12]; /* max size of test data so far */
16 unsigned char input_str[265]; /* max size of binary input/output so far */
17 unsigned char output_str[265];
18 unsigned char output[265];
19 unsigned char mac_str[16]; /* size set by the standard */
20 unsigned char mac[16]; /* size set by the standard */
Daniel Kingb8025c52016-05-17 14:43:01 -030021 size_t input_len;
22 size_t output_len;
23 size_t aad_len;
24 size_t key_len;
25 size_t nonce_len;
26 size_t mac_len;
Manuel Pégourié-Gonnard346b8d52018-05-07 12:56:36 +020027 mbedtls_chachapoly_context ctx;
Daniel Kingb8025c52016-05-17 14:43:01 -030028
Manuel Pégourié-Gonnard528524b2018-05-09 11:21:21 +020029 memset( key_str, 0x00, sizeof( key_str ) );
30 memset( nonce_str, 0x00, sizeof( nonce_str ) );
31 memset( aad_str, 0x00, sizeof( aad_str ) );
32 memset( input_str, 0x00, sizeof( input_str ) );
33 memset( output_str, 0x00, sizeof( output_str ) );
34 memset( mac_str, 0x00, sizeof( mac_str ) );
Daniel Kingb8025c52016-05-17 14:43:01 -030035
36 aad_len = unhexify( aad_str, hex_aad_string );
37 input_len = unhexify( input_str, hex_input_string );
38 output_len = unhexify( output_str, hex_output_string );
39 key_len = unhexify( key_str, hex_key_string );
40 nonce_len = unhexify( nonce_str, hex_nonce_string );
41 mac_len = unhexify( mac_str, hex_mac_string );
42
43 TEST_ASSERT( key_len == 32 );
44 TEST_ASSERT( nonce_len == 12 );
45 TEST_ASSERT( mac_len == 16 );
46
Manuel Pégourié-Gonnard346b8d52018-05-07 12:56:36 +020047 mbedtls_chachapoly_init( &ctx );
48
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +020049 TEST_ASSERT( mbedtls_chachapoly_setkey( &ctx, key_str ) == 0 );
Manuel Pégourié-Gonnard346b8d52018-05-07 12:56:36 +020050
Manuel Pégourié-Gonnard3dc62a02018-06-04 12:18:19 +020051 TEST_ASSERT( mbedtls_chachapoly_encrypt_and_tag( &ctx,
Manuel Pégourié-Gonnard346b8d52018-05-07 12:56:36 +020052 input_len, nonce_str,
53 aad_str, aad_len,
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +020054 input_str, output, mac ) == 0 );
Daniel Kingb8025c52016-05-17 14:43:01 -030055
56 TEST_ASSERT( memcmp( output_str, output, output_len ) == 0 );
57 TEST_ASSERT( memcmp( mac_str, mac, 16U ) == 0 );
Manuel Pégourié-Gonnard346b8d52018-05-07 12:56:36 +020058
59exit:
60 mbedtls_chachapoly_free( &ctx );
Daniel Kingb8025c52016-05-17 14:43:01 -030061}
62/* END_CASE */
63
64/* BEGIN_CASE */
Manuel Pégourié-Gonnard72967712018-05-09 12:22:13 +020065void mbedtls_chachapoly_dec( char *hex_key_string, char *hex_nonce_string, char *hex_aad_string, char *hex_input_string, char *hex_output_string, char *hex_mac_string, int ret_exp )
Daniel Kingb8025c52016-05-17 14:43:01 -030066{
Manuel Pégourié-Gonnard528524b2018-05-09 11:21:21 +020067 unsigned char key_str[32]; /* size set by the standard */
68 unsigned char nonce_str[12]; /* size set by the standard */
69 unsigned char aad_str[12]; /* max size of test data so far */
70 unsigned char input_str[265]; /* max size of binary input/output so far */
71 unsigned char output_str[265];
72 unsigned char output[265];
73 unsigned char mac_str[16]; /* size set by the standard */
Daniel Kingb8025c52016-05-17 14:43:01 -030074 size_t input_len;
75 size_t output_len;
76 size_t aad_len;
77 size_t key_len;
78 size_t nonce_len;
79 size_t mac_len;
Manuel Pégourié-Gonnard346b8d52018-05-07 12:56:36 +020080 int ret;
81 mbedtls_chachapoly_context ctx;
Daniel Kingb8025c52016-05-17 14:43:01 -030082
Manuel Pégourié-Gonnard528524b2018-05-09 11:21:21 +020083 memset( key_str, 0x00, sizeof( key_str ) );
84 memset( nonce_str, 0x00, sizeof( nonce_str ) );
85 memset( aad_str, 0x00, sizeof( aad_str ) );
86 memset( input_str, 0x00, sizeof( input_str ) );
87 memset( output_str, 0x00, sizeof( output_str ) );
88 memset( mac_str, 0x00, sizeof( mac_str ) );
Daniel Kingb8025c52016-05-17 14:43:01 -030089
90 aad_len = unhexify( aad_str, hex_aad_string );
91 input_len = unhexify( input_str, hex_input_string );
92 output_len = unhexify( output_str, hex_output_string );
93 key_len = unhexify( key_str, hex_key_string );
94 nonce_len = unhexify( nonce_str, hex_nonce_string );
95 mac_len = unhexify( mac_str, hex_mac_string );
96
97 TEST_ASSERT( key_len == 32 );
98 TEST_ASSERT( nonce_len == 12 );
99 TEST_ASSERT( mac_len == 16 );
100
Manuel Pégourié-Gonnard346b8d52018-05-07 12:56:36 +0200101 mbedtls_chachapoly_init( &ctx );
Daniel Kingb8025c52016-05-17 14:43:01 -0300102
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +0200103 TEST_ASSERT( mbedtls_chachapoly_setkey( &ctx, key_str ) == 0 );
Manuel Pégourié-Gonnard346b8d52018-05-07 12:56:36 +0200104
105 ret = mbedtls_chachapoly_auth_decrypt( &ctx,
106 input_len, nonce_str,
107 aad_str, aad_len,
108 mac_str, input_str, output );
109
Manuel Pégourié-Gonnard72967712018-05-09 12:22:13 +0200110 TEST_ASSERT( ret == ret_exp );
111 if( ret_exp == 0 )
112 {
113 TEST_ASSERT( memcmp( output_str, output, output_len ) == 0 );
114 }
Manuel Pégourié-Gonnard346b8d52018-05-07 12:56:36 +0200115
116exit:
117 mbedtls_chachapoly_free( &ctx );
Daniel Kingb8025c52016-05-17 14:43:01 -0300118}
119/* END_CASE */
120
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +0200121/* BEGIN_CASE */
122void chachapoly_bad_params()
123{
124 unsigned char key[32];
125 unsigned char nonce[12];
126 unsigned char aad[1];
127 unsigned char input[1];
128 unsigned char output[1];
129 unsigned char mac[16];
130 size_t input_len = sizeof( input );
131 size_t aad_len = sizeof( aad );
132 mbedtls_chachapoly_context ctx;
133
134 memset( key, 0x00, sizeof( key ) );
135 memset( nonce, 0x00, sizeof( nonce ) );
136 memset( aad, 0x00, sizeof( aad ) );
137 memset( input, 0x00, sizeof( input ) );
138 memset( output, 0x00, sizeof( output ) );
139 memset( mac, 0x00, sizeof( mac ) );
140
141 mbedtls_chachapoly_init( NULL );
142 mbedtls_chachapoly_free( NULL );
143
144 mbedtls_chachapoly_init( &ctx );
145
146 TEST_ASSERT( mbedtls_chachapoly_setkey( NULL, key )
Manuel Pégourié-Gonnard3798b6b2018-05-24 13:27:45 +0200147 == MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +0200148 TEST_ASSERT( mbedtls_chachapoly_setkey( &ctx, NULL )
Manuel Pégourié-Gonnard3798b6b2018-05-24 13:27:45 +0200149 == MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +0200150
Manuel Pégourié-Gonnard3dc62a02018-06-04 12:18:19 +0200151 TEST_ASSERT( mbedtls_chachapoly_encrypt_and_tag( NULL,
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +0200152 0, nonce,
153 aad, 0,
154 input, output, mac )
Manuel Pégourié-Gonnard3798b6b2018-05-24 13:27:45 +0200155 == MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard3dc62a02018-06-04 12:18:19 +0200156 TEST_ASSERT( mbedtls_chachapoly_encrypt_and_tag( &ctx,
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +0200157 0, NULL,
158 aad, 0,
159 input, output, mac )
Manuel Pégourié-Gonnard3798b6b2018-05-24 13:27:45 +0200160 == MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard3dc62a02018-06-04 12:18:19 +0200161 TEST_ASSERT( mbedtls_chachapoly_encrypt_and_tag( &ctx,
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +0200162 0, nonce,
163 NULL, aad_len,
164 input, output, mac )
Manuel Pégourié-Gonnard3798b6b2018-05-24 13:27:45 +0200165 == MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard3dc62a02018-06-04 12:18:19 +0200166 TEST_ASSERT( mbedtls_chachapoly_encrypt_and_tag( &ctx,
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +0200167 input_len, nonce,
168 aad, 0,
169 NULL, output, mac )
Manuel Pégourié-Gonnard3798b6b2018-05-24 13:27:45 +0200170 == MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard3dc62a02018-06-04 12:18:19 +0200171 TEST_ASSERT( mbedtls_chachapoly_encrypt_and_tag( &ctx,
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +0200172 input_len, nonce,
173 aad, 0,
174 input, NULL, mac )
Manuel Pégourié-Gonnard3798b6b2018-05-24 13:27:45 +0200175 == MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard3dc62a02018-06-04 12:18:19 +0200176 TEST_ASSERT( mbedtls_chachapoly_encrypt_and_tag( &ctx,
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +0200177 0, nonce,
178 aad, 0,
179 input, output, NULL )
Manuel Pégourié-Gonnard3798b6b2018-05-24 13:27:45 +0200180 == MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +0200181
182 TEST_ASSERT( mbedtls_chachapoly_auth_decrypt( NULL,
183 0, nonce,
184 aad, 0,
185 mac, input, output )
Manuel Pégourié-Gonnard3798b6b2018-05-24 13:27:45 +0200186 == MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +0200187 TEST_ASSERT( mbedtls_chachapoly_auth_decrypt( &ctx,
188 0, NULL,
189 aad, 0,
190 mac, input, output )
Manuel Pégourié-Gonnard3798b6b2018-05-24 13:27:45 +0200191 == MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +0200192 TEST_ASSERT( mbedtls_chachapoly_auth_decrypt( &ctx,
193 0, nonce,
194 NULL, aad_len,
195 mac, input, output )
Manuel Pégourié-Gonnard3798b6b2018-05-24 13:27:45 +0200196 == MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +0200197 TEST_ASSERT( mbedtls_chachapoly_auth_decrypt( &ctx,
198 0, nonce,
199 aad, 0,
200 NULL, input, output )
Manuel Pégourié-Gonnard3798b6b2018-05-24 13:27:45 +0200201 == MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +0200202 TEST_ASSERT( mbedtls_chachapoly_auth_decrypt( &ctx,
203 input_len, nonce,
204 aad, 0,
205 mac, NULL, output )
Manuel Pégourié-Gonnard3798b6b2018-05-24 13:27:45 +0200206 == MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +0200207 TEST_ASSERT( mbedtls_chachapoly_auth_decrypt( &ctx,
208 input_len, nonce,
209 aad, 0,
210 mac, input, NULL )
Manuel Pégourié-Gonnard3798b6b2018-05-24 13:27:45 +0200211 == MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +0200212
Manuel Pégourié-Gonnard3dc62a02018-06-04 12:18:19 +0200213 TEST_ASSERT( mbedtls_chachapoly_encrypt_and_tag( &ctx,
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +0200214 0, nonce,
215 aad, aad_len,
216 NULL, NULL, mac )
217 == 0 );
218 TEST_ASSERT( mbedtls_chachapoly_auth_decrypt( &ctx,
219 0, nonce,
220 aad, aad_len,
221 mac, NULL, NULL )
222 == 0 );
223
Manuel Pégourié-Gonnard3dc62a02018-06-04 12:18:19 +0200224 TEST_ASSERT( mbedtls_chachapoly_encrypt_and_tag( &ctx,
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +0200225 input_len, nonce,
226 NULL, 0,
227 input, output, mac )
228 == 0 );
229 TEST_ASSERT( mbedtls_chachapoly_auth_decrypt( &ctx,
230 input_len, nonce,
231 NULL, 0,
232 mac, input, output )
233 == 0 );
234
235 TEST_ASSERT( mbedtls_chachapoly_starts( NULL, nonce, MBEDTLS_CHACHAPOLY_ENCRYPT )
Manuel Pégourié-Gonnard3798b6b2018-05-24 13:27:45 +0200236 == MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +0200237 TEST_ASSERT( mbedtls_chachapoly_starts( &ctx, NULL, MBEDTLS_CHACHAPOLY_ENCRYPT )
Manuel Pégourié-Gonnard3798b6b2018-05-24 13:27:45 +0200238 == MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +0200239
240 TEST_ASSERT( mbedtls_chachapoly_update_aad( NULL, aad, aad_len )
Manuel Pégourié-Gonnard3798b6b2018-05-24 13:27:45 +0200241 == MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +0200242 TEST_ASSERT( mbedtls_chachapoly_update_aad( &ctx, NULL, aad_len )
Manuel Pégourié-Gonnard3798b6b2018-05-24 13:27:45 +0200243 == MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +0200244
245 TEST_ASSERT( mbedtls_chachapoly_update( NULL, input_len, input, output )
Manuel Pégourié-Gonnard3798b6b2018-05-24 13:27:45 +0200246 == MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +0200247 TEST_ASSERT( mbedtls_chachapoly_update( &ctx, input_len, NULL, output )
Manuel Pégourié-Gonnard3798b6b2018-05-24 13:27:45 +0200248 == MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +0200249 TEST_ASSERT( mbedtls_chachapoly_update( &ctx, input_len, input, NULL )
Manuel Pégourié-Gonnard3798b6b2018-05-24 13:27:45 +0200250 == MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +0200251
252 TEST_ASSERT( mbedtls_chachapoly_finish( NULL, mac )
Manuel Pégourié-Gonnard3798b6b2018-05-24 13:27:45 +0200253 == MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +0200254 TEST_ASSERT( mbedtls_chachapoly_finish( &ctx, NULL )
Manuel Pégourié-Gonnard3798b6b2018-05-24 13:27:45 +0200255 == MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard59d2c302018-05-10 10:39:32 +0200256
257exit:
258 mbedtls_chachapoly_free( &ctx );
259}
260/* END_CASE */
261
Manuel Pégourié-Gonnardceb12252018-05-10 11:41:00 +0200262/* BEGIN_CASE */
263void chachapoly_state()
264{
265 unsigned char key[32];
266 unsigned char nonce[12];
267 unsigned char aad[1];
268 unsigned char input[1];
269 unsigned char output[1];
270 unsigned char mac[16];
271 size_t input_len = sizeof( input );
272 size_t aad_len = sizeof( aad );
273 mbedtls_chachapoly_context ctx;
274
275 memset( key, 0x00, sizeof( key ) );
276 memset( nonce, 0x00, sizeof( nonce ) );
277 memset( aad, 0x00, sizeof( aad ) );
278 memset( input, 0x00, sizeof( input ) );
279 memset( output, 0x00, sizeof( output ) );
280 memset( mac, 0x00, sizeof( mac ) );
281
282 /* Initial state: finish, update, update_aad forbidden */
283 mbedtls_chachapoly_init( &ctx );
284
285 TEST_ASSERT( mbedtls_chachapoly_finish( &ctx, mac )
286 == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE );
287 TEST_ASSERT( mbedtls_chachapoly_update( &ctx, input_len, input, output )
288 == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE );
289 TEST_ASSERT( mbedtls_chachapoly_update_aad( &ctx, aad, aad_len )
290 == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE );
291
292 /* Still initial state: finish, update, update_aad forbidden */
293 TEST_ASSERT( mbedtls_chachapoly_setkey( &ctx, key )
294 == 0 );
295
296 TEST_ASSERT( mbedtls_chachapoly_finish( &ctx, mac )
297 == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE );
298 TEST_ASSERT( mbedtls_chachapoly_update( &ctx, input_len, input, output )
299 == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE );
300 TEST_ASSERT( mbedtls_chachapoly_update_aad( &ctx, aad, aad_len )
301 == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE );
302
303 /* Starts -> finish OK */
304 TEST_ASSERT( mbedtls_chachapoly_starts( &ctx, nonce, MBEDTLS_CHACHAPOLY_ENCRYPT )
305 == 0 );
306 TEST_ASSERT( mbedtls_chachapoly_finish( &ctx, mac )
307 == 0 );
308
309 /* After finish: update, update_aad forbidden */
310 TEST_ASSERT( mbedtls_chachapoly_update( &ctx, input_len, input, output )
311 == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE );
312 TEST_ASSERT( mbedtls_chachapoly_update_aad( &ctx, aad, aad_len )
313 == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE );
314
315 /* Starts -> update* OK */
316 TEST_ASSERT( mbedtls_chachapoly_starts( &ctx, nonce, MBEDTLS_CHACHAPOLY_ENCRYPT )
317 == 0 );
318 TEST_ASSERT( mbedtls_chachapoly_update( &ctx, input_len, input, output )
319 == 0 );
320 TEST_ASSERT( mbedtls_chachapoly_update( &ctx, input_len, input, output )
321 == 0 );
322
323 /* After update: update_aad forbidden */
324 TEST_ASSERT( mbedtls_chachapoly_update_aad( &ctx, aad, aad_len )
325 == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE );
326
327 /* Starts -> update_aad* -> finish OK */
328 TEST_ASSERT( mbedtls_chachapoly_starts( &ctx, nonce, MBEDTLS_CHACHAPOLY_ENCRYPT )
329 == 0 );
330 TEST_ASSERT( mbedtls_chachapoly_update_aad( &ctx, aad, aad_len )
331 == 0 );
332 TEST_ASSERT( mbedtls_chachapoly_update_aad( &ctx, aad, aad_len )
333 == 0 );
334 TEST_ASSERT( mbedtls_chachapoly_finish( &ctx, mac )
335 == 0 );
336
337exit:
338 mbedtls_chachapoly_free( &ctx );
339}
340/* END_CASE */
341
Daniel Kingb8025c52016-05-17 14:43:01 -0300342/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200343void chachapoly_selftest()
Daniel Kingb8025c52016-05-17 14:43:01 -0300344{
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200345 TEST_ASSERT( mbedtls_chachapoly_self_test( 1 ) == 0 );
Daniel Kingb8025c52016-05-17 14:43:01 -0300346}
347/* END_CASE */