SSLClient/docs/html/_s_s_l_client_8h_source.html
2019-08-14 11:14:13 -07:00

155 lines
49 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.3.0</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 &quot;Client.h&quot;</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</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="l00023"></a><span class="lineno"> 23</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="l00024"></a><span class="lineno"> 24</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_s_s_l_client_parameters_8h.html">SSLClientParameters.h</a>&quot;</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_s_s_l_obj_8h.html">SSLObj.h</a>&quot;</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="preprocessor">#ifndef SSLClient_H_</span></div><div class="line"><a name="l00028"></a><span class="lineno"><a class="line" href="_s_s_l_client_8h.html#a0e14869de8f634ff2fb63826ae583569"> 28</a></span>&#160;<span class="preprocessor">#define SSLClient_H_</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;</div><div class="line"><a name="l00035"></a><span class="lineno"> 35</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="l00036"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html"> 36</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="l00037"></a><span class="lineno"> 37</span>&#160;<span class="comment">/* </span></div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<span class="comment"> * static checks</span></div><div class="line"><a name="l00039"></a><span class="lineno"> 39</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="l00040"></a><span class="lineno"> 40</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="l00041"></a><span class="lineno"> 41</span>&#160;<span class="comment"> * actually present on class C. It does this by checking that the</span></div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="comment"> * class inherits from Client.</span></div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<span class="comment"> * </span></div><div class="line"><a name="l00044"></a><span class="lineno"> 44</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="l00045"></a><span class="lineno"> 45</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="l00046"></a><span class="lineno"> 46</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="l00047"></a><span class="lineno"> 47</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="l00048"></a><span class="lineno"> 48</span>&#160;<span class="comment"> * amount past that will require special modification of this library, and </span></div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160;<span class="comment"> * assumes you know what you are doing.</span></div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;<span class="comment"> */</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="l00072"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#ae9a7509bc8a18f67e286547c19deb3c0"> 72</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, </div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; <span class="keyword">const</span> br_x509_trust_anchor *trust_anchors, </div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="keyword">const</span> <span class="keywordtype">size_t</span> trust_anchors_num, </div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> analog_pin, </div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; <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="l00077"></a><span class="lineno"> 77</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="l00078"></a><span class="lineno"> 78</span>&#160; , m_client(client)</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; , m_sessions{}</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">// set the timeout to a reasonable number (it can always be changes later)</span></div><div class="line"><a name="l00082"></a><span class="lineno"> 82</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="l00083"></a><span class="lineno"> 83</span>&#160; setTimeout(30 * 1000);</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; }</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160;</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; <span class="comment">//========================================</span></div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; <span class="comment">//= Functions implemented in SSLClientImpl</span></div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <span class="comment">//========================================</span></div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160;</div><div class="line"><a name="l00129"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a4a2172aedfcc483ba2a256ad12148630"> 129</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="l00130"></a><span class="lineno"> 130</span>&#160;</div><div class="line"><a name="l00167"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a91c63e35f31652c20faa5b9be95984bf"> 167</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="l00168"></a><span class="lineno"> 168</span>&#160;</div><div class="line"><a name="l00170"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a6b8ff53c10fe34aab1dc2561410f70bb"> 170</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="l00194"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a6bcb7579ebc051c097acb794b95771a9"> 194</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="l00195"></a><span class="lineno"> 195</span>&#160;</div><div class="line"><a name="l00214"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a5d13fd2f32ee2ea65a1f3820f758e77e"> 214</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="l00215"></a><span class="lineno"> 215</span>&#160;</div><div class="line"><a name="l00220"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#aedf2746cc35da596faf8322776c2118e"> 220</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="l00242"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#afd6d7ae798c05cf566b2eb5651dba795"> 242</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="l00243"></a><span class="lineno"> 243</span>&#160;</div><div class="line"><a name="l00252"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a31742867b00bd8d130637af0935bacbd"> 252</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="l00253"></a><span class="lineno"> 253</span>&#160;</div><div class="line"><a name="l00261"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a2ee6a3134d07ca09cf61ee04d32c3d44"> 261</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="l00262"></a><span class="lineno"> 262</span>&#160;</div><div class="line"><a name="l00271"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#ad30db47248d78df7c12dedfb27f06529"> 271</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="l00272"></a><span class="lineno"> 272</span>&#160;</div><div class="line"><a name="l00286"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a25e4414ab0c9424d09592f9567a678dc"> 286</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="l00287"></a><span class="lineno"> 287</span>&#160;</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; <span class="comment">//========================================</span></div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; <span class="comment">//= Functions Not in the Client Interface</span></div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; <span class="comment">//========================================</span></div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160;</div><div class="line"><a name="l00297"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a16aa9765bd450dcbba21c598456f464f"> 297</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="class_s_s_l_client.html#a16aa9765bd450dcbba21c598456f464f">setMutualAuthParams</a>(<span class="keyword">const</span> <a class="code" href="struct_s_s_l_client_parameters.html">SSLClientParameters</a>* params) { <span class="keywordflow">return</span> <a class="code" href="class_s_s_l_client_impl.html#a9dd694f8e0e65624b103dc781a7744af">set_mutual_impl</a>(params); }</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160;</div><div class="line"><a name="l00313"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a2d8bf9b891151bc5b0b865d70cf9c086"> 313</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="l00314"></a><span class="lineno"> 314</span>&#160;</div><div class="line"><a name="l00323"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a5b626703a24089dbb0480a9b6ddf348c"> 323</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="l00324"></a><span class="lineno"> 324</span>&#160;</div><div class="line"><a name="l00330"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a2d71f00d6634092f50c5262ad25cdacd"> 330</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="l00331"></a><span class="lineno"> 331</span>&#160;</div><div class="line"><a name="l00337"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a2d378fbb7b8f15a1691746572f9d95b1"> 337</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="l00339"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a505bfb6831a45aebf58d84e3b89d4cfc"> 339</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="l00341"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a824b599264f893e1b206a9100bc52ee1"> 341</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="l00343"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a5f40f8f4d26d21e14276c3e8162b62b9"> 343</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="l00345"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#adab82ba09345fa070712d3124af30e1b"> 345</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="l00347"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a563c5f9829757075bf16742cffa4cf73"> 347</a></span>&#160; uint16_t <a class="code" href="class_s_s_l_client.html#a563c5f9829757075bf16742cffa4cf73">localPort</a>()<span class="keyword"> override </span>{ <span class="keywordflow">return</span> m_client.localPort(); }</div><div class="line"><a name="l00349"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#af76a0df76834e0d0999dbf44c7c0a174"> 349</a></span>&#160; IPAddress <a class="code" href="class_s_s_l_client.html#af76a0df76834e0d0999dbf44c7c0a174">remoteIP</a>()<span class="keyword"> override </span>{ <span class="keywordflow">return</span> m_client.remoteIP(); }</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>{ <span class="keywordflow">return</span> m_client.remotePort(); }</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160;</div><div class="line"><a name="l00354"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#afd0d4d2c98433d60897d8828d8047d41"> 354</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="l00355"></a><span class="lineno"> 355</span>&#160;</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160;<span class="keyword">protected</span>:</div><div class="line"><a name="l00358"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a9c5001bdfa75ccc0d93cc60dd872b38a"> 358</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="l00359"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a353c875d17a85dbb7bfe10de155f3b52"> 359</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="l00361"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a9e7769fed78825cf4723778f4b5aa3e9"> 361</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="l00362"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a18adfc074d6b8e996819d4beb4689cbd"> 362</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="l00363"></a><span class="lineno"> 363</span>&#160;</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; <span class="comment">// create a copy of the client</span></div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; C m_client;</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</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="l00368"></a><span class="lineno"> 368</span>&#160; <a class="code" href="class_s_s_l_session.html">SSLSession</a> m_sessions[SessionCache];</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;</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160;<span class="preprocessor">#endif </span></div><div class="ttc" id="class_s_s_l_client_html_a16aa9765bd450dcbba21c598456f464f"><div class="ttname"><a href="class_s_s_l_client.html#a16aa9765bd450dcbba21c598456f464f">SSLClient::setMutualAuthParams</a></div><div class="ttdeci">void setMutualAuthParams(const SSLClientParameters *params)</div><div class="ttdoc">Add a client certificate and enable support for mutual auth.</div><div class="ttdef"><b>Definition:</b> SSLClient.h:297</div></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:130</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:362</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.</div><div class="ttdef"><b>Definition:</b> SSLClient.h:349</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:170</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:66</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:286</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:345</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:214</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:354</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:209</div></div>
<div class="ttc" id="struct_s_s_l_client_parameters_html"><div class="ttname"><a href="struct_s_s_l_client_parameters.html">SSLClientParameters</a></div><div class="ttdoc">This struct stores data required for SSLClient to use mutual authentication.</div><div class="ttdef"><b>Definition:</b> SSLClientParameters.h:52</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:261</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:36</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:341</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:271</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:194</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:72</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:252</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:173</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:343</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:194</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:361</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:305</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:358</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, if C::localPort exists.</div><div class="ttdef"><b>Definition:</b> SSLClient.h:347</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_a9dd694f8e0e65624b103dc781a7744af"><div class="ttname"><a href="class_s_s_l_client_impl.html#a9dd694f8e0e65624b103dc781a7744af">SSLClientImpl::set_mutual_impl</a></div><div class="ttdeci">void set_mutual_impl(const SSLClientParameters *params)</div><div class="ttdef"><b>Definition:</b> SSLClientImpl.cpp:316</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:220</div></div>
<div class="ttc" id="_s_s_l_client_parameters_8h_html"><div class="ttname"><a href="_s_s_l_client_parameters_8h.html">SSLClientParameters.h</a></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:286</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:359</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:167</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:339</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:73</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:330</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:227</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:221</div></div>
<div class="ttc" id="_s_s_l_obj_8h_html"><div class="ttname"><a href="_s_s_l_obj_8h.html">SSLObj.h</a></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:72</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:323</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:255</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:313</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:60</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:242</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:129</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>