Skip to content
This repository was archived by the owner on Oct 25, 2024. It is now read-only.

Commit 90fec52

Browse files
committed
Add client fingerprint verification
1 parent b8d1fb5 commit 90fec52

File tree

7 files changed

+52
-145
lines changed

7 files changed

+52
-145
lines changed

quic_transport/BUILD.gn

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,6 @@ source_set("owt_quic_transport_impl") {
3333
"sdk/impl/logging.cc",
3434
"sdk/impl/proof_source_owt.cc",
3535
"sdk/impl/proof_source_owt.h",
36-
"sdk/impl/proof_verifier_owt.cc",
37-
"sdk/impl/proof_verifier_owt.h",
3836
"sdk/impl/quic_transport_factory_impl.cc",
3937
"sdk/impl/quic_transport_factory_impl.h",
4038
"sdk/impl/quic_transport_owt_client_base.cc",

quic_transport/sdk/impl/proof_verifier_owt.cc

Lines changed: 0 additions & 64 deletions
This file was deleted.

quic_transport/sdk/impl/proof_verifier_owt.h

Lines changed: 0 additions & 66 deletions
This file was deleted.

quic_transport/sdk/impl/quic_transport_factory_impl.cc

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
#include "net/quic/quic_chromium_connection_helper.h"
2222
#include "net/third_party/quiche/src/quiche/quic/core/crypto/proof_source.h"
2323
#include "net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_server_config.h"
24-
#include "net/third_party/quiche/src/quiche/quic/core/quic_types.h"
2524
#include "url/gurl.h"
2625
#include "net/quic/address_utils.h"
2726
#include "net/tools/quic/synchronous_host_resolver.h"
@@ -161,6 +160,22 @@ void QuicTransportFactoryImpl::Init() {
161160
logging::InitLogging(settings);
162161
logging::SetMinLogLevel(1);
163162

163+
char* str = std::getenv("QUIC_SERVER_FINGERPRINTS");
164+
if(str == NULL) {
165+
LOG(ERROR) <<"No server fingerprints provided in env";
166+
} else {
167+
const char delimiter = ',';
168+
std::stringstream ss;
169+
std::string s;
170+
ss << str;
171+
172+
while (std::getline(ss, s, delimiter)) {
173+
::quic::CertificateFingerprint quic_fingerprint;
174+
quic_fingerprint.algorithm = ::quic::CertificateFingerprint::kSha256;
175+
quic_fingerprint.fingerprint = s;
176+
server_certificate_fingerprints.push_back(quic_fingerprint);
177+
}
178+
}
164179
}
165180

166181
QuicTransportClientInterface*
@@ -174,10 +189,9 @@ QuicTransportFactoryImpl::CreateQuicTransportClient(
174189
FROM_HERE,
175190
base::BindOnce(
176191
[](const char* host, int port,
192+
const std::vector<::quic::CertificateFingerprint>& fingerprints,
177193
base::Thread* io_thread, base::Thread* event_thread,
178194
owt::quic::QuicTransportClientInterface** result, base::WaitableEvent* event) {
179-
std::unique_ptr<::quic::ProofVerifier> proof_verifier;
180-
proof_verifier.reset(new FakeProofVerifier());
181195
::quic::QuicIpAddress ip_addr;
182196

183197
GURL url("https://www.example.org");
@@ -196,16 +210,16 @@ QuicTransportFactoryImpl::CreateQuicTransportClient(
196210
net::ToQuicIpAddress(addresses[0].address());
197211
}
198212

199-
::quic::QuicServerId server_id(url.host(), url.EffectiveIntPort(),
200-
net::PRIVACY_MODE_DISABLED);
213+
::quic::QuicServerId server_id(host, port, false);
201214
::quic::ParsedQuicVersionVector versions = ::quic::CurrentSupportedVersions();
215+
printf("url host is:%s, origin host is:%s\n", url.host().c_str(), host);
202216

203217
*result = new net::QuicTransportOwtClientImpl(
204-
::quic::QuicSocketAddress(ip_addr, port), server_id, versions, std::move(proof_verifier),
218+
::quic::QuicSocketAddress(ip_addr, port), server_id, versions, fingerprints,
205219
io_thread, event_thread);
206220
event->Signal();
207221
},
208-
base::Unretained(host), port, base::Unretained(io_thread_.get()),
222+
base::Unretained(host), port, server_certificate_fingerprints, base::Unretained(io_thread_.get()),
209223
base::Unretained(event_thread_.get()), base::Unretained(&result),
210224
base::Unretained(&done)));
211225
done.Wait();

quic_transport/sdk/impl/quic_transport_factory_impl.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
#include "owt/quic/export.h"
1414
#include "owt/quic/quic_transport_factory.h"
1515
#include "owt/quic_transport/sdk/impl/proof_source_owt.h"
16-
#include "owt/quic_transport/sdk/impl/proof_verifier_owt.h"
16+
#include "net/third_party/quiche/src/quiche/quic/platform/api/quic_default_proof_providers.h"
17+
#include "net/third_party/quiche/src/quiche/quic/core/quic_types.h"
18+
#include "quiche/quic/core/crypto/web_transport_fingerprint_proof_verifier.h"
1719

1820
namespace quic {
1921
class QuicAlarmFactory;
@@ -61,6 +63,7 @@ class OWT_EXPORT QuicTransportFactoryImpl : public owt::quic::QuicTransportFacto
6163
std::unique_ptr<base::AtExitManager> at_exit_manager_;
6264
std::unique_ptr<base::Thread> io_thread_;
6365
std::unique_ptr<base::Thread> event_thread_;
66+
std::vector<::quic::CertificateFingerprint> server_certificate_fingerprints;
6467
};
6568

6669
} // namespace quic

