~ubuntu-branches/ubuntu/wily/qca2/wily-proposed

« back to all changes in this revision

Viewing changes to qca/apidocs/html/sslservtest_8cpp-example.html

  • Committer: Bazaar Package Importer
  • Author(s): Jan Niehusmann
  • Date: 2007-10-27 18:51:54 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20071027185154-4ir9ys3h2q9fofrw
Tags: 2.0.0-2
Upload to unstable

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2
 
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
3
 
<title>Qt Cryptographic Architecture: sslservtest.cpp</title>
4
 
<link href="doxygen.css" rel="stylesheet" type="text/css">
5
 
<link href="tabs.css" rel="stylesheet" type="text/css">
6
 
</head><body>
7
 
<!-- Generated by Doxygen 1.4.6 -->
8
 
<div class="tabs">
9
 
  <ul>
10
 
    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
11
 
    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
12
 
    <li><a href="annotated.html"><span>Classes</span></a></li>
13
 
    <li><a href="files.html"><span>Files</span></a></li>
14
 
    <li><a href="dirs.html"><span>Directories</span></a></li>
15
 
    <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
16
 
    <li><a href="examples.html"><span>Examples</span></a></li>
17
 
  </ul></div>
18
 
<h1>sslservtest.cpp</h1>The code below shows how to create an SSL server.<p>
19
 
Note that this server returns a self-signed certificate for "example.com", and that the certificate is expired.<p>
20
 
The design used here only allows for one connection at a time. If you want to allow for more, you should probably create a "TlsConnection" object that agregates a <a class="el" href="classQCA_1_1TLS.html">QCA::TLS</a> object and a <a class="elRef" doxygen="qt.tag:" href="qtcpsocket.html">QTcpSocket</a> (plus a little bit of state information) that handles a single connection. Then just create a TlsConnection for each server connection.<p>
21
 
<div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
22
 
<a name="l00002"></a>00002 <span class="comment"> Copyright (C) 2003 Justin Karneges &lt;justin@affinix.com&gt;</span>
23
 
<a name="l00003"></a>00003 <span class="comment"> Copyright (C) 2006 Brad Hards &lt;bradh@frogmouth.net&gt;</span>
24
 
<a name="l00004"></a>00004 <span class="comment"></span>
25
 
<a name="l00005"></a>00005 <span class="comment"> Permission is hereby granted, free of charge, to any person obtaining a copy</span>
26
 
<a name="l00006"></a>00006 <span class="comment"> of this software and associated documentation files (the "Software"), to deal</span>
27
 
<a name="l00007"></a>00007 <span class="comment"> in the Software without restriction, including without limitation the rights</span>
28
 
<a name="l00008"></a>00008 <span class="comment"> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span>
29
 
<a name="l00009"></a>00009 <span class="comment"> copies of the Software, and to permit persons to whom the Software is</span>
30
 
<a name="l00010"></a>00010 <span class="comment"> furnished to do so, subject to the following conditions:</span>
31
 
<a name="l00011"></a>00011 <span class="comment"></span>
32
 
<a name="l00012"></a>00012 <span class="comment"> The above copyright notice and this permission notice shall be included in</span>
33
 
<a name="l00013"></a>00013 <span class="comment"> all copies or substantial portions of the Software.</span>
34
 
<a name="l00014"></a>00014 <span class="comment"></span>
35
 
<a name="l00015"></a>00015 <span class="comment"> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span>
36
 
<a name="l00016"></a>00016 <span class="comment"> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span>
37
 
<a name="l00017"></a>00017 <span class="comment"> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE</span>
38
 
<a name="l00018"></a>00018 <span class="comment"> AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN</span>
39
 
<a name="l00019"></a>00019 <span class="comment"> AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN</span>
40
 
<a name="l00020"></a>00020 <span class="comment"> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</span>
41
 
<a name="l00021"></a>00021 <span class="comment">*/</span>
42
 
<a name="l00022"></a>00022 
43
 
<a name="l00023"></a>00023 <span class="preprocessor">#include &lt;QtCrypto&gt;</span>
44
 
<a name="l00024"></a>00024 
45
 
<a name="l00025"></a>00025 <span class="preprocessor">#include &lt;QCoreApplication&gt;</span>
46
 
