1b7579f77SDag-Erling Smørgrav /* 2b7579f77SDag-Erling Smørgrav * validator/val_kentry.h - validator key entry definition. 3b7579f77SDag-Erling Smørgrav * 4b7579f77SDag-Erling Smørgrav * Copyright (c) 2007, NLnet Labs. All rights reserved. 5b7579f77SDag-Erling Smørgrav * 6b7579f77SDag-Erling Smørgrav * This software is open source. 7b7579f77SDag-Erling Smørgrav * 8b7579f77SDag-Erling Smørgrav * Redistribution and use in source and binary forms, with or without 9b7579f77SDag-Erling Smørgrav * modification, are permitted provided that the following conditions 10b7579f77SDag-Erling Smørgrav * are met: 11b7579f77SDag-Erling Smørgrav * 12b7579f77SDag-Erling Smørgrav * Redistributions of source code must retain the above copyright notice, 13b7579f77SDag-Erling Smørgrav * this list of conditions and the following disclaimer. 14b7579f77SDag-Erling Smørgrav * 15b7579f77SDag-Erling Smørgrav * Redistributions in binary form must reproduce the above copyright notice, 16b7579f77SDag-Erling Smørgrav * this list of conditions and the following disclaimer in the documentation 17b7579f77SDag-Erling Smørgrav * and/or other materials provided with the distribution. 18b7579f77SDag-Erling Smørgrav * 19b7579f77SDag-Erling Smørgrav * Neither the name of the NLNET LABS nor the names of its contributors may 20b7579f77SDag-Erling Smørgrav * be used to endorse or promote products derived from this software without 21b7579f77SDag-Erling Smørgrav * specific prior written permission. 22b7579f77SDag-Erling Smørgrav * 23b7579f77SDag-Erling Smørgrav * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2417d15b25SDag-Erling Smørgrav * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2517d15b25SDag-Erling Smørgrav * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2617d15b25SDag-Erling Smørgrav * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2717d15b25SDag-Erling Smørgrav * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2817d15b25SDag-Erling Smørgrav * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 2917d15b25SDag-Erling Smørgrav * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 3017d15b25SDag-Erling Smørgrav * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 3117d15b25SDag-Erling Smørgrav * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 3217d15b25SDag-Erling Smørgrav * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 3317d15b25SDag-Erling Smørgrav * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34b7579f77SDag-Erling Smørgrav */ 35b7579f77SDag-Erling Smørgrav 36b7579f77SDag-Erling Smørgrav /** 37b7579f77SDag-Erling Smørgrav * \file 38b7579f77SDag-Erling Smørgrav * 39b7579f77SDag-Erling Smørgrav * This file contains functions for dealing with validator key entries. 40b7579f77SDag-Erling Smørgrav */ 41b7579f77SDag-Erling Smørgrav 42b7579f77SDag-Erling Smørgrav #ifndef VALIDATOR_VAL_KENTRY_H 43b7579f77SDag-Erling Smørgrav #define VALIDATOR_VAL_KENTRY_H 44b7579f77SDag-Erling Smørgrav struct packed_rrset_data; 45b7579f77SDag-Erling Smørgrav struct regional; 46b7579f77SDag-Erling Smørgrav struct ub_packed_rrset_key; 47b7579f77SDag-Erling Smørgrav #include "util/storage/lruhash.h" 48a39a5a69SCy Schubert #include "sldns/rrdef.h" 49b7579f77SDag-Erling Smørgrav 50b7579f77SDag-Erling Smørgrav /** 51b7579f77SDag-Erling Smørgrav * A key entry for the validator. 52b7579f77SDag-Erling Smørgrav * This may or may not be a trusted key. 53b7579f77SDag-Erling Smørgrav * This is what is stored in the key cache. 54b7579f77SDag-Erling Smørgrav * This is the key part for the cache; the key entry key. 55b7579f77SDag-Erling Smørgrav */ 56b7579f77SDag-Erling Smørgrav struct key_entry_key { 57b7579f77SDag-Erling Smørgrav /** lru hash entry */ 58b7579f77SDag-Erling Smørgrav struct lruhash_entry entry; 59b7579f77SDag-Erling Smørgrav /** name of the key */ 60b7579f77SDag-Erling Smørgrav uint8_t* name; 61b7579f77SDag-Erling Smørgrav /** length of name */ 62b7579f77SDag-Erling Smørgrav size_t namelen; 63b7579f77SDag-Erling Smørgrav /** class of the key, host byteorder */ 64b7579f77SDag-Erling Smørgrav uint16_t key_class; 65b7579f77SDag-Erling Smørgrav }; 66b7579f77SDag-Erling Smørgrav 67b7579f77SDag-Erling Smørgrav /** 68b7579f77SDag-Erling Smørgrav * Key entry for the validator. 69b7579f77SDag-Erling Smørgrav * Contains key status. 70b7579f77SDag-Erling Smørgrav * This is the data part for the cache, the key entry data. 71b7579f77SDag-Erling Smørgrav * 72b7579f77SDag-Erling Smørgrav * Can be in three basic states: 73b7579f77SDag-Erling Smørgrav * isbad=0: good key 74b7579f77SDag-Erling Smørgrav * isbad=1: bad key 75b7579f77SDag-Erling Smørgrav * isbad=0 && rrset=0: insecure space. 76b7579f77SDag-Erling Smørgrav */ 77b7579f77SDag-Erling Smørgrav struct key_entry_data { 78b7579f77SDag-Erling Smørgrav /** the TTL of this entry (absolute time) */ 7917d15b25SDag-Erling Smørgrav time_t ttl; 80b7579f77SDag-Erling Smørgrav /** the key rrdata. can be NULL to signal keyless name. */ 81b7579f77SDag-Erling Smørgrav struct packed_rrset_data* rrset_data; 82b7579f77SDag-Erling Smørgrav /** not NULL sometimes to give reason why bogus */ 83b7579f77SDag-Erling Smørgrav char* reason; 84a39a5a69SCy Schubert /** not NULL to give reason why bogus */ 85a39a5a69SCy Schubert sldns_ede_code reason_bogus; 86b7579f77SDag-Erling Smørgrav /** list of algorithms signalled, ends with 0, or NULL */ 87b7579f77SDag-Erling Smørgrav uint8_t* algo; 88b7579f77SDag-Erling Smørgrav /** DNS RR type of the rrset data (host order) */ 89b7579f77SDag-Erling Smørgrav uint16_t rrset_type; 90b7579f77SDag-Erling Smørgrav /** if the key is bad: Bogus or malformed */ 91b7579f77SDag-Erling Smørgrav uint8_t isbad; 92b7579f77SDag-Erling Smørgrav }; 93b7579f77SDag-Erling Smørgrav 94b7579f77SDag-Erling Smørgrav /** function for lruhash operation */ 95b7579f77SDag-Erling Smørgrav size_t key_entry_sizefunc(void* key, void* data); 96b7579f77SDag-Erling Smørgrav 97b7579f77SDag-Erling Smørgrav /** function for lruhash operation */ 98b7579f77SDag-Erling Smørgrav int key_entry_compfunc(void* k1, void* k2); 99b7579f77SDag-Erling Smørgrav 100b7579f77SDag-Erling Smørgrav /** function for lruhash operation */ 101b7579f77SDag-Erling Smørgrav void key_entry_delkeyfunc(void* key, void* userarg); 102b7579f77SDag-Erling Smørgrav 103b7579f77SDag-Erling Smørgrav /** function for lruhash operation */ 104b7579f77SDag-Erling Smørgrav void key_entry_deldatafunc(void* data, void* userarg); 105b7579f77SDag-Erling Smørgrav 106b7579f77SDag-Erling Smørgrav /** calculate hash for key entry 107b7579f77SDag-Erling Smørgrav * @param kk: key entry. The lruhash entry.hash value is filled in. 108b7579f77SDag-Erling Smørgrav */ 109b7579f77SDag-Erling Smørgrav void key_entry_hash(struct key_entry_key* kk); 110b7579f77SDag-Erling Smørgrav 111b7579f77SDag-Erling Smørgrav /** 112b7579f77SDag-Erling Smørgrav * Copy a key entry, to be region-allocated. 113b7579f77SDag-Erling Smørgrav * @param kkey: the key entry key (and data pointer) to copy. 114b7579f77SDag-Erling Smørgrav * @param region: where to allocate it 115b7579f77SDag-Erling Smørgrav * @return newly region-allocated entry or NULL on a failure to allocate. 116b7579f77SDag-Erling Smørgrav */ 117b7579f77SDag-Erling Smørgrav struct key_entry_key* key_entry_copy_toregion(struct key_entry_key* kkey, 118b7579f77SDag-Erling Smørgrav struct regional* region); 119b7579f77SDag-Erling Smørgrav 120b7579f77SDag-Erling Smørgrav /** 121b7579f77SDag-Erling Smørgrav * Copy a key entry, malloced. 122b7579f77SDag-Erling Smørgrav * @param kkey: the key entry key (and data pointer) to copy. 123*8f76bb7dSCy Schubert * @param copy_reason: if the reason string needs to be copied (allocated). 124b7579f77SDag-Erling Smørgrav * @return newly allocated entry or NULL on a failure to allocate memory. 125b7579f77SDag-Erling Smørgrav */ 126*8f76bb7dSCy Schubert struct key_entry_key* key_entry_copy(struct key_entry_key* kkey, 127*8f76bb7dSCy Schubert int copy_reason); 128b7579f77SDag-Erling Smørgrav 129b7579f77SDag-Erling Smørgrav /** 130b7579f77SDag-Erling Smørgrav * See if this is a null entry. Does not do locking. 131b7579f77SDag-Erling Smørgrav * @param kkey: must have data pointer set correctly 132b7579f77SDag-Erling Smørgrav * @return true if it is a NULL rrset entry. 133b7579f77SDag-Erling Smørgrav */ 134b7579f77SDag-Erling Smørgrav int key_entry_isnull(struct key_entry_key* kkey); 135b7579f77SDag-Erling Smørgrav 136b7579f77SDag-Erling Smørgrav /** 137b7579f77SDag-Erling Smørgrav * See if this entry is good. Does not do locking. 138b7579f77SDag-Erling Smørgrav * @param kkey: must have data pointer set correctly 139b7579f77SDag-Erling Smørgrav * @return true if it is good. 140b7579f77SDag-Erling Smørgrav */ 141b7579f77SDag-Erling Smørgrav int key_entry_isgood(struct key_entry_key* kkey); 142b7579f77SDag-Erling Smørgrav 143b7579f77SDag-Erling Smørgrav /** 144b7579f77SDag-Erling Smørgrav * See if this entry is bad. Does not do locking. 145b7579f77SDag-Erling Smørgrav * @param kkey: must have data pointer set correctly 146b7579f77SDag-Erling Smørgrav * @return true if it is bad. 147b7579f77SDag-Erling Smørgrav */ 148b7579f77SDag-Erling Smørgrav int key_entry_isbad(struct key_entry_key* kkey); 149b7579f77SDag-Erling Smørgrav 150b7579f77SDag-Erling Smørgrav /** 151b7579f77SDag-Erling Smørgrav * Get reason why a key is bad. 152b7579f77SDag-Erling Smørgrav * @param kkey: bad key 153b7579f77SDag-Erling Smørgrav * @return pointer to string. 154b7579f77SDag-Erling Smørgrav * String is part of key entry and is deleted with it. 155b7579f77SDag-Erling Smørgrav */ 156b7579f77SDag-Erling Smørgrav char* key_entry_get_reason(struct key_entry_key* kkey); 157b7579f77SDag-Erling Smørgrav 158b7579f77SDag-Erling Smørgrav /** 159a39a5a69SCy Schubert * Get the EDE (RFC8914) code why a key is bad. Can return LDNS_EDE_NONE. 160a39a5a69SCy Schubert * @param kkey: bad key 161a39a5a69SCy Schubert * @return the ede code. 162a39a5a69SCy Schubert */ 163a39a5a69SCy Schubert sldns_ede_code key_entry_get_reason_bogus(struct key_entry_key* kkey); 164a39a5a69SCy Schubert 165a39a5a69SCy Schubert /** 166b7579f77SDag-Erling Smørgrav * Create a null entry, in the given region. 167b7579f77SDag-Erling Smørgrav * @param region: where to allocate 168b7579f77SDag-Erling Smørgrav * @param name: the key name 169b7579f77SDag-Erling Smørgrav * @param namelen: length of name 170b7579f77SDag-Erling Smørgrav * @param dclass: class of key entry. (host order); 171b7579f77SDag-Erling Smørgrav * @param ttl: what ttl should the key have. relative. 172*8f76bb7dSCy Schubert * @param reason_bogus: accompanying EDE code. 173*8f76bb7dSCy Schubert * @param reason: accompanying NULL-terminated EDE string (or NULL). 174b7579f77SDag-Erling Smørgrav * @param now: current time (added to ttl). 175b7579f77SDag-Erling Smørgrav * @return new key entry or NULL on alloc failure 176b7579f77SDag-Erling Smørgrav */ 177b7579f77SDag-Erling Smørgrav struct key_entry_key* key_entry_create_null(struct regional* region, 17817d15b25SDag-Erling Smørgrav uint8_t* name, size_t namelen, uint16_t dclass, time_t ttl, 179*8f76bb7dSCy Schubert sldns_ede_code reason_bogus, const char* reason, 18017d15b25SDag-Erling Smørgrav time_t now); 181b7579f77SDag-Erling Smørgrav 182b7579f77SDag-Erling Smørgrav /** 183b7579f77SDag-Erling Smørgrav * Create a key entry from an rrset, in the given region. 184b7579f77SDag-Erling Smørgrav * @param region: where to allocate. 185b7579f77SDag-Erling Smørgrav * @param name: the key name 186b7579f77SDag-Erling Smørgrav * @param namelen: length of name 187b7579f77SDag-Erling Smørgrav * @param dclass: class of key entry. (host order); 188b7579f77SDag-Erling Smørgrav * @param rrset: data for key entry. This is copied to the region. 189b7579f77SDag-Erling Smørgrav * @param sigalg: signalled algorithm list (or NULL). 190*8f76bb7dSCy Schubert * @param reason_bogus: accompanying EDE code (usually LDNS_EDE_NONE). 191*8f76bb7dSCy Schubert * @param reason: accompanying NULL-terminated EDE string (or NULL). 192b7579f77SDag-Erling Smørgrav * @param now: current time (added to ttl of rrset) 193b7579f77SDag-Erling Smørgrav * @return new key entry or NULL on alloc failure 194b7579f77SDag-Erling Smørgrav */ 195b7579f77SDag-Erling Smørgrav struct key_entry_key* key_entry_create_rrset(struct regional* region, 196b7579f77SDag-Erling Smørgrav uint8_t* name, size_t namelen, uint16_t dclass, 197*8f76bb7dSCy Schubert struct ub_packed_rrset_key* rrset, uint8_t* sigalg, 198*8f76bb7dSCy Schubert sldns_ede_code reason_bogus, const char* reason, 199*8f76bb7dSCy Schubert time_t now); 200b7579f77SDag-Erling Smørgrav 201b7579f77SDag-Erling Smørgrav /** 202b7579f77SDag-Erling Smørgrav * Create a bad entry, in the given region. 203b7579f77SDag-Erling Smørgrav * @param region: where to allocate 204b7579f77SDag-Erling Smørgrav * @param name: the key name 205b7579f77SDag-Erling Smørgrav * @param namelen: length of name 206b7579f77SDag-Erling Smørgrav * @param dclass: class of key entry. (host order); 207b7579f77SDag-Erling Smørgrav * @param ttl: what ttl should the key have. relative. 208*8f76bb7dSCy Schubert * @param reason_bogus: accompanying EDE code. 209*8f76bb7dSCy Schubert * @param reason: accompanying NULL-terminated EDE string (or NULL). 210b7579f77SDag-Erling Smørgrav * @param now: current time (added to ttl). 211b7579f77SDag-Erling Smørgrav * @return new key entry or NULL on alloc failure 212b7579f77SDag-Erling Smørgrav */ 213b7579f77SDag-Erling Smørgrav struct key_entry_key* key_entry_create_bad(struct regional* region, 21417d15b25SDag-Erling Smørgrav uint8_t* name, size_t namelen, uint16_t dclass, time_t ttl, 215*8f76bb7dSCy Schubert sldns_ede_code reason_bogus, const char* reason, 21617d15b25SDag-Erling Smørgrav time_t now); 217b7579f77SDag-Erling Smørgrav 218b7579f77SDag-Erling Smørgrav /** 219b7579f77SDag-Erling Smørgrav * Obtain rrset from a key entry, allocated in region. 220b7579f77SDag-Erling Smørgrav * @param kkey: key entry to convert to a rrset. 221b7579f77SDag-Erling Smørgrav * @param region: where to allocate rrset 222b7579f77SDag-Erling Smørgrav * @return rrset copy; if no rrset or alloc error returns NULL. 223b7579f77SDag-Erling Smørgrav */ 224b7579f77SDag-Erling Smørgrav struct ub_packed_rrset_key* key_entry_get_rrset(struct key_entry_key* kkey, 225b7579f77SDag-Erling Smørgrav struct regional* region); 226b7579f77SDag-Erling Smørgrav 227b7579f77SDag-Erling Smørgrav /** 228b7579f77SDag-Erling Smørgrav * Get keysize of the keyentry. 229b7579f77SDag-Erling Smørgrav * @param kkey: key, must be a good key, with contents. 230b7579f77SDag-Erling Smørgrav * @return size in bits of the key. 231b7579f77SDag-Erling Smørgrav */ 232b7579f77SDag-Erling Smørgrav size_t key_entry_keysize(struct key_entry_key* kkey); 233b7579f77SDag-Erling Smørgrav 234b7579f77SDag-Erling Smørgrav #endif /* VALIDATOR_VAL_KENTRY_H */ 235