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

« back to all changes in this revision

Viewing changes to apidocs/html/aes-cmac_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
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">
 
2
<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
3
3
<title>Qt Cryptographic Architecture: aes-cmac.cpp</title>
4
4
<link href="doxygen.css" rel="stylesheet" type="text/css">
5
5
<link href="tabs.css" rel="stylesheet" type="text/css">
6
6
</head><body>
7
 
<!-- Generated by Doxygen 1.4.6 -->
 
7
<!-- Generated by Doxygen 1.5.2 -->
8
8
<div class="tabs">
9
9
  <ul>
10
10
    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
 
11
    <li><a href="modules.html"><span>Modules</span></a></li>
11
12
    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
12
13
    <li><a href="annotated.html"><span>Classes</span></a></li>
13
14
    <li><a href="files.html"><span>Files</span></a></li>
14
15
    <li><a href="dirs.html"><span>Directories</span></a></li>
15
16
    <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
16
17
    <li><a href="examples.html"><span>Examples</span></a></li>
17
 
  </ul></div>
18
 
<h1>aes-cmac.cpp</h1>This example shows how to implement a client side "provider".<p>
19
 
There are three important parts to this:<ul>
20
 
<li>the class derived from <a class="el" href="classQCA_1_1Provider.html">QCA::Provider</a> (in this example called "ClientSideProvider"), that generates the context class</li><li>one or more context classes (in this example only one, implementing AES-CMAC, called "AESCMACContext")</li><li>a call to <a class="el" href="namespaceQCA.html#62a0e1e519e664e2db003c14715f1125">QCA::insertProvider</a>, to add the <a class="el" href="classQCA_1_1Provider.html">QCA::Provider</a> subclass into <a class="el" href="namespaceQCA.html">QCA</a></li></ul>
 
18
  </ul>
 
19
</div>
 
20
<h1>aes-cmac.cpp</h1>This example shows how to implement a client side "provider".There are three important parts to this:<ul>
 
21
<li>the class derived from <a class="el" href="classQCA_1_1Provider.html" title="Algorithm provider.">QCA::Provider</a> (in this example called "ClientSideProvider"), that generates the context class</li><li>one or more context classes (in this example only one, implementing AES-CMAC, called "AESCMACContext")</li><li>a call to <a class="el" href="namespaceQCA.html#62a0e1e519e664e2db003c14715f1125" title="Add a provider to the current list of providers.">QCA::insertProvider</a>, to add the <a class="el" href="classQCA_1_1Provider.html" title="Algorithm provider.">QCA::Provider</a> subclass into <a class="el" href="namespaceQCA.html" title="QCA - the Qt Cryptographic Architecture.">QCA</a></li></ul>
21
22
<p>
22
23
<div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
23
24
<a name="l00002"></a>00002 <span class="comment"> Copyright (C) 2006 Brad Hards &lt;bradh@frogmouth.net&gt;</span>
49
50
<a name="l00028"></a>00028 <span class="keyword">class </span>AESCMACContext : <span class="keyword">public</span> QCA::MACContext
50
51
<a name="l00029"></a>00029 {
51
52
<a name="l00030"></a>00030 <span class="keyword">public</span>:
52
 
<a name="l00031"></a>00031     AESCMACContext(QCA::Provider *p) : QCA::MACContext(p, <span class="stringliteral">"cmac(aes)"</span>)
 
53
<a name="l00031"></a>00031     AESCMACContext(<a name="_a0"></a><a class="code" href="classQCA_1_1Provider.html" title="Algorithm provider.">QCA::Provider</a> *p) : <a name="_a1"></a><a class="code" href="classQCA_1_1MACContext.html" title="Message authentication code provider.">QCA::MACContext</a>(p, <span class="stringliteral">"cmac(aes)"</span>)
53
54
<a name="l00032"></a>00032     {
54
55
<a name="l00033"></a>00033     }
55
56
<a name="l00034"></a>00034 
60
61
<a name="l00039"></a>00039 
61
62
<a name="l00040"></a>00040     <span class="comment">// Helper to left shift an arbitrary length array</span>
62
63
<a name="l00041"></a>00041     <span class="comment">// This is heavily based on the example in the I-D.</span>
63
 
<a name="l00042"></a>00042     <a name="_a0"></a><a class="code" href="classQCA_1_1SecureArray.html">QCA::SecureArray</a> leftShift(<span class="keyword">const</span> <a class="code" href="classQCA_1_1SecureArray.html">QCA::SecureArray</a> &amp;array)
 
64
<a name="l00042"></a>00042     <a name="_a2"></a><a class="code" href="classQCA_1_1SecureArray.html" title="Secure array of bytes.">QCA::SecureArray</a> leftShift(<span class="keyword">const</span> <a class="code" href="classQCA_1_1SecureArray.html" title="Secure array of bytes.">QCA::SecureArray</a> &amp;array)
64
65
<a name="l00043"></a>00043     {
65
66
<a name="l00044"></a>00044         <span class="comment">// We create an output of the same size as the input</span>
66
 
<a name="l00045"></a>00045         <a class="code" href="classQCA_1_1SecureArray.html">QCA::SecureArray</a> out(array.<a name="a1"></a><a class="code" href="classQCA_1_1SecureArray.html#6414d576761db18707321698bd4cb401">size</a>());
 
67
<a name="l00045"></a>00045         <a class="code" href="classQCA_1_1SecureArray.html" title="Secure array of bytes.">QCA::SecureArray</a> out(array.<a name="a3"></a><a class="code" href="classQCA_1_1SecureArray.html#219033b99be6be2ba42266cf851467f5" title="Returns the number of bytes in the array.">size</a>());
67
68
<a name="l00046"></a>00046         <span class="comment">// We handle one byte at a time - this is the high bit</span>
68
69
<a name="l00047"></a>00047         <span class="comment">// from the previous byte.</span>
69
70
<a name="l00048"></a>00048         <span class="keywordtype">int</span> overflow = 0;
70
71
<a name="l00049"></a>00049 
71
72
<a name="l00050"></a>00050         <span class="comment">// work through each byte.</span>
72
 
<a name="l00051"></a>00051         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = array.<a class="code" href="classQCA_1_1SecureArray.html#6414d576761db18707321698bd4cb401">size</a>() -1; i &gt;= 0; --i) {
 
73
<a name="l00051"></a>00051         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = array.<a class="code" href="classQCA_1_1SecureArray.html#219033b99be6be2ba42266cf851467f5" title="Returns the number of bytes in the array.">size</a>() -1; i &gt;= 0; --i) {
73
74
<a name="l00052"></a>00052             <span class="comment">// do the left shift on this byte.</span>
74
75
<a name="l00053"></a>00053             out[i] = array[i] &lt;&lt; 1;
75
76
<a name="l00054"></a>00054             <span class="comment">// make the low bit on this byte be the high bit</span>
83
84
<a name="l00062"></a>00062 
84
85
<a name="l00063"></a>00063 
85
86
<a name="l00064"></a>00064     <span class="comment">// Helper to XOR two arrays - must be same length</span>
86
 
<a name="l00065"></a>00065     <a class="code" href="classQCA_1_1SecureArray.html">QCA::SecureArray</a> xorArray(<span class="keyword">const</span> <a class="code" href="classQCA_1_1SecureArray.html">QCA::SecureArray</a> &amp;array1,
87
 
<a name="l00066"></a>00066                           <span class="keyword">const</span> <a class="code" href="classQCA_1_1SecureArray.html">QCA::SecureArray</a> &amp;array2)
 
87
<a name="l00065"></a>00065     <a class="code" href="classQCA_1_1SecureArray.html" title="Secure array of bytes.">QCA::SecureArray</a> xorArray(<span class="keyword">const</span> <a class="code" href="classQCA_1_1SecureArray.html" title="Secure array of bytes.">QCA::SecureArray</a> &amp;array1,
 
88
<a name="l00066"></a>00066                           <span class="keyword">const</span> <a class="code" href="classQCA_1_1SecureArray.html" title="Secure array of bytes.">QCA::SecureArray</a> &amp;array2)
88
89
<a name="l00067"></a>00067     {
89
 
<a name="l00068"></a>00068         <span class="keywordflow">if</span> (array1.<a class="code" href="classQCA_1_1SecureArray.html#6414d576761db18707321698bd4cb401">size</a>() != array2.<a class="code" href="classQCA_1_1SecureArray.html#6414d576761db18707321698bd4cb401">size</a>())
 
90
<a name="l00068"></a>00068         <span class="keywordflow">if</span> (array1.<a class="code" href="classQCA_1_1SecureArray.html#219033b99be6be2ba42266cf851467f5" title="Returns the number of bytes in the array.">size</a>() != array2.<a class="code" href="classQCA_1_1SecureArray.html#219033b99be6be2ba42266cf851467f5" title="Returns the number of bytes in the array.">size</a>())
90
91
<a name="l00069"></a>00069             <span class="comment">// empty array</span>
91
 
<a name="l00070"></a>00070             <span class="keywordflow">return</span> <a class="code" href="classQCA_1_1SecureArray.html">QCA::SecureArray</a>();
 
92
<a name="l00070"></a>00070             <span class="keywordflow">return</span> <a class="code" href="classQCA_1_1SecureArray.html" title="Secure array of bytes.">QCA::SecureArray</a>();
92
93
<a name="l00071"></a>00071 
93
 
<a name="l00072"></a>00072         QCA::SecureArray result(array1.<a class="code" href="classQCA_1_1SecureArray.html#6414d576761db18707321698bd4cb401">size</a>());
 
94
<a name="l00072"></a>00072         QCA::SecureArray result(array1.<a class="code" href="classQCA_1_1SecureArray.html#219033b99be6be2ba42266cf851467f5" title="Returns the number of bytes in the array.">size</a>());
94
95
<a name="l00073"></a>00073 
95
 
<a name="l00074"></a>00074         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; array1.<a class="code" href="classQCA_1_1SecureArray.html#6414d576761db18707321698bd4cb401">size</a>(); ++i)
 
96
<a name="l00074"></a>00074         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; array1.<a class="code" href="classQCA_1_1SecureArray.html#219033b99be6be2ba42266cf851467f5" title="Returns the number of bytes in the array.">size</a>(); ++i)
96
97
<a name="l00075"></a>00075             result[i] = array1[i] ^ array2[i];
97
98
<a name="l00076"></a>00076 
98
99
<a name="l00077"></a>00077         <span class="keywordflow">return</span> result;
99
100
<a name="l00078"></a>00078     }
100
101
<a name="l00079"></a>00079 
101
102
<a name="l00080"></a>00080 
102
 
