SSLClient/docs/html/_s_s_l_client_8h_source.html

151 lines
50 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.15"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>SSLClient: C:/Users/Noah/Documents/Arduino/libraries/SSLClient/src/SSLClient.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(initResizable);
/* @license-end */</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">SSLClient
&#160;<span id="projectnumber">v1.1.1</span>
</div>
<div id="projectbrief">Add TLS 1.2 functionality to any network library.</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.15 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('_s_s_l_client_8h_source.html','');});
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">SSLClient.h</div> </div>
</div><!--header-->
<div class="contents">
<a href="_s_s_l_client_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/* Copyright 2019 OSU OPEnS Lab</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> * Permission is hereby granted, free of charge, to any person obtaining a copy of this</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> * software and associated documentation files (the &quot;Software&quot;), to deal in the Software</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> * without restriction, including without limitation the rights to use, copy, modify,</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> * permit persons to whom the Software is furnished to do so, subject to the following</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> * conditions:</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> * The above copyright notice and this permission notice shall be included in all</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> * copies or substantial portions of the Software.</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment"> * THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment"> * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment"> * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment"> * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="comment"> * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="comment"> * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;</div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor">#include &lt;type_traits&gt;</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="preprocessor">#include &quot;Client.h&quot;</span></div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_s_s_l_client_impl_8h.html">SSLClientImpl.h</a>&quot;</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_s_s_l_session_8h.html">SSLSession.h</a>&quot;</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;</div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="preprocessor">#ifndef SSLClient_H_</span></div><div class="line"><a name="l00027"></a><span class="lineno"><a class="line" href="_s_s_l_client_8h.html#a0e14869de8f634ff2fb63826ae583569"> 27</a></span>&#160;<span class="preprocessor">#define SSLClient_H_</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">class</span> C, <span class="keywordtype">size_t</span> SessionCache = 1&gt;</div><div class="line"><a name="l00035"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html"> 35</a></span>&#160;<span class="keyword">class </span><a class="code" href="class_s_s_l_client.html">SSLClient</a> : <span class="keyword">public</span> <a class="code" href="class_s_s_l_client_impl.html">SSLClientImpl</a> {</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="comment">/* </span></div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="comment"> * static checks</span></div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<span class="comment"> * I&#39;m a java developer, so I want to ensure that my inheritance is safe.</span></div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;<span class="comment"> * These checks ensure that all the functions we use on class C are</span></div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;<span class="comment"> * actually present on class C. It does this by checking that the</span></div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160;<span class="comment"> * class inherits from Client.</span></div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="comment"> * </span></div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<span class="comment"> * Additionally, I ran into a lot of memory issues with large sessions caches.</span></div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;<span class="comment"> * Since each session contains at max 352 bytes of memory, they eat of the</span></div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;<span class="comment"> * stack quite quickly and can cause overflows. As a result, I have added a</span></div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;<span class="comment"> * warning here to discourage the use of more than 3 sessions at a time. Any</span></div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;<span class="comment"> * amount past that will require special modification of this library, and </span></div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160;<span class="comment"> * assumes you know what you are doing.</span></div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;static_assert(std::is_base_of&lt;Client, C&gt;::value, <span class="stringliteral">&quot;SSLClient can only accept a type with base class Client!&quot;</span>);</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;static_assert(SessionCache &gt; 0 &amp;&amp; SessionCache &lt; 255, <span class="stringliteral">&quot;There can be no less than one and no more than 255 sessions in the cache!&quot;</span>);</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;static_assert(SessionCache &lt;= 3, <span class="stringliteral">&quot;You need to decrease the size of m_iobuf in order to have more than 3 sessions at once, otherwise memory issues will occur.&quot;</span>);</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160;</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00071"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#ae9a7509bc8a18f67e286547c19deb3c0"> 71</a></span>&#160; <span class="keyword">explicit</span> <a class="code" href="class_s_s_l_client.html#ae9a7509bc8a18f67e286547c19deb3c0">SSLClient</a>(<span class="keyword">const</span> C&amp; client, <span class="keyword">const</span> br_x509_trust_anchor *trust_anchors, <span class="keyword">const</span> <span class="keywordtype">size_t</span> trust_anchors_num, <span class="keyword">const</span> <span class="keywordtype">int</span> analog_pin, <span class="keyword">const</span> <a class="code" href="_s_s_l_client_impl_8h.html#ab658e6d84759440dbf3c890446075395">DebugLevel</a> debug = <a class="code" href="_s_s_l_client_impl_8h.html#ab658e6d84759440dbf3c890446075395a86c8fdfc38831619d5ed73dff5b0911d">SSL_WARN</a>)</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; : <a class="code" href="class_s_s_l_client_impl.html">SSLClientImpl</a>(trust_anchors, trust_anchors_num, analog_pin, debug) </div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; , m_client(client)</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; , m_sessions{<a class="code" href="class_s_s_l_session.html">SSLSession</a>()}</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; {</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; <span class="comment">// set the timeout to a reasonable number (it can always be changes later)</span></div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; <span class="comment">// SSL Connections take a really long time so we don&#39;t want to time out a legitimate thing</span></div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; setTimeout(30 * 1000);</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; }</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; </div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; <span class="comment">//========================================</span></div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; <span class="comment">//= Functions implemented in SSLClientImpl</span></div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; <span class="comment">//========================================</span></div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160;</div><div class="line"><a name="l00124"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a4a2172aedfcc483ba2a256ad12148630"> 124</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="class_s_s_l_client.html#a4a2172aedfcc483ba2a256ad12148630">connect</a>(IPAddress ip, uint16_t port)<span class="keyword"> override </span>{ <span class="keywordflow">return</span> <a class="code" href="class_s_s_l_client_impl.html#aa5c14ecf301c268306946c85825e565b">connect_impl</a>(ip, port); }</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160;</div><div class="line"><a name="l00162"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a91c63e35f31652c20faa5b9be95984bf"> 162</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="class_s_s_l_client.html#a91c63e35f31652c20faa5b9be95984bf">connect</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *host, uint16_t port)<span class="keyword"> override </span>{ <span class="keywordflow">return</span> <a class="code" href="class_s_s_l_client_impl.html#aa5c14ecf301c268306946c85825e565b">connect_impl</a>(host, port); }</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160;</div><div class="line"><a name="l00165"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a6b8ff53c10fe34aab1dc2561410f70bb"> 165</a></span>&#160; <span class="keywordtype">size_t</span> <a class="code" href="class_s_s_l_client.html#a6b8ff53c10fe34aab1dc2561410f70bb">write</a>(uint8_t b)<span class="keyword"> override </span>{ <span class="keywordflow">return</span> <a class="code" href="class_s_s_l_client_impl.html#a807656f814f24cf6cd711e429b716c4d">write_impl</a>(&amp;b, 1); }</div><div class="line"><a name="l00189"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a6bcb7579ebc051c097acb794b95771a9"> 189</a></span>&#160; <span class="keywordtype">size_t</span> <a class="code" href="class_s_s_l_client.html#a6bcb7579ebc051c097acb794b95771a9">write</a>(<span class="keyword">const</span> uint8_t *buf, <span class="keywordtype">size_t</span> size)<span class="keyword"> override </span>{ <span class="keywordflow">return</span> <a class="code" href="class_s_s_l_client_impl.html#a807656f814f24cf6cd711e429b716c4d">write_impl</a>(buf, size); }</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160;</div><div class="line"><a name="l00209"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a5d13fd2f32ee2ea65a1f3820f758e77e"> 209</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="class_s_s_l_client.html#a5d13fd2f32ee2ea65a1f3820f758e77e">available</a>()<span class="keyword"> override </span>{ <span class="keywordflow">return</span> <a class="code" href="class_s_s_l_client_impl.html#abe33c793ec37f11087651cf4e586569b">available_impl</a>(); }</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160;</div><div class="line"><a name="l00215"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#aedf2746cc35da596faf8322776c2118e"> 215</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="class_s_s_l_client.html#aedf2746cc35da596faf8322776c2118e">read</a>()<span class="keyword"> override </span>{ uint8_t read_val; <span class="keywordflow">return</span> <a class="code" href="class_s_s_l_client.html#aedf2746cc35da596faf8322776c2118e">read</a>(&amp;read_val, 1) &gt; 0 ? read_val : -1; };</div><div class="line"><a name="l00237"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#afd6d7ae798c05cf566b2eb5651dba795"> 237</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="class_s_s_l_client.html#afd6d7ae798c05cf566b2eb5651dba795">read</a>(uint8_t *buf, <span class="keywordtype">size_t</span> size)<span class="keyword"> override </span>{ <span class="keywordflow">return</span> <a class="code" href="class_s_s_l_client_impl.html#a231b7b1bb2182cda1ed6e9d5ebf66afe">read_impl</a>(buf, size); }</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160;</div><div class="line"><a name="l00247"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a31742867b00bd8d130637af0935bacbd"> 247</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="class_s_s_l_client.html#a31742867b00bd8d130637af0935bacbd">peek</a>()<span class="keyword"> override </span>{ <span class="keywordflow">return</span> <a class="code" href="class_s_s_l_client_impl.html#a1b90e7df3a77eea5efb955cc15a17f7d">peek_impl</a>(); }</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160;</div><div class="line"><a name="l00256"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a2ee6a3134d07ca09cf61ee04d32c3d44"> 256</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="class_s_s_l_client.html#a2ee6a3134d07ca09cf61ee04d32c3d44">flush</a>()<span class="keyword"> override </span>{ <span class="keywordflow">return</span> <a class="code" href="class_s_s_l_client_impl.html#a21ab78a0917f74ae5383d688e1548788">flush_impl</a>(); }</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160;</div><div class="line"><a name="l00266"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#ad30db47248d78df7c12dedfb27f06529"> 266</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="class_s_s_l_client.html#ad30db47248d78df7c12dedfb27f06529">stop</a>()<span class="keyword"> override </span>{ <span class="keywordflow">return</span> <a class="code" href="class_s_s_l_client_impl.html#a81eb5ede3a894f281ae586d463b624e6">stop_impl</a>(); }</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160;</div><div class="line"><a name="l00281"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a25e4414ab0c9424d09592f9567a678dc"> 281</a></span>&#160; uint8_t <a class="code" href="class_s_s_l_client.html#a25e4414ab0c9424d09592f9567a678dc">connected</a>()<span class="keyword"> override </span>{ <span class="keywordflow">return</span> <a class="code" href="class_s_s_l_client_impl.html#a957984fa392550a7df86f758e9b14bfb">connected_impl</a>(); }</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160;</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; <span class="comment">//========================================</span></div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; <span class="comment">//= Functions Not in the Client Interface</span></div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; <span class="comment">//========================================</span></div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160;</div><div class="line"><a name="l00301"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a2d8bf9b891151bc5b0b865d70cf9c086"> 301</a></span>&#160; <a class="code" href="class_s_s_l_session.html">SSLSession</a>&amp; <a class="code" href="class_s_s_l_client.html#a2d8bf9b891151bc5b0b865d70cf9c086">getSession</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* host, <span class="keyword">const</span> IPAddress&amp; addr) { <span class="keywordflow">return</span> <a class="code" href="class_s_s_l_client_impl.html#ab4e38d4319ec504395d67d2ab21a639e">get_session_impl</a>(host, addr); }</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160;</div><div class="line"><a name="l00311"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a5b626703a24089dbb0480a9b6ddf348c"> 311</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="class_s_s_l_client.html#a5b626703a24089dbb0480a9b6ddf348c">removeSession</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* host, <span class="keyword">const</span> IPAddress&amp; addr) { <span class="keywordflow">return</span> <a class="code" href="class_s_s_l_client_impl.html#a6baed094969874fb9d2bea3a00ecbee1">remove_session_impl</a>(host, addr); }</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160;</div><div class="line"><a name="l00318"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a2d71f00d6634092f50c5262ad25cdacd"> 318</a></span>&#160; <span class="keywordtype">size_t</span> <a class="code" href="class_s_s_l_client.html#a2d71f00d6634092f50c5262ad25cdacd">getSessionCount</a>()<span class="keyword"> const override </span>{ <span class="keywordflow">return</span> SessionCache; }</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160;</div><div class="line"><a name="l00325"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a2d378fbb7b8f15a1691746572f9d95b1"> 325</a></span>&#160; <span class="keyword">operator</span> bool() { <span class="keywordflow">return</span> <a class="code" href="class_s_s_l_client.html#a25e4414ab0c9424d09592f9567a678dc">connected</a>() &gt; 0; }</div><div class="line"><a name="l00327"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a505bfb6831a45aebf58d84e3b89d4cfc"> 327</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="class_s_s_l_client.html#a505bfb6831a45aebf58d84e3b89d4cfc">operator==</a>(<span class="keyword">const</span> <span class="keywordtype">bool</span> value) { <span class="keywordflow">return</span> bool() == value; }</div><div class="line"><a name="l00329"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a824b599264f893e1b206a9100bc52ee1"> 329</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="class_s_s_l_client.html#a824b599264f893e1b206a9100bc52ee1">operator!=</a>(<span class="keyword">const</span> <span class="keywordtype">bool</span> value) { <span class="keywordflow">return</span> bool() != value; }</div><div class="line"><a name="l00331"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a5f40f8f4d26d21e14276c3e8162b62b9"> 331</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="class_s_s_l_client.html#a5f40f8f4d26d21e14276c3e8162b62b9">operator==</a>(<span class="keyword">const</span> C&amp; rhs) { <span class="keywordflow">return</span> m_client == rhs; }</div><div class="line"><a name="l00333"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#adab82ba09345fa070712d3124af30e1b"> 333</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="class_s_s_l_client.html#adab82ba09345fa070712d3124af30e1b">operator!=</a>(<span class="keyword">const</span> C&amp; rhs) { <span class="keywordflow">return</span> m_client != rhs; }</div><div class="line"><a name="l00335"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a563c5f9829757075bf16742cffa4cf73"> 335</a></span>&#160; uint16_t <a class="code" href="class_s_s_l_client.html#a563c5f9829757075bf16742cffa4cf73">localPort</a>()<span class="keyword"> override </span>{</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; <span class="keywordflow">if</span> (std::is_member_function_pointer&lt;decltype(&amp;C::localPort)&gt;::value) <span class="keywordflow">return</span> m_client.localPort();</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; <a class="code" href="class_s_s_l_client_impl.html#a2bfb55bcde46d8d77a46bfe0f577bf3f">m_warn</a>(<span class="stringliteral">&quot;Client class has no localPort function, so localPort() will always return 0&quot;</span>, __func__);</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; } </div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160; }</div><div class="line"><a name="l00343"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#af76a0df76834e0d0999dbf44c7c0a174"> 343</a></span>&#160; IPAddress <a class="code" href="class_s_s_l_client.html#af76a0df76834e0d0999dbf44c7c0a174">remoteIP</a>()<span class="keyword"> override </span>{ </div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; <span class="keywordflow">if</span> (std::is_member_function_pointer&lt;decltype(&amp;C::remoteIP)&gt;::value) <span class="keywordflow">return</span> m_client.remoteIP();</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; <a class="code" href="class_s_s_l_client_impl.html#a2bfb55bcde46d8d77a46bfe0f577bf3f">m_warn</a>(<span class="stringliteral">&quot;Client class has no remoteIP function, so remoteIP() will always return INADDR_NONE. This means that sessions caching will always be disabled.&quot;</span>, __func__);</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; <span class="keywordflow">return</span> INADDR_NONE;</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; } </div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; }</div><div class="line"><a name="l00351"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a5974a5f8722a752f121af4fac498bb22"> 351</a></span>&#160; uint16_t <a class="code" href="class_s_s_l_client.html#a5974a5f8722a752f121af4fac498bb22">remotePort</a>()<span class="keyword"> override </span>{</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; <span class="keywordflow">if</span> (std::is_member_function_pointer&lt;decltype(&amp;C::remotePort)&gt;::value) <span class="keywordflow">return</span> m_client.remotePort();</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; <a class="code" href="class_s_s_l_client_impl.html#a2bfb55bcde46d8d77a46bfe0f577bf3f">m_warn</a>(<span class="stringliteral">&quot;Client class has no remotePort function, so remotePort() will always return 0&quot;</span>, __func__);</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; } </div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; }</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160;</div><div class="line"><a name="l00360"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#afd0d4d2c98433d60897d8828d8047d41"> 360</a></span>&#160; C&amp; <a class="code" href="class_s_s_l_client.html#afd0d4d2c98433d60897d8828d8047d41">getClient</a>() { <span class="keywordflow">return</span> m_client; }</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160;</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160;<span class="keyword">protected</span>:</div><div class="line"><a name="l00364"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a9c5001bdfa75ccc0d93cc60dd872b38a"> 364</a></span>&#160; Client&amp; <a class="code" href="class_s_s_l_client.html#a9c5001bdfa75ccc0d93cc60dd872b38a">get_arduino_client</a>()<span class="keyword"> override </span>{ <span class="keywordflow">return</span> m_client; }</div><div class="line"><a name="l00365"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a353c875d17a85dbb7bfe10de155f3b52"> 365</a></span>&#160; <span class="keyword">const</span> Client&amp; <a class="code" href="class_s_s_l_client.html#a353c875d17a85dbb7bfe10de155f3b52">get_arduino_client</a>()<span class="keyword"> const override </span>{ <span class="keywordflow">return</span> m_client; }</div><div class="line"><a name="l00367"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a9e7769fed78825cf4723778f4b5aa3e9"> 367</a></span>&#160; <a class="code" href="class_s_s_l_session.html">SSLSession</a>* <a class="code" href="class_s_s_l_client.html#a9e7769fed78825cf4723778f4b5aa3e9">get_session_array</a>()<span class="keyword"> override </span>{ <span class="keywordflow">return</span> m_sessions; }</div><div class="line"><a name="l00368"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a18adfc074d6b8e996819d4beb4689cbd"> 368</a></span>&#160; <span class="keyword">const</span> <a class="code" href="class_s_s_l_session.html">SSLSession</a>* <a class="code" href="class_s_s_l_client.html#a18adfc074d6b8e996819d4beb4689cbd">get_session_array</a>()<span class="keyword"> const override </span>{ <span class="keywordflow">return</span> m_sessions; }</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160;</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; <span class="comment">// create a copy of the client</span></div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; C m_client;</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; <span class="comment">// also store an array of SSLSessions, so we can resume communication with multiple websites</span></div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; <a class="code" href="class_s_s_l_session.html">SSLSession</a> m_sessions[SessionCache];</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160;};</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160;</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160;<span class="preprocessor">#endif </span></div><div class="ttc" id="class_s_s_l_client_impl_html_a807656f814f24cf6cd711e429b716c4d"><div class="ttname"><a href="class_s_s_l_client_impl.html#a807656f814f24cf6cd711e429b716c4d">SSLClientImpl::write_impl</a></div><div class="ttdeci">size_t write_impl(const uint8_t *buf, size_t size)</div><div class="ttdef"><b>Definition:</b> SSLClientImpl.cpp:132</div></div>
<div class="ttc" id="class_s_s_l_client_html_a18adfc074d6b8e996819d4beb4689cbd"><div class="ttname"><a href="class_s_s_l_client.html#a18adfc074d6b8e996819d4beb4689cbd">SSLClient::get_session_array</a></div><div class="ttdeci">const SSLSession * get_session_array() const override</div><div class="ttdef"><b>Definition:</b> SSLClient.h:368</div></div>
<div class="ttc" id="class_s_s_l_client_html_af76a0df76834e0d0999dbf44c7c0a174"><div class="ttname"><a href="class_s_s_l_client.html#af76a0df76834e0d0999dbf44c7c0a174">SSLClient::remoteIP</a></div><div class="ttdeci">IPAddress remoteIP() override</div><div class="ttdoc">Returns the remote IP, if C::remoteIP exists. Else return INADDR_NONE.</div><div class="ttdef"><b>Definition:</b> SSLClient.h:343</div></div>
<div class="ttc" id="class_s_s_l_client_html_a6b8ff53c10fe34aab1dc2561410f70bb"><div class="ttname"><a href="class_s_s_l_client.html#a6b8ff53c10fe34aab1dc2561410f70bb">SSLClient::write</a></div><div class="ttdeci">size_t write(uint8_t b) override</div><div class="ttdef"><b>Definition:</b> SSLClient.h:165</div></div>
<div class="ttc" id="_s_s_l_client_impl_8h_html_ab658e6d84759440dbf3c890446075395a86c8fdfc38831619d5ed73dff5b0911d"><div class="ttname"><a href="_s_s_l_client_impl_8h.html#ab658e6d84759440dbf3c890446075395a86c8fdfc38831619d5ed73dff5b0911d">SSL_WARN</a></div><div class="ttdef"><b>Definition:</b> SSLClientImpl.h:65</div></div>
<div class="ttc" id="class_s_s_l_client_impl_html_ab4e38d4319ec504395d67d2ab21a639e"><div class="ttname"><a href="class_s_s_l_client_impl.html#ab4e38d4319ec504395d67d2ab21a639e">SSLClientImpl::get_session_impl</a></div><div class="ttdeci">SSLSession &amp; get_session_impl(const char *host, const IPAddress &amp;addr)</div><div class="ttdef"><b>Definition:</b> SSLClientImpl.cpp:294</div></div>
<div class="ttc" id="class_s_s_l_session_html"><div class="ttname"><a href="class_s_s_l_session.html">SSLSession</a></div><div class="ttdoc">This class stores values which allow SSLClient to save and resume SSL sessions.</div><div class="ttdef"><b>Definition:</b> SSLSession.h:52</div></div>
<div class="ttc" id="class_s_s_l_client_html_adab82ba09345fa070712d3124af30e1b"><div class="ttname"><a href="class_s_s_l_client.html#adab82ba09345fa070712d3124af30e1b">SSLClient::operator!=</a></div><div class="ttdeci">bool operator!=(const C &amp;rhs)</div><div class="ttdoc">Returns whether or not two SSLClient objects do not have the same underlying client object.</div><div class="ttdef"><b>Definition:</b> SSLClient.h:333</div></div>
<div class="ttc" id="class_s_s_l_client_html_a5d13fd2f32ee2ea65a1f3820f758e77e"><div class="ttname"><a href="class_s_s_l_client.html#a5d13fd2f32ee2ea65a1f3820f758e77e">SSLClient::available</a></div><div class="ttdeci">int available() override</div><div class="ttdoc">Returns the number of bytes available to read from the data that has been received and decrypted.</div><div class="ttdef"><b>Definition:</b> SSLClient.h:209</div></div>
<div class="ttc" id="class_s_s_l_client_html_afd0d4d2c98433d60897d8828d8047d41"><div class="ttname"><a href="class_s_s_l_client.html#afd0d4d2c98433d60897d8828d8047d41">SSLClient::getClient</a></div><div class="ttdeci">C &amp; getClient()</div><div class="ttdoc">Returns a reference to the client object stored in this class. Take care not to break it.</div><div class="ttdef"><b>Definition:</b> SSLClient.h:360</div></div>
<div class="ttc" id="class_s_s_l_client_impl_html_a1b90e7df3a77eea5efb955cc15a17f7d"><div class="ttname"><a href="class_s_s_l_client_impl.html#a1b90e7df3a77eea5efb955cc15a17f7d">SSLClientImpl::peek_impl</a></div><div class="ttdeci">int peek_impl()</div><div class="ttdef"><b>Definition:</b> SSLClientImpl.cpp:211</div></div>
<div class="ttc" id="class_s_s_l_client_html_a2ee6a3134d07ca09cf61ee04d32c3d44"><div class="ttname"><a href="class_s_s_l_client.html#a2ee6a3134d07ca09cf61ee04d32c3d44">SSLClient::flush</a></div><div class="ttdeci">void flush() override</div><div class="ttdoc">Force writing the buffered bytes from SSLClient::write to the network.</div><div class="ttdef"><b>Definition:</b> SSLClient.h:256</div></div>
<div class="ttc" id="class_s_s_l_client_html"><div class="ttname"><a href="class_s_s_l_client.html">SSLClient</a></div><div class="ttdoc">The main SSLClient class. Check out README.md for more info.</div><div class="ttdef"><b>Definition:</b> SSLClient.h:35</div></div>
<div class="ttc" id="class_s_s_l_client_html_a824b599264f893e1b206a9100bc52ee1"><div class="ttname"><a href="class_s_s_l_client.html#a824b599264f893e1b206a9100bc52ee1">SSLClient::operator!=</a></div><div class="ttdeci">bool operator!=(const bool value)</div><div class="ttdef"><b>Definition:</b> SSLClient.h:329</div></div>
<div class="ttc" id="class_s_s_l_client_html_ad30db47248d78df7c12dedfb27f06529"><div class="ttname"><a href="class_s_s_l_client.html#ad30db47248d78df7c12dedfb27f06529">SSLClient::stop</a></div><div class="ttdeci">void stop() override</div><div class="ttdoc">Close the connection.</div><div class="ttdef"><b>Definition:</b> SSLClient.h:266</div></div>
<div class="ttc" id="class_s_s_l_client_html_a6bcb7579ebc051c097acb794b95771a9"><div class="ttname"><a href="class_s_s_l_client.html#a6bcb7579ebc051c097acb794b95771a9">SSLClient::write</a></div><div class="ttdeci">size_t write(const uint8_t *buf, size_t size) override</div><div class="ttdoc">Write some bytes to the SSL connection.</div><div class="ttdef"><b>Definition:</b> SSLClient.h:189</div></div>
<div class="ttc" id="class_s_s_l_client_html_ae9a7509bc8a18f67e286547c19deb3c0"><div class="ttname"><a href="class_s_s_l_client.html#ae9a7509bc8a18f67e286547c19deb3c0">SSLClient::SSLClient</a></div><div class="ttdeci">SSLClient(const C &amp;client, const br_x509_trust_anchor *trust_anchors, const size_t trust_anchors_num, const int analog_pin, const DebugLevel debug=SSL_WARN)</div><div class="ttdoc">Initialize SSLClient with all of the prerequisites needed.</div><div class="ttdef"><b>Definition:</b> SSLClient.h:71</div></div>
<div class="ttc" id="class_s_s_l_client_html_a31742867b00bd8d130637af0935bacbd"><div class="ttname"><a href="class_s_s_l_client.html#a31742867b00bd8d130637af0935bacbd">SSLClient::peek</a></div><div class="ttdeci">int peek() override</div><div class="ttdoc">View the first byte of the buffer, without removing it from the SSLClient Buffer.</div><div class="ttdef"><b>Definition:</b> SSLClient.h:247</div></div>
<div class="ttc" id="class_s_s_l_client_impl_html_abe33c793ec37f11087651cf4e586569b"><div class="ttname"><a href="class_s_s_l_client_impl.html#abe33c793ec37f11087651cf4e586569b">SSLClientImpl::available_impl</a></div><div class="ttdeci">int available_impl()</div><div class="ttdef"><b>Definition:</b> SSLClientImpl.cpp:175</div></div>
<div class="ttc" id="class_s_s_l_client_html_a5f40f8f4d26d21e14276c3e8162b62b9"><div class="ttname"><a href="class_s_s_l_client.html#a5f40f8f4d26d21e14276c3e8162b62b9">SSLClient::operator==</a></div><div class="ttdeci">bool operator==(const C &amp;rhs)</div><div class="ttdoc">Returns whether or not two SSLClient objects have the same underlying client object.</div><div class="ttdef"><b>Definition:</b> SSLClient.h:331</div></div>
<div class="ttc" id="class_s_s_l_client_impl_html_a231b7b1bb2182cda1ed6e9d5ebf66afe"><div class="ttname"><a href="class_s_s_l_client_impl.html#a231b7b1bb2182cda1ed6e9d5ebf66afe">SSLClientImpl::read_impl</a></div><div class="ttdeci">int read_impl(uint8_t *buf, size_t size)</div><div class="ttdef"><b>Definition:</b> SSLClientImpl.cpp:196</div></div>
<div class="ttc" id="class_s_s_l_client_html_a9e7769fed78825cf4723778f4b5aa3e9"><div class="ttname"><a href="class_s_s_l_client.html#a9e7769fed78825cf4723778f4b5aa3e9">SSLClient::get_session_array</a></div><div class="ttdeci">SSLSession * get_session_array() override</div><div class="ttdoc">Returns an instance of the session array that is on the stack.</div><div class="ttdef"><b>Definition:</b> SSLClient.h:367</div></div>
<div class="ttc" id="class_s_s_l_client_impl_html_a6baed094969874fb9d2bea3a00ecbee1"><div class="ttname"><a href="class_s_s_l_client_impl.html#a6baed094969874fb9d2bea3a00ecbee1">SSLClientImpl::remove_session_impl</a></div><div class="ttdeci">void remove_session_impl(const char *host, const IPAddress &amp;addr)</div><div class="ttdef"><b>Definition:</b> SSLClientImpl.cpp:313</div></div>
<div class="ttc" id="class_s_s_l_client_html_a9c5001bdfa75ccc0d93cc60dd872b38a"><div class="ttname"><a href="class_s_s_l_client.html#a9c5001bdfa75ccc0d93cc60dd872b38a">SSLClient::get_arduino_client</a></div><div class="ttdeci">Client &amp; get_arduino_client() override</div><div class="ttdoc">Returns an instance of m_client that is polymorphic and can be used by SSLClientImpl.</div><div class="ttdef"><b>Definition:</b> SSLClient.h:364</div></div>
<div class="ttc" id="class_s_s_l_client_html_a563c5f9829757075bf16742cffa4cf73"><div class="ttname"><a href="class_s_s_l_client.html#a563c5f9829757075bf16742cffa4cf73">SSLClient::localPort</a></div><div class="ttdeci">uint16_t localPort() override</div><div class="ttdoc">Returns the local port, C::localPort exists. Else return 0.</div><div class="ttdef"><b>Definition:</b> SSLClient.h:335</div></div>
<div class="ttc" id="_s_s_l_client_impl_8h_html"><div class="ttname"><a href="_s_s_l_client_impl_8h.html">SSLClientImpl.h</a></div></div>
<div class="ttc" id="class_s_s_l_client_impl_html_a2bfb55bcde46d8d77a46bfe0f577bf3f"><div class="ttname"><a href="class_s_s_l_client_impl.html#a2bfb55bcde46d8d77a46bfe0f577bf3f">SSLClientImpl::m_warn</a></div><div class="ttdeci">void m_warn(const T str, const char *func_name) const</div><div class="ttdef"><b>Definition:</b> SSLClientImpl.h:153</div></div>
<div class="ttc" id="class_s_s_l_client_html_aedf2746cc35da596faf8322776c2118e"><div class="ttname"><a href="class_s_s_l_client.html#aedf2746cc35da596faf8322776c2118e">SSLClient::read</a></div><div class="ttdeci">int read() override</div><div class="ttdoc">Read a single byte, or -1 if none is available.</div><div class="ttdef"><b>Definition:</b> SSLClient.h:215</div></div>
<div class="ttc" id="class_s_s_l_client_html_a25e4414ab0c9424d09592f9567a678dc"><div class="ttname"><a href="class_s_s_l_client.html#a25e4414ab0c9424d09592f9567a678dc">SSLClient::connected</a></div><div class="ttdeci">uint8_t connected() override</div><div class="ttdoc">Check if the device is connected.</div><div class="ttdef"><b>Definition:</b> SSLClient.h:281</div></div>
<div class="ttc" id="_s_s_l_session_8h_html"><div class="ttname"><a href="_s_s_l_session_8h.html">SSLSession.h</a></div></div>
<div class="ttc" id="class_s_s_l_client_html_a353c875d17a85dbb7bfe10de155f3b52"><div class="ttname"><a href="class_s_s_l_client.html#a353c875d17a85dbb7bfe10de155f3b52">SSLClient::get_arduino_client</a></div><div class="ttdeci">const Client &amp; get_arduino_client() const override</div><div class="ttdef"><b>Definition:</b> SSLClient.h:365</div></div>
<div class="ttc" id="class_s_s_l_client_html_a91c63e35f31652c20faa5b9be95984bf"><div class="ttname"><a href="class_s_s_l_client.html#a91c63e35f31652c20faa5b9be95984bf">SSLClient::connect</a></div><div class="ttdeci">int connect(const char *host, uint16_t port) override</div><div class="ttdoc">Connect over SSL to a host specified by a hostname.</div><div class="ttdef"><b>Definition:</b> SSLClient.h:162</div></div>
<div class="ttc" id="class_s_s_l_client_html_a505bfb6831a45aebf58d84e3b89d4cfc"><div class="ttname"><a href="class_s_s_l_client.html#a505bfb6831a45aebf58d84e3b89d4cfc">SSLClient::operator==</a></div><div class="ttdeci">bool operator==(const bool value)</div><div class="ttdef"><b>Definition:</b> SSLClient.h:327</div></div>
<div class="ttc" id="class_s_s_l_client_html_a5974a5f8722a752f121af4fac498bb22"><div class="ttname"><a href="class_s_s_l_client.html#a5974a5f8722a752f121af4fac498bb22">SSLClient::remotePort</a></div><div class="ttdeci">uint16_t remotePort() override</div><div class="ttdoc">Returns the remote port, if C::remotePort exists. Else return 0.</div><div class="ttdef"><b>Definition:</b> SSLClient.h:351</div></div>
<div class="ttc" id="class_s_s_l_client_impl_html_aa5c14ecf301c268306946c85825e565b"><div class="ttname"><a href="class_s_s_l_client_impl.html#aa5c14ecf301c268306946c85825e565b">SSLClientImpl::connect_impl</a></div><div class="ttdeci">int connect_impl(IPAddress ip, uint16_t port)</div><div class="ttdef"><b>Definition:</b> SSLClientImpl.cpp:75</div></div>
<div class="ttc" id="class_s_s_l_client_html_a2d71f00d6634092f50c5262ad25cdacd"><div class="ttname"><a href="class_s_s_l_client.html#a2d71f00d6634092f50c5262ad25cdacd">SSLClient::getSessionCount</a></div><div class="ttdeci">size_t getSessionCount() const override</div><div class="ttdoc">Get the maximum number of SSL sessions that can be stored at once.</div><div class="ttdef"><b>Definition:</b> SSLClient.h:318</div></div>
<div class="ttc" id="class_s_s_l_client_impl_html_a81eb5ede3a894f281ae586d463b624e6"><div class="ttname"><a href="class_s_s_l_client_impl.html#a81eb5ede3a894f281ae586d463b624e6">SSLClientImpl::stop_impl</a></div><div class="ttdeci">void stop_impl()</div><div class="ttdef"><b>Definition:</b> SSLClientImpl.cpp:231</div></div>
<div class="ttc" id="class_s_s_l_client_impl_html_a21ab78a0917f74ae5383d688e1548788"><div class="ttname"><a href="class_s_s_l_client_impl.html#a21ab78a0917f74ae5383d688e1548788">SSLClientImpl::flush_impl</a></div><div class="ttdeci">void flush_impl()</div><div class="ttdef"><b>Definition:</b> SSLClientImpl.cpp:223</div></div>
<div class="ttc" id="class_s_s_l_client_impl_html"><div class="ttname"><a href="class_s_s_l_client_impl.html">SSLClientImpl</a></div><div class="ttdoc">Implementation code to be inherited by SSLClient.</div><div class="ttdef"><b>Definition:</b> SSLClientImpl.h:71</div></div>
<div class="ttc" id="class_s_s_l_client_html_a5b626703a24089dbb0480a9b6ddf348c"><div class="ttname"><a href="class_s_s_l_client.html#a5b626703a24089dbb0480a9b6ddf348c">SSLClient::removeSession</a></div><div class="ttdeci">void removeSession(const char *host, const IPAddress &amp;addr)</div><div class="ttdoc">Clear the session corresponding to a host and IP.</div><div class="ttdef"><b>Definition:</b> SSLClient.h:311</div></div>
<div class="ttc" id="class_s_s_l_client_impl_html_a957984fa392550a7df86f758e9b14bfb"><div class="ttname"><a href="class_s_s_l_client_impl.html#a957984fa392550a7df86f758e9b14bfb">SSLClientImpl::connected_impl</a></div><div class="ttdeci">uint8_t connected_impl()</div><div class="ttdef"><b>Definition:</b> SSLClientImpl.cpp:263</div></div>
<div class="ttc" id="class_s_s_l_client_html_a2d8bf9b891151bc5b0b865d70cf9c086"><div class="ttname"><a href="class_s_s_l_client.html#a2d8bf9b891151bc5b0b865d70cf9c086">SSLClient::getSession</a></div><div class="ttdeci">SSLSession &amp; getSession(const char *host, const IPAddress &amp;addr)</div><div class="ttdoc">Gets a session reference corresponding to a host and IP, or a reference to a empty session if none ex...</div><div class="ttdef"><b>Definition:</b> SSLClient.h:301</div></div>
<div class="ttc" id="_s_s_l_client_impl_8h_html_ab658e6d84759440dbf3c890446075395"><div class="ttname"><a href="_s_s_l_client_impl_8h.html#ab658e6d84759440dbf3c890446075395">DebugLevel</a></div><div class="ttdeci">DebugLevel</div><div class="ttdoc">Level of verbosity used in logging for SSLClient.</div><div class="ttdef"><b>Definition:</b> SSLClientImpl.h:59</div></div>
<div class="ttc" id="class_s_s_l_client_html_afd6d7ae798c05cf566b2eb5651dba795"><div class="ttname"><a href="class_s_s_l_client.html#afd6d7ae798c05cf566b2eb5651dba795">SSLClient::read</a></div><div class="ttdeci">int read(uint8_t *buf, size_t size) override</div><div class="ttdoc">Read size bytes from the SSL client buffer, copying them into *buf, and return the number of bytes re...</div><div class="ttdef"><b>Definition:</b> SSLClient.h:237</div></div>
<div class="ttc" id="class_s_s_l_client_html_a4a2172aedfcc483ba2a256ad12148630"><div class="ttname"><a href="class_s_s_l_client.html#a4a2172aedfcc483ba2a256ad12148630">SSLClient::connect</a></div><div class="ttdeci">int connect(IPAddress ip, uint16_t port) override</div><div class="ttdoc">Connect over SSL to a host specified by an IP address.</div><div class="ttdef"><b>Definition:</b> SSLClient.h:124</div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="_s_s_l_client_8h.html">SSLClient.h</a></li>
<li class="footer">Generated by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.15 </li>
</ul>
</div>
</body>
</html>