Add a ServerProofVerifier interface to QUIC. This is a server-side equivalent of ProofVerifier. It is used to verify a client's certificate chain. It will only be used when the server needs to request client certificates. ServerProofVerifier drops the VerifyProof() function (not used in TLS 1.3) and the |hostname|, |ocsp_response|, and |cert_sct| parameters of VerifyCertChain() (those aren't really meaningful to a server). See go/quic-tls-client-certificates for the full design doc and context. gfe-relnote: no functional changes (only adds an interface). PiperOrigin-RevId: 291429810 Change-Id: Ifd7deb6e72294b2626572b6555e3b5e2976b286e
diff --git a/quic/core/crypto/server_proof_verifier.h b/quic/core/crypto/server_proof_verifier.h new file mode 100644 index 0000000..94fe131 --- /dev/null +++ b/quic/core/crypto/server_proof_verifier.h
@@ -0,0 +1,42 @@ +// Copyright (c) 2020 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. + +#ifndef QUICHE_QUIC_CORE_CRYPTO_SERVER_PROOF_VERIFIER_H_ +#define QUICHE_QUIC_CORE_CRYPTO_SERVER_PROOF_VERIFIER_H_ + +#include <memory> +#include <string> +#include <vector> + +#include "net/third_party/quiche/src/quic/core/crypto/proof_verifier.h" +#include "net/third_party/quiche/src/quic/core/quic_types.h" + +namespace quic { + +// A ServerProofVerifier checks the certificate chain presented by a client. +class QUIC_EXPORT_PRIVATE ServerProofVerifier { + public: + virtual ~ServerProofVerifier() {} + + // VerifyCertChain checks that |certs| is a valid chain. On success, it + // returns QUIC_SUCCESS. On failure, it returns QUIC_FAILURE and sets + // |*error_details| to a description of the problem. In either case it may set + // |*details|, which the caller takes ownership of. + // + // |context| specifies an implementation specific struct (which may be nullptr + // for some implementations) that provides useful information for the + // verifier, e.g. logging handles. + // + // This function may also return QUIC_PENDING, in which case the + // ServerProofVerifier will call back, on the original thread, via |callback| + // when complete. In this case, the ServerProofVerifier will take ownership of + // |callback|. + virtual QuicAsyncStatus VerifyCertChain( + const std::vector<std::string>& certs, + std::string* error_details, + std::unique_ptr<ProofVerifierCallback> callback) = 0; +}; + +} // namespace quic +#endif // QUICHE_QUIC_CORE_CRYPTO_SERVER_PROOF_VERIFIER_H_