<a name="l00081"></a>00081     <span class="keywordtype">void</span> setup(<span class="keyword">const</span> <a name="_a2"></a><a class="code" href="classQCA_1_1SymmetricKey.html">QCA::SymmetricKey</a> &amp;key)
 
103
<a name="l00081"></a>00081     <span class="keywordtype">void</span> setup(<span class="keyword">const</span> <a name="_a4"></a><a class="code" href="classQCA_1_1SymmetricKey.html" title="Container for keys for symmetric encryption algorithms.">QCA::SymmetricKey</a> &amp;key)
103
104
<a name="l00082"></a>00082     {
104
105
<a name="l00083"></a>00083         <span class="comment">// We might not have a real key, since this can get called</span>
105
106
<a name="l00084"></a>00084         <span class="comment">// from the constructor.</span>
106
 
<a name="l00085"></a>00085         <span class="keywordflow">if</span> (key.<a class="code" href="classQCA_1_1SecureArray.html#6414d576761db18707321698bd4cb401">size</a>() == 0)
 
107
<a name="l00085"></a>00085         <span class="keywordflow">if</span> (key.<a class="code" href="classQCA_1_1SecureArray.html#219033b99be6be2ba42266cf851467f5" title="Returns the number of bytes in the array.">size</a>() == 0)
107
108
<a name="l00086"></a>00086             <span class="keywordflow">return</span>;
108
109
<a name="l00087"></a>00087 
109
110
<a name="l00088"></a>00088         m_key = key;
110
111
<a name="l00089"></a>00089         <span class="comment">// Generate the subkeys</span>
111
 
<a name="l00090"></a>00090         QCA::SecureArray const_Zero(16);
112
 
<a name="l00091"></a>00091         QCA::SecureArray const_Rb(16);
 
112
<a name="l00090"></a>00090         <a class="code" href="classQCA_1_1SecureArray.html" title="Secure array of bytes.">QCA::SecureArray</a> const_Zero(16);
 
113
<a name="l00091"></a>00091         <a class="code" href="classQCA_1_1SecureArray.html" title="Secure array of bytes.">QCA::SecureArray</a> const_Rb(16);
113
114
<a name="l00092"></a>00092         const_Rb[15] = (char)0x87;
114
115
<a name="l00093"></a>00093 
115
116
<a name="l00094"></a>00094         m_X = const_Zero;
116
 
<a name="l00095"></a>00095         m_residual = QCA::SecureArray();
 
117
<a name="l00095"></a>00095         m_residual = <a class="code" href="classQCA_1_1SecureArray.html" title="Secure array of bytes.">QCA::SecureArray</a>();
117
118
<a name="l00096"></a>00096 
118
119
<a name="l00097"></a>00097         <span class="comment">// Figure 2.2, step 1.</span>
119
 
<a name="l00098"></a>00098         <a name="_a3"></a><a class="code" href="classQCA_1_1Cipher.html">QCA::Cipher</a> aesObj(<a class="codeRef" doxygen="qt.tag:" href="qstring.html">QString</a>(<span class="stringliteral">"aes128"</span>),
120
 
<a name="l00099"></a>00099                            <a name="a4"></a><a class="code" href="classQCA_1_1Cipher.html#55df34874dc7565d7de238d2d742d66b2242c6ac6d37ac39d20d85486b113dbb">QCA::Cipher::ECB</a>, <a name="a5"></a><a class="code" href="classQCA_1_1Cipher.html#eafc444370fbd6d1457580da2f00c52b402325f324be592311fcfe5ea0526747">QCA::Cipher::DefaultPadding</a>,
121
 
<a name="l00100"></a>00100                            <a name="a6"></a><a class="code" href="namespaceQCA.html#8e5d1994b00ea69c9a598f93cd0990ce7d1fca4b5ac95d3b9422a305814c067a">QCA::Encode</a>, key);
122
 
<a name="l00101"></a>00101         QCA::SecureArray L = aesObj.process(const_Zero);
 
120
<a name="l00098"></a>00098         <a name="_a5"></a><a class="code" href="classQCA_1_1Cipher.html" title="General class for cipher (encryption / decryption) algorithms.">QCA::Cipher</a> aesObj(<a name="_a6"></a><a class="codeRef" doxygen="qt.tag:" href="qstring.html">QString</a>(<span class="stringliteral">"aes128"</span>),
 
121
<a name="l00099"></a>00099                            <a name="a7"></a><a class="code" href="classQCA_1_1Cipher.html#55df34874dc7565d7de238d2d742d66b2242c6ac6d37ac39d20d85486b113dbb" title="operate in Electronic Code Book mode">QCA::Cipher::ECB</a>, <a name="a8"></a><a class="code" href="classQCA_1_1Cipher.html#eafc444370fbd6d1457580da2f00c52b402325f324be592311fcfe5ea0526747" title="Default for cipher-mode.">QCA::Cipher::DefaultPadding</a>,
 
122
<a name="l00100"></a>00100                            <a name="a9"></a><a class="code" href="namespaceQCA.html#8e5d1994b00ea69c9a598f93cd0990ce7d1fca4b5ac95d3b9422a305814c067a" title="Operate in the "forward" direction; for example, encrypting.">QCA::Encode</a>, key);
 
123
<a name="l00101"></a>00101         <a class="code" href="classQCA_1_1SecureArray.html" title="Secure array of bytes.">QCA::SecureArray</a> L = aesObj.<a name="a10"></a><a class="code" href="classQCA_1_1Filter.html#17cd73e8444960a4fa6cbebda400e97a" title="Perform an "all in one" update, returning the result.">process</a>(const_Zero);
123
124
<a name="l00102"></a>00102 
124
125
<a name="l00103"></a>00103         <span class="comment">// Figure 2.2, step 2</span>
125
126
<a name="l00104"></a>00104         <span class="keywordflow">if</span> (0 == (L[0] &amp; 0x80))
134
135
<a name="l00113"></a>00113             m_k2 = xorArray(leftShift(m_k1), const_Rb);
135
136
<a name="l00114"></a>00114     }
136
137
<a name="l00115"></a>00115 
137
 
