1*7b5038d7SDag-Erling Smørgrav /* 2*7b5038d7SDag-Erling Smørgrav * rr_function.c 3*7b5038d7SDag-Erling Smørgrav * 4*7b5038d7SDag-Erling Smørgrav * function that operate on specific rr types 5*7b5038d7SDag-Erling Smørgrav * 6*7b5038d7SDag-Erling Smørgrav * (c) NLnet Labs, 2004-2006 7*7b5038d7SDag-Erling Smørgrav * See the file LICENSE for the license 8*7b5038d7SDag-Erling Smørgrav */ 9*7b5038d7SDag-Erling Smørgrav 10*7b5038d7SDag-Erling Smørgrav /* 11*7b5038d7SDag-Erling Smørgrav * These come strait from perldoc Net::DNS::RR::xxx 12*7b5038d7SDag-Erling Smørgrav * first the read variant, then the write. This is 13*7b5038d7SDag-Erling Smørgrav * not complete. 14*7b5038d7SDag-Erling Smørgrav */ 15*7b5038d7SDag-Erling Smørgrav 16*7b5038d7SDag-Erling Smørgrav #include <ldns/config.h> 17*7b5038d7SDag-Erling Smørgrav 18*7b5038d7SDag-Erling Smørgrav #include <ldns/ldns.h> 19*7b5038d7SDag-Erling Smørgrav 20*7b5038d7SDag-Erling Smørgrav #include <limits.h> 21*7b5038d7SDag-Erling Smørgrav #include <strings.h> 22*7b5038d7SDag-Erling Smørgrav 23*7b5038d7SDag-Erling Smørgrav /** 24*7b5038d7SDag-Erling Smørgrav * return a specific rdf 25*7b5038d7SDag-Erling Smørgrav * \param[in] type type of RR 26*7b5038d7SDag-Erling Smørgrav * \param[in] rr the rr itself 27*7b5038d7SDag-Erling Smørgrav * \param[in] pos at which postion to get it 28*7b5038d7SDag-Erling Smørgrav * \return the rdf sought 29*7b5038d7SDag-Erling Smørgrav */ 30*7b5038d7SDag-Erling Smørgrav static ldns_rdf * 31*7b5038d7SDag-Erling Smørgrav ldns_rr_function(ldns_rr_type type, const ldns_rr *rr, size_t pos) 32*7b5038d7SDag-Erling Smørgrav { 33*7b5038d7SDag-Erling Smørgrav if (!rr || ldns_rr_get_type(rr) != type) { 34*7b5038d7SDag-Erling Smørgrav return NULL; 35*7b5038d7SDag-Erling Smørgrav } 36*7b5038d7SDag-Erling Smørgrav return ldns_rr_rdf(rr, pos); 37*7b5038d7SDag-Erling Smørgrav } 38*7b5038d7SDag-Erling Smørgrav 39*7b5038d7SDag-Erling Smørgrav /** 40*7b5038d7SDag-Erling Smørgrav * set a specific rdf 41*7b5038d7SDag-Erling Smørgrav * \param[in] type type of RR 42*7b5038d7SDag-Erling Smørgrav * \param[in] rr the rr itself 43*7b5038d7SDag-Erling Smørgrav * \param[in] rdf the rdf to set 44*7b5038d7SDag-Erling Smørgrav * \param[in] pos at which postion to set it 45*7b5038d7SDag-Erling Smørgrav * \return true or false 46*7b5038d7SDag-Erling Smørgrav */ 47*7b5038d7SDag-Erling Smørgrav static bool 48*7b5038d7SDag-Erling Smørgrav ldns_rr_set_function(ldns_rr_type type, ldns_rr *rr, ldns_rdf *rdf, size_t pos) 49*7b5038d7SDag-Erling Smørgrav { 50*7b5038d7SDag-Erling Smørgrav ldns_rdf *pop; 51*7b5038d7SDag-Erling Smørgrav if (!rr || ldns_rr_get_type(rr) != type) { 52*7b5038d7SDag-Erling Smørgrav return false; 53*7b5038d7SDag-Erling Smørgrav } 54*7b5038d7SDag-Erling Smørgrav pop = ldns_rr_set_rdf(rr, rdf, pos); 55*7b5038d7SDag-Erling Smørgrav ldns_rdf_deep_free(pop); 56*7b5038d7SDag-Erling Smørgrav return true; 57*7b5038d7SDag-Erling Smørgrav } 58*7b5038d7SDag-Erling Smørgrav 59*7b5038d7SDag-Erling Smørgrav /* A/AAAA records */ 60*7b5038d7SDag-Erling Smørgrav ldns_rdf * 61*7b5038d7SDag-Erling Smørgrav ldns_rr_a_address(const ldns_rr *r) 62*7b5038d7SDag-Erling Smørgrav { 63*7b5038d7SDag-Erling Smørgrav /* 2 types to check, cannot use the macro */ 64*7b5038d7SDag-Erling Smørgrav if (!r || (ldns_rr_get_type(r) != LDNS_RR_TYPE_A && 65*7b5038d7SDag-Erling Smørgrav ldns_rr_get_type(r) != LDNS_RR_TYPE_AAAA)) { 66*7b5038d7SDag-Erling Smørgrav return NULL; 67*7b5038d7SDag-Erling Smørgrav } 68*7b5038d7SDag-Erling Smørgrav return ldns_rr_rdf(r, 0); 69*7b5038d7SDag-Erling Smørgrav } 70*7b5038d7SDag-Erling Smørgrav 71*7b5038d7SDag-Erling Smørgrav bool 72*7b5038d7SDag-Erling Smørgrav ldns_rr_a_set_address(ldns_rr *r, ldns_rdf *f) 73*7b5038d7SDag-Erling Smørgrav { 74*7b5038d7SDag-Erling Smørgrav /* 2 types to check, cannot use the macro... */ 75*7b5038d7SDag-Erling Smørgrav ldns_rdf *pop; 76*7b5038d7SDag-Erling Smørgrav if (!r || (ldns_rr_get_type(r) != LDNS_RR_TYPE_A && 77*7b5038d7SDag-Erling Smørgrav ldns_rr_get_type(r) != LDNS_RR_TYPE_AAAA)) { 78*7b5038d7SDag-Erling Smørgrav return false; 79*7b5038d7SDag-Erling Smørgrav } 80*7b5038d7SDag-Erling Smørgrav pop = ldns_rr_set_rdf(r, f, 0); 81*7b5038d7SDag-Erling Smørgrav if (pop) { 82*7b5038d7SDag-Erling Smørgrav LDNS_FREE(pop); 83*7b5038d7SDag-Erling Smørgrav return true; 84*7b5038d7SDag-Erling Smørgrav } else { 85*7b5038d7SDag-Erling Smørgrav return false; 86*7b5038d7SDag-Erling Smørgrav } 87*7b5038d7SDag-Erling Smørgrav } 88*7b5038d7SDag-Erling Smørgrav 89*7b5038d7SDag-Erling Smørgrav /* NS record */ 90*7b5038d7SDag-Erling Smørgrav ldns_rdf * 91*7b5038d7SDag-Erling Smørgrav ldns_rr_ns_nsdname(const ldns_rr *r) 92*7b5038d7SDag-Erling Smørgrav { 93*7b5038d7SDag-Erling Smørgrav return ldns_rr_function(LDNS_RR_TYPE_NS, r, 0); 94*7b5038d7SDag-Erling Smørgrav } 95*7b5038d7SDag-Erling Smørgrav 96*7b5038d7SDag-Erling Smørgrav /* MX record */ 97*7b5038d7SDag-Erling Smørgrav ldns_rdf * 98*7b5038d7SDag-Erling Smørgrav ldns_rr_mx_preference(const ldns_rr *r) 99*7b5038d7SDag-Erling Smørgrav { 100*7b5038d7SDag-Erling Smørgrav return ldns_rr_function(LDNS_RR_TYPE_MX, r, 0); 101*7b5038d7SDag-Erling Smørgrav } 102*7b5038d7SDag-Erling Smørgrav 103*7b5038d7SDag-Erling Smørgrav ldns_rdf * 104*7b5038d7SDag-Erling Smørgrav ldns_rr_mx_exchange(const ldns_rr *r) 105*7b5038d7SDag-Erling Smørgrav { 106*7b5038d7SDag-Erling Smørgrav return ldns_rr_function(LDNS_RR_TYPE_MX, r, 1); 107*7b5038d7SDag-Erling Smørgrav } 108*7b5038d7SDag-Erling Smørgrav 109*7b5038d7SDag-Erling Smørgrav /* RRSIG record */ 110*7b5038d7SDag-Erling Smørgrav ldns_rdf * 111*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_typecovered(const ldns_rr *r) 112*7b5038d7SDag-Erling Smørgrav { 113*7b5038d7SDag-Erling Smørgrav return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 0); 114*7b5038d7SDag-Erling Smørgrav } 115*7b5038d7SDag-Erling Smørgrav 116*7b5038d7SDag-Erling Smørgrav bool 117*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_set_typecovered(ldns_rr *r, ldns_rdf *f) 118*7b5038d7SDag-Erling Smørgrav { 119*7b5038d7SDag-Erling Smørgrav return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 0); 120*7b5038d7SDag-Erling Smørgrav } 121*7b5038d7SDag-Erling Smørgrav 122*7b5038d7SDag-Erling Smørgrav ldns_rdf * 123*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_algorithm(const ldns_rr *r) 124*7b5038d7SDag-Erling Smørgrav { 125*7b5038d7SDag-Erling Smørgrav return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 1); 126*7b5038d7SDag-Erling Smørgrav } 127*7b5038d7SDag-Erling Smørgrav 128*7b5038d7SDag-Erling Smørgrav bool 129*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_set_algorithm(ldns_rr *r, ldns_rdf *f) 130*7b5038d7SDag-Erling Smørgrav { 131*7b5038d7SDag-Erling Smørgrav return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 1); 132*7b5038d7SDag-Erling Smørgrav } 133*7b5038d7SDag-Erling Smørgrav 134*7b5038d7SDag-Erling Smørgrav ldns_rdf * 135*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_labels(const ldns_rr *r) 136*7b5038d7SDag-Erling Smørgrav { 137*7b5038d7SDag-Erling Smørgrav return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 2); 138*7b5038d7SDag-Erling Smørgrav } 139*7b5038d7SDag-Erling Smørgrav 140*7b5038d7SDag-Erling Smørgrav bool 141*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_set_labels(ldns_rr *r, ldns_rdf *f) 142*7b5038d7SDag-Erling Smørgrav { 143*7b5038d7SDag-Erling Smørgrav return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 2); 144*7b5038d7SDag-Erling Smørgrav } 145*7b5038d7SDag-Erling Smørgrav 146*7b5038d7SDag-Erling Smørgrav ldns_rdf * 147*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_origttl(const ldns_rr *r) 148*7b5038d7SDag-Erling Smørgrav { 149*7b5038d7SDag-Erling Smørgrav return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 3); 150*7b5038d7SDag-Erling Smørgrav } 151*7b5038d7SDag-Erling Smørgrav 152*7b5038d7SDag-Erling Smørgrav bool 153*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_set_origttl(ldns_rr *r, ldns_rdf *f) 154*7b5038d7SDag-Erling Smørgrav { 155*7b5038d7SDag-Erling Smørgrav return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 3); 156*7b5038d7SDag-Erling Smørgrav } 157*7b5038d7SDag-Erling Smørgrav 158*7b5038d7SDag-Erling Smørgrav ldns_rdf * 159*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_expiration(const ldns_rr *r) 160*7b5038d7SDag-Erling Smørgrav { 161*7b5038d7SDag-Erling Smørgrav return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 4); 162*7b5038d7SDag-Erling Smørgrav } 163*7b5038d7SDag-Erling Smørgrav 164*7b5038d7SDag-Erling Smørgrav bool 165*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_set_expiration(ldns_rr *r, ldns_rdf *f) 166*7b5038d7SDag-Erling Smørgrav { 167*7b5038d7SDag-Erling Smørgrav return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 4); 168*7b5038d7SDag-Erling Smørgrav } 169*7b5038d7SDag-Erling Smørgrav 170*7b5038d7SDag-Erling Smørgrav ldns_rdf * 171*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_inception(const ldns_rr *r) 172*7b5038d7SDag-Erling Smørgrav { 173*7b5038d7SDag-Erling Smørgrav return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 5); 174*7b5038d7SDag-Erling Smørgrav } 175*7b5038d7SDag-Erling Smørgrav 176*7b5038d7SDag-Erling Smørgrav bool 177*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_set_inception(ldns_rr *r, ldns_rdf *f) 178*7b5038d7SDag-Erling Smørgrav { 179*7b5038d7SDag-Erling Smørgrav return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 5); 180*7b5038d7SDag-Erling Smørgrav } 181*7b5038d7SDag-Erling Smørgrav 182*7b5038d7SDag-Erling Smørgrav ldns_rdf * 183*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_keytag(const ldns_rr *r) 184*7b5038d7SDag-Erling Smørgrav { 185*7b5038d7SDag-Erling Smørgrav return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 6); 186*7b5038d7SDag-Erling Smørgrav } 187*7b5038d7SDag-Erling Smørgrav 188*7b5038d7SDag-Erling Smørgrav bool 189*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_set_keytag(ldns_rr *r, ldns_rdf *f) 190*7b5038d7SDag-Erling Smørgrav { 191*7b5038d7SDag-Erling Smørgrav return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 6); 192*7b5038d7SDag-Erling Smørgrav } 193*7b5038d7SDag-Erling Smørgrav 194*7b5038d7SDag-Erling Smørgrav ldns_rdf * 195*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_signame(const ldns_rr *r) 196*7b5038d7SDag-Erling Smørgrav { 197*7b5038d7SDag-Erling Smørgrav return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 7); 198*7b5038d7SDag-Erling Smørgrav } 199*7b5038d7SDag-Erling Smørgrav 200*7b5038d7SDag-Erling Smørgrav bool 201*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_set_signame(ldns_rr *r, ldns_rdf *f) 202*7b5038d7SDag-Erling Smørgrav { 203*7b5038d7SDag-Erling Smørgrav return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 7); 204*7b5038d7SDag-Erling Smørgrav } 205*7b5038d7SDag-Erling Smørgrav 206*7b5038d7SDag-Erling Smørgrav ldns_rdf * 207*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_sig(const ldns_rr *r) 208*7b5038d7SDag-Erling Smørgrav { 209*7b5038d7SDag-Erling Smørgrav return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 8); 210*7b5038d7SDag-Erling Smørgrav } 211*7b5038d7SDag-Erling Smørgrav 212*7b5038d7SDag-Erling Smørgrav bool 213*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_set_sig(ldns_rr *r, ldns_rdf *f) 214*7b5038d7SDag-Erling Smørgrav { 215*7b5038d7SDag-Erling Smørgrav return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 8); 216*7b5038d7SDag-Erling Smørgrav } 217*7b5038d7SDag-Erling Smørgrav 218*7b5038d7SDag-Erling Smørgrav /* DNSKEY record */ 219*7b5038d7SDag-Erling Smørgrav ldns_rdf * 220*7b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_flags(const ldns_rr *r) 221*7b5038d7SDag-Erling Smørgrav { 222*7b5038d7SDag-Erling Smørgrav return ldns_rr_function(LDNS_RR_TYPE_DNSKEY, r, 0); 223*7b5038d7SDag-Erling Smørgrav } 224*7b5038d7SDag-Erling Smørgrav 225*7b5038d7SDag-Erling Smørgrav bool 226*7b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_set_flags(ldns_rr *r, ldns_rdf *f) 227*7b5038d7SDag-Erling Smørgrav { 228*7b5038d7SDag-Erling Smørgrav return ldns_rr_set_function(LDNS_RR_TYPE_DNSKEY, r, f, 0); 229*7b5038d7SDag-Erling Smørgrav } 230*7b5038d7SDag-Erling Smørgrav 231*7b5038d7SDag-Erling Smørgrav ldns_rdf * 232*7b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_protocol(const ldns_rr *r) 233*7b5038d7SDag-Erling Smørgrav { 234*7b5038d7SDag-Erling Smørgrav return ldns_rr_function(LDNS_RR_TYPE_DNSKEY, r, 1); 235*7b5038d7SDag-Erling Smørgrav } 236*7b5038d7SDag-Erling Smørgrav 237*7b5038d7SDag-Erling Smørgrav bool 238*7b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_set_protocol(ldns_rr *r, ldns_rdf *f) 239*7b5038d7SDag-Erling Smørgrav { 240*7b5038d7SDag-Erling Smørgrav return ldns_rr_set_function(LDNS_RR_TYPE_DNSKEY, r, f, 1); 241*7b5038d7SDag-Erling Smørgrav } 242*7b5038d7SDag-Erling Smørgrav 243*7b5038d7SDag-Erling Smørgrav ldns_rdf * 244*7b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_algorithm(const ldns_rr *r) 245*7b5038d7SDag-Erling Smørgrav { 246*7b5038d7SDag-Erling Smørgrav return ldns_rr_function(LDNS_RR_TYPE_DNSKEY, r, 2); 247*7b5038d7SDag-Erling Smørgrav } 248*7b5038d7SDag-Erling Smørgrav 249*7b5038d7SDag-Erling Smørgrav bool 250*7b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_set_algorithm(ldns_rr *r, ldns_rdf *f) 251*7b5038d7SDag-Erling Smørgrav { 252*7b5038d7SDag-Erling Smørgrav return ldns_rr_set_function(LDNS_RR_TYPE_DNSKEY, r, f, 2); 253*7b5038d7SDag-Erling Smørgrav } 254*7b5038d7SDag-Erling Smørgrav 255*7b5038d7SDag-Erling Smørgrav ldns_rdf * 256*7b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_key(const ldns_rr *r) 257*7b5038d7SDag-Erling Smørgrav { 258*7b5038d7SDag-Erling Smørgrav return ldns_rr_function(LDNS_RR_TYPE_DNSKEY, r, 3); 259*7b5038d7SDag-Erling Smørgrav } 260*7b5038d7SDag-Erling Smørgrav 261*7b5038d7SDag-Erling Smørgrav bool 262*7b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_set_key(ldns_rr *r, ldns_rdf *f) 263*7b5038d7SDag-Erling Smørgrav { 264*7b5038d7SDag-Erling Smørgrav return ldns_rr_set_function(LDNS_RR_TYPE_DNSKEY, r, f, 3); 265*7b5038d7SDag-Erling Smørgrav } 266*7b5038d7SDag-Erling Smørgrav 267*7b5038d7SDag-Erling Smørgrav size_t 268*7b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_key_size_raw(const unsigned char* keydata, 269*7b5038d7SDag-Erling Smørgrav const size_t len, 270*7b5038d7SDag-Erling Smørgrav const ldns_algorithm alg) 271*7b5038d7SDag-Erling Smørgrav { 272*7b5038d7SDag-Erling Smørgrav /* for DSA keys */ 273*7b5038d7SDag-Erling Smørgrav uint8_t t; 274*7b5038d7SDag-Erling Smørgrav 275*7b5038d7SDag-Erling Smørgrav /* for RSA keys */ 276*7b5038d7SDag-Erling Smørgrav uint16_t exp; 277*7b5038d7SDag-Erling Smørgrav uint16_t int16; 278*7b5038d7SDag-Erling Smørgrav 279*7b5038d7SDag-Erling Smørgrav switch ((ldns_signing_algorithm)alg) { 280*7b5038d7SDag-Erling Smørgrav case LDNS_SIGN_DSA: 281*7b5038d7SDag-Erling Smørgrav case LDNS_SIGN_DSA_NSEC3: 282*7b5038d7SDag-Erling Smørgrav if (len > 0) { 283*7b5038d7SDag-Erling Smørgrav t = keydata[0]; 284*7b5038d7SDag-Erling Smørgrav return (64 + t*8)*8; 285*7b5038d7SDag-Erling Smørgrav } else { 286*7b5038d7SDag-Erling Smørgrav return 0; 287*7b5038d7SDag-Erling Smørgrav } 288*7b5038d7SDag-Erling Smørgrav break; 289*7b5038d7SDag-Erling Smørgrav case LDNS_SIGN_RSAMD5: 290*7b5038d7SDag-Erling Smørgrav case LDNS_SIGN_RSASHA1: 291*7b5038d7SDag-Erling Smørgrav case LDNS_SIGN_RSASHA1_NSEC3: 292*7b5038d7SDag-Erling Smørgrav #ifdef USE_SHA2 293*7b5038d7SDag-Erling Smørgrav case LDNS_SIGN_RSASHA256: 294*7b5038d7SDag-Erling Smørgrav case LDNS_SIGN_RSASHA512: 295*7b5038d7SDag-Erling Smørgrav #endif 296*7b5038d7SDag-Erling Smørgrav if (len > 0) { 297*7b5038d7SDag-Erling Smørgrav if (keydata[0] == 0) { 298*7b5038d7SDag-Erling Smørgrav /* big exponent */ 299*7b5038d7SDag-Erling Smørgrav if (len > 3) { 300*7b5038d7SDag-Erling Smørgrav memmove(&int16, keydata + 1, 2); 301*7b5038d7SDag-Erling Smørgrav exp = ntohs(int16); 302*7b5038d7SDag-Erling Smørgrav return (len - exp - 3)*8; 303*7b5038d7SDag-Erling Smørgrav } else { 304*7b5038d7SDag-Erling Smørgrav return 0; 305*7b5038d7SDag-Erling Smørgrav } 306*7b5038d7SDag-Erling Smørgrav } else { 307*7b5038d7SDag-Erling Smørgrav exp = keydata[0]; 308*7b5038d7SDag-Erling Smørgrav return (len-exp-1)*8; 309*7b5038d7SDag-Erling Smørgrav } 310*7b5038d7SDag-Erling Smørgrav } else { 311*7b5038d7SDag-Erling Smørgrav return 0; 312*7b5038d7SDag-Erling Smørgrav } 313*7b5038d7SDag-Erling Smørgrav break; 314*7b5038d7SDag-Erling Smørgrav #ifdef USE_GOST 315*7b5038d7SDag-Erling Smørgrav case LDNS_SIGN_ECC_GOST: 316*7b5038d7SDag-Erling Smørgrav return 512; 317*7b5038d7SDag-Erling Smørgrav #endif 318*7b5038d7SDag-Erling Smørgrav #ifdef USE_ECDSA 319*7b5038d7SDag-Erling Smørgrav case LDNS_SIGN_ECDSAP256SHA256: 320*7b5038d7SDag-Erling Smørgrav return 256; 321*7b5038d7SDag-Erling Smørgrav case LDNS_SIGN_ECDSAP384SHA384: 322*7b5038d7SDag-Erling Smørgrav return 384; 323*7b5038d7SDag-Erling Smørgrav #endif 324*7b5038d7SDag-Erling Smørgrav case LDNS_SIGN_HMACMD5: 325*7b5038d7SDag-Erling Smørgrav return len; 326*7b5038d7SDag-Erling Smørgrav default: 327*7b5038d7SDag-Erling Smørgrav return 0; 328*7b5038d7SDag-Erling Smørgrav } 329*7b5038d7SDag-Erling Smørgrav } 330*7b5038d7SDag-Erling Smørgrav 331*7b5038d7SDag-Erling Smørgrav size_t 332*7b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_key_size(const ldns_rr *key) 333*7b5038d7SDag-Erling Smørgrav { 334*7b5038d7SDag-Erling Smørgrav if (!key || !ldns_rr_dnskey_key(key) 335*7b5038d7SDag-Erling Smørgrav || !ldns_rr_dnskey_algorithm(key)) { 336*7b5038d7SDag-Erling Smørgrav return 0; 337*7b5038d7SDag-Erling Smørgrav } 338*7b5038d7SDag-Erling Smørgrav return ldns_rr_dnskey_key_size_raw((unsigned char*)ldns_rdf_data(ldns_rr_dnskey_key(key)), 339*7b5038d7SDag-Erling Smørgrav ldns_rdf_size(ldns_rr_dnskey_key(key)), 340*7b5038d7SDag-Erling Smørgrav ldns_rdf2native_int8(ldns_rr_dnskey_algorithm(key)) 341*7b5038d7SDag-Erling Smørgrav ); 342*7b5038d7SDag-Erling Smørgrav } 343*7b5038d7SDag-Erling Smørgrav 344*7b5038d7SDag-Erling Smørgrav uint32_t ldns_soa_serial_identity(uint32_t ATTR_UNUSED(unused), void *data) 345*7b5038d7SDag-Erling Smørgrav { 346*7b5038d7SDag-Erling Smørgrav return (uint32_t) (intptr_t) data; 347*7b5038d7SDag-Erling Smørgrav } 348*7b5038d7SDag-Erling Smørgrav 349*7b5038d7SDag-Erling Smørgrav uint32_t ldns_soa_serial_increment(uint32_t s, void *ATTR_UNUSED(unused)) 350*7b5038d7SDag-Erling Smørgrav { 351*7b5038d7SDag-Erling Smørgrav return ldns_soa_serial_increment_by(s, (void *)1); 352*7b5038d7SDag-Erling Smørgrav } 353*7b5038d7SDag-Erling Smørgrav 354*7b5038d7SDag-Erling Smørgrav uint32_t ldns_soa_serial_increment_by(uint32_t s, void *data) 355*7b5038d7SDag-Erling Smørgrav { 356*7b5038d7SDag-Erling Smørgrav return s + (intptr_t) data; 357*7b5038d7SDag-Erling Smørgrav } 358*7b5038d7SDag-Erling Smørgrav 359*7b5038d7SDag-Erling Smørgrav uint32_t ldns_soa_serial_datecounter(uint32_t s, void *data) 360*7b5038d7SDag-Erling Smørgrav { 361*7b5038d7SDag-Erling Smørgrav struct tm tm; 362*7b5038d7SDag-Erling Smørgrav char s_str[11]; 363*7b5038d7SDag-Erling Smørgrav int32_t new_s; 364*7b5038d7SDag-Erling Smørgrav time_t t = data ? (time_t) (intptr_t) data : ldns_time(NULL); 365*7b5038d7SDag-Erling Smørgrav 366*7b5038d7SDag-Erling Smørgrav (void) strftime(s_str, 11, "%Y%m%d00", localtime_r(&t, &tm)); 367*7b5038d7SDag-Erling Smørgrav new_s = (int32_t) atoi(s_str); 368*7b5038d7SDag-Erling Smørgrav return new_s - ((int32_t) s) <= 0 ? s+1 : ((uint32_t) new_s); 369*7b5038d7SDag-Erling Smørgrav } 370*7b5038d7SDag-Erling Smørgrav 371*7b5038d7SDag-Erling Smørgrav uint32_t ldns_soa_serial_unixtime(uint32_t s, void *data) 372*7b5038d7SDag-Erling Smørgrav { 373*7b5038d7SDag-Erling Smørgrav int32_t new_s = data ? (int32_t) (intptr_t) data 374*7b5038d7SDag-Erling Smørgrav : (int32_t) ldns_time(NULL); 375*7b5038d7SDag-Erling Smørgrav return new_s - ((int32_t) s) <= 0 ? s+1 : ((uint32_t) new_s); 376*7b5038d7SDag-Erling Smørgrav } 377*7b5038d7SDag-Erling Smørgrav 378*7b5038d7SDag-Erling Smørgrav void 379*7b5038d7SDag-Erling Smørgrav ldns_rr_soa_increment(ldns_rr *soa) 380*7b5038d7SDag-Erling Smørgrav { 381*7b5038d7SDag-Erling Smørgrav ldns_rr_soa_increment_func_data(soa, ldns_soa_serial_increment, NULL); 382*7b5038d7SDag-Erling Smørgrav } 383*7b5038d7SDag-Erling Smørgrav 384*7b5038d7SDag-Erling Smørgrav void 385*7b5038d7SDag-Erling Smørgrav ldns_rr_soa_increment_func(ldns_rr *soa, ldns_soa_serial_increment_func_t f) 386*7b5038d7SDag-Erling Smørgrav { 387*7b5038d7SDag-Erling Smørgrav ldns_rr_soa_increment_func_data(soa, f, NULL); 388*7b5038d7SDag-Erling Smørgrav } 389*7b5038d7SDag-Erling Smørgrav 390*7b5038d7SDag-Erling Smørgrav void 391*7b5038d7SDag-Erling Smørgrav ldns_rr_soa_increment_func_data(ldns_rr *soa, 392*7b5038d7SDag-Erling Smørgrav ldns_soa_serial_increment_func_t f, void *data) 393*7b5038d7SDag-Erling Smørgrav { 394*7b5038d7SDag-Erling Smørgrav ldns_rdf *prev_soa_serial_rdf; 395*7b5038d7SDag-Erling Smørgrav if ( !soa || !f || ldns_rr_get_type(soa) != LDNS_RR_TYPE_SOA 396*7b5038d7SDag-Erling Smørgrav || !ldns_rr_rdf(soa, 2)) { 397*7b5038d7SDag-Erling Smørgrav return; 398*7b5038d7SDag-Erling Smørgrav } 399*7b5038d7SDag-Erling Smørgrav prev_soa_serial_rdf = ldns_rr_set_rdf( 400*7b5038d7SDag-Erling Smørgrav soa 401*7b5038d7SDag-Erling Smørgrav , ldns_native2rdf_int32( 402*7b5038d7SDag-Erling Smørgrav LDNS_RDF_TYPE_INT32 403*7b5038d7SDag-Erling Smørgrav , (*f)( ldns_rdf2native_int32( 404*7b5038d7SDag-Erling Smørgrav ldns_rr_rdf(soa, 2)) 405*7b5038d7SDag-Erling Smørgrav , data 406*7b5038d7SDag-Erling Smørgrav ) 407*7b5038d7SDag-Erling Smørgrav ) 408*7b5038d7SDag-Erling Smørgrav , 2 409*7b5038d7SDag-Erling Smørgrav ); 410*7b5038d7SDag-Erling Smørgrav LDNS_FREE(prev_soa_serial_rdf); 411*7b5038d7SDag-Erling Smørgrav } 412*7b5038d7SDag-Erling Smørgrav 413*7b5038d7SDag-Erling Smørgrav void 414*7b5038d7SDag-Erling Smørgrav ldns_rr_soa_increment_func_int(ldns_rr *soa, 415*7b5038d7SDag-Erling Smørgrav ldns_soa_serial_increment_func_t f, int data) 416*7b5038d7SDag-Erling Smørgrav { 417*7b5038d7SDag-Erling Smørgrav ldns_rr_soa_increment_func_data(soa, f, (void *) (intptr_t) data); 418*7b5038d7SDag-Erling Smørgrav } 419*7b5038d7SDag-Erling Smørgrav 420