Developer Area

root/tools/iphone-sdk/trunk/ldns_sources/rr_functions.c @ 32

Revision 32, 6.5 kB (checked in by kjaleel, 6 years ago)

unzipped the DotTel?.zip and moved it into trunk

Line 
1/*
2 * rr_function.c
3 *
4 * function that operate on specific rr types
5 *
6 * (c) NLnet Labs, 2004-2006
7 * See the file LICENSE for the license
8 */
9
10/*
11 * These come strait from perldoc Net::DNS::RR::xxx
12 * first the read variant, then the write. This is
13 * not complete.
14 */
15
16#include "ldns/config.h"
17
18#include "ldns.h"
19
20#include <limits.h>
21#include <strings.h>
22
23/**
24 * return a specific rdf
25 * \param[in] type type of RR
26 * \param[in] rr   the rr itself
27 * \param[in] pos  at which postion to get it
28 * \return the rdf sought
29 */
30static ldns_rdf *
31ldns_rr_function(ldns_rr_type type, const ldns_rr *rr, size_t pos)
32{
33        if (!rr || ldns_rr_get_type(rr) != type) {
34                return NULL;
35        }
36        return ldns_rr_rdf(rr, pos);
37}
38
39/**
40 * set a specific rdf
41 * \param[in] type type of RR
42 * \param[in] rr   the rr itself
43 * \param[in] rdf  the rdf to set
44 * \param[in] pos  at which postion to set it
45 * \return true or false
46 */
47static bool
48ldns_rr_set_function(ldns_rr_type type, ldns_rr *rr, ldns_rdf *rdf, size_t pos)
49{
50        ldns_rdf *pop;
51        if (!rr || ldns_rr_get_type(rr) != type) {
52                return false;
53        }
54        pop = ldns_rr_set_rdf(rr, rdf, pos);
55        if (pop) {
56                LDNS_FREE(pop);
57                return true;
58        } else {
59                return true;
60        }
61}
62
63/* A/AAAA records */
64ldns_rdf *
65ldns_rr_a_address(const ldns_rr *r)
66{
67        /* 2 types to check, cannot use the macro */
68        if (!r || (ldns_rr_get_type(r) != LDNS_RR_TYPE_A &&
69                        ldns_rr_get_type(r) != LDNS_RR_TYPE_AAAA)) {
70                return NULL;
71        }
72        return ldns_rr_rdf(r, 0);
73}
74
75bool
76ldns_rr_a_set_address(ldns_rr *r, ldns_rdf *f)
77{
78        /* 2 types to check, cannot use the macro... */
79        ldns_rdf *pop;
80        if (!r || (ldns_rr_get_type(r) != LDNS_RR_TYPE_A &&
81                        ldns_rr_get_type(r) != LDNS_RR_TYPE_AAAA)) {
82                return false;
83        }
84        pop = ldns_rr_set_rdf(r, f, 0);
85        if (pop) {
86                LDNS_FREE(pop);
87                return true;
88        } else {
89                return false;
90        }
91}
92
93/* NS record */
94ldns_rdf *
95ldns_rr_ns_nsdname(const ldns_rr *r)
96{
97        return ldns_rr_function(LDNS_RR_TYPE_NS, r, 0);
98}
99
100/* MX record */
101ldns_rdf *
102ldns_rr_mx_preference(const ldns_rr *r)
103{
104        return ldns_rr_function(LDNS_RR_TYPE_MX, r, 0);
105}
106
107ldns_rdf *
108ldns_rr_mx_exchange(const ldns_rr *r)
109{
110        return ldns_rr_function(LDNS_RR_TYPE_MX, r, 1);
111}
112
113/* RRSIG record */
114ldns_rdf *
115ldns_rr_rrsig_typecovered(const ldns_rr *r)
116{
117        return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 0);
118}
119
120bool
121ldns_rr_rrsig_set_typecovered(ldns_rr *r, ldns_rdf *f)
122{
123        return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 0);
124}
125
126ldns_rdf *
127ldns_rr_rrsig_algorithm(const ldns_rr *r)
128{
129        return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 1);
130}
131
132bool
133ldns_rr_rrsig_set_algorithm(ldns_rr *r, ldns_rdf *f)
134{
135        return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 1);
136}
137
138ldns_rdf *
139ldns_rr_rrsig_labels(const ldns_rr *r)
140{
141        return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 2);
142}
143
144bool
145ldns_rr_rrsig_set_labels(ldns_rr *r, ldns_rdf *f)
146{
147        return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 2);
148}
149
150ldns_rdf *
151ldns_rr_rrsig_origttl(const ldns_rr *r)
152{
153        return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 3);
154}
155
156bool
157ldns_rr_rrsig_set_origttl(ldns_rr *r, ldns_rdf *f)
158{
159        return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 3);
160}
161
162ldns_rdf *
163ldns_rr_rrsig_expiration(const ldns_rr *r)
164{
165        return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 4);
166}
167
168bool
169ldns_rr_rrsig_set_expiration(ldns_rr *r, ldns_rdf *f)
170{
171        return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 4);
172}
173
174ldns_rdf *
175ldns_rr_rrsig_inception(const ldns_rr *r)
176{
177        return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 5);
178}
179
180bool
181ldns_rr_rrsig_set_inception(ldns_rr *r, ldns_rdf *f)
182{
183        return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 5);
184}
185
186ldns_rdf *
187ldns_rr_rrsig_keytag(const ldns_rr *r)
188{
189        return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 6);
190}
191
192bool
193ldns_rr_rrsig_set_keytag(ldns_rr *r, ldns_rdf *f)
194{
195        return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 6);
196}
197
198ldns_rdf *
199ldns_rr_rrsig_signame(const ldns_rr *r)
200{
201        return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 7);
202}
203
204bool
205ldns_rr_rrsig_set_signame(ldns_rr *r, ldns_rdf *f)
206{
207        return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 7);
208}
209
210ldns_rdf *
211ldns_rr_rrsig_sig(const ldns_rr *r)
212{
213        return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 8);
214}
215
216bool
217ldns_rr_rrsig_set_sig(ldns_rr *r, ldns_rdf *f)
218{
219        return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 8);
220}
221
222/* DNSKEY record */
223ldns_rdf *
224ldns_rr_dnskey_flags(const ldns_rr *r)
225{
226        return ldns_rr_function(LDNS_RR_TYPE_DNSKEY, r, 0);
227}
228
229bool
230ldns_rr_dnskey_set_flags(ldns_rr *r, ldns_rdf *f)
231{
232        return ldns_rr_set_function(LDNS_RR_TYPE_DNSKEY, r, f, 0);
233}
234
235ldns_rdf *
236ldns_rr_dnskey_protocol(const ldns_rr *r)
237{
238        return ldns_rr_function(LDNS_RR_TYPE_DNSKEY, r, 1);
239}
240
241bool
242ldns_rr_dnskey_set_protocol(ldns_rr *r, ldns_rdf *f)
243{
244        return ldns_rr_set_function(LDNS_RR_TYPE_DNSKEY, r, f, 1);
245}
246
247ldns_rdf *
248ldns_rr_dnskey_algorithm(const ldns_rr *r)
249{
250        return ldns_rr_function(LDNS_RR_TYPE_DNSKEY, r, 2);
251}
252
253bool
254ldns_rr_dnskey_set_algorithm(ldns_rr *r, ldns_rdf *f)
255{
256        return ldns_rr_set_function(LDNS_RR_TYPE_DNSKEY, r, f, 2);
257}
258
259ldns_rdf *
260ldns_rr_dnskey_key(const ldns_rr *r)
261{
262        return ldns_rr_function(LDNS_RR_TYPE_DNSKEY, r, 3);
263}
264
265bool
266ldns_rr_dnskey_set_key(ldns_rr *r, ldns_rdf *f)
267{
268        return ldns_rr_set_function(LDNS_RR_TYPE_DNSKEY, r, f, 3);
269}
270
271size_t
272ldns_rr_dnskey_key_size_raw(const unsigned char* keydata,
273                            const size_t len,
274                            const ldns_algorithm alg)
275{
276        /* for DSA keys */
277        uint8_t t;
278       
279        /* for RSA keys */
280        uint16_t exp;
281        uint16_t int16;
282       
283        switch (alg) {
284        case LDNS_SIGN_DSA:
285        case LDNS_SIGN_DSA_NSEC3:
286                if (len > 0) {
287                        t = keydata[0];
288                        return (64 + t*8)*8;
289                } else {
290                        return 0;
291                }
292                break;
293        case LDNS_SIGN_RSAMD5:
294        case LDNS_SIGN_RSASHA1:
295        case LDNS_SIGN_RSASHA1_NSEC3:
296#ifdef USE_SHA2
297        case LDNS_SIGN_RSASHA256:
298        case LDNS_SIGN_RSASHA512:
299#endif
300                if (len > 0) {
301                        if (keydata[0] == 0) {
302                                /* big exponent */
303                                if (len > 3) {
304                                        memmove(&int16, keydata + 1, 2);
305                                        exp = ntohs(int16);
306                                        return (len - exp - 3)*8;
307                                } else {
308                                        return 0;
309                                }
310                        } else {
311                                exp = keydata[0];
312                                return (len-exp-1)*8;
313                        }
314                } else {
315                        return 0;
316                }
317                break;
318        case LDNS_SIGN_HMACMD5:
319                return len;
320                break;
321        default:
322                return 0;
323        }
324}
325
326size_t
327ldns_rr_dnskey_key_size(const ldns_rr *key) 
328{
329        if (!key) {
330                return 0;
331        }
332        return ldns_rr_dnskey_key_size_raw(ldns_rdf_data(ldns_rr_dnskey_key(key)),
333                                           ldns_rdf_size(ldns_rr_dnskey_key(key)),
334                                           ldns_rdf2native_int8(ldns_rr_dnskey_algorithm(key))
335                                          );
336}
Note: See TracBrowser for help on using the browser.
Telnic
Search This Site
Partners
Neustar
ICANN
Main site | WHOIS | Sell .tel | FAQ | Archived Site | About Telnic | Contact Us