<a name="l00116"></a>00116     <a name="_a7"></a><a class="code" href="classQCA_1_1Provider_1_1Context.html">QCA::Provider::Context</a> *clone()<span class="keyword"> const</span>
 
138
<a name="l00116"></a>00116     <a name="_a11"></a><a class="code" href="classQCA_1_1Provider_1_1Context.html" title="Internal context class used for the plugin.">QCA::Provider::Context</a> *clone()<span class="keyword"> const</span>
138
139
<a name="l00117"></a>00117 <span class="keyword">    </span>{
139
140
<a name="l00118"></a>00118         <span class="keywordflow">return</span> <span class="keyword">new</span> AESCMACContext(*<span class="keyword">this</span>);
140
141
<a name="l00119"></a>00119     }
144
145
<a name="l00123"></a>00123         setup(m_key);
145
146
<a name="l00124"></a>00124     }
146
147
<a name="l00125"></a>00125 
147
 
<a name="l00126"></a>00126     <a name="_a8"></a><a class="code" href="classQCA_1_1KeyLength.html">QCA::KeyLength</a> keyLength()<span class="keyword"> const</span>
 
148
<a name="l00126"></a>00126     <a name="_a12"></a><a class="code" href="classQCA_1_1KeyLength.html" title="Simple container for acceptable key lengths.">QCA::KeyLength</a> keyLength()<span class="keyword"> const</span>
148
149
<a name="l00127"></a>00127 <span class="keyword">    </span>{
149
 
<a name="l00128"></a>00128         <span class="keywordflow">return</span> <a class="code" href="classQCA_1_1KeyLength.html">QCA::KeyLength</a>(16, 16, 1);
 
150
<a name="l00128"></a>00128         <span class="keywordflow">return</span> <a class="code" href="classQCA_1_1KeyLength.html" title="Simple container for acceptable key lengths.">QCA::KeyLength</a>(16, 16, 1);
150
151
<a name="l00129"></a>00129     }
151
152
<a name="l00130"></a>00130 
152
153
<a name="l00131"></a>00131     <span class="comment">// This is a bit different to the way the I-D does it,</span>
153
154
<a name="l00132"></a>00132     <span class="comment">// to allow for multiple update() calls.</span>
154
 
<a name="l00133"></a>00133     <span class="keywordtype">void</span> update(<span class="keyword">const</span> <a name="_a9"></a><a class="code" href="classQCA_1_1MemoryRegion.html">QCA::MemoryRegion</a> &amp;a)
 
