Add support for non-leaf DNS-over-TLS pinning
This is required by the pinning specification (RFC 7469).
It allows more flexible server management than leaf-only
pinning.
Includes integration tests for fingerprints from
the middle and root of a certificate chain.
Test: Integration tests pass
Bug: 63448475
Change-Id: I65d1255b8dac005d4ab0859c8e8abda84d7b96f8
diff --git a/tests/netd_test.cpp b/tests/netd_test.cpp
index 12d85aa..0217f5b 100644
--- a/tests/netd_test.cpp
+++ b/tests/netd_test.cpp
@@ -833,33 +833,38 @@
const char* listen_addr = "127.0.0.3";
const char* listen_udp = "53";
const char* listen_tls = "853";
- const char* host_name = "tlsfingerprint.example.com.";
- test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail, 1.0);
- dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.1");
- ASSERT_TRUE(dns.startServer());
- std::vector<std::string> servers = { listen_addr };
+ for (int chain_length = 1; chain_length <= 3; ++chain_length) {
+ const char* host_name = StringPrintf("tlsfingerprint%d.example.com.", chain_length).c_str();
+ test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail, 1.0);
+ dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.1");
+ ASSERT_TRUE(dns.startServer());
+ std::vector<std::string> servers = { listen_addr };
- test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
- ASSERT_TRUE(tls.startServer());
- auto rv = mNetdSrv->addPrivateDnsServer(listen_addr, 853, "SHA-256",
- { base64Encode(tls.fingerprint()) });
- ASSERT_TRUE(SetResolversForNetwork(mDefaultSearchDomains, servers, mDefaultParams));
+ test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
+ tls.set_chain_length(chain_length);
+ ASSERT_TRUE(tls.startServer());
+ auto rv = mNetdSrv->addPrivateDnsServer(listen_addr, 853, "SHA-256",
+ { base64Encode(tls.fingerprint()) });
+ ASSERT_TRUE(SetResolversForNetwork(mDefaultSearchDomains, servers, mDefaultParams));
- const hostent* result;
+ const hostent* result;
- // Wait for validation to complete.
- EXPECT_TRUE(tls.waitForQueries(1, 5000));
+ // Wait for validation to complete.
+ EXPECT_TRUE(tls.waitForQueries(1, 5000));
- result = gethostbyname("tlsfingerprint");
- ASSERT_FALSE(result == nullptr);
- EXPECT_EQ("1.2.3.1", ToString(result));
+ result = gethostbyname(StringPrintf("tlsfingerprint%d", chain_length).c_str());
+ EXPECT_FALSE(result == nullptr);
+ if (result) {
+ EXPECT_EQ("1.2.3.1", ToString(result));
- // Wait for query to get counted.
- EXPECT_TRUE(tls.waitForQueries(2, 5000));
+ // Wait for query to get counted.
+ EXPECT_TRUE(tls.waitForQueries(2, 5000));
+ }
- rv = mNetdSrv->removePrivateDnsServer(listen_addr);
- tls.stopServer();
- dns.stopServer();
+ rv = mNetdSrv->removePrivateDnsServer(listen_addr);
+ tls.stopServer();
+ dns.stopServer();
+ }
}
TEST_F(ResolverTest, GetHostByName_BadTlsFingerprint) {