<a name="l00026"></a>00026 <span class="preprocessor">#include &lt;QDebug&gt;</span>
47
 
<a name="l00027"></a>00027 <span class="preprocessor">#include &lt;QHostAddress&gt;</span>
48
 
<a name="l00028"></a>00028 <span class="preprocessor">#include &lt;QTcpServer&gt;</span>
49
 
<a name="l00029"></a>00029 <span class="preprocessor">#include &lt;QTcpSocket&gt;</span>
50
 
<a name="l00030"></a>00030 <span class="preprocessor">#include &lt;QTimer&gt;</span>
51
 
<a name="l00031"></a>00031 
52
 
<a name="l00032"></a>00032 <span class="keywordtype">char</span> pemdata_cert[] =
53
 
<a name="l00033"></a>00033         <span class="stringliteral">"-----BEGIN CERTIFICATE-----\n"</span>
54
 
<a name="l00034"></a>00034         <span class="stringliteral">"MIICeTCCAeKgAwIBAgIRAKKKnOj6Aarmwf0phApitVAwDQYJKoZIhvcNAQEFBQAw\n"</span>
55
 
<a name="l00035"></a>00035         <span class="stringliteral">"ODELMAkGA1UEBhMCVVMxFDASBgNVBAoTC0V4YW1wbGUgT3JnMRMwEQYDVQQDEwpF\n"</span>
56
 
<a name="l00036"></a>00036         <span class="stringliteral">"eGFtcGxlIENBMB4XDTA2MDMxNTA3MDU1MloXDTA3MDMxNTA3MDU1MlowOjEVMBMG\n"</span>
57
 
<a name="l00037"></a>00037         <span class="stringliteral">"A1UEAxMMRXhhbXBsZSBVc2VyMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRXhhbXBs\n"</span>
58
 
<a name="l00038"></a>00038         <span class="stringliteral">"ZSBPcmcwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAPkKn0FfHMvRZv+3uFcw\n"</span>
59
 
<a name="l00039"></a>00039         <span class="stringliteral">"VrOadJmANzLVeVW/DHZp4CXokXSksM66ZMqFuQRBk5rnIZZpZmVp1tTRDVt9sEAY\n"</span>
60
 
<a name="l00040"></a>00040         <span class="stringliteral">"YNa8CRM4HXkVlU0lCKdey18CSq2VuSvNtw8dDpoBmQt3nr9tePvKHnpS3nm6YjR2\n"</span>
61
 
<a name="l00041"></a>00041         <span class="stringliteral">"NEvIKt1P4mHzYXLmwoF24C1bAgMBAAGjgYAwfjAdBgNVHQ4EFgQUmQIdzyDaPYWF\n"</span>
62
 
<a name="l00042"></a>00042         <span class="stringliteral">"fPJ8PPOOm1eSsucwHwYDVR0jBBgwFoAUkCglAizTO7iqwLeaO6r/8kJuqhMwDAYD\n"</span>
63
 
<a name="l00043"></a>00043         <span class="stringliteral">"VR0TAQH/BAIwADAeBgNVHREEFzAVgRNleGFtcGxlQGV4YW1wbGUuY29tMA4GA1Ud\n"</span>
64
 
<a name="l00044"></a>00044         <span class="stringliteral">"DwEB/wQEAwIF4DANBgkqhkiG9w0BAQUFAAOBgQAuhbiUgy2a++EUccaonID7eTJZ\n"</span>
65
 
<a name="l00045"></a>00045         <span class="stringliteral">"F3D5qXMqUpQxlYxU8du+9AxDD7nFxTMkQC2pzfmEc1znRNmJ1ZeLRL72VYsVndcT\n"</span>
66
 
<a name="l00046"></a>00046         <span class="stringliteral">"psyM8ABkvPp1d2jWIyccVjGpt+/RN5IPKm/YIbtIZcywvWuXrOp1lanVmppLfPnO\n"</span>
67
 
<a name="l00047"></a>00047         <span class="stringliteral">"6yneBkC9iqjOv/+Q+A==\n"</span>
68
 
<a name="l00048"></a>00048         <span class="stringliteral">"-----END CERTIFICATE-----\n"</span>;
69
 
