SSLClient/docs/html/_s_s_l_client_8h_source.html
2019-03-31 15:52:50 -07:00

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">1.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 &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(10 * 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#ae6540b9a02f1392bf2ac48421189f70e"> 124</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">int</span> <a class="code" href="class_s_s_l_client.html#ae6540b9a02f1392bf2ac48421189f70e">connect</a>(IPAddress ip, uint16_t port) { <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#a5814c11e96848c2bcea78210f099aad5"> 162</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">int</span> <a class="code" href="class_s_s_l_client.html#a5814c11e96848c2bcea78210f099aad5">connect</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *host, uint16_t port) { <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#a0699ff4b966162cba2ef59ff4a287270"> 165</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> <a class="code" href="class_s_s_l_client.html#a0699ff4b966162cba2ef59ff4a287270">write</a>(uint8_t b) { <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#a3a48b190985cdea2eba79ef0bdc80461"> 189</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> <a class="code" href="class_s_s_l_client.html#a3a48b190985cdea2eba79ef0bdc80461">write</a>(<span class="keyword">const</span> uint8_t *buf, <span class="keywordtype">size_t</span> size) { <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#a40ec85568d0aec376219125b604dbc29"> 209</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">int</span> <a class="code" href="class_s_s_l_client.html#a40ec85568d0aec376219125b604dbc29">available</a>() { <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#ac70b900ff798f9fd33f6367fcc9fad77"> 215</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">int</span> <a class="code" href="class_s_s_l_client.html#ac70b900ff798f9fd33f6367fcc9fad77">read</a>() { uint8_t read_val; <span class="keywordflow">return</span> <a class="code" href="class_s_s_l_client.html#ac70b900ff798f9fd33f6367fcc9fad77">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#ae31dd88a1af8ec3794fb48f26a3dd4bf"> 237</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">int</span> <a class="code" href="class_s_s_l_client.html#ae31dd88a1af8ec3794fb48f26a3dd4bf">read</a>(uint8_t *buf, <span class="keywordtype">size_t</span> size) { <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="l00246"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a227b1cbbe91bcb21153c09f97d0dd484"> 246</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">int</span> <a class="code" href="class_s_s_l_client.html#a227b1cbbe91bcb21153c09f97d0dd484">peek</a>() { <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="l00247"></a><span class="lineno"> 247</span>&#160;</div><div class="line"><a name="l00254"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a51eb668f6a328a6a66298c6bc1361d41"> 254</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="class_s_s_l_client.html#a51eb668f6a328a6a66298c6bc1361d41">flush</a>() { <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="l00255"></a><span class="lineno"> 255</span>&#160;</div><div class="line"><a name="l00263"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a158d87df3fe118b7565a19b72f310322"> 263</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="class_s_s_l_client.html#a158d87df3fe118b7565a19b72f310322">stop</a>() { <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="l00264"></a><span class="lineno"> 264</span>&#160;</div><div class="line"><a name="l00276"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a7318aadc0ec9775bffaaac0b1f00aaf8"> 276</a></span>&#160; <span class="keyword">virtual</span> uint8_t <a class="code" href="class_s_s_l_client.html#a7318aadc0ec9775bffaaac0b1f00aaf8">connected</a>() { <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="l00277"></a><span class="lineno"> 277</span>&#160;</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; <span class="comment">//========================================</span></div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; <span class="comment">//= Functions Not in the Client Interface</span></div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; <span class="comment">//========================================</span></div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160;</div><div class="line"><a name="l00296"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#ae3f27a36ff9c0cd1e2bea5e1708b6e4f"> 296</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="class_s_s_l_session.html">SSLSession</a>&amp; <a class="code" href="class_s_s_l_client.html#ae3f27a36ff9c0cd1e2bea5e1708b6e4f">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="l00297"></a><span class="lineno"> 297</span>&#160;</div><div class="line"><a name="l00306"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a0000d7f1e8656cf4a506a98133391fe0"> 306</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="class_s_s_l_client.html#a0000d7f1e8656cf4a506a98133391fe0">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="l00307"></a><span class="lineno"> 307</span>&#160;</div><div class="line"><a name="l00312"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a36bb344866e4cbcba3bbfcf4d33e5187"> 312</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> <a class="code" href="class_s_s_l_client.html#a36bb344866e4cbcba3bbfcf4d33e5187">getSessionCount</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> SessionCache; }</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160;</div><div class="line"><a name="l00318"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a319a722dae252efdd85fdbaf5c7fbf17"> 318</a></span>&#160; <span class="keyword">virtual</span> <span class="keyword">operator</span> bool() { <span class="keywordflow">return</span> <a class="code" href="class_s_s_l_client.html#a7318aadc0ec9775bffaaac0b1f00aaf8">connected</a>() &gt; 0; }</div><div class="line"><a name="l00320"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a6fb2e8a1cc54dd82a72217e5c4533e02"> 320</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="class_s_s_l_client.html#a6fb2e8a1cc54dd82a72217e5c4533e02">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="l00322"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a9a060e49d0685c6c6795558e41cd3323"> 322</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="class_s_s_l_client.html#a9a060e49d0685c6c6795558e41cd3323">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="l00324"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a26f9418e33d4ca459f78de98d3af43bb"> 324</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="class_s_s_l_client.html#a26f9418e33d4ca459f78de98d3af43bb">operator==</a>(<span class="keyword">const</span> C&amp; rhs) { <span class="keywordflow">return</span> m_client == rhs; }</div><div class="line"><a name="l00326"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a518f4ed733814f2f4a8c7f838555eb35"> 326</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="class_s_s_l_client.html#a518f4ed733814f2f4a8c7f838555eb35">operator!=</a>(<span class="keyword">const</span> C&amp; rhs) { <span class="keywordflow">return</span> m_client != rhs; }</div><div class="line"><a name="l00328"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#ac725067566ee411680c88575c148300b"> 328</a></span>&#160; <span class="keyword">virtual</span> uint16_t <a class="code" href="class_s_s_l_client.html#ac725067566ee411680c88575c148300b">localPort</a>() {</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</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="l00330"></a><span class="lineno"> 330</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l00331"></a><span class="lineno"> 331</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="l00332"></a><span class="lineno"> 332</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; } </div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; }</div><div class="line"><a name="l00336"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#ae2d1d17ee568ec2a37756bf6894dcd05"> 336</a></span>&#160; <span class="keyword">virtual</span> IPAddress <a class="code" href="class_s_s_l_client.html#ae2d1d17ee568ec2a37756bf6894dcd05">remoteIP</a>() { </div><div class="line"><a name="l00337"></a><span class="lineno"> 337</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="l00338"></a><span class="lineno"> 338</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</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="l00340"></a><span class="lineno"> 340</span>&#160; <span class="keywordflow">return</span> INADDR_NONE;</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160; } </div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; }</div><div class="line"><a name="l00344"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#ae8bd9420fec3b11f855729c4ecfe1c2c"> 344</a></span>&#160; <span class="keyword">virtual</span> uint16_t <a class="code" href="class_s_s_l_client.html#ae8bd9420fec3b11f855729c4ecfe1c2c">remotePort</a>() {</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</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="l00346"></a><span class="lineno"> 346</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</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="l00348"></a><span class="lineno"> 348</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; } </div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; }</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160;</div><div class="line"><a name="l00353"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#afd0d4d2c98433d60897d8828d8047d41"> 353</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="l00354"></a><span class="lineno"> 354</span>&#160;</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160;<span class="keyword">protected</span>:</div><div class="line"><a name="l00357"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#ab3ebfbca41a56bfa11e34aac2c2e0106"> 357</a></span>&#160; <span class="keyword">virtual</span> Client&amp; <a class="code" href="class_s_s_l_client.html#ab3ebfbca41a56bfa11e34aac2c2e0106">get_arduino_client</a>() { <span class="keywordflow">return</span> m_client; }</div><div class="line"><a name="l00358"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#a20742b36588c45435139a4f47fe0f1f6"> 358</a></span>&#160; <span class="keyword">virtual</span> <span class="keyword">const</span> Client&amp; <a class="code" href="class_s_s_l_client.html#a20742b36588c45435139a4f47fe0f1f6">get_arduino_client</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_client; }</div><div class="line"><a name="l00360"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#aaa52b481eb1d36a0ae1d208daa2fec51"> 360</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="class_s_s_l_session.html">SSLSession</a>* <a class="code" href="class_s_s_l_client.html#aaa52b481eb1d36a0ae1d208daa2fec51">get_session_array</a>() { <span class="keywordflow">return</span> m_sessions; }</div><div class="line"><a name="l00361"></a><span class="lineno"><a class="line" href="class_s_s_l_client.html#ab076a76b142b553c0dfd29174d4e17e7"> 361</a></span>&#160; <span class="keyword">virtual</span> <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#ab076a76b142b553c0dfd29174d4e17e7">get_session_array</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_sessions; }</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160;</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; <span class="comment">// create a copy of the client</span></div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; C m_client;</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</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="l00367"></a><span class="lineno"> 367</span>&#160; <a class="code" href="class_s_s_l_session.html">SSLSession</a> m_sessions[SessionCache];</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160;};</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="preprocessor">#endif </span></div><div class="ttc" id="class_s_s_l_client_html_a7318aadc0ec9775bffaaac0b1f00aaf8"><div class="ttname"><a href="class_s_s_l_client.html#a7318aadc0ec9775bffaaac0b1f00aaf8">SSLClient::connected</a></div><div class="ttdeci">virtual uint8_t connected()</div><div class="ttdoc">Check if the device is connected. Use this function to determine if SSLClient is still connected and ...</div><div class="ttdef"><b>Definition:</b> SSLClient.h:276</div></div>
<div class="ttc" id="class_s_s_l_client_html_a9a060e49d0685c6c6795558e41cd3323"><div class="ttname"><a href="class_s_s_l_client.html#a9a060e49d0685c6c6795558e41cd3323">SSLClient::operator!=</a></div><div class="ttdeci">virtual bool operator!=(const bool value)</div><div class="ttdef"><b>Definition:</b> SSLClient.h:322</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_ab076a76b142b553c0dfd29174d4e17e7"><div class="ttname"><a href="class_s_s_l_client.html#ab076a76b142b553c0dfd29174d4e17e7">SSLClient::get_session_array</a></div><div class="ttdeci">virtual const SSLSession * get_session_array() const</div><div class="ttdef"><b>Definition:</b> SSLClient.h:361</div></div>
<div class="ttc" id="class_s_s_l_client_html_ae8bd9420fec3b11f855729c4ecfe1c2c"><div class="ttname"><a href="class_s_s_l_client.html#ae8bd9420fec3b11f855729c4ecfe1c2c">SSLClient::remotePort</a></div><div class="ttdeci">virtual uint16_t remotePort()</div><div class="ttdoc">Returns the remote port, if C::remotePort exists. Else return 0.</div><div class="ttdef"><b>Definition:</b> SSLClient.h:344</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:276</div></div>
<div class="ttc" id="class_s_s_l_client_html_a40ec85568d0aec376219125b604dbc29"><div class="ttname"><a href="class_s_s_l_client.html#a40ec85568d0aec376219125b604dbc29">SSLClient::available</a></div><div class="ttdeci">virtual int available()</div><div class="ttdoc">Returns the number of bytes availible to read from the SSL Socket.</div><div class="ttdef"><b>Definition:</b> SSLClient.h:209</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_ac725067566ee411680c88575c148300b"><div class="ttname"><a href="class_s_s_l_client.html#ac725067566ee411680c88575c148300b">SSLClient::localPort</a></div><div class="ttdeci">virtual uint16_t localPort()</div><div class="ttdoc">Returns the local port, C::localPort exists. Else return 0.</div><div class="ttdef"><b>Definition:</b> SSLClient.h:328</div></div>
<div class="ttc" id="class_s_s_l_client_html_ae2d1d17ee568ec2a37756bf6894dcd05"><div class="ttname"><a href="class_s_s_l_client.html#ae2d1d17ee568ec2a37756bf6894dcd05">SSLClient::remoteIP</a></div><div class="ttdeci">virtual IPAddress remoteIP()</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:336</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:353</div></div>
<div class="ttc" id="class_s_s_l_client_html_a227b1cbbe91bcb21153c09f97d0dd484"><div class="ttname"><a href="class_s_s_l_client.html#a227b1cbbe91bcb21153c09f97d0dd484">SSLClient::peek</a></div><div class="ttdeci">virtual int peek()</div><div class="ttdoc">view the first byte of the buffer, without removing it from the SSLClient Buffer The implementation f...</div><div class="ttdef"><b>Definition:</b> SSLClient.h:246</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="class_s_s_l_client_html_ae3f27a36ff9c0cd1e2bea5e1708b6e4f"><div class="ttname"><a href="class_s_s_l_client.html#ae3f27a36ff9c0cd1e2bea5e1708b6e4f">SSLClient::getSession</a></div><div class="ttdeci">virtual SSLSession &amp; getSession(const char *host, const IPAddress &amp;addr)</div><div class="ttdoc">Get a session reference corresponding to a host and IP, or a reference to a empty session if none exi...</div><div class="ttdef"><b>Definition:</b> SSLClient.h:296</div></div>
<div class="ttc" id="class_s_s_l_client_html_a3a48b190985cdea2eba79ef0bdc80461"><div class="ttname"><a href="class_s_s_l_client.html#a3a48b190985cdea2eba79ef0bdc80461">SSLClient::write</a></div><div class="ttdeci">virtual size_t write(const uint8_t *buf, size_t size)</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"><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_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_a158d87df3fe118b7565a19b72f310322"><div class="ttname"><a href="class_s_s_l_client.html#a158d87df3fe118b7565a19b72f310322">SSLClient::stop</a></div><div class="ttdeci">virtual void stop()</div><div class="ttdoc">Close the connection If the SSL session is still active, all incoming data is discarded and BearSSL w...</div><div class="ttdef"><b>Definition:</b> SSLClient.h:263</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_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_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:295</div></div>
<div class="ttc" id="class_s_s_l_client_html_a36bb344866e4cbcba3bbfcf4d33e5187"><div class="ttname"><a href="class_s_s_l_client.html#a36bb344866e4cbcba3bbfcf4d33e5187">SSLClient::getSessionCount</a></div><div class="ttdeci">virtual size_t getSessionCount() const</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:312</div></div>
<div class="ttc" id="class_s_s_l_client_html_ac70b900ff798f9fd33f6367fcc9fad77"><div class="ttname"><a href="class_s_s_l_client.html#ac70b900ff798f9fd33f6367fcc9fad77">SSLClient::read</a></div><div class="ttdeci">virtual int read()</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_a0699ff4b966162cba2ef59ff4a287270"><div class="ttname"><a href="class_s_s_l_client.html#a0699ff4b966162cba2ef59ff4a287270">SSLClient::write</a></div><div class="ttdeci">virtual size_t write(uint8_t b)</div><div class="ttdef"><b>Definition:</b> SSLClient.h:165</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_a6fb2e8a1cc54dd82a72217e5c4533e02"><div class="ttname"><a href="class_s_s_l_client.html#a6fb2e8a1cc54dd82a72217e5c4533e02">SSLClient::operator==</a></div><div class="ttdeci">virtual bool operator==(const bool value)</div><div class="ttdef"><b>Definition:</b> SSLClient.h:320</div></div>
<div class="ttc" id="class_s_s_l_client_html_a51eb668f6a328a6a66298c6bc1361d41"><div class="ttname"><a href="class_s_s_l_client.html#a51eb668f6a328a6a66298c6bc1361d41">SSLClient::flush</a></div><div class="ttdeci">virtual void flush()</div><div class="ttdoc">Force writing the buffered bytes from SSLClient::write to the network. This function is blocking unti...</div><div class="ttdef"><b>Definition:</b> SSLClient.h:254</div></div>
<div class="ttc" id="class_s_s_l_client_html_a20742b36588c45435139a4f47fe0f1f6"><div class="ttname"><a href="class_s_s_l_client.html#a20742b36588c45435139a4f47fe0f1f6">SSLClient::get_arduino_client</a></div><div class="ttdeci">virtual const Client &amp; get_arduino_client() const</div><div class="ttdef"><b>Definition:</b> SSLClient.h:358</div></div>
<div class="ttc" id="class_s_s_l_client_html_a5814c11e96848c2bcea78210f099aad5"><div class="ttname"><a href="class_s_s_l_client.html#a5814c11e96848c2bcea78210f099aad5">SSLClient::connect</a></div><div class="ttdeci">virtual int connect(const char *host, uint16_t port)</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_aaa52b481eb1d36a0ae1d208daa2fec51"><div class="ttname"><a href="class_s_s_l_client.html#aaa52b481eb1d36a0ae1d208daa2fec51">SSLClient::get_session_array</a></div><div class="ttdeci">virtual SSLSession * get_session_array()</div><div class="ttdoc">return an instance of the session array that is on the stack</div><div class="ttdef"><b>Definition:</b> SSLClient.h:360</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_a518f4ed733814f2f4a8c7f838555eb35"><div class="ttname"><a href="class_s_s_l_client.html#a518f4ed733814f2f4a8c7f838555eb35">SSLClient::operator!=</a></div><div class="ttdeci">virtual 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:326</div></div>
<div class="ttc" id="class_s_s_l_client_html_a0000d7f1e8656cf4a506a98133391fe0"><div class="ttname"><a href="class_s_s_l_client.html#a0000d7f1e8656cf4a506a98133391fe0">SSLClient::removeSession</a></div><div class="ttdeci">virtual 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:306</div></div>
<div class="ttc" id="class_s_s_l_client_html_ae6540b9a02f1392bf2ac48421189f70e"><div class="ttname"><a href="class_s_s_l_client.html#ae6540b9a02f1392bf2ac48421189f70e">SSLClient::connect</a></div><div class="ttdeci">virtual int connect(IPAddress ip, uint16_t port)</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 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:74</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:229</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="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_ae31dd88a1af8ec3794fb48f26a3dd4bf"><div class="ttname"><a href="class_s_s_l_client.html#ae31dd88a1af8ec3794fb48f26a3dd4bf">SSLClient::read</a></div><div class="ttdeci">virtual int read(uint8_t *buf, size_t size)</div><div class="ttdoc">Read size bytes from the SSL socket 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_a26f9418e33d4ca459f78de98d3af43bb"><div class="ttname"><a href="class_s_s_l_client.html#a26f9418e33d4ca459f78de98d3af43bb">SSLClient::operator==</a></div><div class="ttdeci">virtual 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:324</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:250</div></div>
<div class="ttc" id="class_s_s_l_client_html_ab3ebfbca41a56bfa11e34aac2c2e0106"><div class="ttname"><a href="class_s_s_l_client.html#ab3ebfbca41a56bfa11e34aac2c2e0106">SSLClient::get_arduino_client</a></div><div class="ttdeci">virtual Client &amp; get_arduino_client()</div><div class="ttdoc">return an instance of m_client that is polymorphic and can be used by SSLClientImpl</div><div class="ttdef"><b>Definition:</b> SSLClient.h:357</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><!-- 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>