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 local_print_ds(FILE* out, const char* pre, ldns_rr* ds)
102 fprintf(out, "%s", pre);
103 ldns_rr_print(out, ds);
109 * For all keys in a packet print the DS
112 print_ds_of_keys(ldns_pkt *p)
118 /* TODO fix the section stuff, here or in ldns */
119 keys = ldns_pkt_rr_list_by_type(p, LDNS_RR_TYPE_DNSKEY,
120 LDNS_SECTION_ANSWER);
122 /* this also returns the question section rr, which does not
123 * have any data.... and this inturn crashes everything */
126 for (i = 0; i < ldns_rr_list_rr_count(keys); i++) {
127 fprintf(stdout, ";\n; equivalent DS records for key %u:\n",
128 (unsigned int)ldns_calc_keytag(ldns_rr_list_rr(keys, i)));
130 ds = ldns_key_rr2ds(ldns_rr_list_rr(keys, i), LDNS_SHA1);
131 local_print_ds(stdout, "; sha1: ", ds);
132 ds = ldns_key_rr2ds(ldns_rr_list_rr(keys, i), LDNS_SHA256);
133 local_print_ds(stdout, "; sha256: ", ds);
139 print_class_type(FILE *fp, ldns_rr *r)
141 ldns_lookup_table *lt;
142 lt = ldns_lookup_by_id(ldns_rr_classes, ldns_rr_get_class(r));
144 fprintf(fp, " %s", lt->name);
146 fprintf(fp, " CLASS%d", ldns_rr_get_class(r));
148 /* okay not THE way - but the quickest */
149 switch (ldns_rr_get_type(r)) {
150 case LDNS_RR_TYPE_RRSIG:
151 fprintf(fp, " RRSIG ");
153 case LDNS_RR_TYPE_DNSKEY:
154 fprintf(fp, " DNSKEY ");
156 case LDNS_RR_TYPE_DS:
166 print_ds_abbr(FILE *fp, ldns_rr *ds)
168 if (!ds || (ldns_rr_get_type(ds) != LDNS_RR_TYPE_DS)) {
172 ldns_rdf_print(fp, ldns_rr_owner(ds));
173 fprintf(fp, " %d", (int)ldns_rr_ttl(ds));
174 print_class_type(fp, ds);
175 ldns_rdf_print(fp, ldns_rr_rdf(ds, 0)); fprintf(fp, " ");
176 ldns_rdf_print(fp, ldns_rr_rdf(ds, 1)); fprintf(fp, " ");
177 ldns_rdf_print(fp, ldns_rr_rdf(ds, 2)); fprintf(fp, " ");
178 ldns_rdf_print(fp, ldns_rr_rdf(ds, 3)); fprintf(fp, " ");
181 /* print some of the elements of a signature */
183 print_rrsig_abbr(FILE *fp, ldns_rr *sig) {
184 if (!sig || (ldns_rr_get_type(sig) != LDNS_RR_TYPE_RRSIG)) {
188 ldns_rdf_print(fp, ldns_rr_owner(sig));
189 fprintf(fp, " %d", (int)ldns_rr_ttl(sig));
190 print_class_type(fp, sig);
192 /* print a number of rdf's */
194 ldns_rdf_print(fp, ldns_rr_rdf(sig, 0)); fprintf(fp, " ");
196 ldns_rdf_print(fp, ldns_rr_rdf(sig, 1)); fprintf(fp, " ");
198 ldns_rdf_print(fp, ldns_rr_rdf(sig, 2)); fprintf(fp, " (\n\t\t\t");
200 ldns_rdf_print(fp, ldns_rr_rdf(sig, 4)); fprintf(fp, " ");
202 ldns_rdf_print(fp, ldns_rr_rdf(sig, 5)); fprintf(fp, " ");
204 ldns_rdf_print(fp, ldns_rr_rdf(sig, 6)); fprintf(fp, " ");
206 ldns_rdf_print(fp, ldns_rr_rdf(sig, 7)); fprintf(fp, ")");
210 print_dnskey_abbr(FILE *fp, ldns_rr *key)
212 if (!key || (ldns_rr_get_type(key) != LDNS_RR_TYPE_DNSKEY)) {
216 ldns_rdf_print(fp, ldns_rr_owner(key));
217 fprintf(fp, " %d", (int)ldns_rr_ttl(key));
218 print_class_type(fp, key);
220 /* print a number of rdf's */
222 ldns_rdf_print(fp, ldns_rr_rdf(key, 0)); fprintf(fp, " ");
224 ldns_rdf_print(fp, ldns_rr_rdf(key, 1)); fprintf(fp, " ");
226 ldns_rdf_print(fp, ldns_rr_rdf(key, 2));
228 if (ldns_rdf2native_int16(ldns_rr_rdf(key, 0)) == 256) {
229 fprintf(fp, " ;{id = %u (zsk), size = %db}", (unsigned int)ldns_calc_keytag(key),
230 (int)ldns_rr_dnskey_key_size(key));
233 if (ldns_rdf2native_int16(ldns_rr_rdf(key, 0)) == 257) {
234 fprintf(fp, " ;{id = %u (ksk), size = %db}", (unsigned int)ldns_calc_keytag(key),
235 (int)ldns_rr_dnskey_key_size(key));
238 fprintf(fp, " ;{id = %u, size = %db}", (unsigned int)ldns_calc_keytag(key),
239 (int)ldns_rr_dnskey_key_size(key));
243 print_rr_list_abbr(FILE *fp, ldns_rr_list *rrlist, char *usr)
248 for(i = 0; i < ldns_rr_list_rr_count(rrlist); i++) {
249 tp = ldns_rr_get_type(ldns_rr_list_rr(rrlist, i));
250 if (i == 0 && tp != LDNS_RR_TYPE_RRSIG) {
252 fprintf(fp, "%s ", usr);
256 case LDNS_RR_TYPE_DNSKEY:
257 print_dnskey_abbr(fp, ldns_rr_list_rr(rrlist, i));
259 case LDNS_RR_TYPE_RRSIG:
260 print_rrsig_abbr(fp, ldns_rr_list_rr(rrlist, i));
262 case LDNS_RR_TYPE_DS:
263 print_ds_abbr(fp, ldns_rr_list_rr(rrlist, i));
280 printf("Mem failure\n");
287 xrealloc(void *p, size_t size)
291 q = realloc(p, size);
293 printf("Mem failure\n");