<a name="l00049"></a>00049 
70
 
<a name="l00050"></a>00050 <span class="keywordtype">char</span> pemdata_privkey[] =
71
 
<a name="l00051"></a>00051         <span class="stringliteral">"-----BEGIN PRIVATE KEY-----\n"</span>
72
 
<a name="l00052"></a>00052         <span class="stringliteral">"MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAPkKn0FfHMvRZv+3\n"</span>
73
 
<a name="l00053"></a>00053         <span class="stringliteral">"uFcwVrOadJmANzLVeVW/DHZp4CXokXSksM66ZMqFuQRBk5rnIZZpZmVp1tTRDVt9\n"</span>
74
 
<a name="l00054"></a>00054         <span class="stringliteral">"sEAYYNa8CRM4HXkVlU0lCKdey18CSq2VuSvNtw8dDpoBmQt3nr9tePvKHnpS3nm6\n"</span>
75
 
<a name="l00055"></a>00055         <span class="stringliteral">"YjR2NEvIKt1P4mHzYXLmwoF24C1bAgMBAAECgYEAyIjJHDaeVXDU42zovyxpZE4n\n"</span>
76
 
<a name="l00056"></a>00056         <span class="stringliteral">"PcOEryY+gdFJE8DFgUD4f1huFsj4iCuNg+PaG42p+hf9IARNvSho/RcEaVg4AJrV\n"</span>
77
 
<a name="l00057"></a>00057         <span class="stringliteral">"jRP8r7fSqcIGr6lGuvDFFv3SU5ddy84g5oqLYGKvuPSHMGfVsZSxAwOrzD4bH19L\n"</span>
78
 
<a name="l00058"></a>00058         <span class="stringliteral">"SNqtNcpdBsBd7ZiEE4ECQQD/oJGui9D5Dx3QVcS+QV4F8wuyN9jYIANmX/17o0fl\n"</span>
79
 
<a name="l00059"></a>00059         <span class="stringliteral">"BL0bwRU4RICwadrcybi5N0JQLIYSUm2HGqNvAJbtnuQxAkEA+WeYLLYPeawcy+WU\n"</span>
80
 
<a name="l00060"></a>00060         <span class="stringliteral">"kGcOR7BUjHiG71+6cvU4XIDW2bezA04fqWXkZRFAwHTMpQb785/XalFftgS21kql\n"</span>
81
 
<a name="l00061"></a>00061         <span class="stringliteral">"8yLDSwJAHkeT2hwftdDPlEUEmBDAJW5DvWmWGwu3u2G1cfbGZl9oUyhM7ixXHg57\n"</span>
82
 
<a name="l00062"></a>00062         <span class="stringliteral">"6VlPs0jTZxHPE86FwNIr99MXDbCbkQJBAMDFOJK+ecGirXNP1P+0GA6DFSap9inJ\n"</span>
83
 
<a name="l00063"></a>00063         <span class="stringliteral">"BRTbwx+EmgwX966DUOefEOSpbDIVVSPs/Qr2LgtIMEFA7Y0+j3wZD3cCQBsTwccd\n"</span>
84
 
<a name="l00064"></a>00064         <span class="stringliteral">"ASQx59xakpq11eOlTYz14rjwodr4QMyj26WxEPJtz7hKokx/+EH6fWuPIUSrROM5\n"</span>
85
 
<a name="l00065"></a>00065         <span class="stringliteral">"07y2gaVbYxtis0s=\n"</span>
86
 
<a name="l00066"></a>00066         <span class="stringliteral">"-----END PRIVATE KEY-----\n"</span>;
87
 
<a name="l00067"></a>00067 
88
 
<a name="l00068"></a>00068 <span class="keyword">class </span>SecureServer : <span class="keyword">public</span> <a class="codeRef" doxygen="qt.tag:" href="qobject.html">QObject</a>
89
 
