xref: /openbsd-src/usr.bin/dig/lib/dns/key.c (revision b9558d14c675017cf470d7469a47201d05e39444)
15185a700Sflorian /*
25185a700Sflorian  * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
35185a700Sflorian  *
45185a700Sflorian  * Permission to use, copy, modify, and/or distribute this software for any
55185a700Sflorian  * purpose with or without fee is hereby granted, provided that the above
65185a700Sflorian  * copyright notice and this permission notice appear in all copies.
75185a700Sflorian  *
85185a700Sflorian  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
95185a700Sflorian  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
105185a700Sflorian  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
115185a700Sflorian  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
125185a700Sflorian  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
135185a700Sflorian  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
145185a700Sflorian  * PERFORMANCE OF THIS SOFTWARE.
155185a700Sflorian  */
165185a700Sflorian 
17*b9558d14Sjsg /* $Id: key.c,v 1.8 2020/02/25 05:00:42 jsg Exp $ */
185185a700Sflorian 
195185a700Sflorian #include <stddef.h>
20e49c1783Sjsg #include <stdint.h>
215185a700Sflorian 
225185a700Sflorian #include <isc/region.h>
235185a700Sflorian #include <isc/util.h>
245185a700Sflorian 
255185a700Sflorian #include <dst/dst.h>
265185a700Sflorian 
275185a700Sflorian #include "dst_internal.h"
285185a700Sflorian 
295185a700Sflorian uint16_t
dst_region_computeid(const isc_region_t * source,unsigned int alg)305185a700Sflorian dst_region_computeid(const isc_region_t *source, unsigned int alg) {
315185a700Sflorian 	uint32_t ac;
325185a700Sflorian 	const unsigned char *p;
335185a700Sflorian 	int size;
345185a700Sflorian 
355185a700Sflorian 	REQUIRE(source != NULL);
365185a700Sflorian 	REQUIRE(source->length >= 4);
375185a700Sflorian 
385185a700Sflorian 	p = source->base;
395185a700Sflorian 	size = source->length;
405185a700Sflorian 
415185a700Sflorian 	if (alg == DST_ALG_RSAMD5)
425185a700Sflorian 		return ((p[size - 3] << 8) + p[size - 2]);
435185a700Sflorian 
445185a700Sflorian 	for (ac = 0; size > 1; size -= 2, p += 2)
455185a700Sflorian 		ac += ((*p) << 8) + *(p + 1);
465185a700Sflorian 
475185a700Sflorian 	if (size > 0)
485185a700Sflorian 		ac += ((*p) << 8);
495185a700Sflorian 	ac += (ac >> 16) & 0xffff;
505185a700Sflorian 
515185a700Sflorian 	return ((uint16_t)(ac & 0xffff));
525185a700Sflorian }
535185a700Sflorian 
545185a700Sflorian unsigned int
dst_key_size(const dst_key_t * key)555185a700Sflorian dst_key_size(const dst_key_t *key) {
565185a700Sflorian 	return (key->key_size);
575185a700Sflorian }
585185a700Sflorian 
595185a700Sflorian unsigned int
dst_key_alg(const dst_key_t * key)605185a700Sflorian dst_key_alg(const dst_key_t *key) {
615185a700Sflorian 	return (key->key_alg);
625185a700Sflorian }
635185a700Sflorian 
645185a700Sflorian void
dst_key_setbits(dst_key_t * key,uint16_t bits)655185a700Sflorian dst_key_setbits(dst_key_t *key, uint16_t bits) {
665185a700Sflorian 	unsigned int maxbits;
675185a700Sflorian 	if (bits != 0) {
685185a700Sflorian 		RUNTIME_CHECK(dst_key_sigsize(key, &maxbits) == ISC_R_SUCCESS);
695185a700Sflorian 		maxbits *= 8;
705185a700Sflorian 		REQUIRE(bits <= maxbits);
715185a700Sflorian 	}
725185a700Sflorian 	key->key_bits = bits;
735185a700Sflorian }
745185a700Sflorian 
755185a700Sflorian uint16_t
dst_key_getbits(const dst_key_t * key)765185a700Sflorian dst_key_getbits(const dst_key_t *key) {
775185a700Sflorian 	return (key->key_bits);
785185a700Sflorian }
795185a700Sflorian 
805185a700Sflorian /*! \file */
81