155
<a name="l00133"></a>00133     <span class="keywordtype">void</span> update(<span class="keyword">const</span> <a name="_a13"></a><a class="code" href="classQCA_1_1MemoryRegion.html" title="Array of bytes that may be optionally secured.">QCA::MemoryRegion</a> &amp;a)
155
156
<a name="l00134"></a>00134     {
156
 
<a name="l00135"></a>00135         QCA::SecureArray bytesToProcess = m_residual + a;
 
157
<a name="l00135"></a>00135         <a class="code" href="classQCA_1_1SecureArray.html" title="Secure array of bytes.">QCA::SecureArray</a> bytesToProcess = m_residual + a;
157
158
<a name="l00136"></a>00136         <span class="keywordtype">int</span> blockNum;
158
159
<a name="l00137"></a>00137         <span class="comment">// note that we don't want to do the last full block here, because</span>
159
160
<a name="l00138"></a>00138         <span class="comment">// it needs special treatment in final().</span>
160
 
<a name="l00139"></a>00139         <span class="keywordflow">for</span> (blockNum = 0; blockNum &lt; ((bytesToProcess.<a class="code" href="classQCA_1_1SecureArray.html#6414d576761db18707321698bd4cb401">size</a>()-1)/16); ++blockNum) {
 
161
<a name="l00139"></a>00139         <span class="keywordflow">for</span> (blockNum = 0; blockNum &lt; ((bytesToProcess.<a class="code" href="classQCA_1_1SecureArray.html#219033b99be6be2ba42266cf851467f5" title="Returns the number of bytes in the array.">size</a>()-1)/16); ++blockNum) {
161
162
<a name="l00140"></a>00140             <span class="comment">// copy a block of data</span>
162
 
<a name="l00141"></a>00141             QCA::SecureArray thisBlock(16);
 
163
<a name="l00141"></a>00141             <a class="code" href="classQCA_1_1SecureArray.html" title="Secure array of bytes.">QCA::SecureArray</a> thisBlock(16);
163
164
<a name="l00142"></a>00142             <span class="keywordflow">for</span> (<span class="keywordtype">int</span> yalv = 0; yalv &lt; 16; ++yalv)
164
165
<a name="l00143"></a>00143                 thisBlock[yalv] = bytesToProcess[blockNum*16 + yalv];
165
166
<a name="l00144"></a>00144 
166
167
<a name="l00145"></a>00145             m_Y = xorArray(m_X, thisBlock);
167
168
<a name="l00146"></a>00146 
168
 
<a name="l00147"></a>00147             <a class="code" href="classQCA_1_1Cipher.html">QCA::Cipher</a> aesObj(<a class="codeRef" doxygen="qt.tag:" href="qstring.html">QString</a>(<span class="stringliteral">"aes128"</span>),
169
 
<a name="l00148"></a>00148                                <a class="code" href="classQCA_1_1Cipher.html#55df34874dc7565d7de238d2d742d66b2242c6ac6d37ac39d20d85486b113dbb">QCA::Cipher::ECB</a>, <a class="code" href="classQCA_1_1Cipher.html#eafc444370fbd6d1457580da2f00c52b402325f324be592311fcfe5ea0526747">QCA::Cipher::DefaultPadding</a>,
170
 
<a name="l00149"></a>00149                                <a class="code" href="namespaceQCA.html#8e5d1994b00ea69c9a598f93cd0990ce7d1fca4b5ac95d3b9422a305814c067a">QCA::Encode</a>, m_key);
171
 
<a name="l00150"></a>00150             m_X = aesObj.process(m_Y);
 
169
<a name="l00147"></a>00147             <a class="code" href="classQCA_1_1Cipher.html" title="General class for cipher (encryption / decryption) algorithms.">QCA::Cipher</a> aesObj(<a class="codeRef" doxygen="qt.tag:" href="qstring.html">QString</a>(<span class="stringliteral">"aes128"</span>),
 
170
<a name="l00148"></a>00148                                <a class="code" href="classQCA_1_1Cipher.html#55df34874dc7565d7de238d2d742d66b2242c6ac6d37ac39d20d85486b113dbb" title="operate in Electronic Code Book mode">QCA::Cipher::ECB</a>, <a class="code" href="classQCA_1_1Cipher.html#eafc444370fbd6d1457580da2f00c52b402325f324be592311fcfe5ea0526747" title="Default for cipher-mode.">QCA::Cipher::DefaultPadding</a>,
 
171
<a name="l00149"></a>00149                                <a class="code" href="namespaceQCA.html#8e5d1994b00ea69c9a598f93cd0990ce7d1fca4b5ac95d3b9422a305814c067a" title="Operate in the "forward" direction; for example, encrypting.">QCA::Encode</a>, m_key);
 
172
<a name="l00150"></a>00150             m_X = aesObj.<a class="code" href="classQCA_1_1Filter.html#17cd73e8444960a4fa6cbebda400e97a" title="Perform an "all in one" update, returning the result.">process</a>(m_Y);
172
173
<a name="l00151"></a>00151         }
173
174
<a name="l00152"></a>00152         <span class="comment">// This can be between 1 and 16</span>
174
 
<a name="l00153"></a>00153         <span class="keywordtype">int</span> numBytesLeft = bytesToProcess.<a class="code" href="classQCA_1_1SecureArray.html#6414d576761db18707321698bd4cb401">size</a>() - 16*blockNum;
 
175
<a name="l00153"></a>00153         <span class="keywordtype">int</span> numBytesLeft = bytesToProcess.<a class="code" href="classQCA_1_1SecureArray.html#219033b99be6be2ba42266cf851467f5" title="Returns the number of bytes in the array.">size</a>() - 16*blockNum;
175
176
<a name="l00154"></a>00154         <span class="comment">// we copy the left over part</span>
176
177
<a name="l00155"></a>00155         m_residual.resize(numBytesLeft);
177
178
<a name="l00156"></a>00156         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> yalv = 0; yalv &lt; numBytesLeft; ++yalv)
178
179
<a name="l00157"></a>00157             m_residual[yalv] = bytesToProcess[blockNum*16 + yalv];
179
180
<a name="l00158"></a>00158     }
180
181
<a name="l00159"></a>00159 
181
 
<a name="l00160"></a>00160     <span class="keywordtype">void</span> <span class="keyword">final</span>( <a class="code" href="classQCA_1_1MemoryRegion.html">QCA::MemoryRegion</a> *out)
 
