1 /* 2 * validator/val_kentry.h - 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. 34 */ 35 36 /** 37 * \file 38 * 39 * This file contains functions for dealing with validator key entries. 40 */ 41 42 #ifndef VALIDATOR_VAL_KENTRY_H 43 #define VALIDATOR_VAL_KENTRY_H 44 struct packed_rrset_data; 45 struct regional; 46 struct ub_packed_rrset_key; 47 #include "util/storage/lruhash.h" 48 49 /** 50 * A key entry for the validator. 51 * This may or may not be a trusted key. 52 * This is what is stored in the key cache. 53 * This is the key part for the cache; the key entry key. 54 */ 55 struct key_entry_key { 56 /** lru hash entry */ 57 struct lruhash_entry entry; 58 /** name of the key */ 59 uint8_t* name; 60 /** length of name */ 61 size_t namelen; 62 /** class of the key, host byteorder */ 63 uint16_t key_class; 64 }; 65 66 /** 67 * Key entry for the validator. 68 * Contains key status. 69 * This is the data part for the cache, the key entry data. 70 * 71 * Can be in three basic states: 72 * isbad=0: good key 73 * isbad=1: bad key 74 * isbad=0 && rrset=0: insecure space. 75 */ 76 struct key_entry_data { 77 /** the TTL of this entry (absolute time) */ 78 uint32_t ttl; 79 /** the key rrdata. can be NULL to signal keyless name. */ 80 struct packed_rrset_data* rrset_data; 81 /** not NULL sometimes to give reason why bogus */ 82 char* reason; 83 /** list of algorithms signalled, ends with 0, or NULL */ 84 uint8_t* algo; 85 /** DNS RR type of the rrset data (host order) */ 86 uint16_t rrset_type; 87 /** if the key is bad: Bogus or malformed */ 88 uint8_t isbad; 89 }; 90 91 /** function for lruhash operation */ 92 size_t key_entry_sizefunc(void* key, void* data); 93 94 /** function for lruhash operation */ 95 int key_entry_compfunc(void* k1, void* k2); 96 97 /** function for lruhash operation */ 98 void key_entry_delkeyfunc(void* key, void* userarg); 99 100 /** function for lruhash operation */ 101 void key_entry_deldatafunc(void* data, void* userarg); 102 103 /** calculate hash for key entry 104 * @param kk: key entry. The lruhash entry.hash value is filled in. 105 */ 106 void key_entry_hash(struct key_entry_key* kk); 107 108 /** 109 * Copy a key entry, to be region-allocated. 110 * @param kkey: the key entry key (and data pointer) to copy. 111 * @param region: where to allocate it 112 * @return newly region-allocated entry or NULL on a failure to allocate. 113 */ 114 struct key_entry_key* key_entry_copy_toregion(struct key_entry_key* kkey, 115 struct regional* region); 116 117 /** 118 * Copy a key entry, malloced. 119 * @param kkey: the key entry key (and data pointer) to copy. 120 * @return newly allocated entry or NULL on a failure to allocate memory. 121 */ 122 struct key_entry_key* key_entry_copy(struct key_entry_key* kkey); 123 124 /** 125 * See if this is a null entry. Does not do locking. 126 * @param kkey: must have data pointer set correctly 127 * @return true if it is a NULL rrset entry. 128 */ 129 int key_entry_isnull(struct key_entry_key* kkey); 130 131 /** 132 * See if this entry is good. Does not do locking. 133 * @param kkey: must have data pointer set correctly 134 * @return true if it is good. 135 */ 136 int key_entry_isgood(struct key_entry_key* kkey); 137 138 /** 139 * See if this entry is bad. Does not do locking. 140 * @param kkey: must have data pointer set correctly 141 * @return true if it is bad. 142 */ 143 int key_entry_isbad(struct key_entry_key* kkey); 144 145 /** 146 * Set reason why a key is bad. 147 * @param kkey: bad key. 148 * @param reason: string to attach, you must allocate it. 149 * Not safe to call twice unless you deallocate it yourself. 150 */ 151 void key_entry_set_reason(struct key_entry_key* kkey, char* reason); 152 153 /** 154 * Get reason why a key is bad. 155 * @param kkey: bad key 156 * @return pointer to string. 157 * String is part of key entry and is deleted with it. 158 */ 159 char* key_entry_get_reason(struct key_entry_key* kkey); 160 161 /** 162 * Create a null entry, in the given region. 163 * @param region: where to allocate 164 * @param name: the key name 165 * @param namelen: length of name 166 * @param dclass: class of key entry. (host order); 167 * @param ttl: what ttl should the key have. relative. 168 * @param now: current time (added to ttl). 169 * @return new key entry or NULL on alloc failure 170 */ 171 struct key_entry_key* key_entry_create_null(struct regional* region, 172 uint8_t* name, size_t namelen, uint16_t dclass, uint32_t ttl, 173 uint32_t now); 174 175 /** 176 * Create a key entry from an rrset, in the given region. 177 * @param region: where to allocate. 178 * @param name: the key name 179 * @param namelen: length of name 180 * @param dclass: class of key entry. (host order); 181 * @param rrset: data for key entry. This is copied to the region. 182 * @param sigalg: signalled algorithm list (or NULL). 183 * @param now: current time (added to ttl of rrset) 184 * @return new key entry or NULL on alloc failure 185 */ 186 struct key_entry_key* key_entry_create_rrset(struct regional* region, 187 uint8_t* name, size_t namelen, uint16_t dclass, 188 struct ub_packed_rrset_key* rrset, uint8_t* sigalg, uint32_t now); 189 190 /** 191 * Create a bad entry, in the given region. 192 * @param region: where to allocate 193 * @param name: the key name 194 * @param namelen: length of name 195 * @param dclass: class of key entry. (host order); 196 * @param ttl: what ttl should the key have. relative. 197 * @param now: current time (added to ttl). 198 * @return new key entry or NULL on alloc failure 199 */ 200 struct key_entry_key* key_entry_create_bad(struct regional* region, 201 uint8_t* name, size_t namelen, uint16_t dclass, uint32_t ttl, 202 uint32_t now); 203 204 /** 205 * Obtain rrset from a key entry, allocated in region. 206 * @param kkey: key entry to convert to a rrset. 207 * @param region: where to allocate rrset 208 * @return rrset copy; if no rrset or alloc error returns NULL. 209 */ 210 struct ub_packed_rrset_key* key_entry_get_rrset(struct key_entry_key* kkey, 211 struct regional* region); 212 213 /** 214 * Get keysize of the keyentry. 215 * @param kkey: key, must be a good key, with contents. 216 * @return size in bits of the key. 217 */ 218 size_t key_entry_keysize(struct key_entry_key* kkey); 219 220 #endif /* VALIDATOR_VAL_KENTRY_H */ 221