blob: d67e7d2275db9db2cf4dfc69bbfc72e52f8550d8 [file] [log] [blame]
Hanno Becker09d880a2021-01-12 07:43:30 +00001/* BEGIN_HEADER */
2
3#include <stdlib.h>
4
Hanno Becker8a04b102021-02-22 16:49:24 +00005#include "mps_reader.h"
Hanno Becker09d880a2021-01-12 07:43:30 +00006
7/*
8 * Compile-time configuration for test suite.
9 */
10
11/* Comment/Uncomment this to disable/enable the
12 * testing of the various MPS layers.
13 * This can be useful for time-consuming instrumentation
14 * tasks such as the conversion of E-ACSL annotations
15 * into runtime assertions. */
16#define TEST_SUITE_MPS_READER
17
18/* End of compile-time configuration. */
19
20/* END_HEADER */
21
22/* BEGIN_CASE depends_on:TEST_SUITE_MPS_READER */
23void mbedtls_mps_reader_no_pausing_single_step_single_round( int with_acc )
24{
25 /* This test exercises the most basic use of the MPS reader:
26 * - The 'producing' layer provides a buffer
27 * - The 'consuming' layer fetches it in a single go.
Hanno Becker5047b562021-02-22 16:52:02 +000028 * - After processing, the consuming layer commits the data
29 * and the reader is moved back to producing mode.
Hanno Becker09d880a2021-01-12 07:43:30 +000030 *
31 * Parameters:
32 * - with_acc: 0 if the reader should be initialized without accumulator.
33 * 1 if the reader should be initialized with accumulator.
34 *
35 * Whether the accumulator is present or not should not matter,
36 * since the consumer's request can be fulfilled from the data
37 * that the producer has provided.
38 */
39 unsigned char bufA[100];
40 unsigned char acc[10];
41 unsigned char *tmp;
Hanno Becker88993962021-01-28 09:45:47 +000042 mbedtls_mps_reader rd;
Hanno Beckerb17212a2021-02-22 16:50:01 +000043 for( size_t i=0; (unsigned) i < sizeof( bufA ); i++ )
Hanno Becker09d880a2021-01-12 07:43:30 +000044 bufA[i] = (unsigned char) i;
45
46 /* Preparation (lower layer) */
47 if( with_acc == 0 )
Hanno Becker88993962021-01-28 09:45:47 +000048 mbedtls_mps_reader_init( &rd, NULL, 0 );
Hanno Becker09d880a2021-01-12 07:43:30 +000049 else
Hanno Becker88993962021-01-28 09:45:47 +000050 mbedtls_mps_reader_init( &rd, acc, sizeof( acc ) );
51 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufA, sizeof( bufA ) ) == 0 );
Hanno Becker09d880a2021-01-12 07:43:30 +000052 /* Consumption (upper layer) */
53 /* Consume exactly what's available */
Hanno Becker88993962021-01-28 09:45:47 +000054 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 100, &tmp, NULL ) == 0 );
Hanno Becker09d880a2021-01-12 07:43:30 +000055 ASSERT_COMPARE( tmp, 100, bufA, 100 );
Hanno Becker88993962021-01-28 09:45:47 +000056 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Becker09d880a2021-01-12 07:43:30 +000057 /* Wrapup (lower layer) */
Hanno Becker88993962021-01-28 09:45:47 +000058 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
59 mbedtls_mps_reader_free( &rd );
Hanno Becker09d880a2021-01-12 07:43:30 +000060}
61/* END_CASE */
Hanno Becker0e4edfc2021-01-12 07:52:29 +000062
63/* BEGIN_CASE depends_on:TEST_SUITE_MPS_READER */
64void mbedtls_mps_reader_no_pausing_single_step_multiple_rounds( int with_acc )
65{
Hanno Becker5047b562021-02-22 16:52:02 +000066 /* This test exercises multiple rounds of the basic use of the MPS reader:
Hanno Becker0e4edfc2021-01-12 07:52:29 +000067 * - The 'producing' layer provides a buffer
68 * - The 'consuming' layer fetches it in a single go.
Hanno Becker5047b562021-02-22 16:52:02 +000069 * - After processing, the consuming layer commits the data
70 * and the reader is moved back to producing mode.
Hanno Becker0e4edfc2021-01-12 07:52:29 +000071 *
72 * Parameters:
73 * - with_acc: 0 if the reader should be initialized without accumulator.
74 * 1 if the reader should be initialized with accumulator.
75 *
76 * Whether the accumulator is present or not should not matter,
77 * since the consumer's request can be fulfilled from the data
78 * that the producer has provided.
79 */
80
81 unsigned char bufA[100], bufB[100];
82 unsigned char acc[10];
83 unsigned char *tmp;
Hanno Becker88993962021-01-28 09:45:47 +000084 mbedtls_mps_reader rd;
Hanno Beckerb17212a2021-02-22 16:50:01 +000085 for( size_t i=0; (unsigned) i < sizeof( bufA ); i++ )
Hanno Becker0e4edfc2021-01-12 07:52:29 +000086 bufA[i] = (unsigned char) i;
Hanno Beckerb17212a2021-02-22 16:50:01 +000087 for( size_t i=0; (unsigned) i < sizeof( bufB ); i++ )
Hanno Becker0e4edfc2021-01-12 07:52:29 +000088 bufB[i] = ~ ((unsigned char) i);
89
90 /* Preparation (lower layer) */
91 if( with_acc == 0 )
Hanno Becker88993962021-01-28 09:45:47 +000092 mbedtls_mps_reader_init( &rd, NULL, 0 );
Hanno Becker0e4edfc2021-01-12 07:52:29 +000093 else
Hanno Becker88993962021-01-28 09:45:47 +000094 mbedtls_mps_reader_init( &rd, acc, sizeof( acc ) );
95 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufA, sizeof( bufA ) ) == 0 );
Hanno Becker0e4edfc2021-01-12 07:52:29 +000096 /* Consumption (upper layer) */
97 /* Consume exactly what's available */
Hanno Becker88993962021-01-28 09:45:47 +000098 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 100, &tmp, NULL ) == 0 );
Hanno Becker0e4edfc2021-01-12 07:52:29 +000099 ASSERT_COMPARE( tmp, 100, bufA, 100 );
Hanno Becker88993962021-01-28 09:45:47 +0000100 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Becker0e4edfc2021-01-12 07:52:29 +0000101 /* Preparation */
Hanno Becker88993962021-01-28 09:45:47 +0000102 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
103 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufB, sizeof( bufB ) ) == 0 );
Hanno Becker0e4edfc2021-01-12 07:52:29 +0000104 /* Consumption */
Hanno Becker88993962021-01-28 09:45:47 +0000105 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 100, &tmp, NULL ) == 0 );
Hanno Becker0e4edfc2021-01-12 07:52:29 +0000106 ASSERT_COMPARE( tmp, 100, bufB, 100 );
Hanno Becker88993962021-01-28 09:45:47 +0000107 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Becker0e4edfc2021-01-12 07:52:29 +0000108 /* Wrapup (lower layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000109 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
110 mbedtls_mps_reader_free( &rd );
Hanno Becker0e4edfc2021-01-12 07:52:29 +0000111}
112/* END_CASE */
Hanno Beckerdbd8a962021-01-12 08:01:16 +0000113
114/* BEGIN_CASE depends_on:TEST_SUITE_MPS_READER */
115void mbedtls_mps_reader_no_pausing_multiple_steps_single_round( int with_acc )
116{
117 /* This test exercises one round of the following:
118 * - The 'producing' layer provides a buffer
119 * - The 'consuming' layer fetches it in multiple calls
Hanno Becker5047b562021-02-22 16:52:02 +0000120 * to `mbedtls_mps_reader_get()`, without committing in between.
121 * - After processing, the consuming layer commits the data
122 * and the reader is moved back to producing mode.
Hanno Beckerdbd8a962021-01-12 08:01:16 +0000123 *
124 * Parameters:
125 * - with_acc: 0 if the reader should be initialized without accumulator.
126 * 1 if the reader should be initialized with accumulator.
127 *
128 * Whether the accumulator is present or not should not matter,
Hanno Becker5047b562021-02-22 16:52:02 +0000129 * since the consumer's requests can be fulfilled from the data
Hanno Beckerdbd8a962021-01-12 08:01:16 +0000130 * that the producer has provided.
131 */
132
133 /* Lower layer provides data that the upper layer fully consumes
134 * through multiple `get` calls. */
135 unsigned char buf[100];
136 unsigned char acc[10];
137 unsigned char *tmp;
138 mbedtls_mps_size_t tmp_len;
Hanno Becker88993962021-01-28 09:45:47 +0000139 mbedtls_mps_reader rd;
Hanno Beckerb17212a2021-02-22 16:50:01 +0000140 for( size_t i=0; (unsigned) i < sizeof( buf ); i++ )
Hanno Beckerdbd8a962021-01-12 08:01:16 +0000141 buf[i] = (unsigned char) i;
142
143 /* Preparation (lower layer) */
144 if( with_acc == 0 )
Hanno Becker88993962021-01-28 09:45:47 +0000145 mbedtls_mps_reader_init( &rd, NULL, 0 );
Hanno Beckerdbd8a962021-01-12 08:01:16 +0000146 else
Hanno Becker88993962021-01-28 09:45:47 +0000147 mbedtls_mps_reader_init( &rd, acc, sizeof( acc ) );
148 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, buf, sizeof( buf ) ) == 0 );
Hanno Beckerdbd8a962021-01-12 08:01:16 +0000149 /* Consumption (upper layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000150 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, NULL ) == 0 );
Hanno Beckerdbd8a962021-01-12 08:01:16 +0000151 ASSERT_COMPARE( tmp, 10, buf, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000152 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 70, &tmp, NULL ) == 0 );
Hanno Beckerdbd8a962021-01-12 08:01:16 +0000153 ASSERT_COMPARE( tmp, 70, buf + 10, 70 );
Hanno Becker88993962021-01-28 09:45:47 +0000154 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 30, &tmp, &tmp_len ) == 0 );
Hanno Beckerdbd8a962021-01-12 08:01:16 +0000155 ASSERT_COMPARE( tmp, tmp_len, buf + 80, 20 );
Hanno Becker88993962021-01-28 09:45:47 +0000156 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Beckerdbd8a962021-01-12 08:01:16 +0000157 /* Wrapup (lower layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000158 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
159 mbedtls_mps_reader_free( &rd );
Hanno Beckerdbd8a962021-01-12 08:01:16 +0000160}
161/* END_CASE */
Hanno Becker7973b2d2021-01-12 08:11:40 +0000162
163/* BEGIN_CASE depends_on:TEST_SUITE_MPS_READER */
164void mbedtls_mps_reader_no_pausing_multiple_steps_multiple_rounds( int with_acc )
165{
166 /* This test exercises one round of fetching a buffer in multiple chunks
167 * and passing it back to the producer afterwards, followed by another
168 * single-step sequence of feed-fetch-commit-reclaim.
169 */
170 unsigned char bufA[100], bufB[100];
171 unsigned char acc[10];
172 unsigned char *tmp;
173 mbedtls_mps_size_t tmp_len;
Hanno Becker88993962021-01-28 09:45:47 +0000174 mbedtls_mps_reader rd;
Hanno Beckerb17212a2021-02-22 16:50:01 +0000175 for( size_t i=0; (unsigned) i < sizeof( bufA ); i++ )
Hanno Becker7973b2d2021-01-12 08:11:40 +0000176 bufA[i] = (unsigned char) i;
Hanno Beckerb17212a2021-02-22 16:50:01 +0000177 for( size_t i=0; (unsigned) i < sizeof( bufB ); i++ )
Hanno Becker7973b2d2021-01-12 08:11:40 +0000178 bufB[i] = ~ ((unsigned char) i);
179
180 /* Preparation (lower layer) */
181 if( with_acc == 0 )
Hanno Becker88993962021-01-28 09:45:47 +0000182 mbedtls_mps_reader_init( &rd, NULL, 0 );
Hanno Becker7973b2d2021-01-12 08:11:40 +0000183 else
Hanno Becker88993962021-01-28 09:45:47 +0000184 mbedtls_mps_reader_init( &rd, acc, sizeof( acc ) );
185 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufA, sizeof( bufA ) ) == 0 );
Hanno Becker7973b2d2021-01-12 08:11:40 +0000186 /* Consumption (upper layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000187 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, NULL ) == 0 );
Hanno Becker7973b2d2021-01-12 08:11:40 +0000188 ASSERT_COMPARE( tmp, 10, bufA, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000189 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 70, &tmp, NULL ) == 0 );
Hanno Becker7973b2d2021-01-12 08:11:40 +0000190 ASSERT_COMPARE( tmp, 70, bufA + 10, 70 );
Hanno Becker88993962021-01-28 09:45:47 +0000191 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 30, &tmp, &tmp_len ) == 0 );
Hanno Becker7973b2d2021-01-12 08:11:40 +0000192 ASSERT_COMPARE( tmp, tmp_len, bufA + 80, 20 );
Hanno Becker88993962021-01-28 09:45:47 +0000193 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Becker7973b2d2021-01-12 08:11:40 +0000194 /* Preparation */
Hanno Becker88993962021-01-28 09:45:47 +0000195 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
196 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufB, sizeof( bufB ) ) == 0 );
Hanno Becker7973b2d2021-01-12 08:11:40 +0000197 /* Consumption */
Hanno Becker88993962021-01-28 09:45:47 +0000198 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 100, &tmp, NULL ) == 0 );
Hanno Becker7973b2d2021-01-12 08:11:40 +0000199 ASSERT_COMPARE( tmp, 100, bufB, 100 );
Hanno Becker88993962021-01-28 09:45:47 +0000200 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Becker7973b2d2021-01-12 08:11:40 +0000201 /* Wrapup */
Hanno Becker88993962021-01-28 09:45:47 +0000202 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
203 mbedtls_mps_reader_free( &rd );
Hanno Becker7973b2d2021-01-12 08:11:40 +0000204}
205/* END_CASE */
Hanno Becker7d86b742021-01-12 08:14:38 +0000206
207/* BEGIN_CASE depends_on:TEST_SUITE_MPS_READER */
208void mbedtls_mps_reader_pausing_needed_disabled()
209{
Hanno Becker5047b562021-02-22 16:52:02 +0000210 /* This test exercises the behaviour of the MPS reader when a read request
Hanno Becker7d86b742021-01-12 08:14:38 +0000211 * of the consumer exceeds what has been provided by the producer, and when
212 * no accumulator is available in the reader.
213 *
214 * In this case, we expect the reader to fail.
215 */
216
217 unsigned char buf[100];
218 unsigned char *tmp;
Hanno Becker88993962021-01-28 09:45:47 +0000219 mbedtls_mps_reader rd;
Hanno Beckerb17212a2021-02-22 16:50:01 +0000220 for( size_t i=0; (unsigned) i < sizeof( buf ); i++ )
Hanno Becker7d86b742021-01-12 08:14:38 +0000221 buf[i] = (unsigned char) i;
222
223 /* Preparation (lower layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000224 mbedtls_mps_reader_init( &rd, NULL, 0 );
225 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, buf, sizeof( buf ) ) == 0 );
Hanno Becker7d86b742021-01-12 08:14:38 +0000226 /* Consumption (upper layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000227 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 50, &tmp, NULL ) == 0 );
Hanno Becker7d86b742021-01-12 08:14:38 +0000228 ASSERT_COMPARE( tmp, 50, buf, 50 );
Hanno Becker88993962021-01-28 09:45:47 +0000229 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
230 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 100, &tmp, NULL ) ==
Hanno Becker7d86b742021-01-12 08:14:38 +0000231 MBEDTLS_ERR_MPS_READER_OUT_OF_DATA );
232 /* Wrapup (lower layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000233 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) ==
Hanno Becker7d86b742021-01-12 08:14:38 +0000234 MBEDTLS_ERR_MPS_READER_NEED_ACCUMULATOR );
Hanno Becker88993962021-01-28 09:45:47 +0000235 mbedtls_mps_reader_free( &rd );
Hanno Becker7d86b742021-01-12 08:14:38 +0000236}
237/* END_CASE */
Hanno Beckercaf1a3f2021-01-12 08:18:12 +0000238
239/* BEGIN_CASE depends_on:TEST_SUITE_MPS_READER */
240void mbedtls_mps_reader_pausing_needed_buffer_too_small()
241{
242 /* This test exercises the behaviour of the MPS reader with accumulator
Hanno Becker5047b562021-02-22 16:52:02 +0000243 * in the situation where a read request goes beyond the bounds of the
Hanno Beckercaf1a3f2021-01-12 08:18:12 +0000244 * current read buffer, _and_ the reader's accumulator is too small to
245 * hold the requested amount of data.
246 *
Hanno Becker014f6832021-02-08 06:52:21 +0000247 * In this case, we expect mbedtls_mps_reader_reclaim() to fail,
248 * but it should be possible to continue fetching data as if
249 * there had been no excess request via mbedtls_mps_reader_get()
250 * and the call to mbedtls_mps_reader_reclaim() had been rejected
251 * because of data remaining.
252 */
Hanno Beckercaf1a3f2021-01-12 08:18:12 +0000253
254 unsigned char buf[100];
255 unsigned char acc[10];
256 unsigned char *tmp;
Hanno Becker88993962021-01-28 09:45:47 +0000257 mbedtls_mps_reader rd;
Hanno Becker014f6832021-02-08 06:52:21 +0000258 mbedtls_mps_size_t tmp_len;
259
Hanno Beckerb17212a2021-02-22 16:50:01 +0000260 for( size_t i=0; (unsigned) i < sizeof( buf ); i++ )
Hanno Beckercaf1a3f2021-01-12 08:18:12 +0000261 buf[i] = (unsigned char) i;
262
263 /* Preparation (lower layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000264 mbedtls_mps_reader_init( &rd, acc, sizeof( acc ) );
265 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, buf, sizeof( buf ) ) == 0 );
Hanno Beckercaf1a3f2021-01-12 08:18:12 +0000266 /* Consumption (upper layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000267 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 50, &tmp, NULL ) == 0 );
Hanno Beckercaf1a3f2021-01-12 08:18:12 +0000268 ASSERT_COMPARE( tmp, 50, buf, 50 );
Hanno Becker88993962021-01-28 09:45:47 +0000269 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Becker014f6832021-02-08 06:52:21 +0000270 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, NULL ) == 0 );
271 ASSERT_COMPARE( tmp, 10, buf + 50, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000272 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 100, &tmp, NULL ) ==
Hanno Beckercaf1a3f2021-01-12 08:18:12 +0000273 MBEDTLS_ERR_MPS_READER_OUT_OF_DATA );
274 /* Wrapup (lower layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000275 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) ==
Hanno Beckercaf1a3f2021-01-12 08:18:12 +0000276 MBEDTLS_ERR_MPS_READER_ACCUMULATOR_TOO_SMALL );
Hanno Becker014f6832021-02-08 06:52:21 +0000277
278 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 50, &tmp, &tmp_len ) == 0 );
279 ASSERT_COMPARE( tmp, tmp_len, buf + 50, 50 );
280
Hanno Becker88993962021-01-28 09:45:47 +0000281 mbedtls_mps_reader_free( &rd );
Hanno Beckercaf1a3f2021-01-12 08:18:12 +0000282}
283/* END_CASE */
Hanno Beckere82952a2021-01-12 08:27:29 +0000284
285/* BEGIN_CASE depends_on:TEST_SUITE_MPS_READER */
286void mbedtls_mps_reader_pausing( int option )
287{
288 /* This test exercises the behaviour of the reader when the
Hanno Becker5047b562021-02-22 16:52:02 +0000289 * accumulator is used to fufill a consumer's request.
Hanno Beckere82952a2021-01-12 08:27:29 +0000290 *
291 * More detailed:
292 * - The producer feeds some data.
293 * - The consumer asks for more data than what's available.
294 * - The reader remembers the request and goes back to
295 * producing mode, waiting for more data from the producer.
296 * - The producer provides another chunk of data which is
297 * sufficient to fulfill the original read request.
298 * - The consumer retries the original read request, which
299 * should now succeed.
300 *
301 * This test comes in multiple variants controlled by the
302 * `option` parameter and documented below.
303 */
304
305 unsigned char bufA[100], bufB[100];
306 unsigned char *tmp;
307 unsigned char acc[40];
Hanno Becker88993962021-01-28 09:45:47 +0000308 mbedtls_mps_reader rd;
Hanno Beckerb17212a2021-02-22 16:50:01 +0000309 for( size_t i=0; (unsigned) i < sizeof( bufA ); i++ )
Hanno Beckere82952a2021-01-12 08:27:29 +0000310 bufA[i] = (unsigned char) i;
Hanno Beckerb17212a2021-02-22 16:50:01 +0000311 for( size_t i=0; (unsigned) i < sizeof( bufB ); i++ )
Hanno Beckere82952a2021-01-12 08:27:29 +0000312 bufB[i] = ~ ((unsigned char) i);
313
314 /* Preparation (lower layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000315 mbedtls_mps_reader_init( &rd, acc, sizeof( acc ) );
316 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufA, sizeof( bufA ) ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000317
318 /* Consumption (upper layer) */
319 /* Ask for more than what's available. */
Hanno Becker88993962021-01-28 09:45:47 +0000320 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 80, &tmp, NULL ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000321 ASSERT_COMPARE( tmp, 80, bufA, 80 );
Hanno Becker88993962021-01-28 09:45:47 +0000322 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
323 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, NULL ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000324 ASSERT_COMPARE( tmp, 10, bufA + 80, 10 );
325 switch( option )
326 {
327 case 0: /* Single uncommitted fetch at pausing */
328 case 1:
Hanno Becker88993962021-01-28 09:45:47 +0000329 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000330 break;
331 default: /* Multiple uncommitted fetches at pausing */
332 break;
333 }
Hanno Becker88993962021-01-28 09:45:47 +0000334 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) ==
Hanno Beckere82952a2021-01-12 08:27:29 +0000335 MBEDTLS_ERR_MPS_READER_OUT_OF_DATA );
336
337 /* Preparation */
Hanno Becker88993962021-01-28 09:45:47 +0000338 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
339 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufB, sizeof( bufB ) ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000340
341 /* Consumption */
342 switch( option )
343 {
344 case 0: /* Single fetch at pausing, re-fetch with commit. */
Hanno Becker88993962021-01-28 09:45:47 +0000345 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000346 ASSERT_COMPARE( tmp, 10, bufA + 90, 10 );
347 ASSERT_COMPARE( tmp + 10, 10, bufB, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000348 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000349 break;
350
351 case 1: /* Single fetch at pausing, re-fetch without commit. */
Hanno Becker88993962021-01-28 09:45:47 +0000352 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000353 ASSERT_COMPARE( tmp, 10, bufA + 90, 10 );
354 ASSERT_COMPARE( tmp + 10, 10, bufB, 10 );
355 break;
356
357 case 2: /* Multiple fetches at pausing, repeat without commit. */
Hanno Becker88993962021-01-28 09:45:47 +0000358 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, NULL ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000359 ASSERT_COMPARE( tmp, 10, bufA + 80, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000360 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000361 ASSERT_COMPARE( tmp, 10, bufA + 90, 10 );
362 ASSERT_COMPARE( tmp + 10, 10, bufB, 10 );
363 break;
364
365 case 3: /* Multiple fetches at pausing, repeat with commit 1. */
Hanno Becker88993962021-01-28 09:45:47 +0000366 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, NULL ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000367 ASSERT_COMPARE( tmp, 10, bufA + 80, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000368 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
369 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000370 ASSERT_COMPARE( tmp, 10, bufA + 90, 10 );
371 ASSERT_COMPARE( tmp + 10, 10, bufB, 10 );
372 break;
373
374 case 4: /* Multiple fetches at pausing, repeat with commit 2. */
Hanno Becker88993962021-01-28 09:45:47 +0000375 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, NULL ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000376 ASSERT_COMPARE( tmp, 10, bufA + 80, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000377 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000378 ASSERT_COMPARE( tmp, 10, bufA + 90, 10 );
379 ASSERT_COMPARE( tmp + 10, 10, bufB, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000380 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000381 break;
382
383 case 5: /* Multiple fetches at pausing, repeat with commit 3. */
Hanno Becker88993962021-01-28 09:45:47 +0000384 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, NULL ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000385 ASSERT_COMPARE( tmp, 10, bufA + 80, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000386 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
387 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000388 ASSERT_COMPARE( tmp, 10, bufA + 90, 10 );
389 ASSERT_COMPARE( tmp + 10, 10, bufB, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000390 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000391 break;
392
393 default:
394 TEST_ASSERT( 0 );
395 }
396
397 /* In all cases, fetch the rest of the second buffer. */
Hanno Becker88993962021-01-28 09:45:47 +0000398 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 90, &tmp, NULL ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000399 ASSERT_COMPARE( tmp, 90, bufB + 10, 90 );
Hanno Becker88993962021-01-28 09:45:47 +0000400 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Beckere82952a2021-01-12 08:27:29 +0000401
402 /* Wrapup */
Hanno Becker88993962021-01-28 09:45:47 +0000403 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
404 mbedtls_mps_reader_free( &rd );
Hanno Beckere82952a2021-01-12 08:27:29 +0000405}
406/* END_CASE */
Hanno Beckeraac41222021-01-12 08:36:36 +0000407
408/* BEGIN_CASE depends_on:TEST_SUITE_MPS_READER */
409void mbedtls_mps_reader_pausing_multiple_feeds( int option )
410{
411 /* This test exercises the behaviour of the MPS reader
412 * in the following situation:
Hanno Becker5047b562021-02-22 16:52:02 +0000413 * - The consumer has asked for more than what's available, so the
Hanno Beckeraac41222021-01-12 08:36:36 +0000414 * reader pauses and waits for further input data via
Hanno Becker88993962021-01-28 09:45:47 +0000415 * `mbedtls_mps_reader_feed()`
416 * - Multiple such calls to `mbedtls_mps_reader_feed()` are necessary
Hanno Beckeraac41222021-01-12 08:36:36 +0000417 * to fulfill the original request, and the reader needs to do
418 * the necessary bookkeeping under the hood.
419 *
420 * This test comes in a few variants differing in the number and
421 * size of feed calls that the producer issues while the reader is
422 * accumulating the necessary data - see the comments below.
423 */
424
425 unsigned char bufA[100], bufB[100];
426 unsigned char *tmp;
427 unsigned char acc[70];
Hanno Becker88993962021-01-28 09:45:47 +0000428 mbedtls_mps_reader rd;
Hanno Beckeraac41222021-01-12 08:36:36 +0000429 mbedtls_mps_size_t fetch_len;
Hanno Beckerb17212a2021-02-22 16:50:01 +0000430 for( size_t i=0; (unsigned) i < sizeof( bufA ); i++ )
Hanno Beckeraac41222021-01-12 08:36:36 +0000431 bufA[i] = (unsigned char) i;
Hanno Beckerb17212a2021-02-22 16:50:01 +0000432 for( size_t i=0; (unsigned) i < sizeof( bufB ); i++ )
Hanno Beckeraac41222021-01-12 08:36:36 +0000433 bufB[i] = ~ ((unsigned char) i);
434
435 /* Preparation (lower layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000436 mbedtls_mps_reader_init( &rd, acc, sizeof( acc ) );
437 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufA, sizeof( bufA ) ) == 0 );
Hanno Beckeraac41222021-01-12 08:36:36 +0000438
439 /* Consumption (upper layer) */
440 /* Ask for more than what's available. */
Hanno Becker88993962021-01-28 09:45:47 +0000441 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 80, &tmp, NULL ) == 0 );
Hanno Beckeraac41222021-01-12 08:36:36 +0000442 ASSERT_COMPARE( tmp, 80, bufA, 80 );
Hanno Becker88993962021-01-28 09:45:47 +0000443 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Beckeraac41222021-01-12 08:36:36 +0000444 /* 20 left, ask for 70 -> 50 overhead */
Hanno Becker88993962021-01-28 09:45:47 +0000445 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 70, &tmp, NULL ) ==
Hanno Beckeraac41222021-01-12 08:36:36 +0000446 MBEDTLS_ERR_MPS_READER_OUT_OF_DATA );
447
448 /* Preparation */
Hanno Becker88993962021-01-28 09:45:47 +0000449 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
Hanno Beckeraac41222021-01-12 08:36:36 +0000450 switch( option )
451 {
452 case 0: /* 10 + 10 + 80 byte feed */
Hanno Becker88993962021-01-28 09:45:47 +0000453 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufB, 10 ) ==
Hanno Beckeraac41222021-01-12 08:36:36 +0000454 MBEDTLS_ERR_MPS_READER_NEED_MORE );
Hanno Becker88993962021-01-28 09:45:47 +0000455 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufB + 10, 10 ) ==
Hanno Beckeraac41222021-01-12 08:36:36 +0000456 MBEDTLS_ERR_MPS_READER_NEED_MORE );
Hanno Becker88993962021-01-28 09:45:47 +0000457 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufB + 20, 80 ) == 0 );
Hanno Beckeraac41222021-01-12 08:36:36 +0000458 break;
459
460 case 1: /* 50 x 1byte */
Hanno Beckerb17212a2021-02-22 16:50:01 +0000461 for( size_t num_feed=0; num_feed<49; num_feed++ )
Hanno Beckeraac41222021-01-12 08:36:36 +0000462 {
Hanno Becker88993962021-01-28 09:45:47 +0000463 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufB + num_feed, 1 ) ==
Hanno Beckeraac41222021-01-12 08:36:36 +0000464 MBEDTLS_ERR_MPS_READER_NEED_MORE );
465 }
Hanno Becker88993962021-01-28 09:45:47 +0000466 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufB + 49, 1 ) == 0 );
Hanno Beckeraac41222021-01-12 08:36:36 +0000467 break;
468
469 case 2: /* 49 x 1byte + 51bytes */
Hanno Beckerb17212a2021-02-22 16:50:01 +0000470 for( size_t num_feed=0; num_feed<49; num_feed++ )
Hanno Beckeraac41222021-01-12 08:36:36 +0000471 {
Hanno Becker88993962021-01-28 09:45:47 +0000472 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufB + num_feed, 1 ) ==
Hanno Beckeraac41222021-01-12 08:36:36 +0000473 MBEDTLS_ERR_MPS_READER_NEED_MORE );
474 }
Hanno Becker88993962021-01-28 09:45:47 +0000475 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufB + 49, 51 ) == 0 );
Hanno Beckeraac41222021-01-12 08:36:36 +0000476 break;
477
478 default:
479 TEST_ASSERT( 0 );
480 break;
481 }
482
483 /* Consumption */
Hanno Becker88993962021-01-28 09:45:47 +0000484 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 70, &tmp, NULL ) == 0 );
Hanno Beckeraac41222021-01-12 08:36:36 +0000485 ASSERT_COMPARE( tmp, 20, bufA + 80, 20 );
486 ASSERT_COMPARE( tmp + 20, 50, bufB, 50 );
Hanno Becker88993962021-01-28 09:45:47 +0000487 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 1000, &tmp, &fetch_len ) == 0 );
Hanno Beckeraac41222021-01-12 08:36:36 +0000488 switch( option )
489 {
490 case 0:
491 TEST_ASSERT( fetch_len == 50 );
492 break;
493
494 case 1:
495 TEST_ASSERT( fetch_len == 0 );
496 break;
497
498 case 2:
499 TEST_ASSERT( fetch_len == 50 );
500 break;
501
502 default:
503 TEST_ASSERT( 0 );
504 break;
505 }
Hanno Becker88993962021-01-28 09:45:47 +0000506 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Beckeraac41222021-01-12 08:36:36 +0000507
508 /* Wrapup */
Hanno Becker88993962021-01-28 09:45:47 +0000509 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
510 mbedtls_mps_reader_free( &rd );
Hanno Beckeraac41222021-01-12 08:36:36 +0000511}
512/* END_CASE */
Hanno Beckercb2a88e2021-01-12 08:39:37 +0000513
514
515/* BEGIN_CASE depends_on:TEST_SUITE_MPS_READER */
516void mbedtls_mps_reader_reclaim_data_left( int option )
517{
518 /* This test exercises the behaviour of the MPS reader when a
Hanno Becker88993962021-01-28 09:45:47 +0000519 * call to mbedtls_mps_reader_reclaim() is made before all data
Hanno Beckercb2a88e2021-01-12 08:39:37 +0000520 * provided by the producer has been fetched and committed. */
521
522 unsigned char buf[100];
523 unsigned char *tmp;
Hanno Becker88993962021-01-28 09:45:47 +0000524 mbedtls_mps_reader rd;
Hanno Beckerb17212a2021-02-22 16:50:01 +0000525 for( size_t i=0; (unsigned) i < sizeof( buf ); i++ )
Hanno Beckercb2a88e2021-01-12 08:39:37 +0000526 buf[i] = (unsigned char) i;
527
528 /* Preparation (lower layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000529 mbedtls_mps_reader_init( &rd, NULL, 0 );
530 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, buf, sizeof( buf ) ) == 0 );
Hanno Beckercb2a88e2021-01-12 08:39:37 +0000531
532 /* Consumption (upper layer) */
533 switch( option )
534 {
535 case 0:
536 /* Fetch (but not commit) the entire buffer. */
Hanno Becker88993962021-01-28 09:45:47 +0000537 TEST_ASSERT( mbedtls_mps_reader_get( &rd, sizeof( buf ), &tmp, NULL )
Hanno Beckercb2a88e2021-01-12 08:39:37 +0000538 == 0 );
539 ASSERT_COMPARE( tmp, 100, buf, 100 );
540 break;
541
542 case 1:
543 /* Fetch (but not commit) parts of the buffer. */
Hanno Becker88993962021-01-28 09:45:47 +0000544 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, buf, sizeof( buf ) / 2 );
547 break;
548
549 case 2:
550 /* Fetch and commit parts of the buffer, then
551 * fetch but not commit the rest of the buffer. */
Hanno Becker88993962021-01-28 09:45:47 +0000552 TEST_ASSERT( mbedtls_mps_reader_get( &rd, sizeof( buf ) / 2,
Hanno Beckercb2a88e2021-01-12 08:39:37 +0000553 &tmp, NULL ) == 0 );
554 ASSERT_COMPARE( tmp, sizeof( buf ) / 2, buf, sizeof( buf ) / 2 );
Hanno Becker88993962021-01-28 09:45:47 +0000555 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
556 TEST_ASSERT( mbedtls_mps_reader_get( &rd, sizeof( buf ) / 2,
Hanno Beckercb2a88e2021-01-12 08:39:37 +0000557 &tmp, NULL ) == 0 );
558 ASSERT_COMPARE( tmp, sizeof( buf ) / 2,
559 buf + sizeof( buf ) / 2,
560 sizeof( buf ) / 2 );
561 break;
562
563 default:
564 TEST_ASSERT( 0 );
565 break;
566 }
567
568 /* Wrapup */
Hanno Becker88993962021-01-28 09:45:47 +0000569 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) ==
Hanno Beckercb2a88e2021-01-12 08:39:37 +0000570 MBEDTLS_ERR_MPS_READER_DATA_LEFT );
Hanno Becker88993962021-01-28 09:45:47 +0000571 mbedtls_mps_reader_free( &rd );
Hanno Beckercb2a88e2021-01-12 08:39:37 +0000572}
573/* END_CASE */
Hanno Beckere1f173c2021-01-12 08:43:58 +0000574
575/* BEGIN_CASE depends_on:TEST_SUITE_MPS_READER */
576void mbedtls_mps_reader_reclaim_data_left_retry()
577{
578 /* This test exercises the behaviour of the MPS reader when an attempt
579 * by the producer to reclaim the reader fails because of more data pending
580 * to be processed, and the consumer subsequently fetches more data. */
581 unsigned char buf[100];
582 unsigned char *tmp;
Hanno Becker88993962021-01-28 09:45:47 +0000583 mbedtls_mps_reader rd;
Hanno Beckere1f173c2021-01-12 08:43:58 +0000584
Hanno Beckerb17212a2021-02-22 16:50:01 +0000585 for( size_t i=0; (unsigned) i < sizeof( buf ); i++ )
Hanno Beckere1f173c2021-01-12 08:43:58 +0000586 buf[i] = (unsigned char) i;
587
588 /* Preparation (lower layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000589 mbedtls_mps_reader_init( &rd, NULL, 0 );
590 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, buf, sizeof( buf ) ) == 0 );
Hanno Beckere1f173c2021-01-12 08:43:58 +0000591 /* Consumption (upper layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000592 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 50, &tmp, NULL ) == 0 );
Hanno Beckere1f173c2021-01-12 08:43:58 +0000593 ASSERT_COMPARE( tmp, 50, buf, 50 );
Hanno Becker88993962021-01-28 09:45:47 +0000594 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
595 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 50, &tmp, NULL ) == 0 );
Hanno Beckere1f173c2021-01-12 08:43:58 +0000596 ASSERT_COMPARE( tmp, 50, buf + 50, 50 );
597 /* Preparation */
Hanno Becker88993962021-01-28 09:45:47 +0000598 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) ==
Hanno Beckere1f173c2021-01-12 08:43:58 +0000599 MBEDTLS_ERR_MPS_READER_DATA_LEFT );
600 /* Consumption */
Hanno Becker88993962021-01-28 09:45:47 +0000601 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 50, &tmp, NULL ) == 0 );
Hanno Beckere1f173c2021-01-12 08:43:58 +0000602 ASSERT_COMPARE( tmp, 50, buf + 50, 50 );
Hanno Becker88993962021-01-28 09:45:47 +0000603 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Beckere1f173c2021-01-12 08:43:58 +0000604 /* Wrapup */
Hanno Becker88993962021-01-28 09:45:47 +0000605 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
606 mbedtls_mps_reader_free( &rd );
Hanno Beckere1f173c2021-01-12 08:43:58 +0000607}
608/* END_CASE */
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000609
610/* BEGIN_CASE depends_on:TEST_SUITE_MPS_READER */
611void mbedtls_mps_reader_multiple_pausing( int option )
612{
613 /* This test exercises the behaviour of the MPS reader
614 * in the following situation:
Hanno Becker88993962021-01-28 09:45:47 +0000615 * - A read request via `mbedtls_mps_reader_get()` can't
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000616 * be served and the reader is paused to accumulate
617 * the desired amount of data from the producer.
Hanno Becker5047b562021-02-22 16:52:02 +0000618 * - Once enough data is available, the consumer successfully
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000619 * reads the data from the reader, but afterwards exceeds
620 * the available data again - pausing is necessary for a
621 * second time.
622 */
623
624 unsigned char bufA[100], bufB[20], bufC[10];
625 unsigned char *tmp;
626 unsigned char acc[50];
627 mbedtls_mps_size_t tmp_len;
Hanno Becker88993962021-01-28 09:45:47 +0000628 mbedtls_mps_reader rd;
Hanno Beckerb17212a2021-02-22 16:50:01 +0000629 for( size_t i=0; (unsigned) i < sizeof( bufA ); i++ )
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000630 bufA[i] = (unsigned char) i;
Hanno Beckerb17212a2021-02-22 16:50:01 +0000631 for( size_t i=0; (unsigned) i < sizeof( bufB ); i++ )
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000632 bufB[i] = ~ ((unsigned char) i);
Hanno Beckerb17212a2021-02-22 16:50:01 +0000633 for( size_t i=0; (unsigned) i < sizeof( bufC ); i++ )
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000634 bufC[i] = ~ ((unsigned char) i);
635
636 /* Preparation (lower layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000637 mbedtls_mps_reader_init( &rd, acc, sizeof( acc ) );
638 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufA, sizeof( bufA ) ) == 0 );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000639
640 /* Consumption (upper layer) */
641 /* Ask for more than what's available. */
Hanno Becker88993962021-01-28 09:45:47 +0000642 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 80, &tmp, NULL ) == 0 );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000643 ASSERT_COMPARE( tmp, 80, bufA, 80 );
Hanno Becker88993962021-01-28 09:45:47 +0000644 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
645 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, NULL ) == 0 );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000646 ASSERT_COMPARE( tmp, 10, bufA + 80, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000647 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) ==
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000648 MBEDTLS_ERR_MPS_READER_OUT_OF_DATA );
649
650 /* Preparation */
Hanno Becker88993962021-01-28 09:45:47 +0000651 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
652 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufB, sizeof( bufB ) ) == 0 );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000653
654 switch( option )
655 {
656 case 0: /* Fetch same chunks, commit afterwards, and
657 * then exceed bounds of new buffer; accumulator
658 * large enough. */
659
660 /* Consume */
Hanno Becker88993962021-01-28 09:45:47 +0000661 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, &tmp_len ) == 0 );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000662 ASSERT_COMPARE( tmp, tmp_len, bufA + 80, 10 );
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, bufA + 90, 10 );
665 ASSERT_COMPARE( tmp + 10, 10, bufB, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000666 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
667 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) ==
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000668 MBEDTLS_ERR_MPS_READER_OUT_OF_DATA );
669
670 /* Prepare */
Hanno Becker88993962021-01-28 09:45:47 +0000671 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
672 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufC, sizeof( bufC ) ) == 0 );;
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000673
674 /* Consume */
Hanno Becker88993962021-01-28 09:45:47 +0000675 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) == 0 );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000676 ASSERT_COMPARE( tmp, 10, bufB + 10, 10 );
677 ASSERT_COMPARE( tmp + 10, 10, bufC, 10 );
678 break;
679
680 case 1: /* Fetch same chunks, commit afterwards, and
681 * then exceed bounds of new buffer; accumulator
682 * not large enough. */
Hanno Becker88993962021-01-28 09:45:47 +0000683 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, NULL ) == 0 );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000684 ASSERT_COMPARE( tmp, 10, bufA + 80, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000685 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) == 0 );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000686 ASSERT_COMPARE( tmp, 10, bufA + 90, 10 );
687 ASSERT_COMPARE( tmp + 10, 10, bufB, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000688 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
689 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 51, &tmp, NULL ) ==
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000690 MBEDTLS_ERR_MPS_READER_OUT_OF_DATA );
691
692 /* Prepare */
Hanno Becker88993962021-01-28 09:45:47 +0000693 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) ==
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000694 MBEDTLS_ERR_MPS_READER_ACCUMULATOR_TOO_SMALL );
695 break;
696
697 case 2: /* Fetch same chunks, don't commit afterwards, and
698 * then exceed bounds of new buffer; accumulator
699 * large enough. */
Hanno Becker88993962021-01-28 09:45:47 +0000700 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, NULL ) == 0 );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000701 ASSERT_COMPARE( tmp, 10, bufA + 80, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000702 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) == 0 );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000703 ASSERT_COMPARE( tmp, 10, bufA + 90, 10 );
704 ASSERT_COMPARE( tmp + 10, 10, bufB, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000705 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) ==
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000706 MBEDTLS_ERR_MPS_READER_OUT_OF_DATA );
707
708 /* Prepare */
Hanno Becker88993962021-01-28 09:45:47 +0000709 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
710 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufC, sizeof( bufC ) ) == 0 );;
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000711
712 /* Consume */
Hanno Becker88993962021-01-28 09:45:47 +0000713 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 50, &tmp, NULL ) == 0 );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000714 ASSERT_COMPARE( tmp, 20, bufA + 80, 20 );
715 ASSERT_COMPARE( tmp + 20, 20, bufB, 20 );
716 ASSERT_COMPARE( tmp + 40, 10, bufC, 10 );
717 break;
718
719 case 3: /* Fetch same chunks, don't commit afterwards, and
720 * then exceed bounds of new buffer; accumulator
721 * not large enough. */
Hanno Becker88993962021-01-28 09:45:47 +0000722 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, NULL ) == 0 );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000723 ASSERT_COMPARE( tmp, 10, bufA + 80, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000724 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) == 0 );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000725 ASSERT_COMPARE( tmp, 10, bufA + 90, 10 );
726 ASSERT_COMPARE( tmp + 10, 10, bufB, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000727 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 21, &tmp, NULL ) ==
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000728 MBEDTLS_ERR_MPS_READER_OUT_OF_DATA );
729
730 /* Prepare */
Hanno Becker88993962021-01-28 09:45:47 +0000731 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) ==
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000732 MBEDTLS_ERR_MPS_READER_ACCUMULATOR_TOO_SMALL );
733 break;
734
735 default:
736 TEST_ASSERT( 0 );
737 break;
738 }
739
Hanno Becker88993962021-01-28 09:45:47 +0000740 mbedtls_mps_reader_free( &rd );
Hanno Beckerb6fdd352021-01-12 09:17:56 +0000741}
742/* END_CASE */
Hanno Becker714cbeb2021-01-12 09:23:15 +0000743
744/* BEGIN_CASE depends_on:TEST_SUITE_MPS_READER:MBEDTLS_MPS_STATE_VALIDATION */
745void mbedtls_mps_reader_random_usage( int num_out_chunks,
746 int max_chunk_size,
747 int max_request,
748 int acc_size )
749
750{
751 /* Randomly pass a reader object back and forth between lower and
752 * upper layer and let each of them call the respective reader API
753 * functions in a random fashion.
754 *
755 * On the lower layer, we're tracking and concatenating
756 * the data passed to successful feed calls.
757 *
758 * For the upper layer, we track and concatenate buffers
759 * obtained from successful get calls.
760 *
761 * As long as the lower layer calls reclaim at least once, (resetting the
762 * fetched but not-yet-committed data), this should always lead to the same
763 * stream of outgoing/incoming data for the lower/upper layers, even if
764 * most of the random calls fail.
765 *
766 * NOTE: This test uses rand() for random data, which is not optimal.
767 * Instead, it would be better to get the random data from a
768 * static buffer. This both eases reproducibility and allows
769 * simple conversion to a fuzz target.
770 */
771 int ret;
772 unsigned char *acc = NULL;
773 unsigned char *outgoing = NULL, *incoming = NULL;
774 unsigned char *cur_chunk = NULL;
775 size_t cur_out_chunk, out_pos, in_commit, in_fetch;
776 int rand_op; /* Lower layer:
777 * - Reclaim (0)
778 * - Feed (1)
779 * Upper layer:
780 * - Get, do tolerate smaller output (0)
781 * - Get, don't tolerate smaller output (1)
782 * - Commit (2) */
783 int mode = 0; /* Lower layer (0) or Upper layer (1) */
784 int reclaimed = 1; /* Have to call reclaim at least once before
785 * returning the reader to the upper layer. */
Hanno Becker88993962021-01-28 09:45:47 +0000786 mbedtls_mps_reader rd;
Hanno Becker714cbeb2021-01-12 09:23:15 +0000787
788 if( acc_size > 0 )
789 {
790 ASSERT_ALLOC( acc, acc_size );
791 }
792
793 /* This probably needs to be changed because we want
794 * our tests to be deterministic. */
795 // srand( time( NULL ) );
796
797 ASSERT_ALLOC( outgoing, num_out_chunks * max_chunk_size );
798 ASSERT_ALLOC( incoming, num_out_chunks * max_chunk_size );
799
Hanno Becker88993962021-01-28 09:45:47 +0000800 mbedtls_mps_reader_init( &rd, acc, acc_size );
Hanno Becker714cbeb2021-01-12 09:23:15 +0000801
802 cur_out_chunk = 0;
803 in_commit = 0;
804 in_fetch = 0;
805 out_pos = 0;
806 while( cur_out_chunk < (unsigned) num_out_chunks )
807 {
808 if( mode == 0 )
809 {
810 /* Choose randomly between reclaim and feed */
811 rand_op = rand() % 2;
812
813 if( rand_op == 0 )
814 {
815 /* Reclaim */
Hanno Becker88993962021-01-28 09:45:47 +0000816 ret = mbedtls_mps_reader_reclaim( &rd, NULL );
Hanno Becker714cbeb2021-01-12 09:23:15 +0000817
818 if( ret == 0 )
819 {
820 TEST_ASSERT( cur_chunk != NULL );
821 mbedtls_free( cur_chunk );
822 cur_chunk = NULL;
823 }
824 reclaimed = 1;
825 }
826 else
827 {
828 /* Feed reader with a random chunk */
829 unsigned char *tmp = NULL;
830 size_t tmp_size;
831 if( cur_out_chunk == (unsigned) num_out_chunks )
832 continue;
833
834 tmp_size = ( rand() % max_chunk_size ) + 1;
835 ASSERT_ALLOC( tmp, tmp_size );
836
837 TEST_ASSERT( mbedtls_test_rnd_std_rand( NULL, tmp, tmp_size ) == 0 );
Hanno Becker88993962021-01-28 09:45:47 +0000838 ret = mbedtls_mps_reader_feed( &rd, tmp, tmp_size );
Hanno Becker714cbeb2021-01-12 09:23:15 +0000839
840 if( ret == 0 || ret == MBEDTLS_ERR_MPS_READER_NEED_MORE )
841 {
842 cur_out_chunk++;
843 memcpy( outgoing + out_pos, tmp, tmp_size );
844 out_pos += tmp_size;
845 }
846
847 if( ret == 0 )
848 {
849 TEST_ASSERT( cur_chunk == NULL );
850 cur_chunk = tmp;
851 }
852 else
853 {
854 mbedtls_free( tmp );
855 }
856
857 }
858
859 /* Randomly switch to consumption mode if reclaim
860 * was called at least once. */
861 if( reclaimed == 1 && rand() % 3 == 0 )
862 {
863 in_fetch = 0;
864 mode = 1;
865 }
866 }
867 else
868 {
869 /* Choose randomly between get tolerating fewer data,
870 * get not tolerating fewer data, and commit. */
871 rand_op = rand() % 3;
872 if( rand_op == 0 || rand_op == 1 )
873 {
874 mbedtls_mps_size_t get_size, real_size;
875 unsigned char *chunk_get;
876 get_size = ( rand() % max_request ) + 1;
877 if( rand_op == 0 )
878 {
Hanno Becker88993962021-01-28 09:45:47 +0000879 ret = mbedtls_mps_reader_get( &rd, get_size, &chunk_get,
Hanno Becker714cbeb2021-01-12 09:23:15 +0000880 &real_size );
881 }
882 else
883 {
884 real_size = get_size;
Hanno Becker88993962021-01-28 09:45:47 +0000885 ret = mbedtls_mps_reader_get( &rd, get_size, &chunk_get, NULL );
Hanno Becker714cbeb2021-01-12 09:23:15 +0000886 }
887
888 /* Check if output is in accordance with what was written */
889 if( ret == 0 )
890 {
891 memcpy( incoming + in_commit + in_fetch,
892 chunk_get, real_size );
893 TEST_ASSERT( memcmp( incoming + in_commit + in_fetch,
894 outgoing + in_commit + in_fetch,
895 real_size ) == 0 );
896 in_fetch += real_size;
897 }
898 }
899 else if( rand_op == 2 ) /* Commit */
900 {
Hanno Becker88993962021-01-28 09:45:47 +0000901 ret = mbedtls_mps_reader_commit( &rd );
Hanno Becker714cbeb2021-01-12 09:23:15 +0000902 if( ret == 0 )
903 {
904 in_commit += in_fetch;
905 in_fetch = 0;
906 }
907 }
908
909 /* Randomly switch back to preparation */
910 if( rand() % 3 == 0 )
911 {
912 reclaimed = 0;
913 mode = 0;
914 }
915 }
916 }
917
918 /* Cleanup */
Hanno Becker88993962021-01-28 09:45:47 +0000919 mbedtls_mps_reader_free( &rd );
Hanno Becker714cbeb2021-01-12 09:23:15 +0000920 mbedtls_free( incoming );
921 mbedtls_free( outgoing );
922 mbedtls_free( acc );
923 mbedtls_free( cur_chunk );
924}
925/* END_CASE */
Hanno Becker223b72e2021-01-12 09:31:31 +0000926
927/* BEGIN_CASE depends_on:TEST_SUITE_MPS_READER */
928void mbedtls_reader_inconsistent_usage( int option )
929{
930 /* This test exercises the behaviour of the MPS reader
931 * in the following situation:
932 * - The consumer asks for more data than what's available
933 * - The reader is paused and receives more data from the
934 * producer until the original read request can be fulfilled.
935 * - The consumer does not repeat the original request but
936 * requests data in a different way.
937 *
938 * The reader does not guarantee that inconsistent read requests
939 * after pausing will succeed, and this test triggers some cases
940 * where the request fails.
941 */
942
943 unsigned char bufA[100], bufB[100];
944 unsigned char *tmp;
945 unsigned char acc[40];
Hanno Becker88993962021-01-28 09:45:47 +0000946 mbedtls_mps_reader rd;
Hanno Becker223b72e2021-01-12 09:31:31 +0000947 int success = 0;
Hanno Beckerb17212a2021-02-22 16:50:01 +0000948 for( size_t i=0; (unsigned) i < sizeof( bufA ); i++ )
Hanno Becker223b72e2021-01-12 09:31:31 +0000949 bufA[i] = (unsigned char) i;
Hanno Beckerb17212a2021-02-22 16:50:01 +0000950 for( size_t i=0; (unsigned) i < sizeof( bufB ); i++ )
Hanno Becker223b72e2021-01-12 09:31:31 +0000951 bufB[i] = ~ ((unsigned char) i);
952
953 /* Preparation (lower layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000954 mbedtls_mps_reader_init( &rd, acc, sizeof( acc ) );
955 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufA, sizeof( bufA ) ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +0000956 /* Consumption (upper layer) */
Hanno Becker88993962021-01-28 09:45:47 +0000957 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 80, &tmp, NULL ) == 0 );
958 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
959 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, NULL ) == 0 );
960 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 20, &tmp, NULL ) ==
Hanno Becker223b72e2021-01-12 09:31:31 +0000961 MBEDTLS_ERR_MPS_READER_OUT_OF_DATA );
962 /* Preparation */
Hanno Becker88993962021-01-28 09:45:47 +0000963 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
964 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, bufB, sizeof( bufB ) ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +0000965 /* Consumption */
966 switch( option )
967 {
968 case 0:
969 /* Ask for buffered data in a single chunk, no commit */
Hanno Becker88993962021-01-28 09:45:47 +0000970 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 30, &tmp, NULL ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +0000971 ASSERT_COMPARE( tmp, 20, bufA + 80, 20 );
972 ASSERT_COMPARE( tmp + 20, 10, bufB, 10 );
973 success = 1;
974 break;
975
976 case 1:
977 /* Ask for buffered data in a single chunk, with commit */
Hanno Becker88993962021-01-28 09:45:47 +0000978 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 30, &tmp, NULL ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +0000979 ASSERT_COMPARE( tmp, 20, bufA + 80, 20 );
980 ASSERT_COMPARE( tmp + 20, 10, bufB, 10 );
Hanno Becker88993962021-01-28 09:45:47 +0000981 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +0000982 success = 1;
983 break;
984
985 case 2:
986 /* Ask for more than was requested when pausing, #1 */
Hanno Becker88993962021-01-28 09:45:47 +0000987 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 31, &tmp, NULL ) ==
Hanno Becker223b72e2021-01-12 09:31:31 +0000988 MBEDTLS_ERR_MPS_READER_INCONSISTENT_REQUESTS );
989 break;
990
991 case 3:
992 /* Ask for more than was requested when pausing #2 */
Hanno Becker88993962021-01-28 09:45:47 +0000993 TEST_ASSERT( mbedtls_mps_reader_get( &rd, (mbedtls_mps_size_t) -1, &tmp, NULL ) ==
Hanno Becker223b72e2021-01-12 09:31:31 +0000994 MBEDTLS_ERR_MPS_READER_INCONSISTENT_REQUESTS );
995 break;
996
997 case 4:
998 /* Asking for buffered data in different
999 * chunks than before CAN fail. */
Hanno Becker88993962021-01-28 09:45:47 +00001000 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 15, &tmp, NULL ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +00001001 ASSERT_COMPARE( tmp, 15, bufA + 80, 15 );
Hanno Becker88993962021-01-28 09:45:47 +00001002 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 10, &tmp, NULL ) ==
Hanno Becker223b72e2021-01-12 09:31:31 +00001003 MBEDTLS_ERR_MPS_READER_INCONSISTENT_REQUESTS );
1004 break;
1005
1006 case 5:
1007 /* Asking for buffered data different chunks
1008 * than before NEED NOT fail - no commits */
Hanno Becker88993962021-01-28 09:45:47 +00001009 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 15, &tmp, NULL ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +00001010 ASSERT_COMPARE( tmp, 15, bufA + 80, 15 );
Hanno Becker88993962021-01-28 09:45:47 +00001011 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 6:
1018 /* Asking for buffered data different chunks
1019 * than before NEED NOT fail - intermediate 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_commit( &rd ) == 0 );
1023 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 15, &tmp, NULL ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +00001024 ASSERT_COMPARE( tmp, 5, bufA + 95, 5 );
1025 ASSERT_COMPARE( tmp + 5, 10, bufB, 10 );
1026 success = 1;
1027 break;
1028
1029 case 7:
1030 /* Asking for buffered data different chunks
1031 * than before NEED NOT fail - 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 );
Hanno Becker223b72e2021-01-12 09:31:31 +00001035 ASSERT_COMPARE( tmp, 5, bufA + 95, 5 );
1036 ASSERT_COMPARE( tmp + 5, 10, bufB, 10 );
Hanno Becker88993962021-01-28 09:45:47 +00001037 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +00001038 success = 1;
1039 break;
1040
1041 case 8:
1042 /* Asking for buffered data different chunks
1043 * than before NEED NOT fail - intermediate & end commit */
Hanno Becker88993962021-01-28 09:45:47 +00001044 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 15, &tmp, NULL ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +00001045 ASSERT_COMPARE( tmp, 15, bufA + 80, 15 );
Hanno Becker88993962021-01-28 09:45:47 +00001046 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 15, &tmp, NULL ) == 0 );
1047 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +00001048 ASSERT_COMPARE( tmp, 5, bufA + 95, 5 );
1049 ASSERT_COMPARE( tmp + 5, 10, bufB, 10 );
Hanno Becker88993962021-01-28 09:45:47 +00001050 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +00001051 success = 1;
1052 break;
1053
1054 default:
1055 TEST_ASSERT( 0 );
1056 break;
1057 }
1058
1059 if( success == 1 )
1060 {
1061 /* In all succeeding cases, fetch the rest of the second buffer. */
Hanno Becker88993962021-01-28 09:45:47 +00001062 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 90, &tmp, NULL ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +00001063 ASSERT_COMPARE( tmp, 90, bufB + 10, 90 );
Hanno Becker88993962021-01-28 09:45:47 +00001064 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +00001065
1066 /* Wrapup */
Hanno Becker88993962021-01-28 09:45:47 +00001067 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
Hanno Becker223b72e2021-01-12 09:31:31 +00001068 }
1069
1070 /* Wrapup */
Hanno Becker88993962021-01-28 09:45:47 +00001071 mbedtls_mps_reader_free( &rd );
Hanno Becker223b72e2021-01-12 09:31:31 +00001072}
1073/* END_CASE */
Hanno Becker2b8bad32021-01-12 09:40:05 +00001074
1075/* BEGIN_CASE depends_on:TEST_SUITE_MPS_READER */
Hanno Becker15da2fc2021-02-22 16:57:14 +00001076void mbedtls_mps_reader_feed_empty()
Hanno Becker2b8bad32021-01-12 09:40:05 +00001077{
1078 /* This test exercises the behaviour of the reader when it is
Hanno Becker5047b562021-02-22 16:52:02 +00001079 * fed with a NULL buffer. */
Hanno Becker2b8bad32021-01-12 09:40:05 +00001080 unsigned char buf[100];
1081 unsigned char *tmp;
Hanno Becker88993962021-01-28 09:45:47 +00001082 mbedtls_mps_reader rd;
Hanno Beckerb17212a2021-02-22 16:50:01 +00001083 for( size_t i=0; (unsigned) i < sizeof( buf ); i++ )
Hanno Becker2b8bad32021-01-12 09:40:05 +00001084 buf[i] = (unsigned char) i;
1085
1086 /* Preparation (lower layer) */
Hanno Becker88993962021-01-28 09:45:47 +00001087 mbedtls_mps_reader_init( &rd, NULL, 0 );
Hanno Becker2b8bad32021-01-12 09:40:05 +00001088
Hanno Becker15da2fc2021-02-22 16:57:14 +00001089 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, NULL, sizeof( buf ) ) ==
1090 MBEDTLS_ERR_MPS_READER_INVALID_ARG );
1091
Hanno Becker2b8bad32021-01-12 09:40:05 +00001092 /* Subsequent feed-calls should still succeed. */
Hanno Becker88993962021-01-28 09:45:47 +00001093 TEST_ASSERT( mbedtls_mps_reader_feed( &rd, buf, sizeof( buf ) ) == 0 );
Hanno Becker2b8bad32021-01-12 09:40:05 +00001094
1095 /* Consumption (upper layer) */
Hanno Becker88993962021-01-28 09:45:47 +00001096 TEST_ASSERT( mbedtls_mps_reader_get( &rd, 100, &tmp, NULL ) == 0 );
Hanno Becker2b8bad32021-01-12 09:40:05 +00001097 ASSERT_COMPARE( tmp, 100, buf, 100 );
Hanno Becker88993962021-01-28 09:45:47 +00001098 TEST_ASSERT( mbedtls_mps_reader_commit( &rd ) == 0 );
Hanno Becker2b8bad32021-01-12 09:40:05 +00001099
1100 /* Wrapup */
Hanno Becker88993962021-01-28 09:45:47 +00001101 TEST_ASSERT( mbedtls_mps_reader_reclaim( &rd, NULL ) == 0 );
1102 mbedtls_mps_reader_free( &rd );
Hanno Becker2b8bad32021-01-12 09:40:05 +00001103}
1104/* END_CASE */