1/*	$NetBSD: safe_test.c,v 1.2 2024/02/21 22:52:51 christos Exp $	*/
2
3/*
4 * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
5 *
6 * SPDX-License-Identifier: MPL-2.0
7 *
8 * This Source Code Form is subject to the terms of the Mozilla Public
9 * License, v. 2.0. If a copy of the MPL was not distributed with this
10 * file, you can obtain one at https://mozilla.org/MPL/2.0/.
11 *
12 * See the COPYRIGHT file distributed with this work for additional
13 * information regarding copyright ownership.
14 */
15
16/* ! \file */
17
18#include <inttypes.h>
19#include <sched.h> /* IWYU pragma: keep */
20#include <setjmp.h>
21#include <stdarg.h>
22#include <stddef.h>
23#include <stdlib.h>
24#include <string.h>
25
26#define UNIT_TESTING
27#include <cmocka.h>
28
29#include <isc/safe.h>
30#include <isc/util.h>
31
32#include <tests/isc.h>
33
34/* test isc_safe_memequal() */
35ISC_RUN_TEST_IMPL(isc_safe_memequal) {
36	UNUSED(state);
37
38	assert_true(isc_safe_memequal("test", "test", 4));
39	assert_true(!isc_safe_memequal("test", "tesc", 4));
40	assert_true(
41		isc_safe_memequal("\x00\x00\x00\x00", "\x00\x00\x00\x00", 4));
42	assert_true(
43		!isc_safe_memequal("\x00\x00\x00\x00", "\x00\x00\x00\x01", 4));
44	assert_true(
45		!isc_safe_memequal("\x00\x00\x00\x02", "\x00\x00\x00\x00", 4));
46}
47
48/* test isc_safe_memwipe() */
49ISC_RUN_TEST_IMPL(isc_safe_memwipe) {
50	UNUSED(state);
51
52	/* These should pass. */
53	isc_safe_memwipe(NULL, 0);
54	isc_safe_memwipe((void *)-1, 0);
55
56	/*
57	 * isc_safe_memwipe(ptr, size) should function same as
58	 * memset(ptr, 0, size);
59	 */
60	{
61		char buf1[4] = { 1, 2, 3, 4 };
62		char buf2[4] = { 1, 2, 3, 4 };
63
64		isc_safe_memwipe(buf1, sizeof(buf1));
65		memset(buf2, 0, sizeof(buf2));
66
67		assert_int_equal(memcmp(buf1, buf2, sizeof(buf1)), 0);
68	}
69
70	/*
71	 * Boundary test.
72	 */
73	{
74		char buf1[4] = { 1, 2, 3, 4 };
75		char buf2[4] = { 1, 2, 3, 4 };
76
77		/*
78		 * We wipe 3 elements on purpose, keeping the 4th in
79		 * place.
80		 */
81		isc_safe_memwipe(buf1, 3);
82		memset(buf2, 0, 3);
83
84		assert_int_equal(memcmp(buf1, buf2, sizeof(buf1)), 0);
85	}
86}
87
88ISC_TEST_LIST_START
89ISC_TEST_ENTRY(isc_safe_memequal)
90ISC_TEST_ENTRY(isc_safe_memwipe)
91
92ISC_TEST_LIST_END
93
94ISC_TEST_MAIN
95