3 * some handy function needed in drill and not implemented
7 * See the file LICENSE for the license
12 #include <ldns/ldns.h>
17 read_line(FILE *input, char *line)
22 for (i = 0; i < LDNS_MAX_PACKETLEN; i++) {
26 } else if (c != '\n') {
36 /* key_list must be initialized with ldns_rr_list_new() */
38 read_key_file(const char *filename, ldns_rr_list *key_list)
43 char line[LDNS_MAX_PACKETLEN];
48 input_file = fopen(filename, "r");
50 fprintf(stderr, "Error opening %s: %s\n",
51 filename, strerror(errno));
52 return LDNS_STATUS_ERR;
54 while (line_len >= 0) {
55 line_len = read_line(input_file, line);
57 if (line_len > 0 && line[0] != ';') {
58 status = ldns_rr_new_frm_str(&rr, line, 0, NULL, NULL);
59 if (status != LDNS_STATUS_OK) {
61 "Error parsing DNSKEY RR in line %d: %s\n",
63 ldns_get_errorstr_by_id(status));
64 } else if (ldns_rr_get_type(rr) == LDNS_RR_TYPE_DNSKEY ||
65 ldns_rr_get_type(rr) == LDNS_RR_TYPE_DS) {
66 ldns_rr_list_push_rr(key_list, rr);
73 printf(";; Number of trusted keys: %d\n", key_count);
75 return LDNS_STATUS_OK;
77 /*fprintf(stderr, "No keys read\n");*/
78 return LDNS_STATUS_ERR;
83 ldns_rdf_new_addr_frm_str(char *str)
87 a = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_A, str);
90 a = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_AAAA, str);
99 * For all keys in a packet print the DS
102 print_ds_of_keys(ldns_pkt *p)
108 /* TODO fix the section stuff, here or in ldns */
109 keys = ldns_pkt_rr_list_by_type(p, LDNS_RR_TYPE_DNSKEY,
110 LDNS_SECTION_ANSWER);
112 /* this also returns the question section rr, which does not
113 * have any data.... and this inturn crashes everything */
116 for (i = 0; i < ldns_rr_list_rr_count(keys); i++) {
117 ds = ldns_key_rr2ds(ldns_rr_list_rr(keys, i), LDNS_SHA1);
120 ldns_rr_print(stdout, ds);
128 print_class_type(FILE *fp, ldns_rr *r)
130 ldns_lookup_table *lt;
131 lt = ldns_lookup_by_id(ldns_rr_classes, ldns_rr_get_class(r));
133 fprintf(fp, " %s", lt->name);
135 fprintf(fp, " CLASS%d", ldns_rr_get_class(r));
137 /* okay not THE way - but the quickest */
138 switch (ldns_rr_get_type(r)) {
139 case LDNS_RR_TYPE_RRSIG:
140 fprintf(fp, " RRSIG ");
142 case LDNS_RR_TYPE_DNSKEY:
143 fprintf(fp, " DNSKEY ");
145 case LDNS_RR_TYPE_DS:
155 print_ds_abbr(FILE *fp, ldns_rr *ds)
157 if (!ds || (ldns_rr_get_type(ds) != LDNS_RR_TYPE_DS)) {
161 ldns_rdf_print(fp, ldns_rr_owner(ds));
162 fprintf(fp, " %d", (int)ldns_rr_ttl(ds));
163 print_class_type(fp, ds);
164 ldns_rdf_print(fp, ldns_rr_rdf(ds, 0)); fprintf(fp, " ");
165 ldns_rdf_print(fp, ldns_rr_rdf(ds, 1)); fprintf(fp, " ");
166 ldns_rdf_print(fp, ldns_rr_rdf(ds, 2)); fprintf(fp, " ");
167 ldns_rdf_print(fp, ldns_rr_rdf(ds, 3)); fprintf(fp, " ");
170 /* print some of the elements of a signature */
172 print_rrsig_abbr(FILE *fp, ldns_rr *sig) {
173 if (!sig || (ldns_rr_get_type(sig) != LDNS_RR_TYPE_RRSIG)) {
177 ldns_rdf_print(fp, ldns_rr_owner(sig));
178 fprintf(fp, " %d", (int)ldns_rr_ttl(sig));
179 print_class_type(fp, sig);
181 /* print a number of rdf's */
183 ldns_rdf_print(fp, ldns_rr_rdf(sig, 0)); fprintf(fp, " ");
185 ldns_rdf_print(fp, ldns_rr_rdf(sig, 1)); fprintf(fp, " ");
187 ldns_rdf_print(fp, ldns_rr_rdf(sig, 2)); fprintf(fp, " (\n\t\t\t");
189 ldns_rdf_print(fp, ldns_rr_rdf(sig, 4)); fprintf(fp, " ");
191 ldns_rdf_print(fp, ldns_rr_rdf(sig, 5)); fprintf(fp, " ");
193 ldns_rdf_print(fp, ldns_rr_rdf(sig, 6)); fprintf(fp, " ");
195 ldns_rdf_print(fp, ldns_rr_rdf(sig, 7)); fprintf(fp, ")");
199 print_dnskey_abbr(FILE *fp, ldns_rr *key)
201 if (!key || (ldns_rr_get_type(key) != LDNS_RR_TYPE_DNSKEY)) {
205 ldns_rdf_print(fp, ldns_rr_owner(key));
206 fprintf(fp, " %d", (int)ldns_rr_ttl(key));
207 print_class_type(fp, key);
209 /* print a number of rdf's */
211 ldns_rdf_print(fp, ldns_rr_rdf(key, 0)); fprintf(fp, " ");
213 ldns_rdf_print(fp, ldns_rr_rdf(key, 1)); fprintf(fp, " ");
215 ldns_rdf_print(fp, ldns_rr_rdf(key, 2));
217 if (ldns_rdf2native_int16(ldns_rr_rdf(key, 0)) == 256) {
218 fprintf(fp, " ;{id = %d (zsk), size = %db}", (int)ldns_calc_keytag(key),
219 (int)ldns_rr_dnskey_key_size(key));
222 if (ldns_rdf2native_int16(ldns_rr_rdf(key, 0)) == 257) {
223 fprintf(fp, " ;{id = %d (ksk), size = %db}", (int)ldns_calc_keytag(key),
224 (int)ldns_rr_dnskey_key_size(key));
227 fprintf(fp, " ;{id = %d, size = %db}", (int)ldns_calc_keytag(key),
228 (int)ldns_rr_dnskey_key_size(key));
232 print_rr_list_abbr(FILE *fp, ldns_rr_list *rrlist, char *usr)
237 for(i = 0; i < ldns_rr_list_rr_count(rrlist); i++) {
238 tp = ldns_rr_get_type(ldns_rr_list_rr(rrlist, i));
239 if (i == 0 && tp != LDNS_RR_TYPE_RRSIG) {
241 fprintf(fp, "%s ", usr);
245 case LDNS_RR_TYPE_DNSKEY:
246 print_dnskey_abbr(fp, ldns_rr_list_rr(rrlist, i));
248 case LDNS_RR_TYPE_RRSIG:
249 print_rrsig_abbr(fp, ldns_rr_list_rr(rrlist, i));
251 case LDNS_RR_TYPE_DS:
252 print_ds_abbr(fp, ldns_rr_list_rr(rrlist, i));
269 printf("Mem failure\n");
276 xrealloc(void *p, size_t size)
280 q = realloc(p, size);
282 printf("Mem failure\n");