Line data Source code
1 : /* t-dns-cert.c - Module test for dns-stuff.c
2 : * Copyright (C) 2011 Free Software Foundation, Inc.
3 : * Copyright (C) 2011, 2015 Werner Koch
4 : *
5 : * This file is part of GnuPG.
6 : *
7 : * GnuPG is free software; you can redistribute it and/or modify
8 : * it under the terms of the GNU General Public License as published by
9 : * the Free Software Foundation; either version 3 of the License, or
10 : * (at your option) any later version.
11 : *
12 : * GnuPG is distributed in the hope that it will be useful,
13 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 : * GNU General Public License for more details.
16 : *
17 : * You should have received a copy of the GNU General Public License
18 : * along with this program; if not, see <https://www.gnu.org/licenses/>.
19 : */
20 :
21 : #include <config.h>
22 : #include <stdio.h>
23 : #include <stdlib.h>
24 : #include <assert.h>
25 :
26 :
27 : #include "util.h"
28 : #include "dns-stuff.h"
29 :
30 : #define PGM "t-dns-stuff"
31 :
32 : static int verbose;
33 : static int debug;
34 :
35 :
36 :
37 : int
38 1 : main (int argc, char **argv)
39 : {
40 1 : int last_argc = -1;
41 : gpg_error_t err;
42 1 : int any_options = 0;
43 1 : int opt_tor = 0;
44 1 : int opt_new_circuit = 0;
45 1 : int opt_cert = 0;
46 1 : int opt_srv = 0;
47 1 : int opt_bracket = 0;
48 1 : int opt_cname = 0;
49 1 : char const *name = NULL;
50 :
51 1 : gpgrt_init ();
52 1 : log_set_prefix (PGM, GPGRT_LOG_WITH_PREFIX);
53 1 : if (argc)
54 1 : { argc--; argv++; }
55 2 : while (argc && last_argc != argc )
56 : {
57 0 : last_argc = argc;
58 0 : if (!strcmp (*argv, "--"))
59 : {
60 0 : argc--; argv++;
61 0 : break;
62 : }
63 0 : else if (!strcmp (*argv, "--help"))
64 : {
65 0 : fputs ("usage: " PGM " [HOST]\n"
66 : "Options:\n"
67 : " --verbose print timings etc.\n"
68 : " --debug flyswatter\n"
69 : " --standard-resolver use the system's resolver\n"
70 : " --use-tor use Tor\n"
71 : " --new-circuit use a new Tor circuit\n"
72 : " --bracket enclose v6 addresses in brackets\n"
73 : " --cert lookup a CERT RR\n"
74 : " --srv lookup a SRV RR\n"
75 : " --cname lookup a CNAME RR\n"
76 : , stdout);
77 0 : exit (0);
78 : }
79 0 : else if (!strcmp (*argv, "--verbose"))
80 : {
81 0 : verbose++;
82 0 : argc--; argv++;
83 : }
84 0 : else if (!strcmp (*argv, "--debug"))
85 : {
86 0 : verbose += 2;
87 0 : debug++;
88 0 : argc--; argv++;
89 : }
90 0 : else if (!strcmp (*argv, "--use-tor"))
91 : {
92 0 : opt_tor = 1;
93 0 : argc--; argv++;
94 : }
95 0 : else if (!strcmp (*argv, "--new-circuit"))
96 : {
97 0 : opt_new_circuit = 1;
98 0 : argc--; argv++;
99 : }
100 0 : else if (!strcmp (*argv, "--standard-resolver"))
101 : {
102 0 : enable_standard_resolver (1);
103 0 : argc--; argv++;
104 : }
105 0 : else if (!strcmp (*argv, "--bracket"))
106 : {
107 0 : opt_bracket = 1;
108 0 : argc--; argv++;
109 : }
110 0 : else if (!strcmp (*argv, "--cert"))
111 : {
112 0 : any_options = opt_cert = 1;
113 0 : argc--; argv++;
114 : }
115 0 : else if (!strcmp (*argv, "--srv"))
116 : {
117 0 : any_options = opt_srv = 1;
118 0 : argc--; argv++;
119 : }
120 0 : else if (!strcmp (*argv, "--cname"))
121 : {
122 0 : any_options = opt_cname = 1;
123 0 : argc--; argv++;
124 : }
125 0 : else if (!strncmp (*argv, "--", 2))
126 : {
127 0 : fprintf (stderr, PGM ": unknown option '%s'\n", *argv);
128 0 : exit (1);
129 : }
130 : }
131 :
132 1 : if (!argc && !any_options)
133 : {
134 1 : opt_cert = 1;
135 1 : name = "simon.josefsson.org";
136 : }
137 0 : else if (argc == 1)
138 0 : name = *argv;
139 : else
140 : {
141 0 : fprintf (stderr, PGM ": none or too many host names given\n");
142 0 : exit (1);
143 : }
144 :
145 1 : if (opt_tor)
146 : {
147 0 : err = enable_dns_tormode (opt_new_circuit);
148 0 : if (err)
149 : {
150 0 : fprintf (stderr, "error switching into Tor mode: %s\n",
151 : gpg_strerror (err));
152 0 : exit (1);
153 : }
154 : }
155 :
156 1 : if (opt_cert)
157 : {
158 : unsigned char *fpr;
159 : size_t fpr_len;
160 : char *url;
161 : void *key;
162 : size_t keylen;
163 :
164 1 : if (verbose || any_options)
165 0 : printf ("CERT lookup on '%s'\n", name);
166 :
167 1 : err = get_dns_cert (name, DNS_CERTTYPE_ANY, &key, &keylen,
168 : &fpr, &fpr_len, &url);
169 1 : if (err)
170 1 : printf ("get_dns_cert failed: %s <%s>\n",
171 : gpg_strerror (err), gpg_strsource (err));
172 0 : else if (key)
173 : {
174 0 : if (verbose || any_options)
175 0 : printf ("Key found (%u bytes)\n", (unsigned int)keylen);
176 : }
177 : else
178 : {
179 0 : if (fpr)
180 : {
181 : int i;
182 :
183 0 : printf ("Fingerprint found (%d bytes): ", (int)fpr_len);
184 0 : for (i = 0; i < fpr_len; i++)
185 0 : printf ("%02X", fpr[i]);
186 0 : putchar ('\n');
187 : }
188 : else
189 0 : printf ("No fingerprint found\n");
190 :
191 0 : if (url)
192 0 : printf ("URL found: %s\n", url);
193 : else
194 0 : printf ("No URL found\n");
195 :
196 : }
197 :
198 1 : xfree (key);
199 1 : xfree (fpr);
200 1 : xfree (url);
201 : }
202 0 : else if (opt_cname)
203 : {
204 : char *cname;
205 :
206 0 : printf ("CNAME lookup on '%s'\n", name);
207 0 : err = get_dns_cname (name, &cname);
208 0 : if (err)
209 0 : printf ("get_dns_cname failed: %s <%s>\n",
210 : gpg_strerror (err), gpg_strsource (err));
211 : else
212 : {
213 0 : printf ("CNAME found: '%s'\n", cname);
214 : }
215 :
216 0 : xfree (cname);
217 : }
218 0 : else if (opt_srv)
219 : {
220 : struct srventry *srv;
221 : int rc,i;
222 :
223 0 : rc=getsrv (name? name : "_hkp._tcp.wwwkeys.pgp.net", &srv);
224 0 : printf("Count=%d\n",rc);
225 0 : for(i=0;i<rc;i++)
226 : {
227 0 : printf("priority=%-8hu ",srv[i].priority);
228 0 : printf("weight=%-8hu ",srv[i].weight);
229 0 : printf("port=%-5hu ",srv[i].port);
230 0 : printf("target=%s\n",srv[i].target);
231 : }
232 :
233 0 : xfree(srv);
234 : }
235 : else /* Standard lookup. */
236 : {
237 : char *cname;
238 : dns_addrinfo_t aibuf, ai;
239 : char *host;
240 :
241 0 : printf ("Lookup on '%s'\n", name);
242 :
243 0 : err = resolve_dns_name (name, 0, 0, SOCK_STREAM, &aibuf, &cname);
244 0 : if (err)
245 : {
246 0 : fprintf (stderr, PGM": resolving '%s' failed: %s\n",
247 : name, gpg_strerror (err));
248 0 : exit (1);
249 : }
250 :
251 0 : if (cname)
252 0 : printf ("cname: %s\n", cname);
253 0 : for (ai = aibuf; ai; ai = ai->next)
254 : {
255 0 : printf ("%s %3d %3d ",
256 0 : ai->family == AF_INET6? "inet6" :
257 0 : ai->family == AF_INET? "inet4" : "? ",
258 : ai->socktype, ai->protocol);
259 :
260 0 : err = resolve_dns_addr (ai->addr, ai->addrlen,
261 : (DNS_NUMERICHOST
262 : | (opt_bracket? DNS_WITHBRACKET:0)),
263 : &host);
264 0 : if (err)
265 0 : printf ("[resolve_dns_addr failed: %s]", gpg_strerror (err));
266 : else
267 : {
268 0 : printf ("%s", host);
269 0 : xfree (host);
270 : }
271 :
272 0 : err = resolve_dns_addr (ai->addr, ai->addrlen,
273 : (opt_bracket? DNS_WITHBRACKET:0),
274 : &host);
275 0 : if (err)
276 0 : printf ("[resolve_dns_addr failed (2): %s]", gpg_strerror (err));
277 : else
278 : {
279 0 : if (!is_ip_address (host))
280 0 : printf (" (%s)", host);
281 0 : xfree (host);
282 : }
283 0 : putchar ('\n');
284 : }
285 0 : xfree (cname);
286 0 : free_dns_addrinfo (aibuf);
287 : }
288 :
289 :
290 1 : return 0;
291 : }
|