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: rrsig_46.c,v 1.12 2020/02/26 18:47:59 florian Exp $ */ 18 19 /* Reviewed: Fri Mar 17 09:05:02 PST 2000 by gson */ 20 21 /* RFC2535 */ 22 23 #ifndef RDATA_GENERIC_RRSIG_46_C 24 #define RDATA_GENERIC_RRSIG_46_C 25 26 static inline isc_result_t 27 totext_rrsig(ARGS_TOTEXT) { 28 isc_region_t sr; 29 char buf[sizeof("4294967295")]; /* Also TYPE65000. */ 30 dns_rdatatype_t covered; 31 unsigned long ttl; 32 unsigned long when; 33 unsigned long exp; 34 unsigned long foot; 35 dns_name_t name; 36 37 REQUIRE(rdata->type == dns_rdatatype_rrsig); 38 REQUIRE(rdata->length != 0); 39 40 dns_rdata_toregion(rdata, &sr); 41 42 /* 43 * Type covered. 44 */ 45 covered = uint16_fromregion(&sr); 46 isc_region_consume(&sr, 2); 47 48 RETERR(dns_rdatatype_totext(covered, target)); 49 RETERR(isc_str_tobuffer(" ", target)); 50 51 /* 52 * Algorithm. 53 */ 54 snprintf(buf, sizeof(buf), "%u", sr.base[0]); 55 isc_region_consume(&sr, 1); 56 RETERR(isc_str_tobuffer(buf, target)); 57 RETERR(isc_str_tobuffer(" ", target)); 58 59 /* 60 * Labels. 61 */ 62 snprintf(buf, sizeof(buf), "%u", sr.base[0]); 63 isc_region_consume(&sr, 1); 64 RETERR(isc_str_tobuffer(buf, target)); 65 RETERR(isc_str_tobuffer(" ", target)); 66 67 /* 68 * Ttl. 69 */ 70 ttl = uint32_fromregion(&sr); 71 isc_region_consume(&sr, 4); 72 snprintf(buf, sizeof(buf), "%lu", ttl); 73 RETERR(isc_str_tobuffer(buf, target)); 74 75 if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0) 76 RETERR(isc_str_tobuffer(" (", target)); 77 RETERR(isc_str_tobuffer(tctx->linebreak, target)); 78 79 /* 80 * Sig exp. 81 */ 82 exp = uint32_fromregion(&sr); 83 isc_region_consume(&sr, 4); 84 RETERR(dns_time32_totext(exp, target)); 85 RETERR(isc_str_tobuffer(" ", target)); 86 87 /* 88 * Time signed. 89 */ 90 when = uint32_fromregion(&sr); 91 isc_region_consume(&sr, 4); 92 RETERR(dns_time32_totext(when, target)); 93 RETERR(isc_str_tobuffer(" ", target)); 94 95 /* 96 * Footprint. 97 */ 98 foot = uint16_fromregion(&sr); 99 isc_region_consume(&sr, 2); 100 snprintf(buf, sizeof(buf), "%lu", foot); 101 RETERR(isc_str_tobuffer(buf, target)); 102 RETERR(isc_str_tobuffer(" ", target)); 103 104 /* 105 * Signer. 106 */ 107 dns_name_init(&name, NULL); 108 dns_name_fromregion(&name, &sr); 109 isc_region_consume(&sr, name_length(&name)); 110 RETERR(dns_name_totext(&name, ISC_FALSE, target)); 111 112 /* 113 * Sig. 114 */ 115 RETERR(isc_str_tobuffer(tctx->linebreak, target)); 116 if ((tctx->flags & DNS_STYLEFLAG_NOCRYPTO) == 0) { 117 if (tctx->width == 0) /* No splitting */ 118 RETERR(isc_base64_totext(&sr, 60, "", target)); 119 else 120 RETERR(isc_base64_totext(&sr, tctx->width - 2, 121 tctx->linebreak, target)); 122 } else 123 RETERR(isc_str_tobuffer("[omitted]", target)); 124 125 if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0) 126 RETERR(isc_str_tobuffer(" )", target)); 127 128 return (ISC_R_SUCCESS); 129 } 130 131 static inline isc_result_t 132 fromwire_rrsig(ARGS_FROMWIRE) { 133 isc_region_t sr; 134 dns_name_t name; 135 136 REQUIRE(type == dns_rdatatype_rrsig); 137 138 UNUSED(type); 139 UNUSED(rdclass); 140 141 dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE); 142 143 isc_buffer_activeregion(source, &sr); 144 /* 145 * type covered: 2 146 * algorithm: 1 147 * labels: 1 148 * original ttl: 4 149 * signature expiration: 4 150 * time signed: 4 151 * key footprint: 2 152 */ 153 if (sr.length < 18) 154 return (ISC_R_UNEXPECTEDEND); 155 156 isc_buffer_forward(source, 18); 157 RETERR(isc_mem_tobuffer(target, sr.base, 18)); 158 159 /* 160 * Signer. 161 */ 162 dns_name_init(&name, NULL); 163 RETERR(dns_name_fromwire(&name, source, dctx, options, target)); 164 165 /* 166 * Sig. 167 */ 168 isc_buffer_activeregion(source, &sr); 169 isc_buffer_forward(source, sr.length); 170 return (isc_mem_tobuffer(target, sr.base, sr.length)); 171 } 172 173 static inline isc_result_t 174 towire_rrsig(ARGS_TOWIRE) { 175 isc_region_t sr; 176 dns_name_t name; 177 dns_offsets_t offsets; 178 179 REQUIRE(rdata->type == dns_rdatatype_rrsig); 180 REQUIRE(rdata->length != 0); 181 182 dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); 183 dns_rdata_toregion(rdata, &sr); 184 /* 185 * type covered: 2 186 * algorithm: 1 187 * labels: 1 188 * original ttl: 4 189 * signature expiration: 4 190 * time signed: 4 191 * key footprint: 2 192 */ 193 RETERR(isc_mem_tobuffer(target, sr.base, 18)); 194 isc_region_consume(&sr, 18); 195 196 /* 197 * Signer. 198 */ 199 dns_name_init(&name, offsets); 200 dns_name_fromregion(&name, &sr); 201 isc_region_consume(&sr, name_length(&name)); 202 RETERR(dns_name_towire(&name, cctx, target)); 203 204 /* 205 * Signature. 206 */ 207 return (isc_mem_tobuffer(target, sr.base, sr.length)); 208 } 209 210 static inline dns_rdatatype_t 211 covers_rrsig(dns_rdata_t *rdata) { 212 dns_rdatatype_t type; 213 isc_region_t r; 214 215 REQUIRE(rdata->type == dns_rdatatype_rrsig); 216 217 dns_rdata_toregion(rdata, &r); 218 type = uint16_fromregion(&r); 219 220 return (type); 221 } 222 223 #endif /* RDATA_GENERIC_RRSIG_46_C */ 224