1/* 2 * validator/val_kentry.c - validator key entry definition. 3 * 4 * Copyright (c) 2007, NLnet Labs. All rights reserved. 5 * 6 * This software is open source. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 12 * Redistributions of source code must retain the above copyright notice, 13 * this list of conditions and the following disclaimer. 14 * 15 * Redistributions in binary form must reproduce the above copyright notice, 16 * this list of conditions and the following disclaimer in the documentation 17 * and/or other materials provided with the distribution. 18 * 19 * Neither the name of the NLNET LABS nor the names of its contributors may 20 * be used to endorse or promote products derived from this software without 21 * specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
| 1/* 2 * validator/val_kentry.c - validator key entry definition. 3 * 4 * Copyright (c) 2007, NLnet Labs. All rights reserved. 5 * 6 * This software is open source. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 12 * Redistributions of source code must retain the above copyright notice, 13 * this list of conditions and the following disclaimer. 14 * 15 * Redistributions in binary form must reproduce the above copyright notice, 16 * this list of conditions and the following disclaimer in the documentation 17 * and/or other materials provided with the distribution. 18 * 19 * Neither the name of the NLNET LABS nor the names of its contributors may 20 * be used to endorse or promote products derived from this software without 21 * specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 25 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 26 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE 27 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 28 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 29 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 30 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 31 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 32 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 33 * POSSIBILITY OF SUCH DAMAGE.
| 24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 26 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 27 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 29 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 30 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 31 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 32 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 33 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
34 */ 35 36/** 37 * \file 38 * 39 * This file contains functions for dealing with validator key entries. 40 */ 41#include "config.h"
| 34 */ 35 36/** 37 * \file 38 * 39 * This file contains functions for dealing with validator key entries. 40 */ 41#include "config.h"
|
42#include <ldns/ldns.h>
| |
43#include "validator/val_kentry.h" 44#include "util/data/packed_rrset.h" 45#include "util/data/dname.h" 46#include "util/storage/lookup3.h" 47#include "util/regional.h" 48#include "util/net_help.h"
| 42#include "validator/val_kentry.h" 43#include "util/data/packed_rrset.h" 44#include "util/data/dname.h" 45#include "util/storage/lookup3.h" 46#include "util/regional.h" 47#include "util/net_help.h"
|
| 48#include "ldns/rrdef.h" 49#include "ldns/keyraw.h"
|
49 50size_t 51key_entry_sizefunc(void* key, void* data) 52{ 53 struct key_entry_key* kk = (struct key_entry_key*)key; 54 struct key_entry_data* kd = (struct key_entry_data*)data; 55 size_t s = sizeof(*kk) + kk->namelen; 56 s += sizeof(*kd) + lock_get_mem(&kk->entry.lock); 57 if(kd->rrset_data) 58 s += packed_rrset_sizeof(kd->rrset_data); 59 if(kd->reason) 60 s += strlen(kd->reason)+1; 61 if(kd->algo) 62 s += strlen((char*)kd->algo)+1; 63 return s; 64} 65 66int 67key_entry_compfunc(void* k1, void* k2) 68{ 69 struct key_entry_key* n1 = (struct key_entry_key*)k1; 70 struct key_entry_key* n2 = (struct key_entry_key*)k2; 71 if(n1->key_class != n2->key_class) { 72 if(n1->key_class < n2->key_class) 73 return -1; 74 return 1; 75 } 76 return query_dname_compare(n1->name, n2->name); 77} 78 79void 80key_entry_delkeyfunc(void* key, void* ATTR_UNUSED(userarg)) 81{ 82 struct key_entry_key* kk = (struct key_entry_key*)key; 83 if(!key) 84 return; 85 lock_rw_destroy(&kk->entry.lock); 86 free(kk->name); 87 free(kk); 88} 89 90void 91key_entry_deldatafunc(void* data, void* ATTR_UNUSED(userarg)) 92{ 93 struct key_entry_data* kd = (struct key_entry_data*)data; 94 free(kd->reason); 95 free(kd->rrset_data); 96 free(kd->algo); 97 free(kd); 98} 99 100void 101key_entry_hash(struct key_entry_key* kk) 102{ 103 kk->entry.hash = 0x654; 104 kk->entry.hash = hashlittle(&kk->key_class, sizeof(kk->key_class), 105 kk->entry.hash); 106 kk->entry.hash = dname_query_hash(kk->name, kk->entry.hash); 107} 108 109struct key_entry_key* 110key_entry_copy_toregion(struct key_entry_key* kkey, struct regional* region) 111{ 112 struct key_entry_key* newk; 113 newk = regional_alloc_init(region, kkey, sizeof(*kkey)); 114 if(!newk) 115 return NULL; 116 newk->name = regional_alloc_init(region, kkey->name, kkey->namelen); 117 if(!newk->name) 118 return NULL; 119 newk->entry.key = newk; 120 if(newk->entry.data) { 121 /* copy data element */ 122 struct key_entry_data *d = (struct key_entry_data*) 123 kkey->entry.data; 124 struct key_entry_data *newd; 125 newd = regional_alloc_init(region, d, sizeof(*d)); 126 if(!newd) 127 return NULL; 128 /* copy rrset */ 129 if(d->rrset_data) { 130 newd->rrset_data = regional_alloc_init(region, 131 d->rrset_data, 132 packed_rrset_sizeof(d->rrset_data)); 133 if(!newd->rrset_data) 134 return NULL; 135 packed_rrset_ptr_fixup(newd->rrset_data); 136 } 137 if(d->reason) { 138 newd->reason = regional_strdup(region, d->reason); 139 if(!newd->reason) 140 return NULL; 141 } 142 if(d->algo) { 143 newd->algo = (uint8_t*)regional_strdup(region, 144 (char*)d->algo); 145 if(!newd->algo) 146 return NULL; 147 } 148 newk->entry.data = newd; 149 } 150 return newk; 151} 152 153struct key_entry_key* 154key_entry_copy(struct key_entry_key* kkey) 155{ 156 struct key_entry_key* newk; 157 if(!kkey) 158 return NULL; 159 newk = memdup(kkey, sizeof(*kkey)); 160 if(!newk) 161 return NULL; 162 newk->name = memdup(kkey->name, kkey->namelen); 163 if(!newk->name) { 164 free(newk); 165 return NULL; 166 } 167 lock_rw_init(&newk->entry.lock); 168 newk->entry.key = newk; 169 if(newk->entry.data) { 170 /* copy data element */ 171 struct key_entry_data *d = (struct key_entry_data*) 172 kkey->entry.data; 173 struct key_entry_data *newd; 174 newd = memdup(d, sizeof(*d)); 175 if(!newd) { 176 free(newk->name); 177 free(newk); 178 return NULL; 179 } 180 /* copy rrset */ 181 if(d->rrset_data) { 182 newd->rrset_data = memdup(d->rrset_data, 183 packed_rrset_sizeof(d->rrset_data)); 184 if(!newd->rrset_data) { 185 free(newd); 186 free(newk->name); 187 free(newk); 188 return NULL; 189 } 190 packed_rrset_ptr_fixup(newd->rrset_data); 191 } 192 if(d->reason) { 193 newd->reason = strdup(d->reason); 194 if(!newd->reason) { 195 free(newd->rrset_data); 196 free(newd); 197 free(newk->name); 198 free(newk); 199 return NULL; 200 } 201 } 202 if(d->algo) { 203 newd->algo = (uint8_t*)strdup((char*)d->algo); 204 if(!newd->algo) { 205 free(newd->rrset_data); 206 free(newd->reason); 207 free(newd); 208 free(newk->name); 209 free(newk); 210 return NULL; 211 } 212 } 213 newk->entry.data = newd; 214 } 215 return newk; 216} 217 218int 219key_entry_isnull(struct key_entry_key* kkey) 220{ 221 struct key_entry_data* d = (struct key_entry_data*)kkey->entry.data; 222 return (!d->isbad && d->rrset_data == NULL); 223} 224 225int 226key_entry_isgood(struct key_entry_key* kkey) 227{ 228 struct key_entry_data* d = (struct key_entry_data*)kkey->entry.data; 229 return (!d->isbad && d->rrset_data != NULL); 230} 231 232int 233key_entry_isbad(struct key_entry_key* kkey) 234{ 235 struct key_entry_data* d = (struct key_entry_data*)kkey->entry.data; 236 return (int)(d->isbad); 237} 238 239void 240key_entry_set_reason(struct key_entry_key* kkey, char* reason) 241{ 242 struct key_entry_data* d = (struct key_entry_data*)kkey->entry.data; 243 d->reason = reason; 244} 245 246char* 247key_entry_get_reason(struct key_entry_key* kkey) 248{ 249 struct key_entry_data* d = (struct key_entry_data*)kkey->entry.data; 250 return d->reason; 251} 252 253/** setup key entry in region */ 254static int 255key_entry_setup(struct regional* region, 256 uint8_t* name, size_t namelen, uint16_t dclass, 257 struct key_entry_key** k, struct key_entry_data** d) 258{ 259 *k = regional_alloc(region, sizeof(**k)); 260 if(!*k) 261 return 0; 262 memset(*k, 0, sizeof(**k)); 263 (*k)->entry.key = *k; 264 (*k)->name = regional_alloc_init(region, name, namelen); 265 if(!(*k)->name) 266 return 0; 267 (*k)->namelen = namelen; 268 (*k)->key_class = dclass; 269 *d = regional_alloc(region, sizeof(**d)); 270 if(!*d) 271 return 0; 272 (*k)->entry.data = *d; 273 return 1; 274} 275 276struct key_entry_key* 277key_entry_create_null(struct regional* region,
| 50 51size_t 52key_entry_sizefunc(void* key, void* data) 53{ 54 struct key_entry_key* kk = (struct key_entry_key*)key; 55 struct key_entry_data* kd = (struct key_entry_data*)data; 56 size_t s = sizeof(*kk) + kk->namelen; 57 s += sizeof(*kd) + lock_get_mem(&kk->entry.lock); 58 if(kd->rrset_data) 59 s += packed_rrset_sizeof(kd->rrset_data); 60 if(kd->reason) 61 s += strlen(kd->reason)+1; 62 if(kd->algo) 63 s += strlen((char*)kd->algo)+1; 64 return s; 65} 66 67int 68key_entry_compfunc(void* k1, void* k2) 69{ 70 struct key_entry_key* n1 = (struct key_entry_key*)k1; 71 struct key_entry_key* n2 = (struct key_entry_key*)k2; 72 if(n1->key_class != n2->key_class) { 73 if(n1->key_class < n2->key_class) 74 return -1; 75 return 1; 76 } 77 return query_dname_compare(n1->name, n2->name); 78} 79 80void 81key_entry_delkeyfunc(void* key, void* ATTR_UNUSED(userarg)) 82{ 83 struct key_entry_key* kk = (struct key_entry_key*)key; 84 if(!key) 85 return; 86 lock_rw_destroy(&kk->entry.lock); 87 free(kk->name); 88 free(kk); 89} 90 91void 92key_entry_deldatafunc(void* data, void* ATTR_UNUSED(userarg)) 93{ 94 struct key_entry_data* kd = (struct key_entry_data*)data; 95 free(kd->reason); 96 free(kd->rrset_data); 97 free(kd->algo); 98 free(kd); 99} 100 101void 102key_entry_hash(struct key_entry_key* kk) 103{ 104 kk->entry.hash = 0x654; 105 kk->entry.hash = hashlittle(&kk->key_class, sizeof(kk->key_class), 106 kk->entry.hash); 107 kk->entry.hash = dname_query_hash(kk->name, kk->entry.hash); 108} 109 110struct key_entry_key* 111key_entry_copy_toregion(struct key_entry_key* kkey, struct regional* region) 112{ 113 struct key_entry_key* newk; 114 newk = regional_alloc_init(region, kkey, sizeof(*kkey)); 115 if(!newk) 116 return NULL; 117 newk->name = regional_alloc_init(region, kkey->name, kkey->namelen); 118 if(!newk->name) 119 return NULL; 120 newk->entry.key = newk; 121 if(newk->entry.data) { 122 /* copy data element */ 123 struct key_entry_data *d = (struct key_entry_data*) 124 kkey->entry.data; 125 struct key_entry_data *newd; 126 newd = regional_alloc_init(region, d, sizeof(*d)); 127 if(!newd) 128 return NULL; 129 /* copy rrset */ 130 if(d->rrset_data) { 131 newd->rrset_data = regional_alloc_init(region, 132 d->rrset_data, 133 packed_rrset_sizeof(d->rrset_data)); 134 if(!newd->rrset_data) 135 return NULL; 136 packed_rrset_ptr_fixup(newd->rrset_data); 137 } 138 if(d->reason) { 139 newd->reason = regional_strdup(region, d->reason); 140 if(!newd->reason) 141 return NULL; 142 } 143 if(d->algo) { 144 newd->algo = (uint8_t*)regional_strdup(region, 145 (char*)d->algo); 146 if(!newd->algo) 147 return NULL; 148 } 149 newk->entry.data = newd; 150 } 151 return newk; 152} 153 154struct key_entry_key* 155key_entry_copy(struct key_entry_key* kkey) 156{ 157 struct key_entry_key* newk; 158 if(!kkey) 159 return NULL; 160 newk = memdup(kkey, sizeof(*kkey)); 161 if(!newk) 162 return NULL; 163 newk->name = memdup(kkey->name, kkey->namelen); 164 if(!newk->name) { 165 free(newk); 166 return NULL; 167 } 168 lock_rw_init(&newk->entry.lock); 169 newk->entry.key = newk; 170 if(newk->entry.data) { 171 /* copy data element */ 172 struct key_entry_data *d = (struct key_entry_data*) 173 kkey->entry.data; 174 struct key_entry_data *newd; 175 newd = memdup(d, sizeof(*d)); 176 if(!newd) { 177 free(newk->name); 178 free(newk); 179 return NULL; 180 } 181 /* copy rrset */ 182 if(d->rrset_data) { 183 newd->rrset_data = memdup(d->rrset_data, 184 packed_rrset_sizeof(d->rrset_data)); 185 if(!newd->rrset_data) { 186 free(newd); 187 free(newk->name); 188 free(newk); 189 return NULL; 190 } 191 packed_rrset_ptr_fixup(newd->rrset_data); 192 } 193 if(d->reason) { 194 newd->reason = strdup(d->reason); 195 if(!newd->reason) { 196 free(newd->rrset_data); 197 free(newd); 198 free(newk->name); 199 free(newk); 200 return NULL; 201 } 202 } 203 if(d->algo) { 204 newd->algo = (uint8_t*)strdup((char*)d->algo); 205 if(!newd->algo) { 206 free(newd->rrset_data); 207 free(newd->reason); 208 free(newd); 209 free(newk->name); 210 free(newk); 211 return NULL; 212 } 213 } 214 newk->entry.data = newd; 215 } 216 return newk; 217} 218 219int 220key_entry_isnull(struct key_entry_key* kkey) 221{ 222 struct key_entry_data* d = (struct key_entry_data*)kkey->entry.data; 223 return (!d->isbad && d->rrset_data == NULL); 224} 225 226int 227key_entry_isgood(struct key_entry_key* kkey) 228{ 229 struct key_entry_data* d = (struct key_entry_data*)kkey->entry.data; 230 return (!d->isbad && d->rrset_data != NULL); 231} 232 233int 234key_entry_isbad(struct key_entry_key* kkey) 235{ 236 struct key_entry_data* d = (struct key_entry_data*)kkey->entry.data; 237 return (int)(d->isbad); 238} 239 240void 241key_entry_set_reason(struct key_entry_key* kkey, char* reason) 242{ 243 struct key_entry_data* d = (struct key_entry_data*)kkey->entry.data; 244 d->reason = reason; 245} 246 247char* 248key_entry_get_reason(struct key_entry_key* kkey) 249{ 250 struct key_entry_data* d = (struct key_entry_data*)kkey->entry.data; 251 return d->reason; 252} 253 254/** setup key entry in region */ 255static int 256key_entry_setup(struct regional* region, 257 uint8_t* name, size_t namelen, uint16_t dclass, 258 struct key_entry_key** k, struct key_entry_data** d) 259{ 260 *k = regional_alloc(region, sizeof(**k)); 261 if(!*k) 262 return 0; 263 memset(*k, 0, sizeof(**k)); 264 (*k)->entry.key = *k; 265 (*k)->name = regional_alloc_init(region, name, namelen); 266 if(!(*k)->name) 267 return 0; 268 (*k)->namelen = namelen; 269 (*k)->key_class = dclass; 270 *d = regional_alloc(region, sizeof(**d)); 271 if(!*d) 272 return 0; 273 (*k)->entry.data = *d; 274 return 1; 275} 276 277struct key_entry_key* 278key_entry_create_null(struct regional* region,
|
278 uint8_t* name, size_t namelen, uint16_t dclass, uint32_t ttl, 279 uint32_t now)
| 279 uint8_t* name, size_t namelen, uint16_t dclass, time_t ttl, 280 time_t now)
|
280{ 281 struct key_entry_key* k; 282 struct key_entry_data* d; 283 if(!key_entry_setup(region, name, namelen, dclass, &k, &d)) 284 return NULL; 285 d->ttl = now + ttl; 286 d->isbad = 0; 287 d->reason = NULL; 288 d->rrset_type = LDNS_RR_TYPE_DNSKEY; 289 d->rrset_data = NULL; 290 d->algo = NULL; 291 return k; 292} 293 294struct key_entry_key* 295key_entry_create_rrset(struct regional* region, 296 uint8_t* name, size_t namelen, uint16_t dclass,
| 281{ 282 struct key_entry_key* k; 283 struct key_entry_data* d; 284 if(!key_entry_setup(region, name, namelen, dclass, &k, &d)) 285 return NULL; 286 d->ttl = now + ttl; 287 d->isbad = 0; 288 d->reason = NULL; 289 d->rrset_type = LDNS_RR_TYPE_DNSKEY; 290 d->rrset_data = NULL; 291 d->algo = NULL; 292 return k; 293} 294 295struct key_entry_key* 296key_entry_create_rrset(struct regional* region, 297 uint8_t* name, size_t namelen, uint16_t dclass,
|
297 struct ub_packed_rrset_key* rrset, uint8_t* sigalg, uint32_t now)
| 298 struct ub_packed_rrset_key* rrset, uint8_t* sigalg, time_t now)
|
298{ 299 struct key_entry_key* k; 300 struct key_entry_data* d; 301 struct packed_rrset_data* rd = (struct packed_rrset_data*) 302 rrset->entry.data; 303 if(!key_entry_setup(region, name, namelen, dclass, &k, &d)) 304 return NULL; 305 d->ttl = rd->ttl + now; 306 d->isbad = 0; 307 d->reason = NULL; 308 d->rrset_type = ntohs(rrset->rk.type); 309 d->rrset_data = (struct packed_rrset_data*)regional_alloc_init(region, 310 rd, packed_rrset_sizeof(rd)); 311 if(!d->rrset_data) 312 return NULL; 313 if(sigalg) { 314 d->algo = (uint8_t*)regional_strdup(region, (char*)sigalg); 315 if(!d->algo) 316 return NULL; 317 } else d->algo = NULL; 318 packed_rrset_ptr_fixup(d->rrset_data); 319 return k; 320} 321 322struct key_entry_key* 323key_entry_create_bad(struct regional* region,
| 299{ 300 struct key_entry_key* k; 301 struct key_entry_data* d; 302 struct packed_rrset_data* rd = (struct packed_rrset_data*) 303 rrset->entry.data; 304 if(!key_entry_setup(region, name, namelen, dclass, &k, &d)) 305 return NULL; 306 d->ttl = rd->ttl + now; 307 d->isbad = 0; 308 d->reason = NULL; 309 d->rrset_type = ntohs(rrset->rk.type); 310 d->rrset_data = (struct packed_rrset_data*)regional_alloc_init(region, 311 rd, packed_rrset_sizeof(rd)); 312 if(!d->rrset_data) 313 return NULL; 314 if(sigalg) { 315 d->algo = (uint8_t*)regional_strdup(region, (char*)sigalg); 316 if(!d->algo) 317 return NULL; 318 } else d->algo = NULL; 319 packed_rrset_ptr_fixup(d->rrset_data); 320 return k; 321} 322 323struct key_entry_key* 324key_entry_create_bad(struct regional* region,
|
324 uint8_t* name, size_t namelen, uint16_t dclass, uint32_t ttl, 325 uint32_t now)
| 325 uint8_t* name, size_t namelen, uint16_t dclass, time_t ttl, 326 time_t now)
|
326{ 327 struct key_entry_key* k; 328 struct key_entry_data* d; 329 if(!key_entry_setup(region, name, namelen, dclass, &k, &d)) 330 return NULL; 331 d->ttl = now + ttl; 332 d->isbad = 1; 333 d->reason = NULL; 334 d->rrset_type = LDNS_RR_TYPE_DNSKEY; 335 d->rrset_data = NULL; 336 d->algo = NULL; 337 return k; 338} 339 340struct ub_packed_rrset_key* 341key_entry_get_rrset(struct key_entry_key* kkey, struct regional* region) 342{ 343 struct key_entry_data* d = (struct key_entry_data*)kkey->entry.data; 344 struct ub_packed_rrset_key* rrk; 345 struct packed_rrset_data* rrd; 346 if(!d || !d->rrset_data) 347 return NULL; 348 rrk = regional_alloc(region, sizeof(*rrk)); 349 if(!rrk) 350 return NULL; 351 memset(rrk, 0, sizeof(*rrk)); 352 rrk->rk.dname = regional_alloc_init(region, kkey->name, kkey->namelen); 353 if(!rrk->rk.dname) 354 return NULL; 355 rrk->rk.dname_len = kkey->namelen; 356 rrk->rk.type = htons(d->rrset_type); 357 rrk->rk.rrset_class = htons(kkey->key_class); 358 rrk->entry.key = rrk; 359 rrd = regional_alloc_init(region, d->rrset_data, 360 packed_rrset_sizeof(d->rrset_data)); 361 if(!rrd) 362 return NULL; 363 rrk->entry.data = rrd; 364 packed_rrset_ptr_fixup(rrd); 365 return rrk; 366} 367 368/** Get size of key in keyset */ 369static size_t 370dnskey_get_keysize(struct packed_rrset_data* data, size_t idx) 371{ 372 unsigned char* pk; 373 unsigned int pklen = 0; 374 int algo; 375 if(data->rr_len[idx] < 2+5) 376 return 0; 377 algo = (int)data->rr_data[idx][2+3]; 378 pk = (unsigned char*)data->rr_data[idx]+2+4; 379 pklen = (unsigned)data->rr_len[idx]-2-4;
| 327{ 328 struct key_entry_key* k; 329 struct key_entry_data* d; 330 if(!key_entry_setup(region, name, namelen, dclass, &k, &d)) 331 return NULL; 332 d->ttl = now + ttl; 333 d->isbad = 1; 334 d->reason = NULL; 335 d->rrset_type = LDNS_RR_TYPE_DNSKEY; 336 d->rrset_data = NULL; 337 d->algo = NULL; 338 return k; 339} 340 341struct ub_packed_rrset_key* 342key_entry_get_rrset(struct key_entry_key* kkey, struct regional* region) 343{ 344 struct key_entry_data* d = (struct key_entry_data*)kkey->entry.data; 345 struct ub_packed_rrset_key* rrk; 346 struct packed_rrset_data* rrd; 347 if(!d || !d->rrset_data) 348 return NULL; 349 rrk = regional_alloc(region, sizeof(*rrk)); 350 if(!rrk) 351 return NULL; 352 memset(rrk, 0, sizeof(*rrk)); 353 rrk->rk.dname = regional_alloc_init(region, kkey->name, kkey->namelen); 354 if(!rrk->rk.dname) 355 return NULL; 356 rrk->rk.dname_len = kkey->namelen; 357 rrk->rk.type = htons(d->rrset_type); 358 rrk->rk.rrset_class = htons(kkey->key_class); 359 rrk->entry.key = rrk; 360 rrd = regional_alloc_init(region, d->rrset_data, 361 packed_rrset_sizeof(d->rrset_data)); 362 if(!rrd) 363 return NULL; 364 rrk->entry.data = rrd; 365 packed_rrset_ptr_fixup(rrd); 366 return rrk; 367} 368 369/** Get size of key in keyset */ 370static size_t 371dnskey_get_keysize(struct packed_rrset_data* data, size_t idx) 372{ 373 unsigned char* pk; 374 unsigned int pklen = 0; 375 int algo; 376 if(data->rr_len[idx] < 2+5) 377 return 0; 378 algo = (int)data->rr_data[idx][2+3]; 379 pk = (unsigned char*)data->rr_data[idx]+2+4; 380 pklen = (unsigned)data->rr_len[idx]-2-4;
|
380 return ldns_rr_dnskey_key_size_raw(pk, pklen, algo);
| 381 return sldns_rr_dnskey_key_size_raw(pk, pklen, algo);
|
381} 382 383/** get dnskey flags from data */ 384static uint16_t 385kd_get_flags(struct packed_rrset_data* data, size_t idx) 386{ 387 uint16_t f; 388 if(data->rr_len[idx] < 2+2) 389 return 0; 390 memmove(&f, data->rr_data[idx]+2, 2); 391 f = ntohs(f); 392 return f; 393} 394 395size_t 396key_entry_keysize(struct key_entry_key* kkey) 397{ 398 struct packed_rrset_data* d; 399 /* compute size of smallest ZSK key in the rrset */ 400 size_t i; 401 size_t bits = 0; 402 if(!key_entry_isgood(kkey)) 403 return 0; 404 d = ((struct key_entry_data*)kkey->entry.data)->rrset_data; 405 for(i=0; i<d->count; i++) { 406 if(!(kd_get_flags(d, i) & DNSKEY_BIT_ZSK)) 407 continue; 408 if(i==0 || dnskey_get_keysize(d, i) < bits) 409 bits = dnskey_get_keysize(d, i); 410 } 411 return bits; 412}
| 382} 383 384/** get dnskey flags from data */ 385static uint16_t 386kd_get_flags(struct packed_rrset_data* data, size_t idx) 387{ 388 uint16_t f; 389 if(data->rr_len[idx] < 2+2) 390 return 0; 391 memmove(&f, data->rr_data[idx]+2, 2); 392 f = ntohs(f); 393 return f; 394} 395 396size_t 397key_entry_keysize(struct key_entry_key* kkey) 398{ 399 struct packed_rrset_data* d; 400 /* compute size of smallest ZSK key in the rrset */ 401 size_t i; 402 size_t bits = 0; 403 if(!key_entry_isgood(kkey)) 404 return 0; 405 d = ((struct key_entry_data*)kkey->entry.data)->rrset_data; 406 for(i=0; i<d->count; i++) { 407 if(!(kd_get_flags(d, i) & DNSKEY_BIT_ZSK)) 408 continue; 409 if(i==0 || dnskey_get_keysize(d, i) < bits) 410 bits = dnskey_get_keysize(d, i); 411 } 412 return bits; 413}
|