nsec3param.flags = 0;
nsec3param.hash = unknownalg ? DNS_NSEC3_UNKNOWNALG : dns_hash_sha1;
nsec3param.iterations = iterations;
- nsec3param.salt_length = (unsigned char)salt_len;
- nsec3param.salt = UNCONST(salt);
+ nsec3param.salt.length = (unsigned char)salt_len;
+ nsec3param.salt.base = UNCONST(salt);
isc_buffer_init(&b, nsec3parambuf, sizeof(nsec3parambuf));
result = dns_rdata_fromstruct(&rdata, gclass, dns_rdatatype_nsec3param,
check_result(result, "dns_rdata_tostruct");
if (exists && nsec3.hash == hashalg &&
nsec3.iterations == iterations &&
- nsec3.salt_length == salt_len &&
- isc_safe_memequal(nsec3.salt, salt, salt_len))
+ nsec3.salt.length == salt_len &&
+ isc_safe_memequal(nsec3.salt.base, salt, salt_len))
{
continue;
}
bool resalt = false;
uint32_t serial = 0;
char keystr[DNS_SECALG_FORMATSIZE + 7]; /* <5-digit keyid>/<alg> */
- unsigned short hash = 0, flags = 0, iter = 0, saltlen = 0;
- unsigned char salt[255];
+ unsigned short hash = 0, flags = 0, iter = 0;
+ isc_region_t salt = { 0 };
+ unsigned char saltbuf[255];
const char *ptr;
size_t n;
bool kasp = false;
* 5155 (64 bits). It should be made
* configurable.
*/
- saltlen = 8;
+ salt.length = 8;
resalt = true;
} else if (strcmp(ptr, "-") != 0) {
isc_buffer_t buf;
- isc_buffer_init(&buf, salt, sizeof(salt));
+ isc_buffer_init(&buf, saltbuf, sizeof(saltbuf));
CHECK(isc_hex_decodestring(ptr, &buf));
- saltlen = isc_buffer_usedlength(&buf);
+ salt.base = saltbuf;
+ salt.length = isc_buffer_usedlength(&buf);
}
}
} else if (strcasecmp(ptr, "-serial") == 0) {
(void)putstr(text, "request queued");
(void)putnull(text);
} else if (chain && !kasp) {
- CHECK(dns_zone_setnsec3param(
- zone, (uint8_t)hash, (uint8_t)flags, iter,
- (uint8_t)saltlen, salt, true, resalt));
+ CHECK(dns_zone_setnsec3param(zone, (uint8_t)hash,
+ (uint8_t)flags, iter, &salt, true,
+ resalt));
(void)putstr(text, "nsec3param request queued");
(void)putnull(text);
} else if (setserial) {
result = dns_zone_setnsec3param(
zone, 1, dns_kasp_nsec3flags(kasp),
dns_kasp_nsec3iter(kasp),
- dns_kasp_nsec3saltlen(kasp), NULL, true,
- false);
+ &(isc_region_t){
+ .length = dns_kasp_nsec3saltlen(
+ kasp),
+ },
+ true, false);
} else {
result = dns_zone_setnsec3param(
- zone, 0, 0, 0, 0, NULL, true, false);
+ zone, 0, 0, 0, NULL, true, false);
}
INSIST(result == ISC_R_SUCCESS);
isc_result_t
dns_zone_setnsec3param(dns_zone_t *zone, uint8_t hash, uint8_t flags,
- uint16_t iter, uint8_t saltlen, unsigned char *salt,
- bool replace, bool resalt);
+ uint16_t iter, isc_region_t *salt, bool replace,
+ bool resalt);
/*%<
* Set the NSEC3 parameters for the zone.
*
INSIST(result == ISC_R_SUCCESS);
present = false;
- for (i = 0; i < nsec3.len; i += len) {
- INSIST(i + 2 <= nsec3.len);
- window = nsec3.typebits[i];
- len = nsec3.typebits[i + 1];
+ for (i = 0; i < nsec3.typebits.length; i += len) {
+ INSIST(i + 2 <= nsec3.typebits.length);
+ window = nsec3.typebits.base[i];
+ len = nsec3.typebits.base[i + 1];
INSIST(len > 0 && len <= 32);
i += 2;
- INSIST(i + len <= nsec3.len);
+ INSIST(i + len <= nsec3.typebits.length);
if (window * 256 > type) {
break;
}
continue;
}
if (type < (window * 256) + len * 8) {
- present = dns_nsec_isset(&nsec3.typebits[i],
+ present = dns_nsec_isset(&nsec3.typebits.base[i],
type % 256);
}
break;
const dns_rdata_nsec3param_t *nsec3param) {
if (nsec3->hash == nsec3param->hash &&
nsec3->iterations == nsec3param->iterations &&
- nsec3->salt_length == nsec3param->salt_length &&
- !memcmp(nsec3->salt, nsec3param->salt, nsec3->salt_length))
+ nsec3->salt.length == nsec3param->salt.length &&
+ !memcmp(nsec3->salt.base, nsec3param->salt.base,
+ nsec3->salt.length))
{
return true;
}
*/
hash = nsec3param->hash;
iterations = nsec3param->iterations;
- salt_length = nsec3param->salt_length;
- salt = nsec3param->salt;
+ salt_length = nsec3param->salt.length;
+ salt = nsec3param->salt.base;
/*
* Default flags for a new chain.
if (!CREATE(nsec3param->flags)) {
flags = nsec3.flags;
}
- next_length = nsec3.next_length;
+ next_length = nsec3.next.length;
INSIST(next_length <= sizeof(nexthash));
- memmove(nexthash, nsec3.next, next_length);
+ memmove(nexthash, nsec3.next.base, next_length);
dns_rdataset_disassociate(&rdataset);
/*
* If the NSEC3 is not for a unsecure delegation then
}
}
- old_next = nsec3.next;
- old_length = nsec3.next_length;
+ old_next = nsec3.next.base;
+ old_length = nsec3.next.length;
/*
* Delete the old previous NSEC3.
/*
* Fixup the previous NSEC3.
*/
- nsec3.next = nexthash;
- nsec3.next_length = (unsigned char)next_length;
+ nsec3.next.base = nexthash;
+ nsec3.next.length = (unsigned char)next_length;
isc_buffer_init(&buffer, nsec3buf, sizeof(nsec3buf));
CHECK(dns_rdata_fromstruct(&rdata, rdataset.rdclass,
dns_rdatatype_nsec3, &nsec3,
continue;
}
- old_next = nsec3.next;
- old_length = nsec3.next_length;
+ old_next = nsec3.next.base;
+ old_length = nsec3.next.length;
/*
* Delete the old previous NSEC3.
/*
* Fixup the previous NSEC3.
*/
- nsec3.next = nexthash;
- nsec3.next_length = (unsigned char)next_length;
+ nsec3.next.base = nexthash;
+ nsec3.next.length = (unsigned char)next_length;
isc_buffer_init(&buffer, nsec3buf, sizeof(nsec3buf));
CHECK(dns_rdata_fromstruct(&rdata, rdataset.rdclass,
dns_rdatatype_nsec3, &nsec3,
isc_result_t
dns_nsec3param_salttotext(dns_rdata_nsec3param_t *nsec3param, char *dst,
size_t dstlen) {
- isc_region_t r;
isc_buffer_t b;
REQUIRE(nsec3param != NULL);
REQUIRE(dst != NULL);
- if (nsec3param->salt_length == 0) {
+ if (nsec3param->salt.length == 0) {
if (dstlen < 2U) {
return ISC_R_NOSPACE;
}
return ISC_R_SUCCESS;
}
- r.base = nsec3param->salt;
- r.length = nsec3param->salt_length;
isc_buffer_init(&b, dst, (unsigned int)dstlen);
- RETERR(isc_hex_totext(&r, 2, "", &b));
+ isc_region_t salt = nsec3param->salt;
+ RETERR(isc_hex_totext(&salt, 2, "", &b));
if (isc_buffer_availablelength(&b) < 1) {
return ISC_R_NOSPACE;
*/
hash = nsec3param->hash;
iterations = nsec3param->iterations;
- salt_length = nsec3param->salt_length;
- salt = nsec3param->salt;
+ salt_length = nsec3param->salt.length;
+ salt = nsec3param->salt.base;
/*
* If this is the first NSEC3 in the chain nexthash will
*/
result = find_nsec3(&nsec3, &rdataset, nsec3param);
if (result == ISC_R_SUCCESS) {
- next_length = nsec3.next_length;
+ next_length = nsec3.next.length;
INSIST(next_length <= sizeof(nexthash));
- memmove(nexthash, nsec3.next, next_length);
+ memmove(nexthash, nsec3.next.base, next_length);
}
dns_rdataset_disassociate(&rdataset);
if (result == ISC_R_NOTFOUND) {
/*
* Fixup the previous NSEC3.
*/
- nsec3.next = nexthash;
- nsec3.next_length = (unsigned char)next_length;
+ nsec3.next.base = nexthash;
+ nsec3.next.length = (unsigned char)next_length;
if (CREATE(nsec3param->flags)) {
nsec3.flags = nsec3param->flags & DNS_NSEC3FLAG_OPTOUT;
}
result = find_nsec3(&nsec3, &rdataset, nsec3param);
if (result == ISC_R_SUCCESS) {
- next_length = nsec3.next_length;
+ next_length = nsec3.next.length;
INSIST(next_length <= sizeof(nexthash));
- memmove(nexthash, nsec3.next, next_length);
+ memmove(nexthash, nsec3.next.base, next_length);
}
dns_rdataset_disassociate(&rdataset);
if (result == ISC_R_NOTFOUND) {
/*
* Fixup the previous NSEC3.
*/
- nsec3.next = nexthash;
- nsec3.next_length = (unsigned char)next_length;
+ nsec3.next.base = nexthash;
+ nsec3.next.length = (unsigned char)next_length;
isc_buffer_init(&buffer, nsec3buf, sizeof(nsec3buf));
CHECK(dns_rdata_fromstruct(&rdata, rdataset.rdclass,
dns_rdatatype_nsec3, &nsec3,
/*
* The hash lengths should match. If not ignore the record.
*/
- if (isc_buffer_usedlength(&buffer) != nsec3.next_length) {
+ if (isc_buffer_usedlength(&buffer) != nsec3.next.length) {
return ISC_R_IGNORE;
}
* Work out what this NSEC3 covers.
* Inside (<0) or outside (>=0).
*/
- scope = memcmp(owner, nsec3.next, nsec3.next_length);
+ scope = memcmp(owner, nsec3.next.base, nsec3.next.length);
/*
* Prepare to compute all the hashes.
}
length = isc_iterated_hash(hash, nsec3.hash, nsec3.iterations,
- nsec3.salt, nsec3.salt_length,
+ nsec3.salt.base, nsec3.salt.length,
qname->ndata, qname->length);
/*
* The computed hash length should match.
*/
- if (length != nsec3.next_length) {
+ if (length != nsec3.next.length) {
(*logit)(arg, ISC_LOG_DEBUG(3),
"ignoring NSEC bad length %u vs %u", length,
- nsec3.next_length);
+ nsec3.next.length);
return ISC_R_IGNORE;
}
* above.
*/
if ((scope < 0 && order > 0 &&
- memcmp(hash, nsec3.next, length) < 0) ||
+ memcmp(hash, nsec3.next.base, length) < 0) ||
(scope >= 0 &&
- (order > 0 || memcmp(hash, nsec3.next, length) < 0)))
+ (order > 0 || memcmp(hash, nsec3.next.base, length) < 0)))
{
dns_name_format(qname, namebuf, sizeof(namebuf));
(*logit)(arg, ISC_LOG_DEBUG(3),
continue;
}
- memmove(version->salt, nsec3param.salt,
- nsec3param.salt_length);
+ memmove(version->salt, nsec3param.salt.base,
+ nsec3param.salt.length);
version->hash = nsec3param.hash;
- version->salt_length = nsec3param.salt_length;
+ version->salt_length = nsec3param.salt.length;
version->iterations = nsec3param.iterations;
version->flags = nsec3param.flags;
version->havensec3 = true;
if (nsec3.hash == search->version->hash &&
nsec3.iterations == search->version->iterations &&
- nsec3.salt_length == search->version->salt_length &&
- memcmp(nsec3.salt, search->version->salt,
- nsec3.salt_length) == 0)
+ nsec3.salt.length == search->version->salt_length &&
+ memcmp(nsec3.salt.base, search->version->salt,
+ nsec3.salt.length) == 0)
{
return true;
}
REQUIRE(nsec3 != NULL);
REQUIRE(nsec3->common.rdtype == type);
REQUIRE(nsec3->common.rdclass == rdclass);
- REQUIRE(nsec3->typebits != NULL || nsec3->len == 0);
+ REQUIRE(nsec3->typebits.base != NULL || nsec3->typebits.length == 0);
UNUSED(type);
UNUSED(rdclass);
RETERR(uint8_tobuffer(nsec3->hash, target));
RETERR(uint8_tobuffer(nsec3->flags, target));
RETERR(uint16_tobuffer(nsec3->iterations, target));
- RETERR(uint8_tobuffer(nsec3->salt_length, target));
- RETERR(mem_tobuffer(target, nsec3->salt, nsec3->salt_length));
- RETERR(uint8_tobuffer(nsec3->next_length, target));
- RETERR(mem_tobuffer(target, nsec3->next, nsec3->next_length));
+ RETERR(uint8_tobuffer(nsec3->salt.length, target));
+ RETERR(mem_tobuffer(target, nsec3->salt.base, nsec3->salt.length));
+ RETERR(uint8_tobuffer(nsec3->next.length, target));
+ RETERR(mem_tobuffer(target, nsec3->next.base, nsec3->next.length));
- region.base = nsec3->typebits;
- region.length = nsec3->len;
+ region.base = nsec3->typebits.base;
+ region.length = nsec3->typebits.length;
RETERR(typemap_test(®ion, true));
- return mem_tobuffer(target, nsec3->typebits, nsec3->len);
+ return mem_tobuffer(target, nsec3->typebits.base,
+ nsec3->typebits.length);
}
+static void freestruct_nsec3(ARGS_FREESTRUCT);
+
static isc_result_t
tostruct_nsec3(ARGS_TOSTRUCT) {
isc_region_t region;
nsec3->flags = uint8_consume_fromregion(®ion);
nsec3->iterations = uint16_consume_fromregion(®ion);
- nsec3->salt_length = uint8_consume_fromregion(®ion);
- INSIST(nsec3->salt_length <= region.length);
- nsec3->salt = mem_maybedup(mctx, region.base, nsec3->salt_length);
- isc_region_consume(®ion, nsec3->salt_length);
+ nsec3->salt.length = uint8_consume_fromregion(®ion);
+ INSIST(nsec3->salt.length <= region.length);
+ nsec3->salt.base = mem_maybedup(mctx, region.base, nsec3->salt.length);
+ isc_region_consume(®ion, nsec3->salt.length);
- nsec3->next_length = uint8_consume_fromregion(®ion);
- INSIST(nsec3->next_length <= region.length);
- nsec3->next = mem_maybedup(mctx, region.base, nsec3->next_length);
- isc_region_consume(®ion, nsec3->next_length);
+ nsec3->next.length = uint8_consume_fromregion(®ion);
+ INSIST(nsec3->next.length <= region.length);
+ nsec3->next.base = mem_maybedup(mctx, region.base, nsec3->next.length);
+ isc_region_consume(®ion, nsec3->next.length);
- nsec3->len = region.length;
- nsec3->typebits = mem_maybedup(mctx, region.base, region.length);
+ nsec3->typebits.length = region.length;
+ nsec3->typebits.base = mem_maybedup(mctx, region.base,
+ nsec3->typebits.length);
nsec3->mctx = mctx;
return ISC_R_SUCCESS;
return;
}
- if (nsec3->salt != NULL) {
- isc_mem_free(nsec3->mctx, nsec3->salt);
+ if (nsec3->salt.base != NULL) {
+ isc_mem_free(nsec3->mctx, nsec3->salt.base);
+ nsec3->salt.length = 0;
}
- if (nsec3->next != NULL) {
- isc_mem_free(nsec3->mctx, nsec3->next);
+ if (nsec3->next.base != NULL) {
+ isc_mem_free(nsec3->mctx, nsec3->next.base);
+ nsec3->next.length = 0;
}
- if (nsec3->typebits != NULL) {
- isc_mem_free(nsec3->mctx, nsec3->typebits);
+ if (nsec3->typebits.base != NULL) {
+ isc_mem_free(nsec3->mctx, nsec3->typebits.base);
+ nsec3->typebits.length = 0;
}
nsec3->mctx = NULL;
}
* \brief Per RFC 5155 */
#include <isc/iterated_hash.h>
+#include <isc/region.h>
typedef struct dns_rdata_nsec3 {
dns_rdatacommon_t common;
dns_hash_t hash;
unsigned char flags;
dns_iterations_t iterations;
- unsigned char salt_length;
- unsigned char next_length;
- uint16_t len;
- unsigned char *salt;
- unsigned char *next;
- unsigned char *typebits;
+ isc_region_t salt;
+ isc_region_t next;
+ isc_region_t typebits;
} dns_rdata_nsec3_t;
/*
RETERR(uint8_tobuffer(nsec3param->hash, target));
RETERR(uint8_tobuffer(nsec3param->flags, target));
RETERR(uint16_tobuffer(nsec3param->iterations, target));
- RETERR(uint8_tobuffer(nsec3param->salt_length, target));
- RETERR(mem_tobuffer(target, nsec3param->salt, nsec3param->salt_length));
+ RETERR(uint8_tobuffer(nsec3param->salt.length, target));
+ RETERR(mem_tobuffer(target, nsec3param->salt.base,
+ nsec3param->salt.length));
return ISC_R_SUCCESS;
}
nsec3param->flags = uint8_consume_fromregion(®ion);
nsec3param->iterations = uint16_consume_fromregion(®ion);
- nsec3param->salt_length = uint8_consume_fromregion(®ion);
- INSIST(nsec3param->salt_length == region.length);
- nsec3param->salt = mem_maybedup(mctx, region.base,
- nsec3param->salt_length);
- isc_region_consume(®ion, nsec3param->salt_length);
+ nsec3param->salt.length = uint8_consume_fromregion(®ion);
+ INSIST(nsec3param->salt.length == region.length);
+ nsec3param->salt.base = mem_maybedup(mctx, region.base,
+ nsec3param->salt.length);
+ isc_region_consume(®ion, nsec3param->salt.length);
nsec3param->mctx = mctx;
return ISC_R_SUCCESS;
return;
}
- if (nsec3param->salt != NULL) {
- isc_mem_free(nsec3param->mctx, nsec3param->salt);
+ if (nsec3param->salt.base != NULL) {
+ isc_mem_free(nsec3param->mctx, nsec3param->salt.base);
+ nsec3param->salt.length = 0;
}
nsec3param->mctx = NULL;
}
dns_hash_t hash;
unsigned char flags; /* DNS_NSEC3FLAG_* */
dns_iterations_t iterations;
- unsigned char salt_length;
- unsigned char *salt;
+ isc_region_t salt;
} dns_rdata_nsec3param_t;
if (nsec3.hash != 1) {
continue;
}
- if (nsec3.next_length > NSEC3_MAX_HASH_LENGTH) {
+ if (nsec3.next.length > NSEC3_MAX_HASH_LENGTH) {
continue;
}
/*
return ISC_R_SUCCESS;
}
length = isc_iterated_hash(
- hash, nsec3.hash, nsec3.iterations, nsec3.salt,
- nsec3.salt_length, name->ndata, name->length);
+ hash, nsec3.hash, nsec3.iterations,
+ nsec3.salt.base, nsec3.salt.length, name->ndata,
+ name->length);
if (length != isc_buffer_usedlength(&buffer)) {
continue;
}
/*
* Does this optout span cover the name?
*/
- scope = memcmp(owner, nsec3.next, nsec3.next_length);
+ scope = memcmp(owner, nsec3.next.base,
+ nsec3.next.length);
if ((scope < 0 && order > 0 &&
- memcmp(hash, nsec3.next, length) < 0) ||
+ memcmp(hash, nsec3.next.base, length) < 0) ||
(scope >= 0 &&
(order > 0 ||
- memcmp(hash, nsec3.next, length) < 0)))
+ memcmp(hash, nsec3.next.base, length) < 0)))
{
dns_rdataset_disassociate(&set);
return ISC_R_SUCCESS;
nsec3chain->nsec3param.hash = nsec3param->hash;
nsec3chain->nsec3param.iterations = nsec3param->iterations;
nsec3chain->nsec3param.flags = nsec3param->flags;
- nsec3chain->nsec3param.salt_length = nsec3param->salt_length;
- memmove(nsec3chain->salt, nsec3param->salt, nsec3param->salt_length);
- nsec3chain->nsec3param.salt = nsec3chain->salt;
+ nsec3chain->nsec3param.salt.length = nsec3param->salt.length;
+ memmove(nsec3chain->salt, nsec3param->salt.base,
+ nsec3param->salt.length);
+ nsec3chain->nsec3param.salt.base = nsec3chain->salt;
nsec3chain->seen_nsec = false;
nsec3chain->delete_nsec = false;
nsec3chain->save_delete_nsec = false;
(current->nsec3param.hash == nsec3param->hash) &&
(current->nsec3param.iterations ==
nsec3param->iterations) &&
- (current->nsec3param.salt_length ==
- nsec3param->salt_length) &&
- memcmp(current->nsec3param.salt, nsec3param->salt,
- nsec3param->salt_length) == 0)
+ (current->nsec3param.salt.length ==
+ nsec3param->salt.length) &&
+ memcmp(current->nsec3param.salt.base, nsec3param->salt.base,
+ nsec3param->salt.length) == 0)
{
current->done = true;
}
if (nsec3param.hash != chain->nsec3param.hash ||
(active && nsec3param.flags != 0) ||
nsec3param.iterations != chain->nsec3param.iterations ||
- nsec3param.salt_length != chain->nsec3param.salt_length ||
- memcmp(nsec3param.salt, chain->nsec3param.salt,
- nsec3param.salt_length))
+ nsec3param.salt.length != chain->nsec3param.salt.length ||
+ memcmp(nsec3param.salt.base, chain->nsec3param.salt.base,
+ nsec3param.salt.length))
{
/*
* If the SOA minimum is different to the current TTL,
(active && nsec3param.flags != 0) ||
nsec3param.iterations !=
chain->nsec3param.iterations ||
- nsec3param.salt_length !=
- chain->nsec3param.salt_length ||
- memcmp(nsec3param.salt, chain->nsec3param.salt,
- nsec3param.salt_length))
+ nsec3param.salt.length !=
+ chain->nsec3param.salt.length ||
+ memcmp(nsec3param.salt.base,
+ chain->nsec3param.salt.base,
+ nsec3param.salt.length))
{
CHECK(update_one_rr(db, ver, diff,
DNS_DIFFOP_ADD, name, ttl,
(nsec3param.flags & DNS_NSEC3FLAG_INITIAL) != 0) ||
nsec3param.hash != chain->nsec3param.hash ||
nsec3param.iterations != chain->nsec3param.iterations ||
- nsec3param.salt_length != chain->nsec3param.salt_length ||
- memcmp(nsec3param.salt, chain->nsec3param.salt,
- nsec3param.salt_length))
+ nsec3param.salt.length != chain->nsec3param.salt.length ||
+ memcmp(nsec3param.salt.base, chain->nsec3param.salt.base,
+ nsec3param.salt.length))
{
continue;
}
CHECK(dns_rdata_tostruct(&rdata, &nsec3, NULL));
if (nsec3.hash != param->hash ||
nsec3.iterations != param->iterations ||
- nsec3.salt_length != param->salt_length ||
- memcmp(nsec3.salt, param->salt, nsec3.salt_length))
+ nsec3.salt.length != param->salt.length ||
+ memcmp(nsec3.salt.base, param->salt.base,
+ nsec3.salt.length))
{
continue;
}
*/
if (myparam.hash == param->hash &&
myparam.iterations == param->iterations &&
- myparam.salt_length == param->salt_length &&
- !memcmp(myparam.salt, param->salt, myparam.salt_length))
+ myparam.salt.length == param->salt.length &&
+ !memcmp(myparam.salt.base, param->salt.base,
+ myparam.salt.length))
{
continue;
}
unsigned char saltbuf[255];
isc_buffer_t b;
- param.salt = NULL;
+ param.salt = (isc_region_t){ .base = NULL };
result = dns__zone_lookup_nsec3param(zone, &np->rdata, ¶m,
saltbuf, np->resalt);
if (result == ISC_R_SUCCESS) {
goto cleanup;
}
- INSIST(param.salt != NULL);
+ INSIST(param.salt.base != NULL);
/* Update NSEC3 parameters. */
np->rdata.hash = param.hash;
np->rdata.flags = param.flags;
np->rdata.iterations = param.iterations;
- np->rdata.salt_length = param.salt_length;
+ np->rdata.salt.length = param.salt.length;
np->rdata.salt = param.salt;
isc_buffer_init(&b, nbuf, sizeof(nbuf));
if (nsec3param.iterations != lookup->iterations) {
continue;
}
- if (nsec3param.salt_length != lookup->salt_length) {
+ if (nsec3param.salt.length != lookup->salt.length) {
continue;
}
- if (lookup->salt != NULL) {
- if (memcmp(nsec3param.salt, lookup->salt,
- lookup->salt_length) != 0)
+ if (lookup->salt.base != NULL) {
+ if (memcmp(nsec3param.salt.base, lookup->salt.base,
+ lookup->salt.length) != 0)
{
continue;
}
param->hash = nsec3param.hash;
param->flags = nsec3param.flags;
param->iterations = nsec3param.iterations;
- param->salt_length = nsec3param.salt_length;
param->salt = nsec3param.salt;
break;
}
param->hash = lookup->hash;
param->flags = lookup->flags;
param->iterations = lookup->iterations;
- param->salt_length = lookup->salt_length;
param->salt = lookup->salt;
}
CHECK(result);
}
- if (param->salt_length == 0) {
- param->salt = (unsigned char *)"-";
- } else if (resalt || param->salt == NULL) {
+ if (param->salt.length == 0) {
+ param->salt.base = (unsigned char *)"-";
+ } else if (resalt || param->salt.base == NULL) {
unsigned char *newsalt;
unsigned char salttext[255 * 2 + 1];
do {
/* Generate a new salt. */
result = dns_nsec3_generate_salt(saltbuf,
- param->salt_length);
+ param->salt.length);
if (result != ISC_R_SUCCESS) {
break;
}
newsalt = saltbuf;
- salt2text(newsalt, param->salt_length, salttext,
+ salt2text(newsalt, param->salt.length, salttext,
sizeof(salttext));
dnssec_log(zone, ISC_LOG_INFO, "generated salt: %s",
salttext);
/* Check for salt conflict. */
- if (param->salt != NULL &&
- memcmp(newsalt, param->salt, param->salt_length) ==
- 0)
+ if (param->salt.base != NULL &&
+ memcmp(newsalt, param->salt.base,
+ param->salt.length) == 0)
{
result = ISC_R_SUCCESS;
} else {
- param->salt = newsalt;
+ param->salt.base = newsalt;
result = DNS_R_NSEC3RESALT;
}
} while (result == ISC_R_SUCCESS);
*/
isc_result_t
dns_zone_setnsec3param(dns_zone_t *zone, uint8_t hash, uint8_t flags,
- uint16_t iter, uint8_t saltlen, unsigned char *salt,
- bool replace, bool resalt) {
+ uint16_t iter, isc_region_t *salt, bool replace,
+ bool resalt) {
isc_result_t result = ISC_R_SUCCESS;
dns_rdata_nsec3param_t param, lookup;
dns_rdata_t nrdata = DNS_RDATA_INIT;
lookup.hash = hash;
lookup.flags = flags;
lookup.iterations = iter;
- lookup.salt_length = saltlen;
- lookup.salt = salt;
- param.salt = NULL;
+ lookup.salt = *salt;
+ param.salt = (isc_region_t){ .base = NULL };
result = dns__zone_lookup_nsec3param(zone, &lookup, ¶m,
saltbuf, resalt);
if (result == ISC_R_SUCCESS) {
* Schedule lookup if lookup above failed (may happen if
* zone db is NULL for example).
*/
- do_lookup = (param.salt == NULL) ? true : false;
+ do_lookup = (param.salt.base == NULL) ? true : false;
}
npe = isc_mem_get(zone->mctx, sizeof(*npe));
*/
isc_buffer_init(&b, nbuf, sizeof(nbuf));
- if (param.salt != NULL) {
+ if (param.salt.base != NULL) {
CHECK(dns_rdata_fromstruct(&nrdata, zone->rdclass,
dns_rdatatype_nsec3param,
¶m, &b));
if (isc_log_wouldlog(ISC_LOG_DEBUG(3))) {
unsigned char salttext[255 * 2 + 1];
- if (param.salt != NULL) {
- salt2text(param.salt, param.salt_length,
+ if (param.salt.base != NULL) {
+ salt2text(param.salt.base, param.salt.length,
salttext, sizeof(salttext));
}
dnssec_log(zone, ISC_LOG_DEBUG(3),
"setnsec3param:nsec3 %u %u %u %u:%s",
param.hash, param.flags, param.iterations,
- param.salt_length,
- param.salt == NULL ? "unknown"
- : (char *)salttext);
+ param.salt.length,
+ param.salt.base == NULL ? "unknown"
+ : (char *)salttext);
}
}
* fields declared above for each NSEC3 chain element:
*
* unsigned char salt[salt_length];
- * unsigned char owner[next_length];
- * unsigned char next[next_length];
+ * unsigned char owner[next.length];
+ * unsigned char next[next.length];
*/
};
unsigned char *cp = NULL;
size_t len;
- len = sizeof(*element) + nsec3->next_length * 2 + nsec3->salt_length;
+ len = sizeof(*element) + nsec3->next.length * 2 + nsec3->salt.length;
element = isc_mem_get(vctx->mctx, len);
*element = (struct nsec3_chain_fixed){
.hash = nsec3->hash,
- .salt_length = nsec3->salt_length,
- .next_length = nsec3->next_length,
+ .salt_length = nsec3->salt.length,
+ .next_length = nsec3->next.length,
.iterations = nsec3->iterations,
};
cp = (unsigned char *)(element + 1);
- memmove(cp, nsec3->salt, nsec3->salt_length);
- cp += nsec3->salt_length;
- memmove(cp, rawhash, nsec3->next_length);
- cp += nsec3->next_length;
- memmove(cp, nsec3->next, nsec3->next_length);
+ memmove(cp, nsec3->salt.base, nsec3->salt.length);
+ cp += nsec3->salt.length;
+ memmove(cp, rawhash, nsec3->next.length);
+ cp += nsec3->next.length;
+ memmove(cp, nsec3->next.base, nsec3->next.length);
isc_heap_insert(chains, element);
}
dns_rdataset_current(rdataset, &rdata);
dns_rdata_tostruct(&rdata, nsec3_match, NULL);
if (nsec3_match->hash == nsec3param->hash &&
- nsec3_match->next_length == rhsize &&
+ nsec3_match->next.length == rhsize &&
nsec3_match->iterations == nsec3param->iterations &&
- nsec3_match->salt_length == nsec3param->salt_length &&
- memcmp(nsec3_match->salt, nsec3param->salt,
- nsec3param->salt_length) == 0)
+ nsec3_match->salt.length == nsec3param->salt.length &&
+ memcmp(nsec3_match->salt.base, nsec3param->salt.base,
+ nsec3param->salt.length) == 0)
{
return ISC_R_SUCCESS;
}
* Check the type list.
*/
len = dns_nsec_compressbitmap(cbm, types, maxtype);
- if (nsec3.len != len || memcmp(cbm, nsec3.typebits, len) != 0) {
+ if (nsec3.typebits.length != len ||
+ memcmp(cbm, nsec3.typebits.base, len) != 0)
+ {
dns_name_format(name, namebuf, sizeof(namebuf));
zoneverify_log_error(vctx,
"Bad NSEC3 record for %s, bit map "
RUNTIME_CHECK(result == ISC_R_SUCCESS);
if (nsec3.hash == nsec3param->hash &&
nsec3.iterations == nsec3param->iterations &&
- nsec3.salt_length == nsec3param->salt_length &&
- memcmp(nsec3.salt, nsec3param->salt, nsec3.salt_length) ==
- 0)
+ nsec3.salt.length == nsec3param->salt.length &&
+ memcmp(nsec3.salt.base, nsec3param->salt.base,
+ nsec3.salt.length) == 0)
{
dns_name_format(name, namebuf, sizeof(namebuf));
zoneverify_log_error(vctx,
RUNTIME_CHECK(result == ISC_R_SUCCESS);
if (nsec3param.flags == 0 && nsec3param.hash == nsec3->hash &&
nsec3param.iterations == nsec3->iterations &&
- nsec3param.salt_length == nsec3->salt_length &&
- memcmp(nsec3param.salt, nsec3->salt, nsec3->salt_length) ==
- 0)
+ nsec3param.salt.length == nsec3->salt.length &&
+ memcmp(nsec3param.salt.base, nsec3->salt.base,
+ nsec3->salt.length) == 0)
{
return true;
}
dns_rdataset_current(&rdataset, &rdata);
result = dns_rdata_tostruct(&rdata, &nsec3, NULL);
RUNTIME_CHECK(result == ISC_R_SUCCESS);
- if (nsec3.next_length != isc_buffer_usedlength(&b)) {
+ if (nsec3.next.length != isc_buffer_usedlength(&b)) {
continue;
}
size_t rhsize = sizeof(rawhash);
dns_fixedname_init(&fixed);
- result = dns_nsec3_hashname(&fixed, rawhash, &rhsize, vctx->origin,
- vctx->origin, nsec3param->hash,
- nsec3param->iterations, nsec3param->salt,
- nsec3param->salt_length);
+ result = dns_nsec3_hashname(
+ &fixed, rawhash, &rhsize, vctx->origin, vctx->origin,
+ nsec3param->hash, nsec3param->iterations, nsec3param->salt.base,
+ nsec3param->salt.length);
if (result != ISC_R_SUCCESS) {
zoneverify_log_error(vctx, "dns_nsec3_hashname(): %s",
isc_result_totext(result));
RETERR(isoptout(vctx, &nsec3param, &optout));
dns_fixedname_init(&fixed);
- result = dns_nsec3_hashname(
- &fixed, rawhash, &rhsize, name, vctx->origin, nsec3param.hash,
- nsec3param.iterations, nsec3param.salt, nsec3param.salt_length);
+ result = dns_nsec3_hashname(&fixed, rawhash, &rhsize, name,
+ vctx->origin, nsec3param.hash,
+ nsec3param.iterations, nsec3param.salt.base,
+ nsec3param.salt.length);
if (result != ISC_R_SUCCESS) {
zoneverify_log_error(vctx, "dns_nsec3_hashname(): %s",
isc_result_totext(result));
to->hash = from.hash;
to->flags = from.flags;
to->iterations = from.iterations;
- to->salt_length = from.salt_length;
if (from.salt == NULL) {
- to->salt = NULL;
+ to->salt = (isc_region_t){ .base = NULL,
+ .length = from.salt_length };
} else if (strcmp(from.salt, "-") == 0) {
- to->salt = (unsigned char *)"-";
+ to->salt = (isc_region_t){ .base = (unsigned char *)"-",
+ .length = 0 };
} else {
decode_salt(from.salt, saltbuf, saltlen);
- to->salt = saltbuf;
+ to->salt = (isc_region_t){ .base = saltbuf,
+ .length = from.salt_length };
}
}
assert_int_equal(param.hash, expect.hash);
assert_int_equal(param.flags, expect.flags);
assert_int_equal(param.iterations, expect.iterations);
- assert_int_equal(param.salt_length, expect.salt_length);
- assert_non_null(param.salt);
- if (expect.salt != NULL) {
- int ret = memcmp(param.salt, expect.salt, expect.salt_length);
+ assert_int_equal(param.salt.length, expect.salt.length);
+ assert_non_null(param.salt.base);
+ if (expect.salt.base != NULL) {
+ int ret = memcmp(param.salt.base, expect.salt.base,
+ expect.salt.length);
assert_true(ret == 0);
} else {
/*
unsigned char salt[SALTLEN];
int ret;
decode_salt(SALT, salt, SALTLEN);
- ret = memcmp(param.salt, salt, SALTLEN);
+ ret = memcmp(param.salt.base, salt, SALTLEN);
assert_false(ret == 0);
}
params.common.rdtype = dns_rdatatype_nsec3param;
params.hash = testcase->hash;
params.iterations = testcase->iterations;
- params.salt = sp;
- params.salt_length = slen;
+ params.salt = (isc_region_t){ .base = sp, .length = slen };
params.flags = testcase->flags;
if (testcase->remove) {