182
<a name="l00160"></a>00160     <span class="keywordtype">void</span> <span class="keyword">final</span>( <a class="code" href="classQCA_1_1MemoryRegion.html" title="Array of bytes that may be optionally secured.">QCA::MemoryRegion</a> *out)
182
183
<a name="l00161"></a>00161     {
183
 
<a name="l00162"></a>00162         QCA::SecureArray lastBlock;
184
 
<a name="l00163"></a>00163         <span class="keywordtype">int</span> numBytesLeft = m_residual.<a class="code" href="classQCA_1_1SecureArray.html#6414d576761db18707321698bd4cb401">size</a>();
 
184
<a name="l00162"></a>00162         <a class="code" href="classQCA_1_1SecureArray.html" title="Secure array of bytes.">QCA::SecureArray</a> lastBlock;
 
185
<a name="l00163"></a>00163         <span class="keywordtype">int</span> numBytesLeft = m_residual.<a class="code" href="classQCA_1_1SecureArray.html#219033b99be6be2ba42266cf851467f5" title="Returns the number of bytes in the array.">size</a>();
185
186
<a name="l00164"></a>00164 
186
187
<a name="l00165"></a>00165         <span class="keywordflow">if</span> ( numBytesLeft != 16 ) {
187
188
<a name="l00166"></a>00166             <span class="comment">// no full block, so we have to pad.</span>
193
194
<a name="l00172"></a>00172             lastBlock = xorArray(m_residual, m_k1);
194
195
<a name="l00173"></a>00173         }
195
196
<a name="l00174"></a>00174         m_Y = xorArray(m_X, lastBlock);
196
 
<a name="l00175"></a>00175         <a class="code" href="classQCA_1_1Cipher.html">QCA::Cipher</a> aesObj(<a class="codeRef" doxygen="qt.tag:" href="qstring.html">QString</a>(<span class="stringliteral">"aes128"</span>),
197
 
<a name="l00176"></a>00176                            <a class="code" href="classQCA_1_1Cipher.html#55df34874dc7565d7de238d2d742d66b2242c6ac6d37ac39d20d85486b113dbb">QCA::Cipher::ECB</a>, <a class="code" href="classQCA_1_1Cipher.html#eafc444370fbd6d1457580da2f00c52b402325f324be592311fcfe5ea0526747">QCA::Cipher::DefaultPadding</a>,
198
 
<a name="l00177"></a>00177                            <a class="code" href="namespaceQCA.html#8e5d1994b00ea69c9a598f93cd0990ce7d1fca4b5ac95d3b9422a305814c067a">QCA::Encode</a>, m_key);
199
 
<a name="l00178"></a>00178         *out = aesObj.process(m_Y);
 
197
<a name="l00175"></a>00175         <a class="code" href="classQCA_1_1Cipher.html" title="General class for cipher (encryption / decryption) algorithms.">QCA::Cipher</a> aesObj(<a class="codeRef" doxygen="qt.tag:" href="qstring.html">QString</a>(<span class="stringliteral">"aes128"</span>),
 
198
<a name="l00176"></a>00176                            <a class="code" href="classQCA_1_1Cipher.html#55df34874dc7565d7de238d2d742d66b2242c6ac6d37ac39d20d85486b113dbb" title="operate in Electronic Code Book mode">QCA::Cipher::ECB</a>, <a class="code" href="classQCA_1_1Cipher.html#eafc444370fbd6d1457580da2f00c52b402325f324be592311fcfe5ea0526747" title="Default for cipher-mode.">QCA::Cipher::DefaultPadding</a>,
 
199
<a name="l00177"></a>00177                            <a class="code" href="namespaceQCA.html#8e5d1994b00ea69c9a598f93cd0990ce7d1fca4b5ac95d3b9422a305814c067a" title="Operate in the "forward" direction; for example, encrypting.">QCA::Encode</a>, m_key);
 
200
<a name="l00178"></a>00178         *out = aesObj.<a class="code" href="classQCA_1_1Filter.html#17cd73e8444960a4fa6cbebda400e97a" title="Perform an "all in one" update, returning the result.">process</a>(m_Y);
200
201
<a name="l00179"></a>00179 
201
202
<a name="l00180"></a>00180     }
202
203
<a name="l00181"></a>00181 
203
204
<a name="l00182"></a>00182 <span class="keyword">protected</span>:
204
205
<a name="l00183"></a>00183     <span class="comment">// first subkey</span>
205
 
<a name="l00184"></a>00184     QCA::SecureArray m_k1;
 
206
<a name="l00184"></a>00184     <a class="code" href="classQCA_1_1SecureArray.html" title="Secure array of bytes.">QCA::SecureArray</a> m_k1;
206
207
<a name="l00185"></a>00185     <span class="comment">// second subkey</span>
207
 
<a name="l00186"></a>00186     QCA::SecureArray m_k2;
 
208
<a name="l00186"></a>00186     <a class="code" href="classQCA_1_1SecureArray.html" title="Secure array of bytes.">QCA::SecureArray</a> m_k2;
208
209
<a name="l00187"></a>00187     <span class="comment">// main key</span>
209
 
<a name="l00188"></a>00188     QCA::SecureArray m_key;
 
210
<a name="l00188"></a>00188     <a class="code" href="classQCA_1_1SecureArray.html" title="Secure array of bytes.">QCA::SecureArray</a> m_key;
210
211
<a name="l00189"></a>00189 
211
212
<a name="l00190"></a>00190     <span class="comment">// state</span>
212
 
<a name="l00191"></a>00191     QCA::SecureArray m_X;
213
 
<a name="l00192"></a>00192     QCA::SecureArray m_Y;
 
213
<a name="l00191"></a>00191     <a class="code" href="classQCA_1_1SecureArray.html" title="Secure array of bytes.">QCA::SecureArray</a> m_X;
 
214
<a name="l00192"></a>00192     <a class="code" href="classQCA_1_1SecureArray.html" title="Secure array of bytes.">QCA::SecureArray</a> m_Y;
214
215
<a name="l00193"></a>00193 
215
216
<a name="l00194"></a>00194     <span class="comment">// partial block that we can't do yet</span>
216
 
<a name="l00195"></a>00195     QCA::SecureArray m_residual;
 
217
<a name="l00195"></a>00195     <a class="code" href="classQCA_1_1SecureArray.html" title="Secure array of bytes.">QCA::SecureArray</a> m_residual;
217
218
<a name="l00196"></a>00196 };
218
219
<a name="l00197"></a>00197 
219
220
<a name="l00198"></a>00198 <span class="keyword">class </span>ClientSideProvider : <span class="keyword">public</span> QCA::Provider
220
221
<a name="l00199"></a>00199 {
221
222
<a name="l00200"></a>00200 <span class="keyword">public</span>:
222
 
<a name="l00201"></a>00201         <span class="keywordtype">int</span> <a name="a10"></a><a class="code" href="qca__core_8h.html#02290b5ce16e32abc64745bb8d9c5520">qcaVersion</a>()<span class="keyword"> const</span>
 
223
<a name="l00201"></a>00201         <span class="keywordtype">int</span> <a name="a14"></a><a class="code" href="qca__core_8h.html#02290b5ce16e32abc64745bb8d9c5520" title="The current version of QCA.">qcaVersion</a>()<span class="keyword"> const</span>
223
224
<a name="l00202"></a>00202 <span class="keyword">        </span>{
224
 
<a name="l00203"></a>00203                 <span class="keywordflow">return</span> <a name="a11"></a><a class="code" href="qca__core_8h.html#e06e7cc07f44561939fb8250825638be">QCA_VERSION</a>;
 
225
<a name="l00203"></a>00203                 <span class="keywordflow">return</span> <a name="a15"></a><a class="code" href="qca__core_8h.html#e06e7cc07f44561939fb8250825638be" title="The current version of QCA.">QCA_VERSION</a>;
225
226
<a name="l00204"></a>00204         }
226
227
<a name="l00205"></a>00205 
227
228
<a name="l00206"></a>00206         <a class="codeRef" doxygen="qt.tag:" href="qstring.html">QString</a> name()<span class="keyword"> const</span>
229
230
<a name="l00208"></a>00208                 <span class="keywordflow">return</span> <span class="stringliteral">"exampleClientSideProvider"</span>;
230
231
<a name="l00209"></a>00209         }
231
232
<a name="l00210"></a>00210 
232
 
