blob: 2bf787a87fa2025dcbd6a2471af16aa75bf7cfbe [file] [log] [blame]
Hanno Becker09d880a2021-01-12 07:43:30 +00001/* BEGIN_HEADER */
2
3#include <stdlib.h>
4
5/* TODO: How are test suites supposed to include internal headers? */
Hanno Beckerc518c3b2021-01-28 07:08:08 +00006#include "../library/mps_reader.h"
Hanno Becker09d880a2021-01-12 07:43:30 +00007
8/*
9 * Compile-time configuration for test suite.
10 */
11
12/* Comment/Uncomment this to disable/enable the
13 * testing of the various MPS layers.
14 * This can be useful for time-consuming instrumentation
15 * tasks such as the conversion of E-ACSL annotations
16 * into runtime assertions. */
17#define TEST_SUITE_MPS_READER
18
19/* End of compile-time configuration. */
20
21/* END_HEADER */
22
23/* BEGIN_CASE depends_on:TEST_SUITE_MPS_READER */
24void mbedtls_mps_reader_no_pausing_single_step_single_round( int with_acc )
25{
26 /* This test exercises the most basic use of the MPS reader:
27 * - The 'producing' layer provides a buffer
28 * - The 'consuming' layer fetches it in a single go.
29 * - After processing, the consuming layer commit the data
30 * and returns back to the producing layer.
31 *
32 * Parameters:
33 * - with_acc: 0 if the reader should be initialized without accumulator.
34 * 1 if the reader should be initialized with accumulator.
35 *
36 * Whether the accumulator is present or not should not matter,
37 * since the consumer's request can be fulfilled from the data
38 * that the producer has provided.
39 */
40 unsigned char bufA[100];
41 unsigned char acc[10];
42 unsigned char *tmp;
Hanno Becker88993962021-01-28 09:45:47 +000043 mbedtls_mps_reader rd;
Hanno Becker09d880a2021-01-12 07:43:30 +000044 for( int i=0; (unsigned) i < sizeof( bufA ); i++ )
45 bufA[i] = (unsigned char) i;
46
47 /* Preparation (lower layer) */
48 if( with_acc == 0 )
Hanno Becker88993962021-01-28 09:45:47 +000049 mbedtls_mps_reader_init( &rd, NULL, 0 );
Hanno Becker09d880a2021-01-12 07:43:30 +000050 else
Hanno Becker88993962021-01-28 09:45:47 +000051 mbedtls_mps_reader_init( &rd, acc, sizeof( acc ) );
52 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufA, sizeof( bufA ) ) == 0 );
Hanno Becker09d880a2021-01-12 07:43:30 +000053 /* Consumption (upper layer) */
54 /* Consume exactly what's available */
Hanno Becker88993962021-01-28 09:45:47 +000055 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 100, &tmp, NULL ) == 0 );
Hanno Becker09d880a2021-01-12 07:43:30 +000056 ASSERT_COMPARE( tmp, 100, bufA, 100 );
Hanno Becker88993962021-01-28 09:45:47 +000057 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Becker09d880a2021-01-12 07:43:30 +000058 /* Wrapup (lower layer) */
Hanno Becker88993962021-01-28 09:45:47 +000059 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
60 mbedtls_mps_reader_free( &rd );
Hanno Becker09d880a2021-01-12 07:43:30 +000061}
62/* END_CASE */
Hanno Becker0e4edfc2021-01-12 07:52:29 +000063
64/* BEGIN_CASE depends_on:TEST_SUITE_MPS_READER */
65void mbedtls_mps_reader_no_pausing_single_step_multiple_rounds( int with_acc )
66{
67 /* This test exercises multiple rounds o fthe basic use of the MPS reader:
68 * - The 'producing' layer provides a buffer
69 * - The 'consuming' layer fetches it in a single go.
70 * - After processing, the consuming layer commit the data
71 * and returns back to the producing layer.
72 *
73 * Parameters:
74 * - with_acc: 0 if the reader should be initialized without accumulator.
75 * 1 if the reader should be initialized with accumulator.
76 *
77 * Whether the accumulator is present or not should not matter,
78 * since the consumer's request can be fulfilled from the data
79 * that the producer has provided.
80 */
81
82 unsigned char bufA[100], bufB[100];
83 unsigned char acc[10];
84 unsigned char *tmp;
Hanno Becker88993962021-01-28 09:45:47 +000085 mbedtls_mps_reader rd;
Hanno Becker0e4edfc2021-01-12 07:52:29 +000086 for( int i=0; (unsigned) i < sizeof( bufA ); i++ )
87 bufA[i] = (unsigned char) i;
88 for( int i=0; (unsigned) i < sizeof( bufB ); i++ )
89 bufB[i] = ~ ((unsigned char) i);
90
91 /* Preparation (lower layer) */
92 if( with_acc == 0 )
Hanno Becker88993962021-01-28 09:45:47 +000093 mbedtls_mps_reader_init( &rd, NULL, 0 );
Hanno Becker0e4edfc2021-01-12 07:52:29 +000094 else
Hanno Becker88993962021-01-28 09:45:47 +000095 mbedtls_mps_reader_init( &rd, acc, sizeof( acc ) );
96 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufA, sizeof( bufA ) ) == 0 );
Hanno Becker0e4edfc2021-01-12 07:52:29 +000097 /* Consumption (upper layer) */
98 /* Consume exactly what's available */
Hanno Becker88993962021-01-28 09:45:47 +000099 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 100, &tmp, NULL ) == 0 );
Hanno Becker0e4edfc2021-01-12 07:52:29 +0000100 ASSERT_COMPARE( tmp, 100, bufA, 100 );
Hanno Becker88993962021-01-28 09:45:47 +0000101 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Becker0e4edfc2021-01-12 07:52:29 +0000102 /* Preparation */
Hanno Becker88993962021-01-28 09:45:47 +0000103 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
104 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufB, sizeof( bufB ) ) == 0 );
Hanno Becker0e4edfc2021-01-12 07:52:29 +0000105 /* Consumption */
Hanno Becker88993962021-01-28 09:45:47 +0000106 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 100, &tmp, NULL ) == 0 );
Hanno Becker0e4edfc2021-01-12 07:52:29 +0000107 ASSERT_COMPARE( tmp, 100, bufB, 100 );
Hanno Becker88993962021-01-28 09:45:47 +0000108 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Becker0e4edfc2021-01-12 07:52:29 +0000109 /* Wrapup (lower layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000110 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
111 mbedtls_mps_reader_free( &rd );
Hanno Becker0e4edfc2021-01-12 07:52:29 +0000112}
113/* END_CASE */
Hanno Beckerdbd8a962021-01-12 08:01:16 +0000114
115/* BEGIN_CASE depends_on:TEST_SUITE_MPS_READER */
116void mbedtls_mps_reader_no_pausing_multiple_steps_single_round( int with_acc )
117{
118 /* This test exercises one round of the following:
119 * - The 'producing' layer provides a buffer
120 * - The 'consuming' layer fetches it in multiple calls
Hanno Becker88993962021-01-28 09:45:47 +0000121 * to `mbedtls_mps_reader_get()`, without comitting in between.
Hanno Beckerdbd8a962021-01-12 08:01:16 +0000122 * - After processing, the consuming layer commit the data
123 * and returns back to the producing layer.
124 *
125 * Parameters:
126 * - with_acc: 0 if the reader should be initialized without accumulator.
127 * 1 if the reader should be initialized with accumulator.
128 *
129 * Whether the accumulator is present or not should not matter,
130 * since the consumer's request can be fulfilled from the data
131 * that the producer has provided.
132 */
133
134 /* Lower layer provides data that the upper layer fully consumes
135 * through multiple `get` calls. */
136 unsigned char buf[100];
137 unsigned char acc[10];
138 unsigned char *tmp;
139 mbedtls_mps_size_t tmp_len;
Hanno Becker88993962021-01-28 09:45:47 +0000140 mbedtls_mps_reader rd;
Hanno Beckerdbd8a962021-01-12 08:01:16 +0000141 for( int i=0; (unsigned) i < sizeof( buf ); i++ )
142 buf[i] = (unsigned char) i;
143
144 /* Preparation (lower layer) */
145 if( with_acc == 0 )
Hanno Becker88993962021-01-28 09:45:47 +0000146 mbedtls_mps_reader_init( &rd, NULL, 0 );
Hanno Beckerdbd8a962021-01-12 08:01:16 +0000147 else
Hanno Becker88993962021-01-28 09:45:47 +0000148 mbedtls_mps_reader_init( &rd, acc, sizeof( acc ) );
149 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, buf, sizeof( buf ) ) == 0 );
Hanno Beckerdbd8a962021-01-12 08:01:16 +0000150 /* Consumption (upper layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000151 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, NULL ) == 0 );
Hanno Beckerdbd8a962021-01-12 08:01:16 +0000152 ASSERT_COMPARE( tmp, 10, buf, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000153 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 70, &tmp, NULL ) == 0 );
Hanno Beckerdbd8a962021-01-12 08:01:16 +0000154 ASSERT_COMPARE( tmp, 70, buf + 10, 70 );
Hanno Becker88993962021-01-28 09:45:47 +0000155 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 30, &tmp, &tmp_len ) == 0 );
Hanno Beckerdbd8a962021-01-12 08:01:16 +0000156 ASSERT_COMPARE( tmp, tmp_len, buf + 80, 20 );
Hanno Becker88993962021-01-28 09:45:47 +0000157 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Beckerdbd8a962021-01-12 08:01:16 +0000158 /* Wrapup (lower layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000159 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
160 mbedtls_mps_reader_free( &rd );
Hanno Beckerdbd8a962021-01-12 08:01:16 +0000161}
162/* END_CASE */
Hanno Becker7973b2d2021-01-12 08:11:40 +0000163
164/* BEGIN_CASE depends_on:TEST_SUITE_MPS_READER */
165void mbedtls_mps_reader_no_pausing_multiple_steps_multiple_rounds( int with_acc )
166{
167 /* This test exercises one round of fetching a buffer in multiple chunks
168 * and passing it back to the producer afterwards, followed by another
169 * single-step sequence of feed-fetch-commit-reclaim.
170 */
171 unsigned char bufA[100], bufB[100];
172 unsigned char acc[10];
173 unsigned char *tmp;
174 mbedtls_mps_size_t tmp_len;
Hanno Becker88993962021-01-28 09:45:47 +0000175 mbedtls_mps_reader rd;
Hanno Becker7973b2d2021-01-12 08:11:40 +0000176 for( int i=0; (unsigned) i < sizeof( bufA ); i++ )
177 bufA[i] = (unsigned char) i;
178 for( int i=0; (unsigned) i < sizeof( bufB ); i++ )
179 bufB[i] = ~ ((unsigned char) i);
180
181 /* Preparation (lower layer) */
182 if( with_acc == 0 )
Hanno Becker88993962021-01-28 09:45:47 +0000183 mbedtls_mps_reader_init( &rd, NULL, 0 );
Hanno Becker7973b2d2021-01-12 08:11:40 +0000184 else
Hanno Becker88993962021-01-28 09:45:47 +0000185 mbedtls_mps_reader_init( &rd, acc, sizeof( acc ) );
186 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufA, sizeof( bufA ) ) == 0 );
Hanno Becker7973b2d2021-01-12 08:11:40 +0000187 /* Consumption (upper layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000188 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, NULL ) == 0 );
Hanno Becker7973b2d2021-01-12 08:11:40 +0000189 ASSERT_COMPARE( tmp, 10, bufA, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000190 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 70, &tmp, NULL ) == 0 );
Hanno Becker7973b2d2021-01-12 08:11:40 +0000191 ASSERT_COMPARE( tmp, 70, bufA + 10, 70 );
Hanno Becker88993962021-01-28 09:45:47 +0000192 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 30, &tmp, &tmp_len ) == 0 );
Hanno Becker7973b2d2021-01-12 08:11:40 +0000193 ASSERT_COMPARE( tmp, tmp_len, bufA + 80, 20 );
Hanno Becker88993962021-01-28 09:45:47 +0000194 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Becker7973b2d2021-01-12 08:11:40 +0000195 /* Preparation */
Hanno Becker88993962021-01-28 09:45:47 +0000196 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
197 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufB, sizeof( bufB ) ) == 0 );
Hanno Becker7973b2d2021-01-12 08:11:40 +0000198 /* Consumption */
Hanno Becker88993962021-01-28 09:45:47 +0000199 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 100, &tmp, NULL ) == 0 );
Hanno Becker7973b2d2021-01-12 08:11:40 +0000200 ASSERT_COMPARE( tmp, 100, bufB, 100 );
Hanno Becker88993962021-01-28 09:45:47 +0000201 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Becker7973b2d2021-01-12 08:11:40 +0000202 /* Wrapup */
Hanno Becker88993962021-01-28 09:45:47 +0000203 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
204 mbedtls_mps_reader_free( &rd );
Hanno Becker7973b2d2021-01-12 08:11:40 +0000205}
206/* END_CASE */
Hanno Becker7d86b742021-01-12 08:14:38 +0000207
208/* BEGIN_CASE depends_on:TEST_SUITE_MPS_READER */
209void mbedtls_mps_reader_pausing_needed_disabled()
210{
211 /* This test exercises the behaviour of the MPS reader when a read requests
212 * of the consumer exceeds what has been provided by the producer, and when
213 * no accumulator is available in the reader.
214 *
215 * In this case, we expect the reader to fail.
216 */
217
218 unsigned char buf[100];
219 unsigned char *tmp;
Hanno Becker88993962021-01-28 09:45:47 +0000220 mbedtls_mps_reader rd;
Hanno Becker7d86b742021-01-12 08:14:38 +0000221 for( int i=0; (unsigned) i < sizeof( buf ); i++ )
222 buf[i] = (unsigned char) i;
223
224 /* Preparation (lower layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000225 mbedtls_mps_reader_init( &rd, NULL, 0 );
226 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, buf, sizeof( buf ) ) == 0 );
Hanno Becker7d86b742021-01-12 08:14:38 +0000227 /* Consumption (upper layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000228 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 50, &tmp, NULL ) == 0 );
Hanno Becker7d86b742021-01-12 08:14:38 +0000229 ASSERT_COMPARE( tmp, 50, buf, 50 );
Hanno Becker88993962021-01-28 09:45:47 +0000230 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
231 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 100, &tmp, NULL ) ==
Hanno Becker7d86b742021-01-12 08:14:38 +0000232 MBEDTLS_ERR_MPS_READER_OUT_OF_DATA );
233 /* Wrapup (lower layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000234 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) ==
Hanno Becker7d86b742021-01-12 08:14:38 +0000235 MBEDTLS_ERR_MPS_READER_NEED_ACCUMULATOR );
Hanno Becker88993962021-01-28 09:45:47 +0000236 mbedtls_mps_reader_free( &rd );
Hanno Becker7d86b742021-01-12 08:14:38 +0000237}
238/* END_CASE */
Hanno Beckercaf1a3f2021-01-12 08:18:12 +0000239
240/* BEGIN_CASE depends_on:TEST_SUITE_MPS_READER */
241void mbedtls_mps_reader_pausing_needed_buffer_too_small()
242{
243 /* This test exercises the behaviour of the MPS reader with accumulator
244 * in the situation where a read requests goes beyond the bounds of the
245 * current read buffer, _and_ the reader's accumulator is too small to
246 * hold the requested amount of data.
247 *
248 * In this case, we expect the reader to fail. */
249
250 unsigned char buf[100];
251 unsigned char acc[10];
252 unsigned char *tmp;
Hanno Becker88993962021-01-28 09:45:47 +0000253 mbedtls_mps_reader rd;
Hanno Beckercaf1a3f2021-01-12 08:18:12 +0000254 for( int i=0; (unsigned) i < sizeof( buf ); i++ )
255 buf[i] = (unsigned char) i;
256
257 /* Preparation (lower layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000258 mbedtls_mps_reader_init( &rd, acc, sizeof( acc ) );
259 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, buf, sizeof( buf ) ) == 0 );
Hanno Beckercaf1a3f2021-01-12 08:18:12 +0000260 /* Consumption (upper layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000261 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 50, &tmp, NULL ) == 0 );
Hanno Beckercaf1a3f2021-01-12 08:18:12 +0000262 ASSERT_COMPARE( tmp, 50, buf, 50 );
Hanno Becker88993962021-01-28 09:45:47 +0000263 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
264 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 100, &tmp, NULL ) ==
Hanno Beckercaf1a3f2021-01-12 08:18:12 +0000265 MBEDTLS_ERR_MPS_READER_OUT_OF_DATA );
266 /* Wrapup (lower layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000267 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) ==
Hanno Beckercaf1a3f2021-01-12 08:18:12 +0000268 MBEDTLS_ERR_MPS_READER_ACCUMULATOR_TOO_SMALL );
Hanno Becker88993962021-01-28 09:45:47 +0000269 mbedtls_mps_reader_free( &rd );
Hanno Beckercaf1a3f2021-01-12 08:18:12 +0000270}
271/* END_CASE */
Hanno Beckere82952a2021-01-12 08:27:29 +0000272
273/* BEGIN_CASE depends_on:TEST_SUITE_MPS_READER */
274void mbedtls_mps_reader_pausing( int option )
275{
276 /* This test exercises the behaviour of the reader when the
277 * accumulator is used to fufill the consumer's request.
278 *
279 * More detailed:
280 * - The producer feeds some data.
281 * - The consumer asks for more data than what's available.
282 * - The reader remembers the request and goes back to
283 * producing mode, waiting for more data from the producer.
284 * - The producer provides another chunk of data which is
285 * sufficient to fulfill the original read request.
286 * - The consumer retries the original read request, which
287 * should now succeed.
288 *
289 * This test comes in multiple variants controlled by the
290 * `option` parameter and documented below.
291 */
292
293 unsigned char bufA[100], bufB[100];
294 unsigned char *tmp;
295 unsigned char acc[40];
Hanno Becker88993962021-01-28 09:45:47 +0000296 mbedtls_mps_reader rd;
Hanno Beckere82952a2021-01-12 08:27:29 +0000297 for( int i=0; (unsigned) i < sizeof( bufA ); i++ )
298 bufA[i] = (unsigned char) i;
299 for( int i=0; (unsigned) i < sizeof( bufB ); i++ )
300 bufB[i] = ~ ((unsigned char) i);
301
302 /* Preparation (lower layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000303 mbedtls_mps_reader_init( &rd, acc, sizeof( acc ) );
304 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufA, sizeof( bufA ) ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000305
306 /* Consumption (upper layer) */
307 /* Ask for more than what's available. */
Hanno Becker88993962021-01-28 09:45:47 +0000308 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 80, &tmp, NULL ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000309 ASSERT_COMPARE( tmp, 80, bufA, 80 );
Hanno Becker88993962021-01-28 09:45:47 +0000310 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
311 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, NULL ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000312 ASSERT_COMPARE( tmp, 10, bufA + 80, 10 );
313 switch( option )
314 {
315 case 0: /* Single uncommitted fetch at pausing */
316 case 1:
Hanno Becker88993962021-01-28 09:45:47 +0000317 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000318 break;
319 default: /* Multiple uncommitted fetches at pausing */
320 break;
321 }
Hanno Becker88993962021-01-28 09:45:47 +0000322 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) ==
Hanno Beckere82952a2021-01-12 08:27:29 +0000323 MBEDTLS_ERR_MPS_READER_OUT_OF_DATA );
324
325 /* Preparation */
Hanno Becker88993962021-01-28 09:45:47 +0000326 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
327 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufB, sizeof( bufB ) ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000328
329 /* Consumption */
330 switch( option )
331 {
332 case 0: /* Single fetch at pausing, re-fetch with commit. */
Hanno Becker88993962021-01-28 09:45:47 +0000333 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000334 ASSERT_COMPARE( tmp, 10, bufA + 90, 10 );
335 ASSERT_COMPARE( tmp + 10, 10, bufB, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000336 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000337 break;
338
339 case 1: /* Single fetch at pausing, re-fetch without commit. */
Hanno Becker88993962021-01-28 09:45:47 +0000340 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000341 ASSERT_COMPARE( tmp, 10, bufA + 90, 10 );
342 ASSERT_COMPARE( tmp + 10, 10, bufB, 10 );
343 break;
344
345 case 2: /* Multiple fetches at pausing, repeat without commit. */
Hanno Becker88993962021-01-28 09:45:47 +0000346 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, NULL ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000347 ASSERT_COMPARE( tmp, 10, bufA + 80, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000348 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000349 ASSERT_COMPARE( tmp, 10, bufA + 90, 10 );
350 ASSERT_COMPARE( tmp + 10, 10, bufB, 10 );
351 break;
352
353 case 3: /* Multiple fetches at pausing, repeat with commit 1. */
Hanno Becker88993962021-01-28 09:45:47 +0000354 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, NULL ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000355 ASSERT_COMPARE( tmp, 10, bufA + 80, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000356 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
357 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000358 ASSERT_COMPARE( tmp, 10, bufA + 90, 10 );
359 ASSERT_COMPARE( tmp + 10, 10, bufB, 10 );
360 break;
361
362 case 4: /* Multiple fetches at pausing, repeat with commit 2. */
Hanno Becker88993962021-01-28 09:45:47 +0000363 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, NULL ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000364 ASSERT_COMPARE( tmp, 10, bufA + 80, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000365 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000366 ASSERT_COMPARE( tmp, 10, bufA + 90, 10 );
367 ASSERT_COMPARE( tmp + 10, 10, bufB, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000368 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000369 break;
370
371 case 5: /* Multiple fetches at pausing, repeat with commit 3. */
Hanno Becker88993962021-01-28 09:45:47 +0000372 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, NULL ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000373 ASSERT_COMPARE( tmp, 10, bufA + 80, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000374 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
375 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000376 ASSERT_COMPARE( tmp, 10, bufA + 90, 10 );
377 ASSERT_COMPARE( tmp + 10, 10, bufB, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000378 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000379 break;
380
381 default:
382 TEST_ASSERT( 0 );
383 }
384
385 /* In all cases, fetch the rest of the second buffer. */
Hanno Becker88993962021-01-28 09:45:47 +0000386 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 90, &tmp, NULL ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000387 ASSERT_COMPARE( tmp, 90, bufB + 10, 90 );
Hanno Becker88993962021-01-28 09:45:47 +0000388 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000389
390 /* Wrapup */
Hanno Becker88993962021-01-28 09:45:47 +0000391 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
392 mbedtls_mps_reader_free( &rd );
Hanno Beckere82952a2021-01-12 08:27:29 +0000393}
394/* END_CASE */
Hanno Beckeraac41222021-01-12 08:36:36 +0000395
396/* BEGIN_CASE depends_on:TEST_SUITE_MPS_READER */
397void mbedtls_mps_reader_pausing_multiple_feeds( int option )
398{
399 /* This test exercises the behaviour of the MPS reader
400 * in the following situation:
401 * - The consumer has asked for mre than what's available, so the
402 * reader pauses and waits for further input data via
Hanno Becker88993962021-01-28 09:45:47 +0000403 * `mbedtls_mps_reader_feed()`
404 * - Multiple such calls to `mbedtls_mps_reader_feed()` are necessary
Hanno Beckeraac41222021-01-12 08:36:36 +0000405 * to fulfill the original request, and the reader needs to do
406 * the necessary bookkeeping under the hood.
407 *
408 * This test comes in a few variants differing in the number and
409 * size of feed calls that the producer issues while the reader is
410 * accumulating the necessary data - see the comments below.
411 */
412
413 unsigned char bufA[100], bufB[100];
414 unsigned char *tmp;
415 unsigned char acc[70];
Hanno Becker88993962021-01-28 09:45:47 +0000416 mbedtls_mps_reader rd;
Hanno Beckeraac41222021-01-12 08:36:36 +0000417 mbedtls_mps_size_t fetch_len;
418 for( int i=0; (unsigned) i < sizeof( bufA ); i++ )
419 bufA[i] = (unsigned char) i;
420 for( int i=0; (unsigned) i < sizeof( bufB ); i++ )
421 bufB[i] = ~ ((unsigned char) i);
422
423 /* Preparation (lower layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000424 mbedtls_mps_reader_init( &rd, acc, sizeof( acc ) );
425 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufA, sizeof( bufA ) ) == 0 );
Hanno Beckeraac41222021-01-12 08:36:36 +0000426
427 /* Consumption (upper layer) */
428 /* Ask for more than what's available. */
Hanno Becker88993962021-01-28 09:45:47 +0000429 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 80, &tmp, NULL ) == 0 );
Hanno Beckeraac41222021-01-12 08:36:36 +0000430 ASSERT_COMPARE( tmp, 80, bufA, 80 );
Hanno Becker88993962021-01-28 09:45:47 +0000431 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Beckeraac41222021-01-12 08:36:36 +0000432 /* 20 left, ask for 70 -> 50 overhead */
Hanno Becker88993962021-01-28 09:45:47 +0000433 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 70, &tmp, NULL ) ==
Hanno Beckeraac41222021-01-12 08:36:36 +0000434 MBEDTLS_ERR_MPS_READER_OUT_OF_DATA );
435
436 /* Preparation */
Hanno Becker88993962021-01-28 09:45:47 +0000437 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
Hanno Beckeraac41222021-01-12 08:36:36 +0000438 switch( option )
439 {
440 case 0: /* 10 + 10 + 80 byte feed */
Hanno Becker88993962021-01-28 09:45:47 +0000441 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufB, 10 ) ==
Hanno Beckeraac41222021-01-12 08:36:36 +0000442 MBEDTLS_ERR_MPS_READER_NEED_MORE );
Hanno Becker88993962021-01-28 09:45:47 +0000443 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufB + 10, 10 ) ==
Hanno Beckeraac41222021-01-12 08:36:36 +0000444 MBEDTLS_ERR_MPS_READER_NEED_MORE );
Hanno Becker88993962021-01-28 09:45:47 +0000445 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufB + 20, 80 ) == 0 );
Hanno Beckeraac41222021-01-12 08:36:36 +0000446 break;
447
448 case 1: /* 50 x 1byte */
449 for( int num_feed=0; num_feed<49; num_feed++ )
450 {
Hanno Becker88993962021-01-28 09:45:47 +0000451 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufB + num_feed, 1 ) ==
Hanno Beckeraac41222021-01-12 08:36:36 +0000452 MBEDTLS_ERR_MPS_READER_NEED_MORE );
453 }
Hanno Becker88993962021-01-28 09:45:47 +0000454 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufB + 49, 1 ) == 0 );
Hanno Beckeraac41222021-01-12 08:36:36 +0000455 break;
456
457 case 2: /* 49 x 1byte + 51bytes */
458 for( int num_feed=0; num_feed<49; num_feed++ )
459 {
Hanno Becker88993962021-01-28 09:45:47 +0000460 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufB + num_feed, 1 ) ==
Hanno Beckeraac41222021-01-12 08:36:36 +0000461 MBEDTLS_ERR_MPS_READER_NEED_MORE );
462 }
Hanno Becker88993962021-01-28 09:45:47 +0000463 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufB + 49, 51 ) == 0 );
Hanno Beckeraac41222021-01-12 08:36:36 +0000464 break;
465
466 default:
467 TEST_ASSERT( 0 );
468 break;
469 }
470
471 /* Consumption */
Hanno Becker88993962021-01-28 09:45:47 +0000472 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 70, &tmp, NULL ) == 0 );
Hanno Beckeraac41222021-01-12 08:36:36 +0000473 ASSERT_COMPARE( tmp, 20, bufA + 80, 20 );
474 ASSERT_COMPARE( tmp + 20, 50, bufB, 50 );
Hanno Becker88993962021-01-28 09:45:47 +0000475 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 1000, &tmp, &fetch_len ) == 0 );
Hanno Beckeraac41222021-01-12 08:36:36 +0000476 switch( option )
477 {
478 case 0:
479 TEST_ASSERT( fetch_len == 50 );
480 break;
481
482 case 1:
483 TEST_ASSERT( fetch_len == 0 );
484 break;
485
486 case 2:
487 TEST_ASSERT( fetch_len == 50 );
488 break;
489
490 default:
491 TEST_ASSERT( 0 );
492 break;
493 }
Hanno Becker88993962021-01-28 09:45:47 +0000494 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Beckeraac41222021-01-12 08:36:36 +0000495
496 /* Wrapup */
Hanno Becker88993962021-01-28 09:45:47 +0000497 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
498 mbedtls_mps_reader_free( &rd );
Hanno Beckeraac41222021-01-12 08:36:36 +0000499}
500/* END_CASE */
Hanno Beckercb2a88e2021-01-12 08:39:37 +0000501
502
503/* BEGIN_CASE depends_on:TEST_SUITE_MPS_READER */
504void mbedtls_mps_reader_reclaim_data_left( int option )
505{
506 /* This test exercises the behaviour of the MPS reader when a
Hanno Becker88993962021-01-28 09:45:47 +0000507 * call to mbedtls_mps_reader_reclaim() is made before all data
Hanno Beckercb2a88e2021-01-12 08:39:37 +0000508 * provided by the producer has been fetched and committed. */
509
510 unsigned char buf[100];
511 unsigned char *tmp;
Hanno Becker88993962021-01-28 09:45:47 +0000512 mbedtls_mps_reader rd;
Hanno Beckercb2a88e2021-01-12 08:39:37 +0000513 for( int i=0; (unsigned) i < sizeof( buf ); i++ )
514 buf[i] = (unsigned char) i;
515
516 /* Preparation (lower layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000517 mbedtls_mps_reader_init( &rd, NULL, 0 );
518 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, buf, sizeof( buf ) ) == 0 );
Hanno Beckercb2a88e2021-01-12 08:39:37 +0000519
520 /* Consumption (upper layer) */
521 switch( option )
522 {
523 case 0:
524 /* Fetch (but not commit) the entire buffer. */
Hanno Becker88993962021-01-28 09:45:47 +0000525 TEST_ASSERT( mbedtls_mps_reader_get( &rd, sizeof( buf ), &tmp, NULL )
Hanno Beckercb2a88e2021-01-12 08:39:37 +0000526 == 0 );
527 ASSERT_COMPARE( tmp, 100, buf, 100 );
528 break;
529
530 case 1:
531 /* Fetch (but not commit) parts of the buffer. */
Hanno Becker88993962021-01-28 09:45:47 +0000532 TEST_ASSERT( mbedtls_mps_reader_get( &rd, sizeof( buf ) / 2,
Hanno Beckercb2a88e2021-01-12 08:39:37 +0000533 &tmp, NULL ) == 0 );
534 ASSERT_COMPARE( tmp, sizeof( buf ) / 2, buf, sizeof( buf ) / 2 );
535 break;
536
537 case 2:
538 /* Fetch and commit parts of the buffer, then
539 * fetch but not commit the rest of the buffer. */
Hanno Becker88993962021-01-28 09:45:47 +0000540 TEST_ASSERT( mbedtls_mps_reader_get( &rd, sizeof( buf ) / 2,
Hanno Beckercb2a88e2021-01-12 08:39:37 +0000541 &tmp, NULL ) == 0 );
542 ASSERT_COMPARE( tmp, sizeof( buf ) / 2, buf, sizeof( buf ) / 2 );
Hanno Becker88993962021-01-28 09:45:47 +0000543 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
544 TEST_ASSERT( mbedtls_mps_reader_get( &rd, sizeof( buf ) / 2,
Hanno Beckercb2a88e2021-01-12 08:39:37 +0000545 &tmp, NULL ) == 0 );
546 ASSERT_COMPARE( tmp, sizeof( buf ) / 2,
547 buf + sizeof( buf ) / 2,
548 sizeof( buf ) / 2 );
549 break;
550
551 default:
552 TEST_ASSERT( 0 );
553 break;
554 }
555
556 /* Wrapup */
Hanno Becker88993962021-01-28 09:45:47 +0000557 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) ==
Hanno Beckercb2a88e2021-01-12 08:39:37 +0000558 MBEDTLS_ERR_MPS_READER_DATA_LEFT );
Hanno Becker88993962021-01-28 09:45:47 +0000559 mbedtls_mps_reader_free( &rd );
Hanno Beckercb2a88e2021-01-12 08:39:37 +0000560}
561/* END_CASE */
Hanno Beckere1f173c2021-01-12 08:43:58 +0000562
563/* BEGIN_CASE depends_on:TEST_SUITE_MPS_READER */
564void mbedtls_mps_reader_reclaim_data_left_retry()
565{
566 /* This test exercises the behaviour of the MPS reader when an attempt
567 * by the producer to reclaim the reader fails because of more data pending
568 * to be processed, and the consumer subsequently fetches more data. */
569 unsigned char buf[100];
570 unsigned char *tmp;
Hanno Becker88993962021-01-28 09:45:47 +0000571 mbedtls_mps_reader rd;
Hanno Beckere1f173c2021-01-12 08:43:58 +0000572
573 for( int i=0; (unsigned) i < sizeof( buf ); i++ )
574 buf[i] = (unsigned char) i;
575
576 /* Preparation (lower layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000577 mbedtls_mps_reader_init( &rd, NULL, 0 );
578 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, buf, sizeof( buf ) ) == 0 );
Hanno Beckere1f173c2021-01-12 08:43:58 +0000579 /* Consumption (upper layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000580 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 50, &tmp, NULL ) == 0 );
Hanno Beckere1f173c2021-01-12 08:43:58 +0000581 ASSERT_COMPARE( tmp, 50, buf, 50 );
Hanno Becker88993962021-01-28 09:45:47 +0000582 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
583 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 50, &tmp, NULL ) == 0 );
Hanno Beckere1f173c2021-01-12 08:43:58 +0000584 ASSERT_COMPARE( tmp, 50, buf + 50, 50 );
585 /* Preparation */
Hanno Becker88993962021-01-28 09:45:47 +0000586 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) ==
Hanno Beckere1f173c2021-01-12 08:43:58 +0000587 MBEDTLS_ERR_MPS_READER_DATA_LEFT );
588 /* Consumption */
Hanno Becker88993962021-01-28 09:45:47 +0000589 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 50, &tmp, NULL ) == 0 );
Hanno Beckere1f173c2021-01-12 08:43:58 +0000590 ASSERT_COMPARE( tmp, 50, buf + 50, 50 );
Hanno Becker88993962021-01-28 09:45:47 +0000591 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Beckere1f173c2021-01-12 08:43:58 +0000592 /* Wrapup */
Hanno Becker88993962021-01-28 09:45:47 +0000593 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
594 mbedtls_mps_reader_free( &rd );
Hanno Beckere1f173c2021-01-12 08:43:58 +0000595}
596/* END_CASE */
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000597
598/* BEGIN_CASE depends_on:TEST_SUITE_MPS_READER */
599void mbedtls_mps_reader_multiple_pausing( int option )
600{
601 /* This test exercises the behaviour of the MPS reader
602 * in the following situation:
Hanno Becker88993962021-01-28 09:45:47 +0000603 * - A read request via `mbedtls_mps_reader_get()` can't
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000604 * be served and the reader is paused to accumulate
605 * the desired amount of data from the producer.
606 * - Once enough data is availble, the consumer successfully
607 * reads the data from the reader, but afterwards exceeds
608 * the available data again - pausing is necessary for a
609 * second time.
610 */
611
612 unsigned char bufA[100], bufB[20], bufC[10];
613 unsigned char *tmp;
614 unsigned char acc[50];
615 mbedtls_mps_size_t tmp_len;
Hanno Becker88993962021-01-28 09:45:47 +0000616 mbedtls_mps_reader rd;
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000617 for( int i=0; (unsigned) i < sizeof( bufA ); i++ )
618 bufA[i] = (unsigned char) i;
619 for( int i=0; (unsigned) i < sizeof( bufB ); i++ )
620 bufB[i] = ~ ((unsigned char) i);
621 for( int i=0; (unsigned) i < sizeof( bufC ); i++ )
622 bufC[i] = ~ ((unsigned char) i);
623
624 /* Preparation (lower layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000625 mbedtls_mps_reader_init( &rd, acc, sizeof( acc ) );
626 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufA, sizeof( bufA ) ) == 0 );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000627
628 /* Consumption (upper layer) */
629 /* Ask for more than what's available. */
Hanno Becker88993962021-01-28 09:45:47 +0000630 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 80, &tmp, NULL ) == 0 );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000631 ASSERT_COMPARE( tmp, 80, bufA, 80 );
Hanno Becker88993962021-01-28 09:45:47 +0000632 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
633 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, NULL ) == 0 );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000634 ASSERT_COMPARE( tmp, 10, bufA + 80, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000635 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) ==
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000636 MBEDTLS_ERR_MPS_READER_OUT_OF_DATA );
637
638 /* Preparation */
Hanno Becker88993962021-01-28 09:45:47 +0000639 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
640 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufB, sizeof( bufB ) ) == 0 );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000641
642 switch( option )
643 {
644 case 0: /* Fetch same chunks, commit afterwards, and
645 * then exceed bounds of new buffer; accumulator
646 * large enough. */
647
648 /* Consume */
Hanno Becker88993962021-01-28 09:45:47 +0000649 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, &tmp_len ) == 0 );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000650 ASSERT_COMPARE( tmp, tmp_len, bufA + 80, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000651 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) == 0 );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000652 ASSERT_COMPARE( tmp, 10, bufA + 90, 10 );
653 ASSERT_COMPARE( tmp + 10, 10, bufB, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000654 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
655 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) ==
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000656 MBEDTLS_ERR_MPS_READER_OUT_OF_DATA );
657
658 /* Prepare */
Hanno Becker88993962021-01-28 09:45:47 +0000659 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
660 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufC, sizeof( bufC ) ) == 0 );;
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000661
662 /* Consume */
Hanno Becker88993962021-01-28 09:45:47 +0000663 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) == 0 );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000664 ASSERT_COMPARE( tmp, 10, bufB + 10, 10 );
665 ASSERT_COMPARE( tmp + 10, 10, bufC, 10 );
666 break;
667
668 case 1: /* Fetch same chunks, commit afterwards, and
669 * then exceed bounds of new buffer; accumulator
670 * not large enough. */
Hanno Becker88993962021-01-28 09:45:47 +0000671 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, NULL ) == 0 );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000672 ASSERT_COMPARE( tmp, 10, bufA + 80, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000673 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) == 0 );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000674 ASSERT_COMPARE( tmp, 10, bufA + 90, 10 );
675 ASSERT_COMPARE( tmp + 10, 10, bufB, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000676 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
677 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 51, &tmp, NULL ) ==
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000678 MBEDTLS_ERR_MPS_READER_OUT_OF_DATA );
679
680 /* Prepare */
Hanno Becker88993962021-01-28 09:45:47 +0000681 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) ==
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000682 MBEDTLS_ERR_MPS_READER_ACCUMULATOR_TOO_SMALL );
683 break;
684
685 case 2: /* Fetch same chunks, don't commit afterwards, and
686 * then exceed bounds of new buffer; accumulator
687 * large enough. */
Hanno Becker88993962021-01-28 09:45:47 +0000688 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, NULL ) == 0 );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000689 ASSERT_COMPARE( tmp, 10, bufA + 80, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000690 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) == 0 );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000691 ASSERT_COMPARE( tmp, 10, bufA + 90, 10 );
692 ASSERT_COMPARE( tmp + 10, 10, bufB, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000693 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) ==
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000694 MBEDTLS_ERR_MPS_READER_OUT_OF_DATA );
695
696 /* Prepare */
Hanno Becker88993962021-01-28 09:45:47 +0000697 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
698 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufC, sizeof( bufC ) ) == 0 );;
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000699
700 /* Consume */
Hanno Becker88993962021-01-28 09:45:47 +0000701 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 50, &tmp, NULL ) == 0 );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000702 ASSERT_COMPARE( tmp, 20, bufA + 80, 20 );
703 ASSERT_COMPARE( tmp + 20, 20, bufB, 20 );
704 ASSERT_COMPARE( tmp + 40, 10, bufC, 10 );
705 break;
706
707 case 3: /* Fetch same chunks, don't commit afterwards, and
708 * then exceed bounds of new buffer; accumulator
709 * not large enough. */
Hanno Becker88993962021-01-28 09:45:47 +0000710 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, NULL ) == 0 );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000711 ASSERT_COMPARE( tmp, 10, bufA + 80, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000712 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) == 0 );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000713 ASSERT_COMPARE( tmp, 10, bufA + 90, 10 );
714 ASSERT_COMPARE( tmp + 10, 10, bufB, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000715 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 21, &tmp, NULL ) ==
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000716 MBEDTLS_ERR_MPS_READER_OUT_OF_DATA );
717
718 /* Prepare */
Hanno Becker88993962021-01-28 09:45:47 +0000719 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) ==
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000720 MBEDTLS_ERR_MPS_READER_ACCUMULATOR_TOO_SMALL );
721 break;
722
723 default:
724 TEST_ASSERT( 0 );
725 break;
726 }
727
Hanno Becker88993962021-01-28 09:45:47 +0000728 mbedtls_mps_reader_free( &rd );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000729}
730/* END_CASE */
Hanno Becker714cbeb2021-01-12 09:23:15 +0000731
732/* BEGIN_CASE depends_on:TEST_SUITE_MPS_READER:MBEDTLS_MPS_STATE_VALIDATION */
733void mbedtls_mps_reader_random_usage( int num_out_chunks,
734 int max_chunk_size,
735 int max_request,
736 int acc_size )
737
738{
739 /* Randomly pass a reader object back and forth between lower and
740 * upper layer and let each of them call the respective reader API
741 * functions in a random fashion.
742 *
743 * On the lower layer, we're tracking and concatenating
744 * the data passed to successful feed calls.
745 *
746 * For the upper layer, we track and concatenate buffers
747 * obtained from successful get calls.
748 *
749 * As long as the lower layer calls reclaim at least once, (resetting the
750 * fetched but not-yet-committed data), this should always lead to the same
751 * stream of outgoing/incoming data for the lower/upper layers, even if
752 * most of the random calls fail.
753 *
754 * NOTE: This test uses rand() for random data, which is not optimal.
755 * Instead, it would be better to get the random data from a
756 * static buffer. This both eases reproducibility and allows
757 * simple conversion to a fuzz target.
758 */
759 int ret;
760 unsigned char *acc = NULL;
761 unsigned char *outgoing = NULL, *incoming = NULL;
762 unsigned char *cur_chunk = NULL;
763 size_t cur_out_chunk, out_pos, in_commit, in_fetch;
764 int rand_op; /* Lower layer:
765 * - Reclaim (0)
766 * - Feed (1)
767 * Upper layer:
768 * - Get, do tolerate smaller output (0)
769 * - Get, don't tolerate smaller output (1)
770 * - Commit (2) */
771 int mode = 0; /* Lower layer (0) or Upper layer (1) */
772 int reclaimed = 1; /* Have to call reclaim at least once before
773 * returning the reader to the upper layer. */
Hanno Becker88993962021-01-28 09:45:47 +0000774 mbedtls_mps_reader rd;
Hanno Becker714cbeb2021-01-12 09:23:15 +0000775
776 if( acc_size > 0 )
777 {
778 ASSERT_ALLOC( acc, acc_size );
779 }
780
781 /* This probably needs to be changed because we want
782 * our tests to be deterministic. */
783 // srand( time( NULL ) );
784
785 ASSERT_ALLOC( outgoing, num_out_chunks * max_chunk_size );
786 ASSERT_ALLOC( incoming, num_out_chunks * max_chunk_size );
787
Hanno Becker88993962021-01-28 09:45:47 +0000788 mbedtls_mps_reader_init( &rd, acc, acc_size );
Hanno Becker714cbeb2021-01-12 09:23:15 +0000789
790 cur_out_chunk = 0;
791 in_commit = 0;
792 in_fetch = 0;
793 out_pos = 0;
794 while( cur_out_chunk < (unsigned) num_out_chunks )
795 {
796 if( mode == 0 )
797 {
798 /* Choose randomly between reclaim and feed */
799 rand_op = rand() % 2;
800
801 if( rand_op == 0 )
802 {
803 /* Reclaim */
Hanno Becker88993962021-01-28 09:45:47 +0000804 ret = mbedtls_mps_reader_reclaim( &rd, NULL );
Hanno Becker714cbeb2021-01-12 09:23:15 +0000805
806 if( ret == 0 )
807 {
808 TEST_ASSERT( cur_chunk != NULL );
809 mbedtls_free( cur_chunk );
810 cur_chunk = NULL;
811 }
812 reclaimed = 1;
813 }
814 else
815 {
816 /* Feed reader with a random chunk */
817 unsigned char *tmp = NULL;
818 size_t tmp_size;
819 if( cur_out_chunk == (unsigned) num_out_chunks )
820 continue;
821
822 tmp_size = ( rand() % max_chunk_size ) + 1;
823 ASSERT_ALLOC( tmp, tmp_size );
824
825 TEST_ASSERT( mbedtls_test_rnd_std_rand( NULL, tmp, tmp_size ) == 0 );
Hanno Becker88993962021-01-28 09:45:47 +0000826 ret = mbedtls_mps_reader_feed( &rd, tmp, tmp_size );
Hanno Becker714cbeb2021-01-12 09:23:15 +0000827
828 if( ret == 0 || ret == MBEDTLS_ERR_MPS_READER_NEED_MORE )
829 {
830 cur_out_chunk++;
831 memcpy( outgoing + out_pos, tmp, tmp_size );
832 out_pos += tmp_size;
833 }
834
835 if( ret == 0 )
836 {
837 TEST_ASSERT( cur_chunk == NULL );
838 cur_chunk = tmp;
839 }
840 else
841 {
842 mbedtls_free( tmp );
843 }
844
845 }
846
847 /* Randomly switch to consumption mode if reclaim
848 * was called at least once. */
849 if( reclaimed == 1 && rand() % 3 == 0 )
850 {
851 in_fetch = 0;
852 mode = 1;
853 }
854 }
855 else
856 {
857 /* Choose randomly between get tolerating fewer data,
858 * get not tolerating fewer data, and commit. */
859 rand_op = rand() % 3;
860 if( rand_op == 0 || rand_op == 1 )
861 {
862 mbedtls_mps_size_t get_size, real_size;
863 unsigned char *chunk_get;
864 get_size = ( rand() % max_request ) + 1;
865 if( rand_op == 0 )
866 {
Hanno Becker88993962021-01-28 09:45:47 +0000867 ret = mbedtls_mps_reader_get( &rd, get_size, &chunk_get,
Hanno Becker714cbeb2021-01-12 09:23:15 +0000868 &real_size );
869 }
870 else
871 {
872 real_size = get_size;
Hanno Becker88993962021-01-28 09:45:47 +0000873 ret = mbedtls_mps_reader_get( &rd, get_size, &chunk_get, NULL );
Hanno Becker714cbeb2021-01-12 09:23:15 +0000874 }
875
876 /* Check if output is in accordance with what was written */
877 if( ret == 0 )
878 {
879 memcpy( incoming + in_commit + in_fetch,
880 chunk_get, real_size );
881 TEST_ASSERT( memcmp( incoming + in_commit + in_fetch,
882 outgoing + in_commit + in_fetch,
883 real_size ) == 0 );
884 in_fetch += real_size;
885 }
886 }
887 else if( rand_op == 2 ) /* Commit */
888 {
Hanno Becker88993962021-01-28 09:45:47 +0000889 ret = mbedtls_mps_reader_commit( &rd );
Hanno Becker714cbeb2021-01-12 09:23:15 +0000890 if( ret == 0 )
891 {
892 in_commit += in_fetch;
893 in_fetch = 0;
894 }
895 }
896
897 /* Randomly switch back to preparation */
898 if( rand() % 3 == 0 )
899 {
900 reclaimed = 0;
901 mode = 0;
902 }
903 }
904 }
905
906 /* Cleanup */
Hanno Becker88993962021-01-28 09:45:47 +0000907 mbedtls_mps_reader_free( &rd );
Hanno Becker714cbeb2021-01-12 09:23:15 +0000908 mbedtls_free( incoming );
909 mbedtls_free( outgoing );
910 mbedtls_free( acc );
911 mbedtls_free( cur_chunk );
912}
913/* END_CASE */
Hanno Becker223b72e2021-01-12 09:31:31 +0000914
915/* BEGIN_CASE depends_on:TEST_SUITE_MPS_READER */
916void mbedtls_reader_inconsistent_usage( int option )
917{
918 /* This test exercises the behaviour of the MPS reader
919 * in the following situation:
920 * - The consumer asks for more data than what's available
921 * - The reader is paused and receives more data from the
922 * producer until the original read request can be fulfilled.
923 * - The consumer does not repeat the original request but
924 * requests data in a different way.
925 *
926 * The reader does not guarantee that inconsistent read requests
927 * after pausing will succeed, and this test triggers some cases
928 * where the request fails.
929 */
930
931 unsigned char bufA[100], bufB[100];
932 unsigned char *tmp;
933 unsigned char acc[40];
Hanno Becker88993962021-01-28 09:45:47 +0000934 mbedtls_mps_reader rd;
Hanno Becker223b72e2021-01-12 09:31:31 +0000935 int success = 0;
936 for( int i=0; (unsigned) i < sizeof( bufA ); i++ )
937 bufA[i] = (unsigned char) i;
938 for( int i=0; (unsigned) i < sizeof( bufB ); i++ )
939 bufB[i] = ~ ((unsigned char) i);
940
941 /* Preparation (lower layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000942 mbedtls_mps_reader_init( &rd, acc, sizeof( acc ) );
943 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufA, sizeof( bufA ) ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +0000944 /* Consumption (upper layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000945 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 80, &tmp, NULL ) == 0 );
946 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
947 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, NULL ) == 0 );
948 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) ==
Hanno Becker223b72e2021-01-12 09:31:31 +0000949 MBEDTLS_ERR_MPS_READER_OUT_OF_DATA );
950 /* Preparation */
Hanno Becker88993962021-01-28 09:45:47 +0000951 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
952 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufB, sizeof( bufB ) ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +0000953 /* Consumption */
954 switch( option )
955 {
956 case 0:
957 /* Ask for buffered data in a single chunk, no commit */
Hanno Becker88993962021-01-28 09:45:47 +0000958 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 30, &tmp, NULL ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +0000959 ASSERT_COMPARE( tmp, 20, bufA + 80, 20 );
960 ASSERT_COMPARE( tmp + 20, 10, bufB, 10 );
961 success = 1;
962 break;
963
964 case 1:
965 /* Ask for buffered data in a single chunk, with commit */
Hanno Becker88993962021-01-28 09:45:47 +0000966 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 30, &tmp, NULL ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +0000967 ASSERT_COMPARE( tmp, 20, bufA + 80, 20 );
968 ASSERT_COMPARE( tmp + 20, 10, bufB, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000969 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +0000970 success = 1;
971 break;
972
973 case 2:
974 /* Ask for more than was requested when pausing, #1 */
Hanno Becker88993962021-01-28 09:45:47 +0000975 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 31, &tmp, NULL ) ==
Hanno Becker223b72e2021-01-12 09:31:31 +0000976 MBEDTLS_ERR_MPS_READER_INCONSISTENT_REQUESTS );
977 break;
978
979 case 3:
980 /* Ask for more than was requested when pausing #2 */
Hanno Becker88993962021-01-28 09:45:47 +0000981 TEST_ASSERT( mbedtls_mps_reader_get( &rd, (mbedtls_mps_size_t) -1, &tmp, NULL ) ==
Hanno Becker223b72e2021-01-12 09:31:31 +0000982 MBEDTLS_ERR_MPS_READER_INCONSISTENT_REQUESTS );
983 break;
984
985 case 4:
986 /* Asking for buffered data in different
987 * chunks than before CAN fail. */
Hanno Becker88993962021-01-28 09:45:47 +0000988 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 15, &tmp, NULL ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +0000989 ASSERT_COMPARE( tmp, 15, bufA + 80, 15 );
Hanno Becker88993962021-01-28 09:45:47 +0000990 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, NULL ) ==
Hanno Becker223b72e2021-01-12 09:31:31 +0000991 MBEDTLS_ERR_MPS_READER_INCONSISTENT_REQUESTS );
992 break;
993
994 case 5:
995 /* Asking for buffered data different chunks
996 * than before NEED NOT fail - no commits */
Hanno Becker88993962021-01-28 09:45:47 +0000997 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 15, &tmp, NULL ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +0000998 ASSERT_COMPARE( tmp, 15, bufA + 80, 15 );
Hanno Becker88993962021-01-28 09:45:47 +0000999 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 15, &tmp, NULL ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +00001000 ASSERT_COMPARE( tmp, 5, bufA + 95, 5 );
1001 ASSERT_COMPARE( tmp + 5, 10, bufB, 10 );
1002 success = 1;
1003 break;
1004
1005 case 6:
1006 /* Asking for buffered data different chunks
1007 * than before NEED NOT fail - intermediate commit */
Hanno Becker88993962021-01-28 09:45:47 +00001008 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 15, &tmp, NULL ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +00001009 ASSERT_COMPARE( tmp, 15, bufA + 80, 15 );
Hanno Becker88993962021-01-28 09:45:47 +00001010 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
1011 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 15, &tmp, NULL ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +00001012 ASSERT_COMPARE( tmp, 5, bufA + 95, 5 );
1013 ASSERT_COMPARE( tmp + 5, 10, bufB, 10 );
1014 success = 1;
1015 break;
1016
1017 case 7:
1018 /* Asking for buffered data different chunks
1019 * than before NEED NOT fail - end commit */
Hanno Becker88993962021-01-28 09:45:47 +00001020 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 15, &tmp, NULL ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +00001021 ASSERT_COMPARE( tmp, 15, bufA + 80, 15 );
Hanno Becker88993962021-01-28 09:45:47 +00001022 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 15, &tmp, NULL ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +00001023 ASSERT_COMPARE( tmp, 5, bufA + 95, 5 );
1024 ASSERT_COMPARE( tmp + 5, 10, bufB, 10 );
Hanno Becker88993962021-01-28 09:45:47 +00001025 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +00001026 success = 1;
1027 break;
1028
1029 case 8:
1030 /* Asking for buffered data different chunks
1031 * than before NEED NOT fail - intermediate & end commit */
Hanno Becker88993962021-01-28 09:45:47 +00001032 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 15, &tmp, NULL ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +00001033 ASSERT_COMPARE( tmp, 15, bufA + 80, 15 );
Hanno Becker88993962021-01-28 09:45:47 +00001034 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 15, &tmp, NULL ) == 0 );
1035 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +00001036 ASSERT_COMPARE( tmp, 5, bufA + 95, 5 );
1037 ASSERT_COMPARE( tmp + 5, 10, bufB, 10 );
Hanno Becker88993962021-01-28 09:45:47 +00001038 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +00001039 success = 1;
1040 break;
1041
1042 default:
1043 TEST_ASSERT( 0 );
1044 break;
1045 }
1046
1047 if( success == 1 )
1048 {
1049 /* In all succeeding cases, fetch the rest of the second buffer. */
Hanno Becker88993962021-01-28 09:45:47 +00001050 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 90, &tmp, NULL ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +00001051 ASSERT_COMPARE( tmp, 90, bufB + 10, 90 );
Hanno Becker88993962021-01-28 09:45:47 +00001052 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +00001053
1054 /* Wrapup */
Hanno Becker88993962021-01-28 09:45:47 +00001055 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +00001056 }
1057
1058 /* Wrapup */
Hanno Becker88993962021-01-28 09:45:47 +00001059 mbedtls_mps_reader_free( &rd );
Hanno Becker223b72e2021-01-12 09:31:31 +00001060}
1061/* END_CASE */
Hanno Becker2b8bad32021-01-12 09:40:05 +00001062
1063/* BEGIN_CASE depends_on:TEST_SUITE_MPS_READER */
1064void mbedtls_mps_reader_feed_empty( int option )
1065{
1066 /* This test exercises the behaviour of the reader when it is
1067 * fed a NULL buffer. */
1068 unsigned char buf[100];
1069 unsigned char *tmp;
Hanno Becker88993962021-01-28 09:45:47 +00001070 mbedtls_mps_reader rd;
Hanno Becker2b8bad32021-01-12 09:40:05 +00001071 for( int i=0; (unsigned) i < sizeof( buf ); i++ )
1072 buf[i] = (unsigned char) i;
1073
1074 /* Preparation (lower layer) */
Hanno Becker88993962021-01-28 09:45:47 +00001075 mbedtls_mps_reader_init( &rd, NULL, 0 );
Hanno Becker2b8bad32021-01-12 09:40:05 +00001076 switch( option )
1077 {
1078 case 0: /* NULL buffer */
Hanno Becker88993962021-01-28 09:45:47 +00001079 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, NULL, sizeof( buf ) ) ==
Hanno Becker2b8bad32021-01-12 09:40:05 +00001080 MBEDTLS_ERR_MPS_READER_INVALID_ARG );
1081 break;
1082
1083 default:
1084 TEST_ASSERT( 0 );
1085 break;
1086 }
1087 /* Subsequent feed-calls should still succeed. */
Hanno Becker88993962021-01-28 09:45:47 +00001088 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, buf, sizeof( buf ) ) == 0 );
Hanno Becker2b8bad32021-01-12 09:40:05 +00001089
1090 /* Consumption (upper layer) */
Hanno Becker88993962021-01-28 09:45:47 +00001091 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 100, &tmp, NULL ) == 0 );
Hanno Becker2b8bad32021-01-12 09:40:05 +00001092 ASSERT_COMPARE( tmp, 100, buf, 100 );
Hanno Becker88993962021-01-28 09:45:47 +00001093 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Becker2b8bad32021-01-12 09:40:05 +00001094
1095 /* Wrapup */
Hanno Becker88993962021-01-28 09:45:47 +00001096 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
1097 mbedtls_mps_reader_free( &rd );
Hanno Becker2b8bad32021-01-12 09:40:05 +00001098}
1099/* END_CASE */