quic_transport/sdk/impl/quic_transport_owt_client_impl.cc

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,39 @@
2929
#include "net/third_party/quiche/src/quiche/quic/core/quic_server_id.h"
3030
#include "net/third_party/quiche/src/quiche/quic/platform/api/quic_flags.h"
3131
#include "net/third_party/quiche/src/quiche/quic/tools/quic_simple_client_session.h"
32-
//#include "net/third_party/quiche/src/spdy/core/spdy_header_block.h"
32+
#include "net/quic/platform/impl/quic_chromium_clock.h"
3333

3434
using std::string;
3535

3636
namespace net {
3737

38+
// From
39+
// https://wicg.github.io/web-transport/#dom-quictransportconfiguration-server_certificate_fingerprints
40+
constexpr int kCustomCertificateMaxValidityDays = 14;
41+
42+
std::unique_ptr<::quic::ProofVerifier> CreateProofVerifier(
43+
quic::QuicChromiumClock* clock,
44+
const std::vector<::quic::CertificateFingerprint> server_certificate_fingerprints) {
45+
46+
auto verifier =
47+
std::make_unique<::quic::WebTransportFingerprintProofVerifier>(
48+
clock, kCustomCertificateMaxValidityDays);
49+
for (const ::quic::CertificateFingerprint& fingerprint :
50+
server_certificate_fingerprints) {
51+
bool success = verifier->AddFingerprint(fingerprint);
52+
if (!success) {
53+
DLOG(WARNING) << "Failed to add a certificate fingerprint: "
54+
<< fingerprint.fingerprint;
55+
}
56+
}
57+
return verifier;
58+
}
59+
3860
QuicTransportOwtClientImpl::QuicTransportOwtClientImpl(
3961
quic::QuicSocketAddress server_address,
4062
const quic::QuicServerId& server_id,
4163
const quic::ParsedQuicVersionVector& supported_versions,
42-
std::unique_ptr<quic::ProofVerifier> proof_verifier,
64+
const std::vector<::quic::CertificateFingerprint> server_certificate_fingerprints,
4365
base::Thread* io_thread,
4466
base::Thread* event_thread)
4567
: quic::QuicTransportOwtClientBase(
@@ -49,7 +71,7 @@ QuicTransportOwtClientImpl::QuicTransportOwtClientImpl(
4971
CreateQuicConnectionHelper(),
5072
CreateQuicAlarmFactory(),
5173
base::WrapUnique(CreateNetworkHelper()),
52-
std::move(proof_verifier),
74+
CreateProofVerifier(&clock_, server_certificate_fingerprints),
5375
nullptr,
5476
io_thread->task_runner().get(),
5577
event_thread->task_runner().get()),

quic_transport/sdk/impl/quic_transport_owt_client_impl.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
#include "owt/quic_transport/sdk/impl/quic_transport_owt_client_base.h"
2424
#include "owt/quic/quic_transport_client_interface.h"
2525
#include "owt/quic/quic_transport_stream_interface.h"
26-
#include "owt/quic_transport/sdk/impl/proof_verifier_owt.h"
26+
#include "net/third_party/quiche/src/quiche/quic/core/crypto/web_transport_fingerprint_proof_verifier.h"
2727
#include "base/threading/thread.h"
2828

2929
namespace net {
@@ -40,7 +40,7 @@ class QuicTransportOwtClientImpl : public quic::QuicTransportOwtClientBase,
4040
QuicTransportOwtClientImpl(quic::QuicSocketAddress server_address,
4141
const quic::QuicServerId& server_id,
4242
const quic::ParsedQuicVersionVector& supported_versions,
43-
std::unique_ptr<quic::ProofVerifier> proof_verifier,
43+
const std::vector<::quic::CertificateFingerprint> server_certificate_fingerprints,
4444
base::Thread* io_thread,
4545
base::Thread* event_thread);
4646

0 commit comments

Comments
 (0)