Greenbone Vulnerability Management Libraries 22.32.0
streamvalidator_tests.c
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2019-2023 Greenbone AG
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later
4 */
5
6#include "streamvalidator.h"
7
8#include <assert.h>
9#include <cgreen/cgreen.h>
10#include <cgreen/mocks.h>
11
12#define VALID_DATA "This should be valid...."
13#define TOO_SHORT_DATA "This is too short!"
14#define TOO_LONG_DATA "This text is longer than expected!"
15#define INVALID_DATA "This shouldn't be valid!"
16#define VALID_DATA_HASH \
17 "sha256:4ae8f10c9e9551173520b7a675e9caba163007edf04dbbd06022bf61ad3fe4fb"
18
19Describe (streamvalidator);
20BeforeEach (streamvalidator)
21{
22}
23AfterEach (streamvalidator)
24{
25}
26
27Ensure (streamvalidator, accepts_valid_data)
28{
29 gvm_stream_validator_t validator = NULL;
30
32 VALID_DATA_HASH, strlen (VALID_DATA), &validator),
34 assert_equal (
37 assert_equal (gvm_stream_validator_end (validator), GVM_STREAM_VALIDATOR_OK);
38
39 gvm_stream_validator_free (validator);
40}
41
42Ensure (streamvalidator, accepts_valid_data_after_multiple_writes)
43{
44 gvm_stream_validator_t validator = NULL;
45
47 VALID_DATA_HASH, strlen (VALID_DATA), &validator),
49 assert_equal (gvm_stream_validator_write (validator, VALID_DATA, 5),
51 assert_equal (gvm_stream_validator_write (validator, VALID_DATA + 5, 5),
53 assert_equal (gvm_stream_validator_write (validator, VALID_DATA + 10,
54 strlen (VALID_DATA) - 10),
56 assert_equal (gvm_stream_validator_end (validator), GVM_STREAM_VALIDATOR_OK);
57
58 gvm_stream_validator_free (validator);
59}
60
61Ensure (streamvalidator, accepts_valid_data_after_rewind)
62{
63 gvm_stream_validator_t validator = NULL;
64
66 VALID_DATA_HASH, strlen (VALID_DATA), &validator),
68 assert_equal (gvm_stream_validator_write (validator, TOO_SHORT_DATA,
69 strlen (TOO_SHORT_DATA)),
72 assert_equal (
75 assert_equal (gvm_stream_validator_end (validator), GVM_STREAM_VALIDATOR_OK);
76
77 gvm_stream_validator_free (validator);
78}
79
80Ensure (streamvalidator, rejects_too_long_data)
81{
82 gvm_stream_validator_t validator = NULL;
83
85 VALID_DATA_HASH, strlen (VALID_DATA), &validator),
87 assert_equal (gvm_stream_validator_write (validator, TOO_LONG_DATA,
88 strlen (TOO_LONG_DATA)),
90 assert_not_equal (gvm_stream_validator_end (validator),
92
93 gvm_stream_validator_free (validator);
94}
95
96Ensure (streamvalidator, rejects_too_short_data)
97{
98 gvm_stream_validator_t validator = NULL;
99
101 VALID_DATA_HASH, strlen (VALID_DATA), &validator),
103 assert_equal (gvm_stream_validator_write (validator, TOO_SHORT_DATA,
104 strlen (TOO_SHORT_DATA)),
106 assert_equal (gvm_stream_validator_end (validator),
108
109 gvm_stream_validator_free (validator);
110}
111
112Ensure (streamvalidator, rejects_hash_mismatch)
113{
114 gvm_stream_validator_t validator = NULL;
115
117 VALID_DATA_HASH, strlen (VALID_DATA), &validator),
119 assert_equal (
122 assert_equal (gvm_stream_validator_end (validator),
124
125 gvm_stream_validator_free (validator);
126}
127
128Ensure (streamvalidator, init_rejects_empty_hash)
129{
130 gvm_stream_validator_t validator = NULL;
131
132 assert_equal (gvm_stream_validator_with_size_new ("", 123, &validator),
134 assert_equal (validator, NULL);
135}
136
137Ensure (streamvalidator, init_rejects_invalid_syntax_hashes)
138{
139 gvm_stream_validator_t validator = NULL;
140
141 assert_equal (gvm_stream_validator_with_size_new ("0123", 123, &validator),
143 assert_equal (validator, NULL);
144
145 assert_equal (gvm_stream_validator_with_size_new ("sha256", 123, &validator),
147 assert_equal (validator, NULL);
148}
149
150Ensure (streamvalidator, init_rejects_invalid_algo_hashes)
151{
152 gvm_stream_validator_t validator = NULL;
153
154 assert_equal (gvm_stream_validator_with_size_new (":0123", 123, &validator),
156 assert_equal (validator, NULL);
157
158 assert_equal (
159 gvm_stream_validator_with_size_new ("xyz:0123", 123, &validator),
161 assert_equal (validator, NULL);
162}
163
164Ensure (streamvalidator, init_rejects_invalid_value_hashes)
165{
166 gvm_stream_validator_t validator = NULL;
167
168 assert_equal (gvm_stream_validator_with_size_new ("sha256:", 123, &validator),
170 assert_equal (validator, NULL);
171
172 assert_equal (
173 gvm_stream_validator_with_size_new ("sha256:xyz", 123, &validator),
175 assert_equal (validator, NULL);
176
177 assert_equal (
178 gvm_stream_validator_with_size_new ("sha256:123", 123, &validator),
180 assert_equal (validator, NULL);
181
182 assert_equal (
183 gvm_stream_validator_with_size_new ("sha256:0123ab", 123, &validator),
185 assert_equal (validator, NULL);
186}
187
188Ensure (streamvalidator, accepts_valid_checksum_only_without_size)
189{
190 gvm_stream_validator_t validator = NULL;
191
195
196 assert_equal (
197 gvm_stream_validator_write (validator, VALID_DATA, strlen (VALID_DATA)),
199
200 assert_equal (gvm_stream_validator_end (validator), GVM_STREAM_VALIDATOR_OK);
201
202 gvm_stream_validator_free (validator);
203}
204
205Ensure (streamvalidator,
206 rejects_checksum_with_extra_colon_suffix_as_invalid_hex)
207{
208 gvm_stream_validator_t validator = NULL;
209
210 assert_equal (
214 assert_equal (validator, NULL);
215
216 assert_equal (
220 assert_equal (validator, NULL);
221}
222
223Ensure (streamvalidator, enforces_size_from_arg_when_no_suffix)
224{
225 gvm_stream_validator_t validator = NULL;
226
228 VALID_DATA_HASH, strlen (VALID_DATA), &validator),
230 assert_equal (
231 gvm_stream_validator_write (validator, VALID_DATA, strlen (VALID_DATA) - 1),
233 assert_equal (gvm_stream_validator_end (validator),
235 gvm_stream_validator_free (validator);
236
238 VALID_DATA_HASH, strlen (VALID_DATA), &validator),
240 assert_equal (gvm_stream_validator_write (validator, TOO_LONG_DATA,
241 strlen (TOO_LONG_DATA)),
243 assert_not_equal (gvm_stream_validator_end (validator),
245 gvm_stream_validator_free (validator);
246
248 VALID_DATA_HASH, strlen (VALID_DATA), &validator),
250 assert_equal (
251 gvm_stream_validator_write (validator, VALID_DATA, strlen (VALID_DATA)),
253 assert_equal (gvm_stream_validator_end (validator), GVM_STREAM_VALIDATOR_OK);
254 gvm_stream_validator_free (validator);
255}
256
257Ensure (streamvalidator, checksum_only_extra_bytes_yield_hash_mismatch)
258{
259 gvm_stream_validator_t validator = NULL;
260
264
265 assert_equal (gvm_stream_validator_write (validator, TOO_LONG_DATA,
266 strlen (TOO_LONG_DATA)),
268
269 assert_equal (gvm_stream_validator_end (validator),
271
272 gvm_stream_validator_free (validator);
273}
274
275Ensure (streamvalidator, init_rejects_invalid_syntax_algo_and_value)
276{
277 gvm_stream_validator_t validator = NULL;
278
279 assert_equal (gvm_stream_validator_with_size_new ("0123", 123, &validator),
281 assert_equal (validator, NULL);
282 assert_equal (gvm_stream_validator_with_size_new ("sha256", 123, &validator),
284 assert_equal (validator, NULL);
285
286 assert_equal (gvm_stream_validator_with_size_new (":0123", 123, &validator),
288 assert_equal (validator, NULL);
289 assert_equal (
290 gvm_stream_validator_with_size_new ("xyz:0123", 123, &validator),
292 assert_equal (validator, NULL);
293
294 assert_equal (gvm_stream_validator_with_size_new ("sha256:", 123, &validator),
296 assert_equal (validator, NULL);
297 assert_equal (
298 gvm_stream_validator_with_size_new ("sha256:xyz", 123, &validator),
300 assert_equal (validator, NULL);
301 assert_equal (
302 gvm_stream_validator_with_size_new ("sha256:123", 123, &validator),
304 assert_equal (validator, NULL);
305 assert_equal (
306 gvm_stream_validator_with_size_new ("sha256:0123ab", 123, &validator),
308 assert_equal (validator, NULL);
309
310 assert_equal (
312 VALID_DATA_HASH ":12abc", GVM_STREAM_VALIDATOR_NO_SIZE, &validator),
314 assert_equal (validator, NULL);
315 assert_equal (
319 assert_equal (validator, NULL);
320}
321
322Ensure (streamvalidator, return_str_ok_is_null)
323{
325 assert_equal (s, NULL);
326}
327
328Ensure (streamvalidator, return_str_maps_known_codes)
329{
330 assert_string_equal (
332 "internal error");
333
334 assert_string_equal (
336 "too short");
337
338 assert_string_equal (
340 "too long");
341
342 assert_string_equal (
344 "invalid hash syntax");
345
346 assert_string_equal (gvm_stream_validator_return_str (
348 "invalid or unsupported hash algorithm");
349
350 assert_string_equal (
352 "invalid hash value");
353
354 assert_string_equal (
356 "hash does not match");
357}
358
359Ensure (streamvalidator, return_str_unknown_code_yields_unknown_error)
360{
361 const char *s =
363 assert_string_equal (s, "unknown error");
364}
365
366Ensure (streamvalidator, wrapper_checksum_only_accepts_valid_data)
367{
368 gvm_stream_validator_t v = NULL;
369
370 assert_equal (gvm_stream_validator_new (VALID_DATA_HASH, &v),
372
373 assert_equal (gvm_stream_validator_write (v, VALID_DATA, strlen (VALID_DATA)),
375
377
379}
380
381Ensure (streamvalidator, wrapper_checksum_only_does_not_enforce_size)
382{
383 gvm_stream_validator_t v = NULL;
384
385 assert_equal (gvm_stream_validator_new (VALID_DATA_HASH, &v),
387
388 assert_equal (
391
392 assert_equal (gvm_stream_validator_end (v),
394
396}
397
398Ensure (streamvalidator, wrapper_rejects_invalid_hash_syntax)
399{
400 gvm_stream_validator_t v = NULL;
401
402 assert_equal (gvm_stream_validator_new ("sha256", &v),
404 assert_equal (v, NULL);
405
406 assert_equal (gvm_stream_validator_new ("", &v),
408 assert_equal (v, NULL);
409}
410
411int
412main (int argc, char **argv)
413{
414 int ret;
415 TestSuite *suite;
416
417 suite = create_test_suite ();
418
419 add_test_with_context (suite, streamvalidator, accepts_valid_data);
420 add_test_with_context (suite, streamvalidator,
421 accepts_valid_data_after_multiple_writes);
422 add_test_with_context (suite, streamvalidator,
423 accepts_valid_data_after_rewind);
424
425 add_test_with_context (suite, streamvalidator, rejects_too_long_data);
426 add_test_with_context (suite, streamvalidator, rejects_too_short_data);
427 add_test_with_context (suite, streamvalidator, rejects_hash_mismatch);
428
429 add_test_with_context (suite, streamvalidator, init_rejects_empty_hash);
430 add_test_with_context (suite, streamvalidator,
431 init_rejects_invalid_syntax_hashes);
432 add_test_with_context (suite, streamvalidator,
433 init_rejects_invalid_algo_hashes);
434 add_test_with_context (suite, streamvalidator,
435 init_rejects_invalid_value_hashes);
436 add_test_with_context (suite, streamvalidator,
437 accepts_valid_checksum_only_without_size);
438 add_test_with_context (suite, streamvalidator,
439 accepts_valid_checksum_only_without_size);
440 add_test_with_context (
441 suite, streamvalidator,
442 rejects_checksum_with_extra_colon_suffix_as_invalid_hex);
443 add_test_with_context (suite, streamvalidator,
444 enforces_size_from_arg_when_no_suffix);
445 add_test_with_context (suite, streamvalidator,
446 checksum_only_extra_bytes_yield_hash_mismatch);
447 add_test_with_context (suite, streamvalidator,
448 init_rejects_invalid_syntax_algo_and_value);
449 add_test_with_context (suite, streamvalidator, return_str_ok_is_null);
450 add_test_with_context (suite, streamvalidator, return_str_maps_known_codes);
451 add_test_with_context (suite, streamvalidator,
452 return_str_unknown_code_yields_unknown_error);
453 add_test_with_context (suite, streamvalidator,
454 wrapper_checksum_only_accepts_valid_data);
455 add_test_with_context (suite, streamvalidator,
456 wrapper_checksum_only_does_not_enforce_size);
457 add_test_with_context (suite, streamvalidator,
458 wrapper_rejects_invalid_hash_syntax);
459
460 if (argc > 1)
461 ret = run_single_test (suite, argv[1], create_text_reporter ());
462 else
463 ret = run_test_suite (suite, create_text_reporter ());
464
465 destroy_test_suite (suite);
466
467 return ret;
468}
void gvm_stream_validator_rewind(gvm_stream_validator_t validator)
Rewind the validation state of a stream validator while keeping the expected hash and data size.
void gvm_stream_validator_free(gvm_stream_validator_t validator)
Free a stream validator and all of its fields.
gvm_stream_validator_return_t gvm_stream_validator_new(const char *expected_hash_str, gvm_stream_validator_t *validator_out)
Allocate and initialize a checksum-only stream validator.
const char * gvm_stream_validator_return_str(gvm_stream_validator_return_t value)
Gets a string representation of a gvm_stream_validator_return_t.
gvm_stream_validator_return_t gvm_stream_validator_with_size_new(const char *expected_hash_str, size_t expected_size, gvm_stream_validator_t *validator_out)
Allocate and initialize a new data stream validator.
gvm_stream_validator_return_t gvm_stream_validator_write(gvm_stream_validator_t validator, const char *data, size_t length)
Write data to a validator, updating the hash state and current size.
gvm_stream_validator_return_t gvm_stream_validator_end(gvm_stream_validator_t validator)
Signal the end of data input into a validator and produce the result of the validation.
Data stream validation headers.
#define GVM_STREAM_VALIDATOR_NO_SIZE
struct gvm_stream_validator * gvm_stream_validator_t
Pointer to an opaque stream validator data structure.
gvm_stream_validator_return_t
@ GVM_STREAM_VALIDATOR_INVALID_HASH_ALGORITHM
@ GVM_STREAM_VALIDATOR_HASH_MISMATCH
@ GVM_STREAM_VALIDATOR_DATA_TOO_SHORT
@ GVM_STREAM_VALIDATOR_DATA_TOO_LONG
@ GVM_STREAM_VALIDATOR_INTERNAL_ERROR
@ GVM_STREAM_VALIDATOR_OK
@ GVM_STREAM_VALIDATOR_INVALID_HASH_SYNTAX
@ GVM_STREAM_VALIDATOR_INVALID_HASH_VALUE
AfterEach(streamvalidator)
#define INVALID_DATA
#define TOO_LONG_DATA
#define TOO_SHORT_DATA
int main(int argc, char **argv)
BeforeEach(streamvalidator)
#define VALID_DATA
Ensure(streamvalidator, accepts_valid_data)
#define VALID_DATA_HASH
Describe(streamvalidator)