File: hash.c

package info (click to toggle)
bind9 1%3A9.20.20-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 43,788 kB
  • sloc: ansic: 316,296; sh: 49,693; python: 25,039; perl: 3,218; makefile: 2,247
file content (98 lines) | stat: -rw-r--r-- 2,362 bytes parent folder | download | duplicates (4)
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/*
 * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
 *
 * SPDX-License-Identifier: MPL-2.0
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, you can obtain one at https://mozilla.org/MPL/2.0/.
 *
 * See the COPYRIGHT file distributed with this work for additional
 * information regarding copyright ownership.
 */

#include <inttypes.h>
#include <stdbool.h>
#include <stddef.h>

#include <isc/ascii.h>
#include <isc/hash.h> /* IWYU pragma: keep */
#include <isc/random.h>
#include <isc/result.h>
#include <isc/siphash.h>
#include <isc/string.h>
#include <isc/types.h>
#include <isc/util.h>

static uint8_t isc_hash_key[16];

void
isc__hash_initialize(void) {
	/*
	 * Set a constant key to help in problem reproduction should
	 * fuzzing find a crash or a hang.
	 */
	uint8_t key[16] = { 1 };
#if !FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
	isc_random_buf(key, sizeof(key));
#endif /* if FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION */
	STATIC_ASSERT(sizeof(key) >= sizeof(isc_hash_key),
		      "sizeof(key) < sizeof(isc_hash_key)");
	memmove(isc_hash_key, key, sizeof(isc_hash_key));
}

const void *
isc_hash_get_initializer(void) {
	return isc_hash_key;
}

void
isc_hash_set_initializer(const void *initializer) {
	REQUIRE(initializer != NULL);

	memmove(isc_hash_key, initializer, sizeof(isc_hash_key));
}

void
isc_hash32_init(isc_hash32_t *restrict state) {
	isc_halfsiphash24_init(state, isc_hash_key);
}

void
isc_hash32_hash(isc_hash32_t *restrict state, const void *data,
		const size_t length, const bool case_sensitive) {
	REQUIRE(length == 0 || data != NULL);

	isc_halfsiphash24_hash(state, data, length, case_sensitive);
}

uint32_t
isc_hash32_finalize(isc_hash32_t *restrict state) {
	uint32_t hval;

	isc_halfsiphash24_finalize(state, (uint8_t *)&hval);

	return hval;
}

void
isc_hash64_init(isc_hash64_t *restrict state) {
	isc_siphash24_init(state, isc_hash_key);
}

void
isc_hash64_hash(isc_hash64_t *restrict state, const void *data,
		const size_t length, const bool case_sensitive) {
	REQUIRE(length == 0 || data != NULL);

	isc_siphash24_hash(state, data, length, case_sensitive);
}

uint64_t
isc_hash64_finalize(isc_hash64_t *restrict state) {
	uint64_t hval;

	isc_siphash24_finalize(state, (uint8_t *)&hval);

	return hval;
}