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