1 /*
2 * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
9 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10 * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
11 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
13 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14 * PERFORMANCE OF THIS SOFTWARE.
15 */
16
17 /* $Id: sshfp_44.c,v 1.12 2020/02/26 18:47:59 florian Exp $ */
18
19 /* RFC 4255 */
20
21 #ifndef RDATA_GENERIC_SSHFP_44_C
22 #define RDATA_GENERIC_SSHFP_44_C
23
24 static inline isc_result_t
totext_sshfp(ARGS_TOTEXT)25 totext_sshfp(ARGS_TOTEXT) {
26 isc_region_t sr;
27 char buf[sizeof("64000 ")];
28 unsigned int n;
29
30 REQUIRE(rdata->type == dns_rdatatype_sshfp);
31 REQUIRE(rdata->length != 0);
32
33 UNUSED(tctx);
34
35 dns_rdata_toregion(rdata, &sr);
36
37 /*
38 * Algorithm.
39 */
40 n = uint8_fromregion(&sr);
41 isc_region_consume(&sr, 1);
42 snprintf(buf, sizeof(buf), "%u ", n);
43 RETERR(isc_str_tobuffer(buf, target));
44
45 /*
46 * Digest type.
47 */
48 n = uint8_fromregion(&sr);
49 isc_region_consume(&sr, 1);
50 snprintf(buf, sizeof(buf), "%u", n);
51 RETERR(isc_str_tobuffer(buf, target));
52
53 /*
54 * Digest.
55 */
56 if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
57 RETERR(isc_str_tobuffer(" (", target));
58 RETERR(isc_str_tobuffer(tctx->linebreak, target));
59 if (tctx->width == 0) /* No splitting */
60 RETERR(isc_hex_totext(&sr, 0, "", target));
61 else
62 RETERR(isc_hex_totext(&sr, tctx->width - 2,
63 tctx->linebreak, target));
64 if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
65 RETERR(isc_str_tobuffer(" )", target));
66 return (ISC_R_SUCCESS);
67 }
68
69 static inline isc_result_t
fromwire_sshfp(ARGS_FROMWIRE)70 fromwire_sshfp(ARGS_FROMWIRE) {
71 isc_region_t sr;
72
73 REQUIRE(type == dns_rdatatype_sshfp);
74
75 UNUSED(type);
76 UNUSED(rdclass);
77 UNUSED(dctx);
78 UNUSED(options);
79
80 isc_buffer_activeregion(source, &sr);
81 if (sr.length < 4)
82 return (ISC_R_UNEXPECTEDEND);
83
84 isc_buffer_forward(source, sr.length);
85 return (isc_mem_tobuffer(target, sr.base, sr.length));
86 }
87
88 static inline isc_result_t
towire_sshfp(ARGS_TOWIRE)89 towire_sshfp(ARGS_TOWIRE) {
90 isc_region_t sr;
91
92 REQUIRE(rdata->type == dns_rdatatype_sshfp);
93 REQUIRE(rdata->length != 0);
94
95 UNUSED(cctx);
96
97 dns_rdata_toregion(rdata, &sr);
98 return (isc_mem_tobuffer(target, sr.base, sr.length));
99 }
100
101 #endif /* RDATA_GENERIC_SSHFP_44_C */
102