Merge remote-tracking branch 'remotes/kraxel/tags/usb-20210122-pull-request' into...
[qemu.git] / tests / test-crypto-xts.c
1 /*
2 * QEMU Crypto XTS cipher mode
3 *
4 * Copyright (c) 2015-2018 Red Hat, Inc.
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18 *
19 * This code is originally derived from public domain / WTFPL code in
20 * LibTomCrypt crytographic library http://libtom.org. The XTS code
21 * was donated by Elliptic Semiconductor Inc (www.ellipticsemi.com)
22 * to the LibTom Projects
23 *
24 */
25
26 #include "qemu/osdep.h"
27 #include "crypto/init.h"
28 #include "crypto/xts.h"
29 #include "crypto/aes.h"
30
31 typedef struct {
32 const char *path;
33 int keylen;
34 unsigned char key1[32];
35 unsigned char key2[32];
36 uint64_t seqnum;
37 unsigned long PTLEN;
38 unsigned char PTX[512], CTX[512];
39 } QCryptoXTSTestData;
40
41 static const QCryptoXTSTestData test_data[] = {
42 /* #1 32 byte key, 32 byte PTX */
43 {
44 "/crypto/xts/t-1-key-32-ptx-32",
45 32,
46 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
47 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
48 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
49 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
50 0,
51 32,
52 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
53 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
54 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
55 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
56 { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
57 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
58 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
59 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
60 },
61
62 /* #2, 32 byte key, 32 byte PTX */
63 {
64 "/crypto/xts/t-2-key-32-ptx-32",
65 32,
66 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
67 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 },
68 { 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
69 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
70 0x3333333333LL,
71 32,
72 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
73 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
74 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
75 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
76 { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
77 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
78 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
79 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
80 },
81
82 /* #5 from xts.7, 32 byte key, 32 byte PTX */
83 {
84 "/crypto/xts/t-5-key-32-ptx-32",
85 32,
86 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
87 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0 },
88 { 0xbf, 0xbe, 0xbd, 0xbc, 0xbb, 0xba, 0xb9, 0xb8,
89 0xb7, 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, 0xb1, 0xb0 },
90 0x123456789aLL,
91 32,
92 { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
93 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
94 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
95 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
96 { 0xb0, 0x1f, 0x86, 0xf8, 0xed, 0xc1, 0x86, 0x37,
97 0x06, 0xfa, 0x8a, 0x42, 0x53, 0xe3, 0x4f, 0x28,
98 0xaf, 0x31, 0x9d, 0xe3, 0x83, 0x34, 0x87, 0x0f,
99 0x4d, 0xd1, 0xf9, 0x4c, 0xbe, 0x98, 0x32, 0xf1 },
100 },
101
102 /* #4, 32 byte key, 512 byte PTX */
103 {
104 "/crypto/xts/t-4-key-32-ptx-512",
105 32,
106 { 0x27, 0x18, 0x28, 0x18, 0x28, 0x45, 0x90, 0x45,
107 0x23, 0x53, 0x60, 0x28, 0x74, 0x71, 0x35, 0x26 },
108 { 0x31, 0x41, 0x59, 0x26, 0x53, 0x58, 0x97, 0x93,
109 0x23, 0x84, 0x62, 0x64, 0x33, 0x83, 0x27, 0x95 },
110 0,
111 512,
112 {
113 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
114 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
115 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
116 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
117 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
118 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
119 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
120 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
121 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
122 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
123 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
124 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
125 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
126 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
127 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
128 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
129 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
130 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
131 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
132 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
133 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
134 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
135 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
136 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
137 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
138 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
139 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
140 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
141 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
142 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
143 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
144 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
145 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
146 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
147 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
148 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
149 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
150 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
151 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
152 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
153 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
154 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
155 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
156 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
157 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
158 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
159 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
160 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
161 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
162 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
163 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
164 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
165 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
166 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
167 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
168 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
169 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
170 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
171 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
172 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
173 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
174 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
175 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
176 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
177 },
178 {
179 0x27, 0xa7, 0x47, 0x9b, 0xef, 0xa1, 0xd4, 0x76,
180 0x48, 0x9f, 0x30, 0x8c, 0xd4, 0xcf, 0xa6, 0xe2,
181 0xa9, 0x6e, 0x4b, 0xbe, 0x32, 0x08, 0xff, 0x25,
182 0x28, 0x7d, 0xd3, 0x81, 0x96, 0x16, 0xe8, 0x9c,
183 0xc7, 0x8c, 0xf7, 0xf5, 0xe5, 0x43, 0x44, 0x5f,
184 0x83, 0x33, 0xd8, 0xfa, 0x7f, 0x56, 0x00, 0x00,
185 0x05, 0x27, 0x9f, 0xa5, 0xd8, 0xb5, 0xe4, 0xad,
186 0x40, 0xe7, 0x36, 0xdd, 0xb4, 0xd3, 0x54, 0x12,
187 0x32, 0x80, 0x63, 0xfd, 0x2a, 0xab, 0x53, 0xe5,
188 0xea, 0x1e, 0x0a, 0x9f, 0x33, 0x25, 0x00, 0xa5,
189 0xdf, 0x94, 0x87, 0xd0, 0x7a, 0x5c, 0x92, 0xcc,
190 0x51, 0x2c, 0x88, 0x66, 0xc7, 0xe8, 0x60, 0xce,
191 0x93, 0xfd, 0xf1, 0x66, 0xa2, 0x49, 0x12, 0xb4,
192 0x22, 0x97, 0x61, 0x46, 0xae, 0x20, 0xce, 0x84,
193 0x6b, 0xb7, 0xdc, 0x9b, 0xa9, 0x4a, 0x76, 0x7a,
194 0xae, 0xf2, 0x0c, 0x0d, 0x61, 0xad, 0x02, 0x65,
195 0x5e, 0xa9, 0x2d, 0xc4, 0xc4, 0xe4, 0x1a, 0x89,
196 0x52, 0xc6, 0x51, 0xd3, 0x31, 0x74, 0xbe, 0x51,
197 0xa1, 0x0c, 0x42, 0x11, 0x10, 0xe6, 0xd8, 0x15,
198 0x88, 0xed, 0xe8, 0x21, 0x03, 0xa2, 0x52, 0xd8,
199 0xa7, 0x50, 0xe8, 0x76, 0x8d, 0xef, 0xff, 0xed,
200 0x91, 0x22, 0x81, 0x0a, 0xae, 0xb9, 0x9f, 0x91,
201 0x72, 0xaf, 0x82, 0xb6, 0x04, 0xdc, 0x4b, 0x8e,
202 0x51, 0xbc, 0xb0, 0x82, 0x35, 0xa6, 0xf4, 0x34,
203 0x13, 0x32, 0xe4, 0xca, 0x60, 0x48, 0x2a, 0x4b,
204 0xa1, 0xa0, 0x3b, 0x3e, 0x65, 0x00, 0x8f, 0xc5,
205 0xda, 0x76, 0xb7, 0x0b, 0xf1, 0x69, 0x0d, 0xb4,
206 0xea, 0xe2, 0x9c, 0x5f, 0x1b, 0xad, 0xd0, 0x3c,
207 0x5c, 0xcf, 0x2a, 0x55, 0xd7, 0x05, 0xdd, 0xcd,
208 0x86, 0xd4, 0x49, 0x51, 0x1c, 0xeb, 0x7e, 0xc3,
209 0x0b, 0xf1, 0x2b, 0x1f, 0xa3, 0x5b, 0x91, 0x3f,
210 0x9f, 0x74, 0x7a, 0x8a, 0xfd, 0x1b, 0x13, 0x0e,
211 0x94, 0xbf, 0xf9, 0x4e, 0xff, 0xd0, 0x1a, 0x91,
212 0x73, 0x5c, 0xa1, 0x72, 0x6a, 0xcd, 0x0b, 0x19,
213 0x7c, 0x4e, 0x5b, 0x03, 0x39, 0x36, 0x97, 0xe1,
214 0x26, 0x82, 0x6f, 0xb6, 0xbb, 0xde, 0x8e, 0xcc,
215 0x1e, 0x08, 0x29, 0x85, 0x16, 0xe2, 0xc9, 0xed,
216 0x03, 0xff, 0x3c, 0x1b, 0x78, 0x60, 0xf6, 0xde,
217 0x76, 0xd4, 0xce, 0xcd, 0x94, 0xc8, 0x11, 0x98,
218 0x55, 0xef, 0x52, 0x97, 0xca, 0x67, 0xe9, 0xf3,
219 0xe7, 0xff, 0x72, 0xb1, 0xe9, 0x97, 0x85, 0xca,
220 0x0a, 0x7e, 0x77, 0x20, 0xc5, 0xb3, 0x6d, 0xc6,
221 0xd7, 0x2c, 0xac, 0x95, 0x74, 0xc8, 0xcb, 0xbc,
222 0x2f, 0x80, 0x1e, 0x23, 0xe5, 0x6f, 0xd3, 0x44,
223 0xb0, 0x7f, 0x22, 0x15, 0x4b, 0xeb, 0xa0, 0xf0,
224 0x8c, 0xe8, 0x89, 0x1e, 0x64, 0x3e, 0xd9, 0x95,
225 0xc9, 0x4d, 0x9a, 0x69, 0xc9, 0xf1, 0xb5, 0xf4,
226 0x99, 0x02, 0x7a, 0x78, 0x57, 0x2a, 0xee, 0xbd,
227 0x74, 0xd2, 0x0c, 0xc3, 0x98, 0x81, 0xc2, 0x13,
228 0xee, 0x77, 0x0b, 0x10, 0x10, 0xe4, 0xbe, 0xa7,
229 0x18, 0x84, 0x69, 0x77, 0xae, 0x11, 0x9f, 0x7a,
230 0x02, 0x3a, 0xb5, 0x8c, 0xca, 0x0a, 0xd7, 0x52,
231 0xaf, 0xe6, 0x56, 0xbb, 0x3c, 0x17, 0x25, 0x6a,
232 0x9f, 0x6e, 0x9b, 0xf1, 0x9f, 0xdd, 0x5a, 0x38,
233 0xfc, 0x82, 0xbb, 0xe8, 0x72, 0xc5, 0x53, 0x9e,
234 0xdb, 0x60, 0x9e, 0xf4, 0xf7, 0x9c, 0x20, 0x3e,
235 0xbb, 0x14, 0x0f, 0x2e, 0x58, 0x3c, 0xb2, 0xad,
236 0x15, 0xb4, 0xaa, 0x5b, 0x65, 0x50, 0x16, 0xa8,
237 0x44, 0x92, 0x77, 0xdb, 0xd4, 0x77, 0xef, 0x2c,
238 0x8d, 0x6c, 0x01, 0x7d, 0xb7, 0x38, 0xb1, 0x8d,
239 0xeb, 0x4a, 0x42, 0x7d, 0x19, 0x23, 0xce, 0x3f,
240 0xf2, 0x62, 0x73, 0x57, 0x79, 0xa4, 0x18, 0xf2,
241 0x0a, 0x28, 0x2d, 0xf9, 0x20, 0x14, 0x7b, 0xea,
242 0xbe, 0x42, 0x1e, 0xe5, 0x31, 0x9d, 0x05, 0x68,
243 }
244 },
245
246 /* #7, 32 byte key, 17 byte PTX */
247 {
248 "/crypto/xts/t-7-key-32-ptx-17",
249 32,
250 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
251 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0 },
252 { 0xbf, 0xbe, 0xbd, 0xbc, 0xbb, 0xba, 0xb9, 0xb8,
253 0xb7, 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, 0xb1, 0xb0 },
254 0x123456789aLL,
255 17,
256 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
257 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 },
258 { 0x6c, 0x16, 0x25, 0xdb, 0x46, 0x71, 0x52, 0x2d,
259 0x3d, 0x75, 0x99, 0x60, 0x1d, 0xe7, 0xca, 0x09, 0xed },
260 },
261
262 /* #15, 32 byte key, 25 byte PTX */
263 {
264 "/crypto/xts/t-15-key-32-ptx-25",
265 32,
266 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
267 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0 },
268 { 0xbf, 0xbe, 0xbd, 0xbc, 0xbb, 0xba, 0xb9, 0xb8,
269 0xb7, 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, 0xb1, 0xb0 },
270 0x123456789aLL,
271 25,
272 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
273 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
274 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18 },
275 { 0x8f, 0x4d, 0xcb, 0xad, 0x55, 0x55, 0x8d, 0x7b,
276 0x4e, 0x01, 0xd9, 0x37, 0x9c, 0xd4, 0xea, 0x22,
277 0xed, 0xbf, 0x9d, 0xac, 0xe4, 0x5d, 0x6f, 0x6a, 0x73 },
278 },
279
280 /* #21, 32 byte key, 31 byte PTX */
281 {
282 "/crypto/xts/t-21-key-32-ptx-31",
283 32,
284 { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
285 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0 },
286 { 0xbf, 0xbe, 0xbd, 0xbc, 0xbb, 0xba, 0xb9, 0xb8,
287 0xb7, 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, 0xb1, 0xb0 },
288 0x123456789aLL,
289 31,
290 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
291 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
292 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
293 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e },
294 { 0xd0, 0x5b, 0xc0, 0x90, 0xa8, 0xe0, 0x4f, 0x1b,
295 0x3d, 0x3e, 0xcd, 0xd5, 0xba, 0xec, 0x0f, 0xd4,
296 0xed, 0xbf, 0x9d, 0xac, 0xe4, 0x5d, 0x6f, 0x6a,
297 0x73, 0x06, 0xe6, 0x4b, 0xe5, 0xdd, 0x82 },
298 },
299 };
300
301 #define STORE64L(x, y) \
302 do { \
303 (y)[7] = (unsigned char)(((x) >> 56) & 255); \
304 (y)[6] = (unsigned char)(((x) >> 48) & 255); \
305 (y)[5] = (unsigned char)(((x) >> 40) & 255); \
306 (y)[4] = (unsigned char)(((x) >> 32) & 255); \
307 (y)[3] = (unsigned char)(((x) >> 24) & 255); \
308 (y)[2] = (unsigned char)(((x) >> 16) & 255); \
309 (y)[1] = (unsigned char)(((x) >> 8) & 255); \
310 (y)[0] = (unsigned char)((x) & 255); \
311 } while (0)
312
313 struct TestAES {
314 AES_KEY enc;
315 AES_KEY dec;
316 };
317
318 static void test_xts_aes_encrypt(const void *ctx,
319 size_t length,
320 uint8_t *dst,
321 const uint8_t *src)
322 {
323 const struct TestAES *aesctx = ctx;
324
325 AES_encrypt(src, dst, &aesctx->enc);
326 }
327
328
329 static void test_xts_aes_decrypt(const void *ctx,
330 size_t length,
331 uint8_t *dst,
332 const uint8_t *src)
333 {
334 const struct TestAES *aesctx = ctx;
335
336 AES_decrypt(src, dst, &aesctx->dec);
337 }
338
339
340 static void test_xts(const void *opaque)
341 {
342 const QCryptoXTSTestData *data = opaque;
343 uint8_t out[512], Torg[16], T[16];
344 uint64_t seq;
345 struct TestAES aesdata;
346 struct TestAES aestweak;
347
348 AES_set_encrypt_key(data->key1, data->keylen / 2 * 8, &aesdata.enc);
349 AES_set_decrypt_key(data->key1, data->keylen / 2 * 8, &aesdata.dec);
350 AES_set_encrypt_key(data->key2, data->keylen / 2 * 8, &aestweak.enc);
351 AES_set_decrypt_key(data->key2, data->keylen / 2 * 8, &aestweak.dec);
352
353 seq = data->seqnum;
354 STORE64L(seq, Torg);
355 memset(Torg + 8, 0, 8);
356
357 memcpy(T, Torg, sizeof(T));
358 xts_encrypt(&aesdata, &aestweak,
359 test_xts_aes_encrypt,
360 test_xts_aes_decrypt,
361 T, data->PTLEN, out, data->PTX);
362
363 g_assert(memcmp(out, data->CTX, data->PTLEN) == 0);
364
365 memcpy(T, Torg, sizeof(T));
366 xts_decrypt(&aesdata, &aestweak,
367 test_xts_aes_encrypt,
368 test_xts_aes_decrypt,
369 T, data->PTLEN, out, data->CTX);
370
371 g_assert(memcmp(out, data->PTX, data->PTLEN) == 0);
372 }
373
374
375 static void test_xts_split(const void *opaque)
376 {
377 const QCryptoXTSTestData *data = opaque;
378 uint8_t out[512], Torg[16], T[16];
379 uint64_t seq;
380 unsigned long len = data->PTLEN / 2;
381 struct TestAES aesdata;
382 struct TestAES aestweak;
383
384 AES_set_encrypt_key(data->key1, data->keylen / 2 * 8, &aesdata.enc);
385 AES_set_decrypt_key(data->key1, data->keylen / 2 * 8, &aesdata.dec);
386 AES_set_encrypt_key(data->key2, data->keylen / 2 * 8, &aestweak.enc);
387 AES_set_decrypt_key(data->key2, data->keylen / 2 * 8, &aestweak.dec);
388
389 seq = data->seqnum;
390 STORE64L(seq, Torg);
391 memset(Torg + 8, 0, 8);
392
393 memcpy(T, Torg, sizeof(T));
394 xts_encrypt(&aesdata, &aestweak,
395 test_xts_aes_encrypt,
396 test_xts_aes_decrypt,
397 T, len, out, data->PTX);
398 xts_encrypt(&aesdata, &aestweak,
399 test_xts_aes_encrypt,
400 test_xts_aes_decrypt,
401 T, len, &out[len], &data->PTX[len]);
402
403 g_assert(memcmp(out, data->CTX, data->PTLEN) == 0);
404
405 memcpy(T, Torg, sizeof(T));
406 xts_decrypt(&aesdata, &aestweak,
407 test_xts_aes_encrypt,
408 test_xts_aes_decrypt,
409 T, len, out, data->CTX);
410 xts_decrypt(&aesdata, &aestweak,
411 test_xts_aes_encrypt,
412 test_xts_aes_decrypt,
413 T, len, &out[len], &data->CTX[len]);
414
415 g_assert(memcmp(out, data->PTX, data->PTLEN) == 0);
416 }
417
418
419 static void test_xts_unaligned(const void *opaque)
420 {
421 #define BAD_ALIGN 3
422 const QCryptoXTSTestData *data = opaque;
423 uint8_t in[512 + BAD_ALIGN], out[512 + BAD_ALIGN];
424 uint8_t Torg[16], T[16 + BAD_ALIGN];
425 uint64_t seq;
426 struct TestAES aesdata;
427 struct TestAES aestweak;
428
429 AES_set_encrypt_key(data->key1, data->keylen / 2 * 8, &aesdata.enc);
430 AES_set_decrypt_key(data->key1, data->keylen / 2 * 8, &aesdata.dec);
431 AES_set_encrypt_key(data->key2, data->keylen / 2 * 8, &aestweak.enc);
432 AES_set_decrypt_key(data->key2, data->keylen / 2 * 8, &aestweak.dec);
433
434 seq = data->seqnum;
435 STORE64L(seq, Torg);
436 memset(Torg + 8, 0, 8);
437
438 /* IV not aligned */
439 memcpy(T + BAD_ALIGN, Torg, 16);
440 memcpy(in, data->PTX, data->PTLEN);
441 xts_encrypt(&aesdata, &aestweak,
442 test_xts_aes_encrypt,
443 test_xts_aes_decrypt,
444 T + BAD_ALIGN, data->PTLEN, out, in);
445
446 g_assert(memcmp(out, data->CTX, data->PTLEN) == 0);
447
448 /* plain text not aligned */
449 memcpy(T, Torg, 16);
450 memcpy(in + BAD_ALIGN, data->PTX, data->PTLEN);
451 xts_encrypt(&aesdata, &aestweak,
452 test_xts_aes_encrypt,
453 test_xts_aes_decrypt,
454 T, data->PTLEN, out, in + BAD_ALIGN);
455
456 g_assert(memcmp(out, data->CTX, data->PTLEN) == 0);
457
458 /* cipher text not aligned */
459 memcpy(T, Torg, 16);
460 memcpy(in, data->PTX, data->PTLEN);
461 xts_encrypt(&aesdata, &aestweak,
462 test_xts_aes_encrypt,
463 test_xts_aes_decrypt,
464 T, data->PTLEN, out + BAD_ALIGN, in);
465
466 g_assert(memcmp(out + BAD_ALIGN, data->CTX, data->PTLEN) == 0);
467
468
469 /* IV not aligned */
470 memcpy(T + BAD_ALIGN, Torg, 16);
471 memcpy(in, data->CTX, data->PTLEN);
472 xts_decrypt(&aesdata, &aestweak,
473 test_xts_aes_encrypt,
474 test_xts_aes_decrypt,
475 T + BAD_ALIGN, data->PTLEN, out, in);
476
477 g_assert(memcmp(out, data->PTX, data->PTLEN) == 0);
478
479 /* cipher text not aligned */
480 memcpy(T, Torg, 16);
481 memcpy(in + BAD_ALIGN, data->CTX, data->PTLEN);
482 xts_decrypt(&aesdata, &aestweak,
483 test_xts_aes_encrypt,
484 test_xts_aes_decrypt,
485 T, data->PTLEN, out, in + BAD_ALIGN);
486
487 g_assert(memcmp(out, data->PTX, data->PTLEN) == 0);
488
489 /* plain text not aligned */
490 memcpy(T, Torg, 16);
491 memcpy(in, data->CTX, data->PTLEN);
492 xts_decrypt(&aesdata, &aestweak,
493 test_xts_aes_encrypt,
494 test_xts_aes_decrypt,
495 T, data->PTLEN, out + BAD_ALIGN, in);
496
497 g_assert(memcmp(out + BAD_ALIGN, data->PTX, data->PTLEN) == 0);
498 }
499
500
501 int main(int argc, char **argv)
502 {
503 size_t i;
504
505 g_test_init(&argc, &argv, NULL);
506
507 g_assert(qcrypto_init(NULL) == 0);
508
509 for (i = 0; i < G_N_ELEMENTS(test_data); i++) {
510 gchar *path = g_strdup_printf("%s/basic", test_data[i].path);
511 g_test_add_data_func(path, &test_data[i], test_xts);
512 g_free(path);
513
514 /* skip the cases where the length is smaller than 2*blocklen
515 * or the length is not a multiple of 32
516 */
517 if ((test_data[i].PTLEN >= 32) && !(test_data[i].PTLEN % 32)) {
518 path = g_strdup_printf("%s/split", test_data[i].path);
519 g_test_add_data_func(path, &test_data[i], test_xts_split);
520 g_free(path);
521 }
522
523 path = g_strdup_printf("%s/unaligned", test_data[i].path);
524 g_test_add_data_func(path, &test_data[i], test_xts_unaligned);
525 g_free(path);
526 }
527
528 return g_test_run();
529 }