#ifndef RDATA_GENERIC_HIP_5_C
#define RDATA_GENERIC_HIP_5_C
static inline isc_result_t
totext_hip(ARGS_TOTEXT) {
isc_region_t region;
dns_name_t name;
unsigned int length, key_len, hit_len;
unsigned char algorithm;
char buf[sizeof("225 ")];
REQUIRE(rdata->type == dns_rdatatype_hip);
REQUIRE(rdata->length != 0);
dns_rdata_toregion(rdata, ®ion);
hit_len = uint8_fromregion(®ion);
isc_region_consume(®ion, 1);
algorithm = uint8_fromregion(®ion);
isc_region_consume(®ion, 1);
key_len = uint16_fromregion(®ion);
isc_region_consume(®ion, 2);
if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
RETERR(isc_str_tobuffer("( ", target));
snprintf(buf, sizeof(buf), "%u ", algorithm);
RETERR(isc_str_tobuffer(buf, target));
INSIST(hit_len < region.length);
length = region.length;
region.length = hit_len;
RETERR(isc_hex_totext(®ion, 1, "", target));
region.length = length - hit_len;
RETERR(isc_str_tobuffer(tctx->linebreak, target));
INSIST(key_len <= region.length);
length = region.length;
region.length = key_len;
RETERR(isc_base64_totext(®ion, 1, "", target));
region.length = length - key_len;
RETERR(isc_str_tobuffer(tctx->linebreak, target));
dns_name_init(&name, NULL);
while (region.length > 0) {
dns_name_fromregion(&name, ®ion);
RETERR(dns_name_totext(&name, 0, target));
isc_region_consume(®ion, name.length);
if (region.length > 0)
RETERR(isc_str_tobuffer(tctx->linebreak, target));
}
if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
RETERR(isc_str_tobuffer(" )", target));
return (ISC_R_SUCCESS);
}
static inline isc_result_t
fromwire_hip(ARGS_FROMWIRE) {
isc_region_t region, rr;
dns_name_t name;
uint8_t hit_len;
uint16_t key_len;
REQUIRE(type == dns_rdatatype_hip);
UNUSED(type);
UNUSED(rdclass);
isc_buffer_activeregion(source, ®ion);
if (region.length < 4U)
return (DNS_R_FORMERR);
rr = region;
hit_len = uint8_fromregion(®ion);
if (hit_len == 0)
return (DNS_R_FORMERR);
isc_region_consume(®ion, 2);
key_len = uint16_fromregion(®ion);
if (key_len == 0)
return (DNS_R_FORMERR);
isc_region_consume(®ion, 2);
if (region.length < (unsigned) (hit_len + key_len))
return (DNS_R_FORMERR);
RETERR(isc_mem_tobuffer(target, rr.base, 4 + hit_len + key_len));
isc_buffer_forward(source, 4 + hit_len + key_len);
dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE);
while (isc_buffer_activelength(source) > 0) {
dns_name_init(&name, NULL);
RETERR(dns_name_fromwire(&name, source, dctx, options, target));
}
return (ISC_R_SUCCESS);
}
static inline isc_result_t
towire_hip(ARGS_TOWIRE) {
isc_region_t region;
REQUIRE(rdata->type == dns_rdatatype_hip);
REQUIRE(rdata->length != 0);
UNUSED(cctx);
dns_rdata_toregion(rdata, ®ion);
return (isc_mem_tobuffer(target, region.base, region.length));
}
#endif