1135446Strhodes/* 2254897Serwin * Copyright (C) 2004, 2005, 2007, 2009, 2011, 2012 Internet Systems Consortium, Inc. ("ISC") 3135446Strhodes * Copyright (C) 1999-2003 Internet Software Consortium. 4135446Strhodes * 5193149Sdougb * Permission to use, copy, modify, and/or distribute this software for any 6135446Strhodes * purpose with or without fee is hereby granted, provided that the above 7135446Strhodes * copyright notice and this permission notice appear in all copies. 8135446Strhodes * 9135446Strhodes * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 10135446Strhodes * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 11135446Strhodes * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 12135446Strhodes * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 13135446Strhodes * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 14135446Strhodes * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 15135446Strhodes * PERFORMANCE OF THIS SOFTWARE. 16135446Strhodes */ 17135446Strhodes 18234010Sdougb/* $Id$ */ 19135446Strhodes 20135446Strhodes/* Reviewed: Wed Mar 15 21:14:32 EST 2000 by tale */ 21135446Strhodes 22170222Sdougb/* RFC2538 */ 23135446Strhodes 24135446Strhodes#ifndef RDATA_GENERIC_CERT_37_C 25135446Strhodes#define RDATA_GENERIC_CERT_37_C 26135446Strhodes 27135446Strhodes#define RRTYPE_CERT_ATTRIBUTES (0) 28135446Strhodes 29135446Strhodesstatic inline isc_result_t 30135446Strhodesfromtext_cert(ARGS_FROMTEXT) { 31135446Strhodes isc_token_t token; 32135446Strhodes dns_secalg_t secalg; 33135446Strhodes dns_cert_t cert; 34135446Strhodes 35135446Strhodes REQUIRE(type == 37); 36135446Strhodes 37135446Strhodes UNUSED(type); 38135446Strhodes UNUSED(rdclass); 39135446Strhodes UNUSED(origin); 40135446Strhodes UNUSED(options); 41135446Strhodes UNUSED(callbacks); 42135446Strhodes 43135446Strhodes /* 44135446Strhodes * Cert type. 45135446Strhodes */ 46135446Strhodes RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string, 47135446Strhodes ISC_FALSE)); 48135446Strhodes RETTOK(dns_cert_fromtext(&cert, &token.value.as_textregion)); 49135446Strhodes RETERR(uint16_tobuffer(cert, target)); 50135446Strhodes 51135446Strhodes /* 52135446Strhodes * Key tag. 53135446Strhodes */ 54135446Strhodes RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number, 55135446Strhodes ISC_FALSE)); 56135446Strhodes if (token.value.as_ulong > 0xffffU) 57135446Strhodes RETTOK(ISC_R_RANGE); 58135446Strhodes RETERR(uint16_tobuffer(token.value.as_ulong, target)); 59135446Strhodes 60135446Strhodes /* 61135446Strhodes * Algorithm. 62135446Strhodes */ 63135446Strhodes RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string, 64135446Strhodes ISC_FALSE)); 65135446Strhodes RETTOK(dns_secalg_fromtext(&secalg, &token.value.as_textregion)); 66135446Strhodes RETERR(mem_tobuffer(target, &secalg, 1)); 67135446Strhodes 68135446Strhodes return (isc_base64_tobuffer(lexer, target, -1)); 69135446Strhodes} 70135446Strhodes 71135446Strhodesstatic inline isc_result_t 72135446Strhodestotext_cert(ARGS_TOTEXT) { 73135446Strhodes isc_region_t sr; 74135446Strhodes char buf[sizeof("64000 ")]; 75135446Strhodes unsigned int n; 76135446Strhodes 77135446Strhodes REQUIRE(rdata->type == 37); 78135446Strhodes REQUIRE(rdata->length != 0); 79135446Strhodes 80135446Strhodes UNUSED(tctx); 81135446Strhodes 82135446Strhodes dns_rdata_toregion(rdata, &sr); 83135446Strhodes 84135446Strhodes /* 85135446Strhodes * Type. 86135446Strhodes */ 87135446Strhodes n = uint16_fromregion(&sr); 88135446Strhodes isc_region_consume(&sr, 2); 89135446Strhodes RETERR(dns_cert_totext((dns_cert_t)n, target)); 90135446Strhodes RETERR(str_totext(" ", target)); 91135446Strhodes 92135446Strhodes /* 93135446Strhodes * Key tag. 94135446Strhodes */ 95135446Strhodes n = uint16_fromregion(&sr); 96135446Strhodes isc_region_consume(&sr, 2); 97135446Strhodes sprintf(buf, "%u ", n); 98135446Strhodes RETERR(str_totext(buf, target)); 99135446Strhodes 100135446Strhodes /* 101135446Strhodes * Algorithm. 102135446Strhodes */ 103135446Strhodes RETERR(dns_secalg_totext(sr.base[0], target)); 104135446Strhodes isc_region_consume(&sr, 1); 105135446Strhodes 106135446Strhodes /* 107135446Strhodes * Cert. 108135446Strhodes */ 109135446Strhodes if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0) 110135446Strhodes RETERR(str_totext(" (", target)); 111135446Strhodes RETERR(str_totext(tctx->linebreak, target)); 112254897Serwin if (tctx->width == 0) /* No splitting */ 113254897Serwin RETERR(isc_base64_totext(&sr, 60, "", target)); 114254897Serwin else 115254897Serwin RETERR(isc_base64_totext(&sr, tctx->width - 2, 116254897Serwin tctx->linebreak, target)); 117135446Strhodes if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0) 118135446Strhodes RETERR(str_totext(" )", target)); 119135446Strhodes return (ISC_R_SUCCESS); 120135446Strhodes} 121135446Strhodes 122135446Strhodesstatic inline isc_result_t 123135446Strhodesfromwire_cert(ARGS_FROMWIRE) { 124135446Strhodes isc_region_t sr; 125135446Strhodes 126135446Strhodes REQUIRE(type == 37); 127135446Strhodes 128135446Strhodes UNUSED(type); 129135446Strhodes UNUSED(rdclass); 130135446Strhodes UNUSED(dctx); 131135446Strhodes UNUSED(options); 132135446Strhodes 133135446Strhodes isc_buffer_activeregion(source, &sr); 134135446Strhodes if (sr.length < 5) 135135446Strhodes return (ISC_R_UNEXPECTEDEND); 136135446Strhodes 137135446Strhodes isc_buffer_forward(source, sr.length); 138135446Strhodes return (mem_tobuffer(target, sr.base, sr.length)); 139135446Strhodes} 140135446Strhodes 141135446Strhodesstatic inline isc_result_t 142135446Strhodestowire_cert(ARGS_TOWIRE) { 143135446Strhodes isc_region_t sr; 144135446Strhodes 145135446Strhodes REQUIRE(rdata->type == 37); 146135446Strhodes REQUIRE(rdata->length != 0); 147135446Strhodes 148135446Strhodes UNUSED(cctx); 149135446Strhodes 150135446Strhodes dns_rdata_toregion(rdata, &sr); 151135446Strhodes return (mem_tobuffer(target, sr.base, sr.length)); 152135446Strhodes} 153135446Strhodes 154135446Strhodesstatic inline int 155135446Strhodescompare_cert(ARGS_COMPARE) { 156135446Strhodes isc_region_t r1; 157135446Strhodes isc_region_t r2; 158135446Strhodes 159135446Strhodes REQUIRE(rdata1->type == rdata2->type); 160135446Strhodes REQUIRE(rdata1->rdclass == rdata2->rdclass); 161135446Strhodes REQUIRE(rdata1->type == 37); 162135446Strhodes REQUIRE(rdata1->length != 0); 163135446Strhodes REQUIRE(rdata2->length != 0); 164135446Strhodes 165135446Strhodes dns_rdata_toregion(rdata1, &r1); 166135446Strhodes dns_rdata_toregion(rdata2, &r2); 167135446Strhodes return (isc_region_compare(&r1, &r2)); 168135446Strhodes} 169135446Strhodes 170135446Strhodesstatic inline isc_result_t 171135446Strhodesfromstruct_cert(ARGS_FROMSTRUCT) { 172135446Strhodes dns_rdata_cert_t *cert = source; 173135446Strhodes 174135446Strhodes REQUIRE(type == 37); 175135446Strhodes REQUIRE(source != NULL); 176135446Strhodes REQUIRE(cert->common.rdtype == type); 177135446Strhodes REQUIRE(cert->common.rdclass == rdclass); 178135446Strhodes 179135446Strhodes UNUSED(type); 180135446Strhodes UNUSED(rdclass); 181135446Strhodes 182135446Strhodes RETERR(uint16_tobuffer(cert->type, target)); 183135446Strhodes RETERR(uint16_tobuffer(cert->key_tag, target)); 184135446Strhodes RETERR(uint8_tobuffer(cert->algorithm, target)); 185135446Strhodes 186135446Strhodes return (mem_tobuffer(target, cert->certificate, cert->length)); 187135446Strhodes} 188135446Strhodes 189135446Strhodesstatic inline isc_result_t 190135446Strhodestostruct_cert(ARGS_TOSTRUCT) { 191135446Strhodes dns_rdata_cert_t *cert = target; 192135446Strhodes isc_region_t region; 193135446Strhodes 194135446Strhodes REQUIRE(rdata->type == 37); 195135446Strhodes REQUIRE(target != NULL); 196135446Strhodes REQUIRE(rdata->length != 0); 197135446Strhodes 198135446Strhodes cert->common.rdclass = rdata->rdclass; 199135446Strhodes cert->common.rdtype = rdata->type; 200135446Strhodes ISC_LINK_INIT(&cert->common, link); 201135446Strhodes 202135446Strhodes dns_rdata_toregion(rdata, ®ion); 203135446Strhodes 204135446Strhodes cert->type = uint16_fromregion(®ion); 205135446Strhodes isc_region_consume(®ion, 2); 206135446Strhodes cert->key_tag = uint16_fromregion(®ion); 207135446Strhodes isc_region_consume(®ion, 2); 208135446Strhodes cert->algorithm = uint8_fromregion(®ion); 209135446Strhodes isc_region_consume(®ion, 1); 210135446Strhodes cert->length = region.length; 211135446Strhodes 212135446Strhodes cert->certificate = mem_maybedup(mctx, region.base, region.length); 213135446Strhodes if (cert->certificate == NULL) 214135446Strhodes return (ISC_R_NOMEMORY); 215135446Strhodes 216135446Strhodes cert->mctx = mctx; 217135446Strhodes return (ISC_R_SUCCESS); 218135446Strhodes} 219135446Strhodes 220135446Strhodesstatic inline void 221135446Strhodesfreestruct_cert(ARGS_FREESTRUCT) { 222135446Strhodes dns_rdata_cert_t *cert = source; 223135446Strhodes 224135446Strhodes REQUIRE(cert != NULL); 225135446Strhodes REQUIRE(cert->common.rdtype == 37); 226135446Strhodes 227135446Strhodes if (cert->mctx == NULL) 228135446Strhodes return; 229135446Strhodes 230135446Strhodes if (cert->certificate != NULL) 231135446Strhodes isc_mem_free(cert->mctx, cert->certificate); 232135446Strhodes cert->mctx = NULL; 233135446Strhodes} 234135446Strhodes 235135446Strhodesstatic inline isc_result_t 236135446Strhodesadditionaldata_cert(ARGS_ADDLDATA) { 237135446Strhodes REQUIRE(rdata->type == 37); 238135446Strhodes 239135446Strhodes UNUSED(rdata); 240135446Strhodes UNUSED(add); 241135446Strhodes UNUSED(arg); 242135446Strhodes 243135446Strhodes return (ISC_R_SUCCESS); 244135446Strhodes} 245135446Strhodes 246135446Strhodesstatic inline isc_result_t 247135446Strhodesdigest_cert(ARGS_DIGEST) { 248135446Strhodes isc_region_t r; 249135446Strhodes 250135446Strhodes REQUIRE(rdata->type == 37); 251135446Strhodes 252135446Strhodes dns_rdata_toregion(rdata, &r); 253135446Strhodes 254135446Strhodes return ((digest)(arg, &r)); 255135446Strhodes} 256135446Strhodes 257135446Strhodesstatic inline isc_boolean_t 258135446Strhodescheckowner_cert(ARGS_CHECKOWNER) { 259135446Strhodes 260135446Strhodes REQUIRE(type == 37); 261135446Strhodes 262135446Strhodes UNUSED(name); 263135446Strhodes UNUSED(type); 264135446Strhodes UNUSED(rdclass); 265135446Strhodes UNUSED(wildcard); 266135446Strhodes 267135446Strhodes return (ISC_TRUE); 268135446Strhodes} 269135446Strhodes 270135446Strhodesstatic inline isc_boolean_t 271135446Strhodeschecknames_cert(ARGS_CHECKNAMES) { 272135446Strhodes 273135446Strhodes REQUIRE(rdata->type == 37); 274135446Strhodes 275135446Strhodes UNUSED(rdata); 276135446Strhodes UNUSED(owner); 277135446Strhodes UNUSED(bad); 278135446Strhodes 279135446Strhodes return (ISC_TRUE); 280135446Strhodes} 281135446Strhodes 282224092Sdougb 283224092Sdougbstatic inline int 284224092Sdougbcasecompare_cert(ARGS_COMPARE) { 285224092Sdougb return (compare_cert(rdata1, rdata2)); 286224092Sdougb} 287135446Strhodes#endif /* RDATA_GENERIC_CERT_37_C */ 288