<a name="l00069"></a>00069 {
90
 
<a name="l00070"></a>00070     Q_OBJECT
91
 
<a name="l00071"></a>00071 
92
 
<a name="l00072"></a>00072 <span class="keyword">public</span>:
93
 
<a name="l00073"></a>00073     <span class="keyword">enum</span> { Idle, Handshaking, Active, Closing };
94
 
<a name="l00074"></a>00074 
95
 
<a name="l00075"></a>00075     SecureServer(quint16 _port) : port(_port)
96
 
<a name="l00076"></a>00076     {
97
 
<a name="l00077"></a>00077         server = <span class="keyword">new</span> <a class="codeRef" doxygen="qt.tag:" href="qtcpserver.html">QTcpServer</a>;
98
 
<a name="l00078"></a>00078         <a name="a318"></a><a class="codeRef" doxygen="qt.tag:" href="qobject.html#4ae3328e7f237d1b61e6f4cd5914bcfb">connect</a>( server, SIGNAL(newConnection()), SLOT(server_handleConnection()) );
99
 
<a name="l00079"></a>00079 
100
 
<a name="l00080"></a>00080         ssl = <span class="keyword">new</span> <a name="_a319"></a><a class="code" href="classQCA_1_1TLS.html">QCA::TLS</a>;
101
 
<a name="l00081"></a>00081         <a class="codeRef" doxygen="qt.tag:" href="qobject.html#4ae3328e7f237d1b61e6f4cd5914bcfb">connect</a>(ssl, SIGNAL(handshaken()), SLOT(ssl_handshaken()));
102
 
<a name="l00082"></a>00082         <a class="codeRef" doxygen="qt.tag:" href="qobject.html#4ae3328e7f237d1b61e6f4cd5914bcfb">connect</a>(ssl, SIGNAL(readyRead()), SLOT(ssl_readyRead()));
103
 
<a name="l00083"></a>00083         <a class="codeRef" doxygen="qt.tag:" href="qobject.html#4ae3328e7f237d1b61e6f4cd5914bcfb">connect</a>(ssl, SIGNAL(readyReadOutgoing()), SLOT(ssl_readyReadOutgoing()));
104
 
<a name="l00084"></a>00084         <a class="codeRef" doxygen="qt.tag:" href="qobject.html#4ae3328e7f237d1b61e6f4cd5914bcfb">connect</a>(ssl, SIGNAL(closed()), SLOT(ssl_closed()));
105
 
<a name="l00085"></a>00085         <a class="codeRef" doxygen="qt.tag:" href="qobject.html#4ae3328e7f237d1b61e6f4cd5914bcfb">connect</a>(ssl, SIGNAL(error()), SLOT(ssl_error()));
106
 
<a name="l00086"></a>00086 
107
 
<a name="l00087"></a>00087         cert = <a name="a320"></a><a class="code" href="classQCA_1_1Certificate.html#6f93280fdf0410b6bbc5390775d53edc">QCA::Certificate::fromPEM</a>(pemdata_cert);
108
 
<a name="l00088"></a>00088         privkey = <a name="a321"></a><a class="code" href="classQCA_1_1PrivateKey.html#4e94ee4bc00b63b89dd06d5e8172d2bf">QCA::PrivateKey::fromPEM</a>(pemdata_privkey);
109
 
<a name="l00089"></a>00089 
110
 
<a name="l00090"></a>00090         mode = Idle;
111
 
<a name="l00091"></a>00091     }
112
 
<a name="l00092"></a>00092 
113
 
<a name="l00093"></a>00093     ~SecureServer()
114
 
<a name="l00094"></a>00094     {
115
 
<a name="l00095"></a>00095         <span class="keyword">delete</span> ssl;
116
 
<a name="l00096"></a>00096         <span class="keyword">delete</span> server;
117
 
<a name="l00097"></a>00097     }
118
 
<a name="l00098"></a>00098 
119
 
<a name="l00099"></a>00099     <span class="keywordtype">void</span> start()
120
 
<a name="l00100"></a>00100     {
121
 
<a name="l00101"></a>00101         <span class="keywordflow">if</span>(cert.<a name="a322"></a><a class="code" href="classQCA_1_1Certificate.html#23a2edd4593be7ede561d411fd0ae788">isNull</a>()) {
122
 
<a name="l00102"></a>00102             qDebug() &lt;&lt; <span class="stringliteral">"Error loading cert!"</span>;
123
 
<a name="l00103"></a>00103             <a name="a323"></a><a class="codeRef" doxygen="qt.tag:" href="qtimer.html#44c8f96240fa4a311a88e5049705af58">QTimer::singleShot</a>(0, <span class="keyword">this</span>, SIGNAL(quit()));
124
 
<a name="l00104"></a>00104             <span class="keywordflow">return</span>;
125
 
<a name="l00105"></a>00105         }
126
 
<a name="l00106"></a>00106         <span class="keywordflow">if</span>(privkey.isNull()) {
127
 
<a name="l00107"></a>00107             qDebug() &lt;&lt; <span class="stringliteral">"Error loading private key!"</span>;
128
 
<a name="l00108"></a>00108             <a class="codeRef" doxygen="qt.tag:" href="qtimer.html#44c8f96240fa4a311a88e5049705af58">QTimer::singleShot</a>(0, <span class="keyword">this</span>, SIGNAL(quit()));
129
 
<a name="l00109"></a>00109             <span class="keywordflow">return</span>;
130
 
<a name="l00110"></a>00110         }
131
 
<a name="l00111"></a>00111         <span class="keywordflow">if</span>(<span class="keyword">false</span> == server-&gt;listen(QHostAddress::Any, port)) {
132
 
<a name="l00112"></a>00112             qDebug() &lt;&lt; <span class="stringliteral">"Error binding to port "</span> &lt;&lt; port;
133
 
<a name="l00113"></a>00113             <a class="codeRef" doxygen="qt.tag:" href="qtimer.html#44c8f96240fa4a311a88e5049705af58">QTimer::singleShot</a>(0, <span class="keyword">this</span>, SIGNAL(quit()));
134
 
<a name="l00114"></a>00114             <span class="keywordflow">return</span>;
135
 
<a name="l00115"></a>00115         }
136
 
<a name="l00116"></a>00116         qDebug() &lt;&lt; <span class="stringliteral">"Listening on port"</span> &lt;&lt; port;
137
 
<a name="l00117"></a>00117     }
138
 
<a name="l00118"></a>00118 
139
 
<a name="l00119"></a>00119 signals:
140
 
<a name="l00120"></a>00120     <span class="keywordtype">void</span> quit();
141
 
<a name="l00121"></a>00121 
142
 
<a name="l00122"></a>00122 <span class="keyword">private</span> slots:
143
 
<a name="l00123"></a>00123     <span class="keywordtype">void</span> sock_readyRead()
144
 
<a name="l00124"></a>00124     {
145
 
<a name="l00125"></a>00125         <a class="codeRef" doxygen="qt.tag:" href="qbytearray.html">QByteArray</a> buf(sock-&gt;bytesAvailable(), 0x00);
146
 
<a name="l00126"></a>00126 
147
 
<a name="l00127"></a>00127         <span class="keywordtype">int</span> num = sock-&gt;read(buf.data(), buf.size());
148
 
<a name="l00128"></a>00128 
149
 
<a name="l00129"></a>00129         <span class="keywordflow">if</span> ( -1 == num )
150
 
<a name="l00130"></a>00130             qDebug() &lt;&lt; <span class="stringliteral">"Error reading data from socket"</span>;
151
 
<a name="l00131"></a>00131 
152
 
<a name="l00132"></a>00132         <span class="keywordflow">if</span> (num &lt; buf.size() )
153
 
<a name="l00133"></a>00133             buf.resize(num);
154
 
<a name="l00134"></a>00134 
155
 
<a name="l00135"></a>00135         ssl-&gt;writeIncoming(buf);
156
 
<a name="l00136"></a>00136     }
157
 
<a name="l00137"></a>00137 
158
 
<a name="l00138"></a>00138     <span class="keywordtype">void</span> server_handleConnection()
159
 
<a name="l00139"></a>00139     {
160
 
<a name="l00140"></a>00140         <span class="comment">// Note: only 1 connection supported at a time in this example!</span>
161
 
<a name="l00141"></a>00141         <span class="keywordflow">if</span>(mode != Idle) {
162
 
<a name="l00142"></a>00142             <a class="codeRef" doxygen="qt.tag:" href="qtcpsocket.html">QTcpSocket</a>* tmp = server-&gt;nextPendingConnection();
163
 
<a name="l00143"></a>00143             tmp-&gt;close();
164
 
<a name="l00144"></a>00144             connect(tmp, SIGNAL(disconnected()), tmp, SLOT(deleteLater()));
165
 
<a name="l00145"></a>00145             qDebug() &lt;&lt; <span class="stringliteral">"throwing away extra connection"</span>;
166
 
<a name="l00146"></a>00146             <span class="keywordflow">return</span>;
167
 
<a name="l00147"></a>00147         }
168
 
<a name="l00148"></a>00148         mode = Handshaking;
169
 
<a name="l00149"></a>00149         sock = server-&gt;nextPendingConnection();
170
 
<a name="l00150"></a>00150         connect(sock, SIGNAL(readyRead()), SLOT(sock_readyRead()));
171
 
<a name="l00151"></a>00151         connect(sock, SIGNAL(disconnected()), SLOT(sock_disconnected()));
172
 
<a name="l00152"></a>00152         connect(sock, SIGNAL(error(QAbstractSocket::SocketError)),
173
 
<a name="l00153"></a>00153                 SLOT(sock_error(QAbstractSocket::SocketError)));
174
 
<a name="l00154"></a>00154         connect(sock, SIGNAL(bytesWritten(qint64)), SLOT(sock_bytesWritten(qint64)));
175
 
<a name="l00155"></a>00155 
176
 
<a name="l00156"></a>00156         qDebug() &lt;&lt; <span class="stringliteral">"Connection received!  Starting TLS handshake."</span>;
177
 
<a name="l00157"></a>00157         ssl-&gt;setCertificate(cert, privkey);
178
 
<a name="l00158"></a>00158         ssl-&gt;startServer();
179
 
<a name="l00159"></a>00159     }
180
 
<a name="l00160"></a>00160 
181
 
<a name="l00161"></a>00161     <span class="keywordtype">void</span> sock_disconnected()
182
 
<a name="l00162"></a>00162     {
183
 
<a name="l00163"></a>00163         qDebug() &lt;&lt; <span class="stringliteral">"Connection closed."</span>;
184
 
<a name="l00164"></a>00164     }
185
 
<a name="l00165"></a>00165 
186
 
<a name="l00166"></a>00166     <span class="keywordtype">void</span> sock_bytesWritten(qint64 x)
187
 
<a name="l00167"></a>00167     {
188
 
<a name="l00168"></a>00168         <span class="keywordflow">if</span>(mode == Active &amp;&amp; sent) {
189
 
<a name="l00169"></a>00169             qint64 bytes = ssl-&gt;convertBytesWritten(x);
190
 
<a name="l00170"></a>00170             bytesLeft -= bytes;
191
 
<a name="l00171"></a>00171 
192
 
<a name="l00172"></a>00172             <span class="keywordflow">if</span>(bytesLeft == 0) {
193
 
<a name="l00173"></a>00173                 mode = Closing;
194
 
<a name="l00174"></a>00174                 qDebug() &lt;&lt; <span class="stringliteral">"Data transfer complete - SSL shutting down"</span>;
195
 
<a name="l00175"></a>00175                 ssl-&gt;close();
196
 
<a name="l00176"></a>00176             }
197
 
<a name="l00177"></a>00177         }
198
 
<a name="l00178"></a>00178     }
199
 
<a name="l00179"></a>00179 
200
 
<a name="l00180"></a>00180     <span class="keywordtype">void</span> sock_error(QAbstractSocket::SocketError error)
201
 
<a name="l00181"></a>00181     {
202
 
<a name="l00182"></a>00182         qDebug() &lt;&lt; <span class="stringliteral">"Socket error: "</span> &lt;&lt; (unsigned) error;
203
 
<a name="l00183"></a>00183     }
204
 
<a name="l00184"></a>00184 
205
 
<a name="l00185"></a>00185     <span class="keywordtype">void</span> ssl_handshaken()
206
 
<a name="l00186"></a>00186     {
207
 
<a name="l00187"></a>00187         qDebug() &lt;&lt; <span class="stringliteral">"Successful SSL handshake.  Waiting for newline."</span>;
208
 
<a name="l00188"></a>00188         bytesLeft = 0;
209
 
<a name="l00189"></a>00189         sent = <span class="keyword">false</span>;
210
 
<a name="l00190"></a>00190         mode = Active;
211
 
<a name="l00191"></a>00191         ssl-&gt;continueAfterStep();
212
 
<a name="l00192"></a>00192     }
213
 
<a name="l00193"></a>00193 
214
 
<a name="l00194"></a>00194     <span class="keywordtype">void</span> ssl_readyRead()
215
 
<a name="l00195"></a>00195     {
216
 
<a name="l00196"></a>00196         <a class="codeRef" doxygen="qt.tag:" href="qbytearray.html">QByteArray</a> a = ssl-&gt;read();
217
 
<a name="l00197"></a>00197         <a class="codeRef" doxygen="qt.tag:" href="qbytearray.html">QByteArray</a> b =
218
 
<a name="l00198"></a>00198             <span class="stringliteral">"&lt;html&gt;\n"</span>
219
 
<a name="l00199"></a>00199             <span class="stringliteral">"&lt;head&gt;&lt;title&gt;Test&lt;/title&gt;&lt;/head&gt;\n"</span>
220
 
<a name="l00200"></a>00200             <span class="stringliteral">"&lt;body&gt;this is only a test&lt;/body&gt;\n"</span>
221
 
<a name="l00201"></a>00201             <span class="stringliteral">"&lt;/html&gt;\n"</span>;
222
 
<a name="l00202"></a>00202 
223
 
<a name="l00203"></a>00203         qDebug() &lt;&lt; <span class="stringliteral">"Sending test response."</span>;
224
 
<a name="l00204"></a>00204         sent = <span class="keyword">true</span>;
225
 
<a name="l00205"></a>00205         ssl-&gt;write(b);
226
 
<a name="l00206"></a>00206     }
227
 
<a name="l00207"></a>00207 
228
 
<a name="l00208"></a>00208     <span class="keywordtype">void</span> ssl_readyReadOutgoing()
229
 
<a name="l00209"></a>00209     {
230
 
<a name="l00210"></a>00210         <span class="keywordtype">int</span> plainBytes;
231
 
<a name="l00211"></a>00211         <a class="codeRef" doxygen="qt.tag:" href="qbytearray.html">QByteArray</a> outgoingData = ssl-&gt;readOutgoing(&amp;plainBytes);
232
 
<a name="l00212"></a>00212         sock-&gt;write( outgoingData );
233
 
<a name="l00213"></a>00213     }
234
 
<a name="l00214"></a>00214 
235
 
<a name="l00215"></a>00215     <span class="keywordtype">void</span> ssl_closed()
236
 
<a name="l00216"></a>00216     {
237
 
<a name="l00217"></a>00217         qDebug() &lt;&lt; <span class="stringliteral">"Closing socket."</span>;
238
 
<a name="l00218"></a>00218         sock-&gt;close();
239
 
<a name="l00219"></a>00219         mode = Idle;
240
 
<a name="l00220"></a>00220     }
241
 
<a name="l00221"></a>00221 
242
 
<a name="l00222"></a>00222     <span class="keywordtype">void</span> ssl_error()
243
 
<a name="l00223"></a>00223     {
244
 
<a name="l00224"></a>00224         <span class="keywordflow">if</span>(ssl-&gt;errorCode() == <a name="a324"></a><a class="code" href="classQCA_1_1TLS.html#660489de52852a468627a0d41a4244e321276907e5aa7b3e3fb59f2ca04f5ebc">QCA::TLS::ErrorHandshake</a>) {
245
 
<a name="l00225"></a>00225             qDebug() &lt;&lt; <span class="stringliteral">"SSL Handshake Error!  Closing."</span>;
246
 
<a name="l00226"></a>00226             sock-&gt;close();
247
 
<a name="l00227"></a>00227         }
248
 
<a name="l00228"></a>00228         <span class="keywordflow">else</span> {
249
 
<a name="l00229"></a>00229             qDebug() &lt;&lt; <span class="stringliteral">"SSL Error!  Closing."</span>;
250
 
<a name="l00230"></a>00230             sock-&gt;close();
251
 
<a name="l00231"></a>00231         }
252
 
<a name="l00232"></a>00232         mode = Idle;
253
 
<a name="l00233"></a>00233     }
254
 
<a name="l00234"></a>00234 
255
 
<a name="l00235"></a>00235 <span class="keyword">private</span>:
256
 
<a name="l00236"></a>00236     quint16 port;
257
 
<a name="l00237"></a>00237     <a class="codeRef" doxygen="qt.tag:" href="qtcpserver.html">QTcpServer</a> *server;
258
 
<a name="l00238"></a>00238     <a class="codeRef" doxygen="qt.tag:" href="qtcpsocket.html">QTcpSocket</a> *sock;
259
 
<a name="l00239"></a>00239     <a class="code" href="classQCA_1_1TLS.html">QCA::TLS</a> *ssl;
260
 
<a name="l00240"></a>00240     <a name="_a325"></a><a class="code" href="classQCA_1_1Certificate.html">QCA::Certificate</a> cert;
261
 
<a name="l00241"></a>00241     <a name="_a326"></a><a class="code" href="classQCA_1_1PrivateKey.html">QCA::PrivateKey</a> privkey;
262
 
<a name="l00242"></a>00242 
263
 
<a name="l00243"></a>00243     <span class="keywordtype">bool</span> sent;
264
 
<a name="l00244"></a>00244     <span class="keywordtype">int</span> mode;
265
 
<a name="l00245"></a>00245     qint64 bytesLeft;
266
 
<a name="l00246"></a>00246 };
267
 
