2 * Copyright (C) 2004, 2006, 2007, 2009, 2012, 2013 Internet Systems Consortium, Inc. ("ISC")
3 * Copyright (C) 2003 Internet Software Consortium.
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
9 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11 * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15 * PERFORMANCE OF THIS SOFTWARE.
22 #ifndef RDATA_GENERIC_SSHFP_44_C
23 #define RDATA_GENERIC_SSHFP_44_C
25 #define RRTYPE_SSHFP_ATTRIBUTES (0)
27 static inline isc_result_t
28 fromtext_sshfp(ARGS_FROMTEXT) {
42 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number,
44 if (token.value.as_ulong > 0xffU)
46 RETERR(uint8_tobuffer(token.value.as_ulong, target));
51 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number,
53 if (token.value.as_ulong > 0xffU)
55 RETERR(uint8_tobuffer(token.value.as_ulong, target));
60 return (isc_hex_tobuffer(lexer, target, -1));
63 static inline isc_result_t
64 totext_sshfp(ARGS_TOTEXT) {
66 char buf[sizeof("64000 ")];
69 REQUIRE(rdata->type == 44);
70 REQUIRE(rdata->length != 0);
74 dns_rdata_toregion(rdata, &sr);
79 n = uint8_fromregion(&sr);
80 isc_region_consume(&sr, 1);
81 sprintf(buf, "%u ", n);
82 RETERR(str_totext(buf, target));
87 n = uint8_fromregion(&sr);
88 isc_region_consume(&sr, 1);
89 sprintf(buf, "%u", n);
90 RETERR(str_totext(buf, target));
95 if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
96 RETERR(str_totext(" (", target));
97 RETERR(str_totext(tctx->linebreak, target));
98 RETERR(isc_hex_totext(&sr, tctx->width - 2, tctx->linebreak, target));
99 if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
100 RETERR(str_totext(" )", target));
101 return (ISC_R_SUCCESS);
104 static inline isc_result_t
105 fromwire_sshfp(ARGS_FROMWIRE) {
115 isc_buffer_activeregion(source, &sr);
117 return (ISC_R_UNEXPECTEDEND);
119 isc_buffer_forward(source, sr.length);
120 return (mem_tobuffer(target, sr.base, sr.length));
123 static inline isc_result_t
124 towire_sshfp(ARGS_TOWIRE) {
127 REQUIRE(rdata->type == 44);
128 REQUIRE(rdata->length != 0);
132 dns_rdata_toregion(rdata, &sr);
133 return (mem_tobuffer(target, sr.base, sr.length));
137 compare_sshfp(ARGS_COMPARE) {
141 REQUIRE(rdata1->type == rdata2->type);
142 REQUIRE(rdata1->rdclass == rdata2->rdclass);
143 REQUIRE(rdata1->type == 44);
144 REQUIRE(rdata1->length != 0);
145 REQUIRE(rdata2->length != 0);
147 dns_rdata_toregion(rdata1, &r1);
148 dns_rdata_toregion(rdata2, &r2);
149 return (isc_region_compare(&r1, &r2));
152 static inline isc_result_t
153 fromstruct_sshfp(ARGS_FROMSTRUCT) {
154 dns_rdata_sshfp_t *sshfp = source;
157 REQUIRE(source != NULL);
158 REQUIRE(sshfp->common.rdtype == type);
159 REQUIRE(sshfp->common.rdclass == rdclass);
164 RETERR(uint8_tobuffer(sshfp->algorithm, target));
165 RETERR(uint8_tobuffer(sshfp->digest_type, target));
167 return (mem_tobuffer(target, sshfp->digest, sshfp->length));
170 static inline isc_result_t
171 tostruct_sshfp(ARGS_TOSTRUCT) {
172 dns_rdata_sshfp_t *sshfp = target;
175 REQUIRE(rdata->type == 44);
176 REQUIRE(target != NULL);
177 REQUIRE(rdata->length != 0);
179 sshfp->common.rdclass = rdata->rdclass;
180 sshfp->common.rdtype = rdata->type;
181 ISC_LINK_INIT(&sshfp->common, link);
183 dns_rdata_toregion(rdata, ®ion);
185 sshfp->algorithm = uint8_fromregion(®ion);
186 isc_region_consume(®ion, 1);
187 sshfp->digest_type = uint8_fromregion(®ion);
188 isc_region_consume(®ion, 1);
189 sshfp->length = region.length;
191 sshfp->digest = mem_maybedup(mctx, region.base, region.length);
192 if (sshfp->digest == NULL)
193 return (ISC_R_NOMEMORY);
196 return (ISC_R_SUCCESS);
200 freestruct_sshfp(ARGS_FREESTRUCT) {
201 dns_rdata_sshfp_t *sshfp = source;
203 REQUIRE(sshfp != NULL);
204 REQUIRE(sshfp->common.rdtype == 44);
206 if (sshfp->mctx == NULL)
209 if (sshfp->digest != NULL)
210 isc_mem_free(sshfp->mctx, sshfp->digest);
214 static inline isc_result_t
215 additionaldata_sshfp(ARGS_ADDLDATA) {
216 REQUIRE(rdata->type == 44);
222 return (ISC_R_SUCCESS);
225 static inline isc_result_t
226 digest_sshfp(ARGS_DIGEST) {
229 REQUIRE(rdata->type == 44);
231 dns_rdata_toregion(rdata, &r);
233 return ((digest)(arg, &r));
236 static inline isc_boolean_t
237 checkowner_sshfp(ARGS_CHECKOWNER) {
249 static inline isc_boolean_t
250 checknames_sshfp(ARGS_CHECKNAMES) {
252 REQUIRE(rdata->type == 44);
262 casecompare_sshfp(ARGS_COMPARE) {
263 return (compare_sshfp(rdata1, rdata2));
266 #endif /* RDATA_GENERIC_SSHFP_44_C */