| // Copyright 2012 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef NET_SOCKET_SSL_SOCKET_H_ |
| #define NET_SOCKET_SSL_SOCKET_H_ |
| |
| #include <string_view> |
| |
| #include "base/containers/span.h" |
| #include "net/base/net_export.h" |
| #include "net/socket/stream_socket.h" |
| |
| namespace net { |
| |
| // SSLSocket interface defines method that are common between client |
| // and server SSL sockets. |
| class NET_EXPORT SSLSocket : public StreamSocket { |
| public: |
| ~SSLSocket() override = default; |
| |
| // Exports data derived from the SSL master-secret (see RFC 5705). The call |
| // will fail with an error if the socket is not connected or the SSL |
| // implementation does not support the operation. Note that |label| is |
| // required (per RFC 5705 section 4) to be ASCII and subclasses enforce this |
| // requirement. |
| // |
| // Note that in TLS < 1.3, passing std::nullopt for context produces a |
| // different result from passing a populated option containing an empty span. |
| // TLS 1.3 did away with this distinction and passing std::nullopt has the |
| // same behavior as passing base::span(). See RFC 5705 section 4 for TLS < |
| // 1.3 and RFC 8446 section 7.5 for TLS 1.3. |
| // |
| // Once we drop support for TLS < 1.3 (some day...) the context argument here |
| // can cease being optional. |
| virtual int ExportKeyingMaterial( |
| std::string_view label, |
| std::optional<base::span<const uint8_t>> context, |
| base::span<uint8_t> out) = 0; |
| }; |
| |
| } // namespace net |
| |
| #endif // NET_SOCKET_SSL_SOCKET_H_ |