<a name="l00247"></a>00247 
268
 
<a name="l00248"></a>00248 <span class="preprocessor">#include "sslservtest.moc"</span>
269
 
<a name="l00249"></a>00249 
270
 
<a name="l00250"></a>00250 <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv)
271
 
<a name="l00251"></a>00251 {
272
 
<a name="l00252"></a>00252     <a name="_a327"></a><a class="code" href="classQCA_1_1Initializer.html">QCA::Initializer</a> <a name="a328"></a><a class="code" href="namespaceQCA.html#1de90bf113c54c9e4ffdc5ad784ce629">init</a>;
273
 
<a name="l00253"></a>00253 
274
 
<a name="l00254"></a>00254     <a class="codeRef" doxygen="qt.tag:" href="qcoreapplication.html">QCoreApplication</a> app(argc, argv);
275
 
<a name="l00255"></a>00255     <span class="keywordtype">int</span> port = argc &gt; 1 ? <a class="codeRef" doxygen="qt.tag:" href="qstring.html">QString</a>(argv[1]).toInt() : 8000;
276
 
<a name="l00256"></a>00256 
277
 
<a name="l00257"></a>00257     <span class="keywordflow">if</span>(!<a name="a329"></a><a class="code" href="namespaceQCA.html#833c9f215544113d52a3a52eedc58620">QCA::isSupported</a>(<span class="stringliteral">"tls"</span>)) {
278
 
<a name="l00258"></a>00258         qDebug() &lt;&lt; <span class="stringliteral">"TLS not supported!"</span>;
279
 
<a name="l00259"></a>00259         <span class="keywordflow">return</span> 1;
280
 
<a name="l00260"></a>00260     }
281
 
<a name="l00261"></a>00261 
282
 
<a name="l00262"></a>00262     SecureServer *server = <span class="keyword">new</span> SecureServer(port);
283
 
<a name="l00263"></a>00263     <a class="codeRef" doxygen="qt.tag:" href="qobject.html#4ae3328e7f237d1b61e6f4cd5914bcfb">QObject::connect</a>(server, SIGNAL(quit()), &amp;app, SLOT(quit()));
284
 
<a name="l00264"></a>00264     server-&gt;start();
285
 
<a name="l00265"></a>00265     app.exec();
286
 
<a name="l00266"></a>00266     <span class="keyword">delete</span> server;
287
 
<a name="l00267"></a>00267 
288
 
<a name="l00268"></a>00268     <span class="keywordflow">return</span> 0;
289
 
<a name="l00269"></a>00269 }
290
 
</pre></div> <hr size="1"><address style="align: right;"><small>Generated on Fri Jul 6 13:22:42 2007 for Qt Cryptographic Architecture by&nbsp;
291
 
<a href="http://www.doxygen.org/index.html">
292
 
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
293
 
</body>
294
 
</html>