diff options
author | agl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-09 20:13:23 +0000 |
---|---|---|
committer | agl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-09 20:13:23 +0000 |
commit | b40f05a835ecd5ff30e7f87a89837eee059bfadc (patch) | |
tree | 6099b52325283e33e1a79892b9646d12cb0da7f5 /net/tools | |
parent | cf59e2dae675b777ce193268ec4040de63e4b4f1 (diff) | |
download | chromium_src-b40f05a835ecd5ff30e7f87a89837eee059bfadc.zip chromium_src-b40f05a835ecd5ff30e7f87a89837eee059bfadc.tar.gz chromium_src-b40f05a835ecd5ff30e7f87a89837eee059bfadc.tar.bz2 |
net: add DNSSEC tool and CNAME support.
This change adds support for DNSSEC chains with CNAMEs. I.e. it's not
possible to prove records about $domain where $domain is a CNAME.
It also adds a tiny, standalone tool to run the verification code from
the command line.
BUG=none
TEST=net_unittests
http://codereview.chromium.org/3301015/show
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@58986 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/tools')
-rw-r--r-- | net/tools/dnssec_chain_verify/dnssec_chain_verify.cc | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/net/tools/dnssec_chain_verify/dnssec_chain_verify.cc b/net/tools/dnssec_chain_verify/dnssec_chain_verify.cc new file mode 100644 index 0000000..a1c5270 --- /dev/null +++ b/net/tools/dnssec_chain_verify/dnssec_chain_verify.cc @@ -0,0 +1,108 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <errno.h> +#include <stdio.h> + +#include "base/at_exit.h" +#include "net/base/dns_util.h" +#include "net/base/dnssec_chain_verifier.h" + +static int usage(const char* argv0) { + fprintf(stderr, "Usage: %s [--ignore-timestamps] <target domain> " + "<input file>\n", argv0); + return 1; +} + +int main(int argc, char** argv) { + base::AtExitManager at_exit_manager; + + if (argc < 3) + return usage(argv[0]); + + const char* target = NULL; + const char* infilename = NULL; + bool ignore_timestamps = false; + + for (int i = 1; i < argc; i++) { + if (strcmp(argv[i], "--ignore-timestamps") == 0) { + ignore_timestamps = true; + } else if (!target) { + target = argv[i]; + } else if (!infilename) { + infilename = argv[i]; + } else { + return usage(argv[0]); + } + } + + if (!target || !infilename) + return usage(argv[0]); + + FILE* infile = fopen(infilename, "r"); + if (!infile) { + perror("open"); + return usage(argv[0]); + } + + fseek(infile, 0, SEEK_END); + unsigned long inlen = ftell(infile); + fseek(infile, 0, SEEK_SET); + + char* const input = (char *) malloc(inlen); + if (fread(input, inlen, 1, infile) != 1) { + perror("read"); + return 1; + } + + std::string target_dns; + if (!net::DNSDomainFromDot(target, &target_dns)) { + fprintf(stderr, "Not a valid DNS name: %s\n", target); + return usage(argv[0]); + } + + net::DNSSECChainVerifier verifier(target_dns, + base::StringPiece(input, inlen)); + if (ignore_timestamps) + verifier.IgnoreTimestamps(); + net::DNSSECChainVerifier::Error err = verifier.Verify(); + const char* err_str; + switch (err) { + case net::DNSSECChainVerifier::BAD_DATA: + err_str = "Bad data"; + break; + case net::DNSSECChainVerifier::UNKNOWN_ROOT_KEY: + err_str = "Unknown root key"; + break; + case net::DNSSECChainVerifier::UNKNOWN_DIGEST: + err_str = "Unknown digest"; + break; + case net::DNSSECChainVerifier::UNKNOWN_TERMINAL_RRTYPE: + err_str = "Unknown terminal RR type"; + break; + case net::DNSSECChainVerifier::BAD_SIGNATURE: + err_str = "Bad signature"; + break; + case net::DNSSECChainVerifier::NO_DS_LINK: + err_str = "No DS link"; + break; + case net::DNSSECChainVerifier::OFF_COURSE: + err_str = "Off course"; + break; + case net::DNSSECChainVerifier::BAD_TARGET: + err_str = "Bad target"; + break; + default: + err_str = "Unknown"; + break; + } + + if (err != net::DNSSECChainVerifier::OK) { + fprintf(stderr, "Chain error: %s (%d)\n", err_str, (int) err); + return 1; + } + + fprintf(stderr, "Chain good: rrtype:%d\n", verifier.rrtype()); + return 0; +} |