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">
7
<!-- Generated by Doxygen 1.4.6 -->
7
<!-- Generated by Doxygen 1.5.2 -->
10
10
<li><a href="index.html"><span>Main 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 Pages</span></a></li>
16
17
<li><a href="examples.html"><span>Examples</span></a></li>
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>
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>
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 <bradh@frogmouth.net></span>
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> &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> &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 >= 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 >= 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] << 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> &array1,
87
<a name="l00066"></a>00066 <span class="keyword">const</span> <a class="code" href="classQCA_1_1SecureArray.html">QCA::SecureArray</a> &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> &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> &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 < 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 < 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> &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> &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] & 0x80))
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> &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> &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 < ((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 < ((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 < 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 < 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>
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() << <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() << <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() << <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() << <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() << <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() << <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() << <span class="stringliteral">"Message1: "</span> << <a name="a17"></a><a class="code" href="namespaceQCA.html#5df0264a9d1b8fa52a7bce4aaa49ad4c">QCA::arrayToHex</a>(message1.toByteArray());
307
<a name="l00285"></a>00285 qDebug() << <span class="stringliteral">"Message1: "</span> << <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() << <span class="stringliteral">"Expecting: bb1d6929e95937287fa37d129b756746"</span>;
308
<a name="l00287"></a>00287 qDebug() << <span class="stringliteral">"AES-CMAC: "</span> << <a class="code" href="namespaceQCA.html#5df0264a9d1b8fa52a7bce4aaa49ad4c">QCA::arrayToHex</a>(cmacObject.process(message1).toByteArray());
309
<a name="l00287"></a>00287 qDebug() << <span class="stringliteral">"AES-CMAC: "</span> << <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() << <span class="stringliteral">"Message2: "</span> << <a class="code" href="namespaceQCA.html#5df0264a9d1b8fa52a7bce4aaa49ad4c">QCA::arrayToHex</a>(message2.toByteArray());
315
<a name="l00293"></a>00293 qDebug() << <span class="stringliteral">"Message2: "</span> << <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() << <span class="stringliteral">"Expecting: 070a16b46b4d4144f79bdd9dd04a287c"</span>;
316
<a name="l00295"></a>00295 qDebug() << <span class="stringliteral">"AES-CMAC: "</span> << <a class="code" href="namespaceQCA.html#5df0264a9d1b8fa52a7bce4aaa49ad4c">QCA::arrayToHex</a>(cmacObject.process(message2).toByteArray());
317
<a name="l00295"></a>00295 qDebug() << <span class="stringliteral">"AES-CMAC: "</span> << <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() << <span class="stringliteral">"Message3: "</span> << <a class="code" href="namespaceQCA.html#5df0264a9d1b8fa52a7bce4aaa49ad4c">QCA::arrayToHex</a>(message3.toByteArray());
323
<a name="l00301"></a>00301 qDebug() << <span class="stringliteral">"Message3: "</span> << <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() << <span class="stringliteral">"Expecting: dfa66747de9ae63030ca32611497c827"</span>;
324
<a name="l00303"></a>00303 qDebug() << <span class="stringliteral">"AES-CMAC "</span> << <a class="code" href="namespaceQCA.html#5df0264a9d1b8fa52a7bce4aaa49ad4c">QCA::arrayToHex</a>(cmacObject.process(message3).toByteArray());
325
<a name="l00303"></a>00303 qDebug() << <span class="stringliteral">"AES-CMAC "</span> << <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() << <span class="stringliteral">"Message4: "</span> << <a class="code" href="namespaceQCA.html#5df0264a9d1b8fa52a7bce4aaa49ad4c">QCA::arrayToHex</a>(message4.toByteArray());
331
<a name="l00309"></a>00309 qDebug() << <span class="stringliteral">"Message4: "</span> << <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() << <span class="stringliteral">"Expecting: 51f0bebf7e3b9d92fc49741779363cfe"</span>;
332
<a name="l00311"></a>00311 qDebug() << <span class="stringliteral">"AES-CMAC: "</span> << <a class="code" href="namespaceQCA.html#5df0264a9d1b8fa52a7bce4aaa49ad4c">QCA::arrayToHex</a>(cmacObject.process(message4).toByteArray());
333
<a name="l00311"></a>00311 qDebug() << <span class="stringliteral">"AES-CMAC: "</span> << <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
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
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>