File: test_random.c

package info (click to toggle)
knot 3.5.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 16,804 kB
  • sloc: ansic: 153,806; sh: 5,822; python: 1,141; makefile: 817
file content (71 lines) | stat: -rw-r--r-- 1,358 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/*  Copyright (C) CZ.NIC, z.s.p.o. and contributors
 *  SPDX-License-Identifier: GPL-2.0-or-later
 *  For more information, see <https://www.knot-dns.cz/>
 */

#include <stdint.h>
#include <string.h>
#include <tap/basic.h>

#include "crypto.h"
#include "error.h"
#include "random.h"

int check_buffer(void)
{
	const size_t buffer_size = 128;
	uint8_t buffer_prev[buffer_size];
	memset(buffer_prev, 0, buffer_size);
	uint8_t buffer[buffer_size];
	memset(buffer, 0, buffer_size);

	for (int i = 0; i < 10; i++) {
		int result = dnssec_random_buffer(buffer, buffer_size);
		if (result != DNSSEC_EOK) {
			return 1;
		}

		if (memcmp(buffer, buffer_prev, buffer_size) == 0) {
			return 1;
		}

		memmove(buffer_prev, buffer, buffer_size);
	}

	return 0;
}

int check_random_type(void)
{
	uint16_t numbers[1000] = { 0 };
	int conflicts = 0;

	for (int i = 0; i < 1000; i++) {
		numbers[i] = dnssec_random_uint16_t();
		// check all previous
		for (int j = 0; j < i; j++) {
			if (numbers[i] == numbers[j]) {
				conflicts += 1;
			}
		}
	}

	// allow 5 % of conflicts
	return conflicts <= 50 ? 0 : 1;
}

int main(void)
{
	plan_lazy();

	dnssec_crypto_init();

	// quite stupid, just check if it does something

	ok(check_buffer() == 0, "dnssec_random_buffer()");
	ok(check_random_type() == 0, "dnssec_random_uint16_t()");

	dnssec_crypto_cleanup();

	return 0;
}