mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-23 02:28:55 +00:00
The coccinellery repository provides many little semantic patches to fix common problems in the code. The number of semantic patches in the coccinellery repository is high and most of the semantic patches apply only for Linux, so it doesn't make sense to run them on regular basis as the processing takes a lot of time. The list of issue found in BIND 9, by no means complete, includes: - double assignment to a variable - `continue` at the end of the loop - double checks for `NULL` - useless checks for `NULL` (cannot be `NULL`, because of earlier return) - using `0` instead of `NULL` - useless extra condition (`if (foo) return; if (!foo) { ...; }`) - removing & in front of static functions passed as arguments
124 lines
2.5 KiB
C
124 lines
2.5 KiB
C
/*
|
|
* Copyright (C) Internet Systems Consortium, Inc. ("ISC")
|
|
*
|
|
* 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 http://mozilla.org/MPL/2.0/.
|
|
*
|
|
* See the COPYRIGHT file distributed with this work for additional
|
|
* information regarding copyright ownership.
|
|
*/
|
|
|
|
|
|
/*! \file */
|
|
|
|
#include <string.h>
|
|
|
|
#include <isc/buffer.h>
|
|
#include <isc/region.h>
|
|
#include <isc/md.h>
|
|
#include <isc/util.h>
|
|
|
|
#include <dns/ds.h>
|
|
#include <dns/fixedname.h>
|
|
#include <dns/name.h>
|
|
#include <dns/rdata.h>
|
|
#include <dns/rdatastruct.h>
|
|
#include <dns/result.h>
|
|
|
|
#include <dst/dst.h>
|
|
|
|
isc_result_t
|
|
dns_ds_buildrdata(dns_name_t *owner, dns_rdata_t *key,
|
|
dns_dsdigest_t digest_type, unsigned char *buffer,
|
|
dns_rdata_t *rdata)
|
|
{
|
|
dns_fixedname_t fname;
|
|
dns_name_t *name;
|
|
unsigned char digest[ISC_MAX_MD_SIZE];
|
|
unsigned int digestlen;
|
|
isc_region_t r;
|
|
isc_buffer_t b;
|
|
dns_rdata_ds_t ds;
|
|
isc_md_t *md;
|
|
isc_md_type_t md_type = 0;
|
|
isc_result_t ret;
|
|
|
|
REQUIRE(key != NULL);
|
|
REQUIRE(key->type == dns_rdatatype_dnskey ||
|
|
key->type == dns_rdatatype_cdnskey);
|
|
|
|
if (!dst_ds_digest_supported(digest_type)) {
|
|
return (ISC_R_NOTIMPLEMENTED);
|
|
}
|
|
|
|
switch (digest_type) {
|
|
case DNS_DSDIGEST_SHA1:
|
|
md_type = ISC_MD_SHA1;
|
|
break;
|
|
|
|
case DNS_DSDIGEST_SHA384:
|
|
md_type = ISC_MD_SHA384;
|
|
break;
|
|
|
|
case DNS_DSDIGEST_SHA256:
|
|
md_type = ISC_MD_SHA256;
|
|
break;
|
|
|
|
default:
|
|
INSIST(0);
|
|
ISC_UNREACHABLE();
|
|
}
|
|
|
|
name = dns_fixedname_initname(&fname);
|
|
(void)dns_name_downcase(owner, name, NULL);
|
|
|
|
memset(buffer, 0, DNS_DS_BUFFERSIZE);
|
|
isc_buffer_init(&b, buffer, DNS_DS_BUFFERSIZE);
|
|
|
|
md = isc_md_new();
|
|
if (md == NULL) {
|
|
return (ISC_R_NOMEMORY);
|
|
}
|
|
|
|
ret = isc_md_init(md, md_type);
|
|
if (ret != ISC_R_SUCCESS) {
|
|
goto end;
|
|
}
|
|
|
|
dns_name_toregion(name, &r);
|
|
|
|
ret = isc_md_update(md, r.base, r.length);
|
|
if (ret != ISC_R_SUCCESS) {
|
|
goto end;
|
|
}
|
|
|
|
dns_rdata_toregion(key, &r);
|
|
INSIST(r.length >= 4);
|
|
|
|
ret = isc_md_update(md, r.base, r.length);
|
|
if (ret != ISC_R_SUCCESS) {
|
|
goto end;
|
|
}
|
|
|
|
ret = isc_md_final(md, digest, &digestlen);
|
|
if (ret != ISC_R_SUCCESS) {
|
|
goto end;
|
|
}
|
|
|
|
ds.mctx = NULL;
|
|
ds.common.rdclass = key->rdclass;
|
|
ds.common.rdtype = dns_rdatatype_ds;
|
|
ds.algorithm = r.base[3];
|
|
ds.key_tag = dst_region_computeid(&r);
|
|
ds.digest_type = digest_type;
|
|
ds.digest = digest;
|
|
ds.length = digestlen;
|
|
|
|
ret = dns_rdata_fromstruct(rdata, key->rdclass, dns_rdatatype_ds,
|
|
&ds, &b);
|
|
end:
|
|
isc_md_free(md);
|
|
return (ret);
|
|
}
|