blob: e25fe64a6e3325e9a04f9cf33f2c455e8d5ca52a [file] [log] [blame]
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Generalises `ClientSession` and `ServerSession`"><meta name="keywords" content="rust, rustlang, rust-lang, Session"><title>Session in rustls - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../SourceSerif4-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../FiraSans-Regular.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../FiraSans-Medium.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../SourceCodePro-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../SourceSerif4-Bold.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../SourceCodePro-Semibold.ttf.woff2"><link rel="stylesheet" href="../normalize.css"><link rel="stylesheet" href="../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" href="../ayu.css" disabled><link rel="stylesheet" href="../dark.css" disabled><link rel="stylesheet" href="../light.css" id="themeStyle"><script id="default-settings" ></script><script src="../storage.js"></script><script defer src="sidebar-items.js"></script><script defer src="../main.js"></script><noscript><link rel="stylesheet" href="../noscript.css"></noscript><link rel="alternate icon" type="image/png" href="../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../favicon.svg"></head><body class="rustdoc trait"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="mobile-topbar"><button class="sidebar-menu-toggle">&#9776;</button><a class="sidebar-logo" href="../rustls/index.html"><div class="logo-container"><img class="rust-logo" src="../rust-logo.svg" alt="logo"></div></a><h2></h2></nav><nav class="sidebar"><a class="sidebar-logo" href="../rustls/index.html"><div class="logo-container"><img class="rust-logo" src="../rust-logo.svg" alt="logo"></div></a><h2 class="location"><a href="#">Session</a></h2><div class="sidebar-elems"><section><h3><a href="#required-methods">Required Methods</a></h3><ul class="block"><li><a href="#tymethod.export_keying_material">export_keying_material</a></li><li><a href="#tymethod.get_alpn_protocol">get_alpn_protocol</a></li><li><a href="#tymethod.get_negotiated_ciphersuite">get_negotiated_ciphersuite</a></li><li><a href="#tymethod.get_peer_certificates">get_peer_certificates</a></li><li><a href="#tymethod.get_protocol_version">get_protocol_version</a></li><li><a href="#tymethod.is_handshaking">is_handshaking</a></li><li><a href="#tymethod.process_new_packets">process_new_packets</a></li><li><a href="#tymethod.read_tls">read_tls</a></li><li><a href="#tymethod.send_close_notify">send_close_notify</a></li><li><a href="#tymethod.set_buffer_limit">set_buffer_limit</a></li><li><a href="#tymethod.wants_read">wants_read</a></li><li><a href="#tymethod.wants_write">wants_write</a></li><li><a href="#tymethod.write_tls">write_tls</a></li></ul><h3><a href="#provided-methods">Provided Methods</a></h3><ul class="block"><li><a href="#method.complete_io">complete_io</a></li></ul><h3><a href="#implementors">Implementors</a></h3></section><h2><a href="index.html">In rustls</a></h2></div></nav><main><div class="width-limiter"><nav class="sub"><form class="search-form"><div class="search-container"><span></span><input class="search-input" name="search" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" title="help" tabindex="-1"><a href="../help.html">?</a></div><div id="settings-menu" tabindex="-1"><a href="../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../wheel.svg"></a></div></div></form></nav><section id="main-content" class="content"><div class="main-heading"><h1 class="fqn">Trait <a href="index.html">rustls</a>::<wbr><a class="trait" href="#">Session</a><button id="copy-path" onclick="copy_path(this)" title="Copy item path to clipboard"><img src="../clipboard.svg" width="19" height="18" alt="Copy item path"></button></h1><span class="out-of-band"><a class="srclink" href="../src/rustls/session.rs.html#26-210">source</a> · <a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class="inner">&#x2212;</span>]</a></span></div><div class="item-decl"><pre class="rust trait"><code>pub trait Session: QuicExt + <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html" title="trait std::io::Read">Read</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Write.html" title="trait std::io::Write">Write</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> {
<details class="rustdoc-toggle type-contents-toggle"><summary class="hideme"><span>Show 14 methods</span></summary> fn <a href="#tymethod.read_tls" class="fnname">read_tls</a>(&amp;mut self, rd: &amp;mut dyn <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html" title="trait std::io::Read">Read</a>) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>, <a class="struct" href="https://doc.rust-lang.org/nightly/std/io/error/struct.Error.html" title="struct std::io::error::Error">Error</a>&gt;;
<span class="item-spacer"></span> fn <a href="#tymethod.write_tls" class="fnname">write_tls</a>(&amp;mut self, wr: &amp;mut dyn <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Write.html" title="trait std::io::Write">Write</a>) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>, <a class="struct" href="https://doc.rust-lang.org/nightly/std/io/error/struct.Error.html" title="struct std::io::error::Error">Error</a>&gt;;
<span class="item-spacer"></span> fn <a href="#tymethod.process_new_packets" class="fnname">process_new_packets</a>(&amp;mut self) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.unit.html">()</a>, <a class="enum" href="enum.TLSError.html" title="enum rustls::TLSError">TLSError</a>&gt;;
<span class="item-spacer"></span> fn <a href="#tymethod.wants_read" class="fnname">wants_read</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a>;
<span class="item-spacer"></span> fn <a href="#tymethod.wants_write" class="fnname">wants_write</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a>;
<span class="item-spacer"></span> fn <a href="#tymethod.is_handshaking" class="fnname">is_handshaking</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a>;
<span class="item-spacer"></span> fn <a href="#tymethod.set_buffer_limit" class="fnname">set_buffer_limit</a>(&amp;mut self, limit: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>);
<span class="item-spacer"></span> fn <a href="#tymethod.send_close_notify" class="fnname">send_close_notify</a>(&amp;mut self);
<span class="item-spacer"></span> fn <a href="#tymethod.get_peer_certificates" class="fnname">get_peer_certificates</a>(&amp;self) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="struct" href="struct.Certificate.html" title="struct rustls::Certificate">Certificate</a>&gt;&gt;;
<span class="item-spacer"></span> fn <a href="#tymethod.get_alpn_protocol" class="fnname">get_alpn_protocol</a>(&amp;self) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;&amp;[<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]&gt;;
<span class="item-spacer"></span> fn <a href="#tymethod.get_protocol_version" class="fnname">get_protocol_version</a>(&amp;self) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="enum" href="internal/msgs/enums/enum.ProtocolVersion.html" title="enum rustls::internal::msgs::enums::ProtocolVersion">ProtocolVersion</a>&gt;;
<span class="item-spacer"></span> fn <a href="#tymethod.export_keying_material" class="fnname">export_keying_material</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;self,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output: &amp;mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>],<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label: &amp;[<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>],<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context: <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;&amp;[<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.unit.html">()</a>, <a class="enum" href="enum.TLSError.html" title="enum rustls::TLSError">TLSError</a>&gt;;
<span class="item-spacer"></span> fn <a href="#tymethod.get_negotiated_ciphersuite" class="fnname">get_negotiated_ciphersuite</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;self<br>&nbsp;&nbsp;&nbsp;&nbsp;) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;&amp;'static <a class="struct" href="struct.SupportedCipherSuite.html" title="struct rustls::SupportedCipherSuite">SupportedCipherSuite</a>&gt;;
fn <a href="#method.complete_io" class="fnname">complete_io</a>&lt;T&gt;(&amp;mut self, io: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;mut </a>T) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;(<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>, <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>), <a class="struct" href="https://doc.rust-lang.org/nightly/std/io/error/struct.Error.html" title="struct std::io::error::Error">Error</a>&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="where">where<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T: <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html" title="trait std::io::Read">Read</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Write.html" title="trait std::io::Write">Write</a></span>,
{ ... }
</details>}</code></pre></div><details class="rustdoc-toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Generalises <code>ClientSession</code> and <code>ServerSession</code></p>
</div></details><h2 id="required-methods" class="small-section-header">Required Methods<a href="#required-methods" class="anchor"></a></h2><div class="methods"><details class="rustdoc-toggle method-toggle" open><summary><section id="tymethod.read_tls" class="method has-srclink"><a class="srclink rightside" href="../src/rustls/session.rs.html#40">source</a><h4 class="code-header">fn <a href="#tymethod.read_tls" class="fnname">read_tls</a>(&amp;mut self, rd: &amp;mut dyn <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html" title="trait std::io::Read">Read</a>) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>, <a class="struct" href="https://doc.rust-lang.org/nightly/std/io/error/struct.Error.html" title="struct std::io::error::Error">Error</a>&gt;</h4></section></summary><div class="docblock"><p>Read TLS content from <code>rd</code>. This method does internal
buffering, so <code>rd</code> can supply TLS messages in arbitrary-
sized chunks (like a socket or pipe might).</p>
<p>You should call <code>process_new_packets</code> each time a call to
this function succeeds.</p>
<p>The returned error only relates to IO on <code>rd</code>. TLS-level
errors are emitted from <code>process_new_packets</code>.</p>
<p>This function returns <code>Ok(0)</code> when the underlying <code>rd</code> does
so. This typically happens when a socket is cleanly closed,
or a file is at EOF.</p>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="tymethod.write_tls" class="method has-srclink"><a class="srclink rightside" href="../src/rustls/session.rs.html#53">source</a><h4 class="code-header">fn <a href="#tymethod.write_tls" class="fnname">write_tls</a>(&amp;mut self, wr: &amp;mut dyn <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Write.html" title="trait std::io::Write">Write</a>) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>, <a class="struct" href="https://doc.rust-lang.org/nightly/std/io/error/struct.Error.html" title="struct std::io::error::Error">Error</a>&gt;</h4></section></summary><div class="docblock"><p>Writes TLS messages to <code>wr</code>.</p>
<p>On success the function returns <code>Ok(n)</code> where <code>n</code> is a number
of bytes written to <code>wr</code>, number of bytes after encoding and
encryption.</p>
<p>Note that after function return the session buffer maybe not
yet fully flushed. <a href="#tymethod.wants_write"><code>wants_write</code></a> function can be used
to check if output buffer is not empty.</p>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="tymethod.process_new_packets" class="method has-srclink"><a class="srclink rightside" href="../src/rustls/session.rs.html#62">source</a><h4 class="code-header">fn <a href="#tymethod.process_new_packets" class="fnname">process_new_packets</a>(&amp;mut self) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.unit.html">()</a>, <a class="enum" href="enum.TLSError.html" title="enum rustls::TLSError">TLSError</a>&gt;</h4></section></summary><div class="docblock"><p>Processes any new packets read by a previous call to <code>read_tls</code>.
Errors from this function relate to TLS protocol errors, and
are fatal to the session. Future calls after an error will do
no new work and will return the same error.</p>
<p>Success from this function can mean new plaintext is available:
obtain it using <code>read</code>.</p>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="tymethod.wants_read" class="method has-srclink"><a class="srclink rightside" href="../src/rustls/session.rs.html#66">source</a><h4 class="code-header">fn <a href="#tymethod.wants_read" class="fnname">wants_read</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Returns true if the caller should call <code>read_tls</code> as soon
as possible.</p>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="tymethod.wants_write" class="method has-srclink"><a class="srclink rightside" href="../src/rustls/session.rs.html#70">source</a><h4 class="code-header">fn <a href="#tymethod.wants_write" class="fnname">wants_write</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Returns true if the caller should call <code>write_tls</code> as soon
as possible.</p>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="tymethod.is_handshaking" class="method has-srclink"><a class="srclink rightside" href="../src/rustls/session.rs.html#75">source</a><h4 class="code-header">fn <a href="#tymethod.is_handshaking" class="fnname">is_handshaking</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Returns true if the session is currently perform the TLS
handshake. During this time plaintext written to the
session is buffered in memory.</p>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="tymethod.set_buffer_limit" class="method has-srclink"><a class="srclink rightside" href="../src/rustls/session.rs.html#83">source</a><h4 class="code-header">fn <a href="#tymethod.set_buffer_limit" class="fnname">set_buffer_limit</a>(&amp;mut self, limit: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>)</h4></section></summary><div class="docblock"><p>Sets a limit on the internal buffers used to buffer
unsent plaintext (prior to completing the TLS handshake)
and unsent TLS records.</p>
<p>By default, there is no limit. The limit can be set
at any time, even if the current buffer use is higher.</p>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="tymethod.send_close_notify" class="method has-srclink"><a class="srclink rightside" href="../src/rustls/session.rs.html#88">source</a><h4 class="code-header">fn <a href="#tymethod.send_close_notify" class="fnname">send_close_notify</a>(&amp;mut self)</h4></section></summary><div class="docblock"><p>Queues a close_notify fatal alert to be sent in the next
<code>write_tls</code> call. This informs the peer that the
connection is being closed.</p>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="tymethod.get_peer_certificates" class="method has-srclink"><a class="srclink rightside" href="../src/rustls/session.rs.html#103">source</a><h4 class="code-header">fn <a href="#tymethod.get_peer_certificates" class="fnname">get_peer_certificates</a>(&amp;self) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="struct" href="struct.Certificate.html" title="struct rustls::Certificate">Certificate</a>&gt;&gt;</h4></section></summary><div class="docblock"><p>Retrieves the certificate chain used by the peer to authenticate.</p>
<p>The order of the certificate chain is as it appears in the TLS
protocol: the first certificate relates to the peer, the
second certifies the first, the third certifies the second, and
so on.</p>
<p>For clients, this is the certificate chain of the server.</p>
<p>For servers, this is the certificate chain of the client,
if client authentication was completed.</p>
<p>The return value is None until this value is available.</p>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="tymethod.get_alpn_protocol" class="method has-srclink"><a class="srclink rightside" href="../src/rustls/session.rs.html#110">source</a><h4 class="code-header">fn <a href="#tymethod.get_alpn_protocol" class="fnname">get_alpn_protocol</a>(&amp;self) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;&amp;[<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]&gt;</h4></section></summary><div class="docblock"><p>Retrieves the protocol agreed with the peer via ALPN.</p>
<p>A return value of None after handshake completion
means no protocol was agreed (because no protocols
were offered or accepted by the peer).</p>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="tymethod.get_protocol_version" class="method has-srclink"><a class="srclink rightside" href="../src/rustls/session.rs.html#115">source</a><h4 class="code-header">fn <a href="#tymethod.get_protocol_version" class="fnname">get_protocol_version</a>(&amp;self) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="enum" href="internal/msgs/enums/enum.ProtocolVersion.html" title="enum rustls::internal::msgs::enums::ProtocolVersion">ProtocolVersion</a>&gt;</h4></section></summary><div class="docblock"><p>Retrieves the protocol version agreed with the peer.</p>
<p>This returns None until the version is agreed.</p>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="tymethod.export_keying_material" class="method has-srclink"><a class="srclink rightside" href="../src/rustls/session.rs.html#130-135">source</a><h4 class="code-header">fn <a href="#tymethod.export_keying_material" class="fnname">export_keying_material</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;self,<br>&nbsp;&nbsp;&nbsp;&nbsp;output: &amp;mut [<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>],<br>&nbsp;&nbsp;&nbsp;&nbsp;label: &amp;[<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>],<br>&nbsp;&nbsp;&nbsp;&nbsp;context: <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;&amp;[<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>]&gt;<br>) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.unit.html">()</a>, <a class="enum" href="enum.TLSError.html" title="enum rustls::TLSError">TLSError</a>&gt;</h4></section></summary><div class="docblock"><p>Derives key material from the agreed session secrets.</p>
<p>This function fills in <code>output</code> with <code>output.len()</code> bytes of key
material derived from the master session secret using <code>label</code>
and <code>context</code> for diversification.</p>
<p>See RFC5705 for more details on what this does and is for.</p>
<p>For TLS1.3 connections, this function does not use the
“early” exporter at any point.</p>
<p>This function fails if called prior to the handshake completing;
check with <code>is_handshaking()</code> first.</p>
</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="tymethod.get_negotiated_ciphersuite" class="method has-srclink"><a class="srclink rightside" href="../src/rustls/session.rs.html#140">source</a><h4 class="code-header">fn <a href="#tymethod.get_negotiated_ciphersuite" class="fnname">get_negotiated_ciphersuite</a>(&amp;self) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;&amp;'static <a class="struct" href="struct.SupportedCipherSuite.html" title="struct rustls::SupportedCipherSuite">SupportedCipherSuite</a>&gt;</h4></section></summary><div class="docblock"><p>Retrieves the ciphersuite agreed with the peer.</p>
<p>This returns None until the ciphersuite is agreed.</p>
</div></details></div><h2 id="provided-methods" class="small-section-header">Provided Methods<a href="#provided-methods" class="anchor"></a></h2><div class="methods"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.complete_io" class="method has-srclink"><a class="srclink rightside" href="../src/rustls/session.rs.html#164-209">source</a><h4 class="code-header">fn <a href="#method.complete_io" class="fnname">complete_io</a>&lt;T&gt;(&amp;mut self, io: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;mut </a>T) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;(<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>, <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>), <a class="struct" href="https://doc.rust-lang.org/nightly/std/io/error/struct.Error.html" title="struct std::io::error::Error">Error</a>&gt;<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,<br>&nbsp;&nbsp;&nbsp;&nbsp;T: <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html" title="trait std::io::Read">Read</a> + <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Write.html" title="trait std::io::Write">Write</a>,</span></h4></section></summary><div class="docblock"><p>This function uses <code>io</code> to complete any outstanding IO for
this session.</p>
<p>This is a convenience function which solely uses other parts
of the public API.</p>
<p>What this means depends on the session state:</p>
<ul>
<li>If the session <code>is_handshaking()</code>, then IO is performed until
the handshake is complete.</li>
<li>Otherwise, if <code>wants_write</code> is true, <code>write_tls</code> is invoked
until it is all written.</li>
<li>Otherwise, if <code>wants_read</code> is true, <code>read_tls</code> is invoked
once.</li>
</ul>
<p>The return value is the number of bytes read from and written
to <code>io</code>, respectively.</p>
<p>This function will block if <code>io</code> blocks.</p>
<p>Errors from TLS record handling (ie, from <code>process_new_packets()</code>)
are wrapped in an <code>io::ErrorKind::InvalidData</code>-kind error.</p>
</div></details></div><h2 id="implementors" class="small-section-header">Implementors<a href="#implementors" class="anchor"></a></h2><div id="implementors-list"><section id="impl-Session-for-ClientSession" class="impl has-srclink"><a class="srclink rightside" href="../src/rustls/client/mod.rs.html#706-767">source</a><a href="#impl-Session-for-ClientSession" class="anchor"></a><h3 class="code-header">impl <a class="trait" href="trait.Session.html" title="trait rustls::Session">Session</a> for <a class="struct" href="struct.ClientSession.html" title="struct rustls::ClientSession">ClientSession</a></h3></section><section id="impl-Session-for-ServerSession" class="impl has-srclink"><a class="srclink rightside" href="../src/rustls/server/mod.rs.html#648-707">source</a><a href="#impl-Session-for-ServerSession" class="anchor"></a><h3 class="code-header">impl <a class="trait" href="trait.Session.html" title="trait rustls::Session">Session</a> for <a class="struct" href="struct.ServerSession.html" title="struct rustls::ServerSession">ServerSession</a></h3></section></div><script src="../implementors/rustls/session/trait.Session.js" async></script></section></div></main><div id="rustdoc-vars" data-root-path="../" data-current-crate="rustls" data-themes="ayu,dark,light" data-resource-suffix="" data-rustdoc-version="1.66.0-nightly (5c8bff74b 2022-10-21)" ></div></body></html>