<a name="l00211"></a>00211         <a class="codeRef" doxygen="qt.tag:" href="qstringlist.html">QStringList</a> features()<span class="keyword"> const</span>
 
233
<a name="l00211"></a>00211         <a name="_a16"></a><a class="codeRef" doxygen="qt.tag:" href="qstringlist.html">QStringList</a> features()<span class="keyword"> const</span>
233
234
<a name="l00212"></a>00212 <span class="keyword">        </span>{
234
235
<a name="l00213"></a>00213                 <a class="codeRef" doxygen="qt.tag:" href="qstringlist.html">QStringList</a> list;
235
236
<a name="l00214"></a>00214                 list += <span class="stringliteral">"cmac(aes)"</span>;
255
256
<a name="l00234"></a>00234 <span class="keyword">class </span>AES_CMAC: <span class="keyword">public</span> QCA::MessageAuthenticationCode
256
257
<a name="l00235"></a>00235 {
257
258
<a name="l00236"></a>00236 <span class="keyword">public</span>:
258
 
<a name="l00237"></a>00237     AES_CMAC(<span class="keyword">const</span> <a class="code" href="classQCA_1_1SymmetricKey.html">QCA::SymmetricKey</a> &amp;key = <a class="code" href="classQCA_1_1SymmetricKey.html">QCA::SymmetricKey</a>(),
 
259
<a name="l00237"></a>00237     AES_CMAC(<span class="keyword">const</span> <a class="code" href="classQCA_1_1SymmetricKey.html" title="Container for keys for symmetric encryption algorithms.">QCA::SymmetricKey</a> &amp;key = <a class="code" href="classQCA_1_1SymmetricKey.html" title="Container for keys for symmetric encryption algorithms.">QCA::SymmetricKey</a>(),
259
260
<a name="l00238"></a>00238              <span class="keyword">const</span> <a class="codeRef" doxygen="qt.tag:" href="qstring.html">QString</a> &amp;provider = <a class="codeRef" doxygen="qt.tag:" href="qstring.html">QString</a>()):
260
261
<a name="l00239"></a>00239         QCA::MessageAuthenticationCode( <span class="stringliteral">"cmac(aes)"</span>, key, provider)
261
262
<a name="l00240"></a>00240     {}
264
265
<a name="l00243"></a>00243 
265
266
<a name="l00244"></a>00244 <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv)
266
267
<a name="l00245"></a>00245 {
267
 
<a name="l00246"></a>00246     <a class="codeRef" doxygen="qt.tag:" href="qcoreapplication.html">QCoreApplication</a> app(argc, argv);
 
268
<a name="l00246"></a>00246     <a name="_a17"></a><a class="codeRef" doxygen="qt.tag:" href="qcoreapplication.html">QCoreApplication</a> app(argc, argv);
268
269
<a name="l00247"></a>00247 
269
270
<a name="l00248"></a>00248     qDebug() &lt;&lt; <span class="stringliteral">"This example shows AES CMAC"</span>;
270
271
<a name="l00249"></a>00249 
271
272
<a name="l00250"></a>00250     <span class="comment">// the Initializer object sets things up, and</span>
272
273
<a name="l00251"></a>00251     <span class="comment">// also does cleanup when it goes out of scope</span>
273
 
<a name="l00252"></a>00252     <a name="_a12"></a><a class="code" href="classQCA_1_1Initializer.html">QCA::Initializer</a> <a name="a13"></a><a class="code" href="namespaceQCA.html#1de90bf113c54c9e4ffdc5ad784ce629">init</a>;
 
274
<a name="l00252"></a>00252     <a name="_a18"></a><a class="code" href="classQCA_1_1Initializer.html" title="Convenience method for initialising and cleaning up QCA.">QCA::Initializer</a> <a name="a19"></a><a class="code" href="namespaceQCA.html#4dc8db9c7ef2a40aff9c2d2760f49458" title="This is an overloaded member function, provided for convenience. It differs from...">init</a>;
274
275
<a name="l00253"></a>00253 
275
276
<a name="l00254"></a>00254     qDebug() &lt;&lt; <span class="stringliteral">"Completed initialisation"</span>;
276
277
<a name="l00255"></a>00255 
277
 
<a name="l00256"></a>00256     <span class="keywordflow">if</span>( ! <a name="a14"></a><a class="code" href="namespaceQCA.html#833c9f215544113d52a3a52eedc58620">QCA::isSupported</a>(<span class="stringliteral">"aes128-ecb"</span>) ) {
 
278
<a name="l00256"></a>00256     <span class="keywordflow">if</span>( ! <a name="a20"></a><a class="code" href="namespaceQCA.html#833c9f215544113d52a3a52eedc58620" title="Test if a capability (algorithm) is available.">QCA::isSupported</a>(<span class="stringliteral">"aes128-ecb"</span>) ) {
278
279
<a name="l00257"></a>00257         qDebug() &lt;&lt; <span class="stringliteral">"AES not supported!"</span>;
279
280
<a name="l00258"></a>00258     }
280
281
<a name="l00259"></a>00259 
281
 
<a name="l00260"></a>00260     <span class="keywordflow">if</span> ( <a name="a15"></a><a class="code" href="namespaceQCA.html#62a0e1e519e664e2db003c14715f1125">QCA::insertProvider</a>(<span class="keyword">new</span> ClientSideProvider, 0) )
 
282
<a name="l00260"></a>00260     <span class="keywordflow">if</span> ( <a name="a21"></a><a class="code" href="namespaceQCA.html#62a0e1e519e664e2db003c14715f1125" title="Add a provider to the current list of providers.">QCA::insertProvider</a>(<span class="keyword">new</span> ClientSideProvider, 0) )
282
283
<a name="l00261"></a>00261         qDebug() &lt;&lt; <span class="stringliteral">"Inserted our provider"</span>;
283
284
<a name="l00262"></a>00262     <span class="keywordflow">else</span>
284
285
<a name="l00263"></a>00263         qDebug() &lt;&lt; <span class="stringliteral">"our provider could not be added"</span>;
285
286
<a name="l00264"></a>00264 
286
287
<a name="l00265"></a>00265     <span class="comment">// We should check AES CMAC is supported before using it.</span>
287
 
<a name="l00266"></a>00266     <span class="keywordflow">if</span>( ! <a class="code" href="namespaceQCA.html#833c9f215544113d52a3a52eedc58620">QCA::isSupported</a>(<span class="stringliteral">"cmac(aes)"</span>) ) {
 
288
<a name="l00266"></a>00266     <span class="keywordflow">if</span>( ! <a class="code" href="namespaceQCA.html#833c9f215544113d52a3a52eedc58620" title="Test if a capability (algorithm) is available.">QCA::isSupported</a>(<span class="stringliteral">"cmac(aes)"</span>) ) {
288
289
<a name="l00267"></a>00267         qDebug() &lt;&lt; <span class="stringliteral">"AES CMAC not supported!"</span>;
289
290
<a name="l00268"></a>00268     } <span class="keywordflow">else</span> {
290
291
<a name="l00269"></a>00269         <span class="comment">// create the required object</span>
291
292
<a name="l00270"></a>00270         AES_CMAC cmacObject;
292
293
<a name="l00271"></a>00271 
293
294
<a name="l00272"></a>00272         <span class="comment">// create the key</span>
294
 
<a name="l00273"></a>00273         <a class="code" href="classQCA_1_1SymmetricKey.html">QCA::SymmetricKey</a> key(<a name="a16"></a><a class="code" href="namespaceQCA.html#8cde84f93941c71dc555f83e293df4a8">QCA::hexToArray</a>(<span class="stringliteral">"2b7e151628aed2a6abf7158809cf4f3c"</span>));
 
295
<a name="l00273"></a>00273         <a class="code" href="classQCA_1_1SymmetricKey.html" title="Container for keys for symmetric encryption algorithms.">QCA::SymmetricKey</a> key(<a name="a22"></a><a class="code" href="namespaceQCA.html#8cde84f93941c71dc555f83e293df4a8" title="Convert a QString containing a hexadecimal representation of a byte array into a...">QCA::hexToArray</a>(<span class="stringliteral">"2b7e151628aed2a6abf7158809cf4f3c"</span>));
295
296
<a name="l00274"></a>00274 
296
297
<a name="l00275"></a>00275         <span class="comment">// set the MAC to use the key</span>
297
298
<a name="l00276"></a>00276         cmacObject.setup(key);
298
299
<a name="l00277"></a>00277 
299
 
<a name="l00278"></a>00278         QCA::SecureArray message = <a class="code" href="namespaceQCA.html#8cde84f93941c71dc555f83e293df4a8">QCA::hexToArray</a>(<span class="stringliteral">"6bc1bee22e409f96e93d7e117393172a"</span>
 
300
<a name="l00278"></a>00278         <a class="code" href="classQCA_1_1SecureArray.html" title="Secure array of bytes.">QCA::SecureArray</a> message = <a class="code" href="namespaceQCA.html#8cde84f93941c71dc555f83e293df4a8" title="Convert a QString containing a hexadecimal representation of a byte array into a...">QCA::hexToArray</a>(<span class="stringliteral">"6bc1bee22e409f96e93d7e117393172a"</span>
300
301
<a name="l00279"></a>00279                                                <span class="stringliteral">"ae2d8a571e03ac9c9eb76fac45af8e51"</span>
301
302
<a name="l00280"></a>00280                                                <span class="stringliteral">"30c81c46a35ce411e5fbc1191a0a52ef"</span>
302
303
<a name="l00281"></a>00281                                                <span class="stringliteral">"f69f2445df4f9b17ad2b417be66c3710"</span>);
303
 
<a name="l00282"></a>00282         QCA::SecureArray message1(message);
 
304
<a name="l00282"></a>00282         <a class="code" href="classQCA_1_1SecureArray.html" title="Secure array of bytes.">QCA::SecureArray</a> message1(message);
304
305
<a name="l00283"></a>00283         message1.resize(0);
305
306
<a name="l00284"></a>00284         qDebug();
306
 
<a name="l00285"></a>00285         qDebug() &lt;&lt; <span class="stringliteral">"Message1: "</span> &lt;&lt; <a name="a17"></a><a class="code" href="namespaceQCA.html#5df0264a9d1b8fa52a7bce4aaa49ad4c">QCA::arrayToHex</a>(message1.toByteArray());
 
307
<a name="l00285"></a>00285         qDebug() &lt;&lt; <span class="stringliteral">"Message1: "</span> &lt;&lt; <a name="a23"></a><a class="code" href="namespaceQCA.html#5df0264a9d1b8fa52a7bce4aaa49ad4c" title="Convert a byte array to printable hexadecimal representation.">QCA::arrayToHex</a>(message1.toByteArray());
307
308
<a name="l00286"></a>00286         qDebug() &lt;&lt; <span class="stringliteral">"Expecting:  bb1d6929e95937287fa37d129b756746"</span>;
308
 
<a name="l00287"></a>00287         qDebug() &lt;&lt; <span class="stringliteral">"AES-CMAC: "</span> &lt;&lt; <a class="code" href="namespaceQCA.html#5df0264a9d1b8fa52a7bce4aaa49ad4c">QCA::arrayToHex</a>(cmacObject.process(message1).toByteArray());
 
309
<a name="l00287"></a>00287         qDebug() &lt;&lt; <span class="stringliteral">"AES-CMAC: "</span> &lt;&lt; <a class="code" href="namespaceQCA.html#5df0264a9d1b8fa52a7bce4aaa49ad4c" title="Convert a byte array to printable hexadecimal representation.">QCA::arrayToHex</a>(cmacObject.process(message1).toByteArray());
309
310
<a name="l00288"></a>00288 
310
311
<a name="l00289"></a>00289         cmacObject.clear();
311
 
<a name="l00290"></a>00290         QCA::SecureArray message2(message);
 
312
<a name="l00290"></a>00290         <a class="code" href="classQCA_1_1SecureArray.html" title="Secure array of bytes.">QCA::SecureArray</a> message2(message);
312
313
<a name="l00291"></a>00291         message2.resize(16);
313
314
<a name="l00292"></a>00292         qDebug();
314
 
<a name="l00293"></a>00293         qDebug() &lt;&lt; <span class="stringliteral">"Message2: "</span> &lt;&lt; <a class="code" href="namespaceQCA.html#5df0264a9d1b8fa52a7bce4aaa49ad4c">QCA::arrayToHex</a>(message2.toByteArray());
 
315
<a name="l00293"></a>00293         qDebug() &lt;&lt; <span class="stringliteral">"Message2: "</span> &lt;&lt; <a class="code" href="namespaceQCA.html#5df0264a9d1b8fa52a7bce4aaa49ad4c" title="Convert a byte array to printable hexadecimal representation.">QCA::arrayToHex</a>(message2.toByteArray());
315
316
<a name="l00294"></a>00294         qDebug() &lt;&lt; <span class="stringliteral">"Expecting:  070a16b46b4d4144f79bdd9dd04a287c"</span>;
316
 
<a name="l00295"></a>00295         qDebug() &lt;&lt; <span class="stringliteral">"AES-CMAC: "</span> &lt;&lt; <a class="code" href="namespaceQCA.html#5df0264a9d1b8fa52a7bce4aaa49ad4c">QCA::arrayToHex</a>(cmacObject.process(message2).toByteArray());
 
317
<a name="l00295"></a>00295         qDebug() &lt;&lt; <span class="stringliteral">"AES-CMAC: "</span> &lt;&lt; <a class="code" href="namespaceQCA.html#5df0264a9d1b8fa52a7bce4aaa49ad4c" title="Convert a byte array to printable hexadecimal representation.">QCA::arrayToHex</a>(cmacObject.process(message2).toByteArray());
317
318
<a name="l00296"></a>00296 
318
319
<a name="l00297"></a>00297         cmacObject.clear();
319
 
<a name="l00298"></a>00298         QCA::SecureArray message3(message);
 
320
<a name="l00298"></a>00298         <a class="code" href="classQCA_1_1SecureArray.html" title="Secure array of bytes.">QCA::SecureArray</a> message3(message);
320
321
<a name="l00299"></a>00299         message3.resize(40);
321
322
<a name="l00300"></a>00300         qDebug();
322
 
<a name="l00301"></a>00301         qDebug() &lt;&lt; <span class="stringliteral">"Message3: "</span> &lt;&lt; <a class="code" href="namespaceQCA.html#5df0264a9d1b8fa52a7bce4aaa49ad4c">QCA::arrayToHex</a>(message3.toByteArray());
 
323
<a name="l00301"></a>00301         qDebug() &lt;&lt; <span class="stringliteral">"Message3: "</span> &lt;&lt; <a class="code" href="namespaceQCA.html#5df0264a9d1b8fa52a7bce4aaa49ad4c" title="Convert a byte array to printable hexadecimal representation.">QCA::arrayToHex</a>(message3.toByteArray());
323
324
<a name="l00302"></a>00302         qDebug() &lt;&lt; <span class="stringliteral">"Expecting:  dfa66747de9ae63030ca32611497c827"</span>;
324
 
<a name="l00303"></a>00303         qDebug() &lt;&lt; <span class="stringliteral">"AES-CMAC  "</span> &lt;&lt; <a class="code" href="namespaceQCA.html#5df0264a9d1b8fa52a7bce4aaa49ad4c">QCA::arrayToHex</a>(cmacObject.process(message3).toByteArray());
 
325
<a name="l00303"></a>00303         qDebug() &lt;&lt; <span class="stringliteral">"AES-CMAC  "</span> &lt;&lt; <a class="code" href="namespaceQCA.html#5df0264a9d1b8fa52a7bce4aaa49ad4c" title="Convert a byte array to printable hexadecimal representation.">QCA::arrayToHex</a>(cmacObject.process(message3).toByteArray());
325
326
<a name="l00304"></a>00304 
326
327
<a name="l00305"></a>00305         cmacObject.clear();
327
 
<a name="l00306"></a>00306         QCA::SecureArray message4(message);
 
328
<a name="l00306"></a>00306         <a class="code" href="classQCA_1_1SecureArray.html" title="Secure array of bytes.">QCA::SecureArray</a> message4(message);
328
329
<a name="l00307"></a>00307         message4.resize(64);
329
330
<a name="l00308"></a>00308         qDebug();
330
 
<a name="l00309"></a>00309         qDebug() &lt;&lt; <span class="stringliteral">"Message4: "</span> &lt;&lt; <a class="code" href="namespaceQCA.html#5df0264a9d1b8fa52a7bce4aaa49ad4c">QCA::arrayToHex</a>(message4.toByteArray());
 
331
<a name="l00309"></a>00309         qDebug() &lt;&lt; <span class="stringliteral">"Message4: "</span> &lt;&lt; <a class="code" href="namespaceQCA.html#5df0264a9d1b8fa52a7bce4aaa49ad4c" title="Convert a byte array to printable hexadecimal representation.">QCA::arrayToHex</a>(message4.toByteArray());
331
332
<a name="l00310"></a>00310         qDebug() &lt;&lt; <span class="stringliteral">"Expecting:  51f0bebf7e3b9d92fc49741779363cfe"</span>;
332
 
<a name="l00311"></a>00311         qDebug() &lt;&lt; <span class="stringliteral">"AES-CMAC: "</span> &lt;&lt; <a class="code" href="namespaceQCA.html#5df0264a9d1b8fa52a7bce4aaa49ad4c">QCA::arrayToHex</a>(cmacObject.process(message4).toByteArray());
 
333
<a name="l00311"></a>00311         qDebug() &lt;&lt; <span class="stringliteral">"AES-CMAC: "</span> &lt;&lt; <a class="code" href="namespaceQCA.html#5df0264a9d1b8fa52a7bce4aaa49ad4c" title="Convert a byte array to printable hexadecimal representation.">QCA::arrayToHex</a>(cmacObject.process(message4).toByteArray());
333
334
<a name="l00312"></a>00312     }
334
335
<a name="l00313"></a>00313 
335
336
<a name="l00314"></a>00314     <span class="keywordflow">return</span> 0;
336
337
<a name="l00315"></a>00315 }
337
338
<a name="l00316"></a>00316 
338
 
</pre></div> <hr size="1"><address style="align: right;"><small>Generated on Fri Jul 6 12:14:03 2007 for Qt Cryptographic Architecture by&nbsp;
 
339
</pre></div> <hr size="1"><address style="text-align: right;"><small>Generated on Thu Sep 6 19:13:35 2007 for Qt Cryptographic Architecture by&nbsp;
339
340
<a href="http://www.doxygen.org/index.html">
340
 
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
 
341
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.2 </small></address>
341
342
</body>
342
343
</html>