1da668aa1SThomas Huth /*
2da668aa1SThomas Huth * QEMU Crypto cipher algorithms
3da668aa1SThomas Huth *
4da668aa1SThomas Huth * Copyright (c) 2015 Red Hat, Inc.
5da668aa1SThomas Huth *
6da668aa1SThomas Huth * This library is free software; you can redistribute it and/or
7da668aa1SThomas Huth * modify it under the terms of the GNU Lesser General Public
8da668aa1SThomas Huth * License as published by the Free Software Foundation; either
9da668aa1SThomas Huth * version 2.1 of the License, or (at your option) any later version.
10da668aa1SThomas Huth *
11da668aa1SThomas Huth * This library is distributed in the hope that it will be useful,
12da668aa1SThomas Huth * but WITHOUT ANY WARRANTY; without even the implied warranty of
13da668aa1SThomas Huth * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14da668aa1SThomas Huth * Lesser General Public License for more details.
15da668aa1SThomas Huth *
16da668aa1SThomas Huth * You should have received a copy of the GNU Lesser General Public
17da668aa1SThomas Huth * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18da668aa1SThomas Huth *
19da668aa1SThomas Huth */
20da668aa1SThomas Huth
21da668aa1SThomas Huth #include "qemu/osdep.h"
22da668aa1SThomas Huth
23da668aa1SThomas Huth #include "crypto/init.h"
24da668aa1SThomas Huth #include "crypto/cipher.h"
25da668aa1SThomas Huth #include "qapi/error.h"
26da668aa1SThomas Huth
27da668aa1SThomas Huth typedef struct QCryptoCipherTestData QCryptoCipherTestData;
28da668aa1SThomas Huth struct QCryptoCipherTestData {
29da668aa1SThomas Huth const char *path;
30*a092c513SMarkus Armbruster QCryptoCipherAlgo alg;
31da668aa1SThomas Huth QCryptoCipherMode mode;
32da668aa1SThomas Huth const char *key;
33da668aa1SThomas Huth const char *plaintext;
34da668aa1SThomas Huth const char *ciphertext;
35da668aa1SThomas Huth const char *iv;
36da668aa1SThomas Huth };
37da668aa1SThomas Huth
38da668aa1SThomas Huth /* AES test data comes from appendix F of:
39da668aa1SThomas Huth *
40da668aa1SThomas Huth * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
41da668aa1SThomas Huth */
42da668aa1SThomas Huth static QCryptoCipherTestData test_data[] = {
43da668aa1SThomas Huth {
44da668aa1SThomas Huth /* NIST F.1.1 ECB-AES128.Encrypt */
45da668aa1SThomas Huth .path = "/crypto/cipher/aes-ecb-128",
46*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_AES_128,
47da668aa1SThomas Huth .mode = QCRYPTO_CIPHER_MODE_ECB,
48da668aa1SThomas Huth .key = "2b7e151628aed2a6abf7158809cf4f3c",
49da668aa1SThomas Huth .plaintext =
50da668aa1SThomas Huth "6bc1bee22e409f96e93d7e117393172a"
51da668aa1SThomas Huth "ae2d8a571e03ac9c9eb76fac45af8e51"
52da668aa1SThomas Huth "30c81c46a35ce411e5fbc1191a0a52ef"
53da668aa1SThomas Huth "f69f2445df4f9b17ad2b417be66c3710",
54da668aa1SThomas Huth .ciphertext =
55da668aa1SThomas Huth "3ad77bb40d7a3660a89ecaf32466ef97"
56da668aa1SThomas Huth "f5d3d58503b9699de785895a96fdbaaf"
57da668aa1SThomas Huth "43b1cd7f598ece23881b00e3ed030688"
58da668aa1SThomas Huth "7b0c785e27e8ad3f8223207104725dd4"
59da668aa1SThomas Huth },
60da668aa1SThomas Huth {
61da668aa1SThomas Huth /* NIST F.1.3 ECB-AES192.Encrypt */
62da668aa1SThomas Huth .path = "/crypto/cipher/aes-ecb-192",
63*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_AES_192,
64da668aa1SThomas Huth .mode = QCRYPTO_CIPHER_MODE_ECB,
65da668aa1SThomas Huth .key = "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b",
66da668aa1SThomas Huth .plaintext =
67da668aa1SThomas Huth "6bc1bee22e409f96e93d7e117393172a"
68da668aa1SThomas Huth "ae2d8a571e03ac9c9eb76fac45af8e51"
69da668aa1SThomas Huth "30c81c46a35ce411e5fbc1191a0a52ef"
70da668aa1SThomas Huth "f69f2445df4f9b17ad2b417be66c3710",
71da668aa1SThomas Huth .ciphertext =
72da668aa1SThomas Huth "bd334f1d6e45f25ff712a214571fa5cc"
73da668aa1SThomas Huth "974104846d0ad3ad7734ecb3ecee4eef"
74da668aa1SThomas Huth "ef7afd2270e2e60adce0ba2face6444e"
75da668aa1SThomas Huth "9a4b41ba738d6c72fb16691603c18e0e"
76da668aa1SThomas Huth },
77da668aa1SThomas Huth {
78da668aa1SThomas Huth /* NIST F.1.5 ECB-AES256.Encrypt */
79da668aa1SThomas Huth .path = "/crypto/cipher/aes-ecb-256",
80*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_AES_256,
81da668aa1SThomas Huth .mode = QCRYPTO_CIPHER_MODE_ECB,
82da668aa1SThomas Huth .key =
83da668aa1SThomas Huth "603deb1015ca71be2b73aef0857d7781"
84da668aa1SThomas Huth "1f352c073b6108d72d9810a30914dff4",
85da668aa1SThomas Huth .plaintext =
86da668aa1SThomas Huth "6bc1bee22e409f96e93d7e117393172a"
87da668aa1SThomas Huth "ae2d8a571e03ac9c9eb76fac45af8e51"
88da668aa1SThomas Huth "30c81c46a35ce411e5fbc1191a0a52ef"
89da668aa1SThomas Huth "f69f2445df4f9b17ad2b417be66c3710",
90da668aa1SThomas Huth .ciphertext =
91da668aa1SThomas Huth "f3eed1bdb5d2a03c064b5a7e3db181f8"
92da668aa1SThomas Huth "591ccb10d410ed26dc5ba74a31362870"
93da668aa1SThomas Huth "b6ed21b99ca6f4f9f153e7b1beafed1d"
94da668aa1SThomas Huth "23304b7a39f9f3ff067d8d8f9e24ecc7",
95da668aa1SThomas Huth },
96da668aa1SThomas Huth {
97da668aa1SThomas Huth /* NIST F.2.1 CBC-AES128.Encrypt */
98da668aa1SThomas Huth .path = "/crypto/cipher/aes-cbc-128",
99*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_AES_128,
100da668aa1SThomas Huth .mode = QCRYPTO_CIPHER_MODE_CBC,
101da668aa1SThomas Huth .key = "2b7e151628aed2a6abf7158809cf4f3c",
102da668aa1SThomas Huth .iv = "000102030405060708090a0b0c0d0e0f",
103da668aa1SThomas Huth .plaintext =
104da668aa1SThomas Huth "6bc1bee22e409f96e93d7e117393172a"
105da668aa1SThomas Huth "ae2d8a571e03ac9c9eb76fac45af8e51"
106da668aa1SThomas Huth "30c81c46a35ce411e5fbc1191a0a52ef"
107da668aa1SThomas Huth "f69f2445df4f9b17ad2b417be66c3710",
108da668aa1SThomas Huth .ciphertext =
109da668aa1SThomas Huth "7649abac8119b246cee98e9b12e9197d"
110da668aa1SThomas Huth "5086cb9b507219ee95db113a917678b2"
111da668aa1SThomas Huth "73bed6b8e3c1743b7116e69e22229516"
112da668aa1SThomas Huth "3ff1caa1681fac09120eca307586e1a7",
113da668aa1SThomas Huth },
114da668aa1SThomas Huth {
115da668aa1SThomas Huth /* NIST F.2.3 CBC-AES128.Encrypt */
116da668aa1SThomas Huth .path = "/crypto/cipher/aes-cbc-192",
117*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_AES_192,
118da668aa1SThomas Huth .mode = QCRYPTO_CIPHER_MODE_CBC,
119da668aa1SThomas Huth .key = "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b",
120da668aa1SThomas Huth .iv = "000102030405060708090a0b0c0d0e0f",
121da668aa1SThomas Huth .plaintext =
122da668aa1SThomas Huth "6bc1bee22e409f96e93d7e117393172a"
123da668aa1SThomas Huth "ae2d8a571e03ac9c9eb76fac45af8e51"
124da668aa1SThomas Huth "30c81c46a35ce411e5fbc1191a0a52ef"
125da668aa1SThomas Huth "f69f2445df4f9b17ad2b417be66c3710",
126da668aa1SThomas Huth .ciphertext =
127da668aa1SThomas Huth "4f021db243bc633d7178183a9fa071e8"
128da668aa1SThomas Huth "b4d9ada9ad7dedf4e5e738763f69145a"
129da668aa1SThomas Huth "571b242012fb7ae07fa9baac3df102e0"
130da668aa1SThomas Huth "08b0e27988598881d920a9e64f5615cd",
131da668aa1SThomas Huth },
132da668aa1SThomas Huth {
133da668aa1SThomas Huth /* NIST F.2.5 CBC-AES128.Encrypt */
134da668aa1SThomas Huth .path = "/crypto/cipher/aes-cbc-256",
135*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_AES_256,
136da668aa1SThomas Huth .mode = QCRYPTO_CIPHER_MODE_CBC,
137da668aa1SThomas Huth .key =
138da668aa1SThomas Huth "603deb1015ca71be2b73aef0857d7781"
139da668aa1SThomas Huth "1f352c073b6108d72d9810a30914dff4",
140da668aa1SThomas Huth .iv = "000102030405060708090a0b0c0d0e0f",
141da668aa1SThomas Huth .plaintext =
142da668aa1SThomas Huth "6bc1bee22e409f96e93d7e117393172a"
143da668aa1SThomas Huth "ae2d8a571e03ac9c9eb76fac45af8e51"
144da668aa1SThomas Huth "30c81c46a35ce411e5fbc1191a0a52ef"
145da668aa1SThomas Huth "f69f2445df4f9b17ad2b417be66c3710",
146da668aa1SThomas Huth .ciphertext =
147da668aa1SThomas Huth "f58c4c04d6e5f1ba779eabfb5f7bfbd6"
148da668aa1SThomas Huth "9cfc4e967edb808d679f777bc6702c7d"
149da668aa1SThomas Huth "39f23369a9d9bacfa530e26304231461"
150da668aa1SThomas Huth "b2eb05e2c39be9fcda6c19078c6a9d1b",
151da668aa1SThomas Huth },
152da668aa1SThomas Huth {
153f8157e10SDaniel P. Berrangé /*
154f8157e10SDaniel P. Berrangé * Testing 'password' as plaintext fits
155f8157e10SDaniel P. Berrangé * in single AES block, and gives identical
156f8157e10SDaniel P. Berrangé * ciphertext in ECB and CBC modes
157f8157e10SDaniel P. Berrangé */
15883bee4b5SDaniel P. Berrangé .path = "/crypto/cipher/des-ecb-56-one-block",
159*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_DES,
160f8157e10SDaniel P. Berrangé .mode = QCRYPTO_CIPHER_MODE_ECB,
16183bee4b5SDaniel P. Berrangé .key = "80c4a2e691d5b3f7",
162f8157e10SDaniel P. Berrangé .plaintext = "70617373776f7264",
163f8157e10SDaniel P. Berrangé .ciphertext = "73fa80b66134e403",
164f8157e10SDaniel P. Berrangé },
165f8157e10SDaniel P. Berrangé {
166f8157e10SDaniel P. Berrangé /* See previous comment */
16783bee4b5SDaniel P. Berrangé .path = "/crypto/cipher/des-cbc-56-one-block",
168*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_DES,
169f8157e10SDaniel P. Berrangé .mode = QCRYPTO_CIPHER_MODE_CBC,
17083bee4b5SDaniel P. Berrangé .key = "80c4a2e691d5b3f7",
171f8157e10SDaniel P. Berrangé .iv = "0000000000000000",
172f8157e10SDaniel P. Berrangé .plaintext = "70617373776f7264",
173f8157e10SDaniel P. Berrangé .ciphertext = "73fa80b66134e403",
174f8157e10SDaniel P. Berrangé },
175f8157e10SDaniel P. Berrangé {
17683bee4b5SDaniel P. Berrangé .path = "/crypto/cipher/des-ecb-56",
177*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_DES,
178da668aa1SThomas Huth .mode = QCRYPTO_CIPHER_MODE_ECB,
17983bee4b5SDaniel P. Berrangé .key = "80c4a2e691d5b3f7",
180da668aa1SThomas Huth .plaintext =
181da668aa1SThomas Huth "6bc1bee22e409f96e93d7e117393172a"
182da668aa1SThomas Huth "ae2d8a571e03ac9c9eb76fac45af8e51"
183da668aa1SThomas Huth "30c81c46a35ce411e5fbc1191a0a52ef"
184da668aa1SThomas Huth "f69f2445df4f9b17ad2b417be66c3710",
185da668aa1SThomas Huth .ciphertext =
186da668aa1SThomas Huth "8f346aaf64eaf24040720d80648c52e7"
187da668aa1SThomas Huth "aefc616be53ab1a3d301e69d91e01838"
188da668aa1SThomas Huth "ffd29f1bb5596ad94ea2d8e6196b7f09"
189da668aa1SThomas Huth "30d8ed0bf2773af36dd82a6280c20926",
190da668aa1SThomas Huth },
191da668aa1SThomas Huth {
192da668aa1SThomas Huth /* Borrowed from linux-kernel crypto/testmgr.h */
193da668aa1SThomas Huth .path = "/crypto/cipher/3des-cbc",
194*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_3DES,
195da668aa1SThomas Huth .mode = QCRYPTO_CIPHER_MODE_CBC,
196da668aa1SThomas Huth .key =
197da668aa1SThomas Huth "e9c0ff2e760b6424444d995a12d640c0"
198da668aa1SThomas Huth "eac284e81495dbe8",
199da668aa1SThomas Huth .iv =
200da668aa1SThomas Huth "7d3388930f93b242",
201da668aa1SThomas Huth .plaintext =
202da668aa1SThomas Huth "6f54206f614d796e5320636565727374"
203da668aa1SThomas Huth "54206f6f4d206e612079655372637465"
204da668aa1SThomas Huth "20736f54206f614d796e532063656572"
205da668aa1SThomas Huth "737454206f6f4d206e61207965537263"
206da668aa1SThomas Huth "746520736f54206f614d796e53206365"
207da668aa1SThomas Huth "6572737454206f6f4d206e6120796553"
208da668aa1SThomas Huth "7263746520736f54206f614d796e5320"
209da668aa1SThomas Huth "63656572737454206f6f4d206e610a79",
210da668aa1SThomas Huth .ciphertext =
211da668aa1SThomas Huth "0e2db6973c5633f4671721c76e8ad549"
212da668aa1SThomas Huth "74b34905c51cd0ed12565c5396b6007d"
213da668aa1SThomas Huth "9048fcf58d2939cc8ad5351836234ed7"
214da668aa1SThomas Huth "76d1da0c9467bb048bf2036ca8cfb6ea"
215da668aa1SThomas Huth "226447aa8f7513bf9fc2c3f0c956c57a"
216da668aa1SThomas Huth "71632e897b1e12cae25fafd8a4f8c97a"
217da668aa1SThomas Huth "d6f92131624445a6d6bc5ad32d5443cc"
218da668aa1SThomas Huth "9ddea570e942458a6bfab19113b0d919",
219da668aa1SThomas Huth },
220da668aa1SThomas Huth {
221da668aa1SThomas Huth /* Borrowed from linux-kernel crypto/testmgr.h */
222da668aa1SThomas Huth .path = "/crypto/cipher/3des-ecb",
223*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_3DES,
224da668aa1SThomas Huth .mode = QCRYPTO_CIPHER_MODE_ECB,
225da668aa1SThomas Huth .key =
226da668aa1SThomas Huth "0123456789abcdef5555555555555555"
227da668aa1SThomas Huth "fedcba9876543210",
228da668aa1SThomas Huth .plaintext =
229da668aa1SThomas Huth "736f6d6564617461",
230da668aa1SThomas Huth .ciphertext =
231da668aa1SThomas Huth "18d748e563620572",
232da668aa1SThomas Huth },
233da668aa1SThomas Huth {
234da668aa1SThomas Huth /* Borrowed from linux-kernel crypto/testmgr.h */
235da668aa1SThomas Huth .path = "/crypto/cipher/3des-ctr",
236*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_3DES,
237da668aa1SThomas Huth .mode = QCRYPTO_CIPHER_MODE_CTR,
238da668aa1SThomas Huth .key =
239da668aa1SThomas Huth "9cd6f39cb95a67005a67002dceeb2dce"
240da668aa1SThomas Huth "ebb45172b451721f",
241da668aa1SThomas Huth .iv =
242da668aa1SThomas Huth "ffffffffffffffff",
243da668aa1SThomas Huth .plaintext =
244da668aa1SThomas Huth "05ec77fb42d559208b128669f05bcf56"
245da668aa1SThomas Huth "39ad349f66ea7dc448d3ba0db118e34a"
246da668aa1SThomas Huth "fe41285c278e11856cf75ec2553ca00b"
247da668aa1SThomas Huth "9265e970db4fd6b900b41fe649fd442f"
248da668aa1SThomas Huth "533a8d149863ca5dc1a833a70e9178ec"
249da668aa1SThomas Huth "77de42d5bc078b12e54cf05b22563980"
250da668aa1SThomas Huth "6b9f66c950c4af36ba0d947fe34add41"
251da668aa1SThomas Huth "28b31a8e11f843f75e21553c876e9265"
252da668aa1SThomas Huth "cc57dba235b900eb72e649d0442fb619"
253da668aa1SThomas Huth "8d14ff46ca5d24a8339a6d9178c377de"
254da668aa1SThomas Huth "a108bc07ee71e54cd75b22b51c806bf2"
255da668aa1SThomas Huth "45c9503baf369960947fc64adda40fb3"
256da668aa1SThomas Huth "1aed74f8432a5e218813876ef158cc57"
257da668aa1SThomas Huth "3ea2359c67eb72c549d0bb02b619e04b"
258da668aa1SThomas Huth "ff46295d248f169a6df45fc3aa3da108"
259da668aa1SThomas Huth "937aee71d84cd7be01b51ce74ef2452c"
260da668aa1SThomas Huth "503b82159960cb52c6a930a40f9679ed"
261da668aa1SThomas Huth "74df432abd048813fa4df15823573e81"
262da668aa1SThomas Huth "689c67ce51c5ac37bb02957ce04bd246"
263da668aa1SThomas Huth "29b01b8f16f940f45f26aa3d846f937a"
264da668aa1SThomas Huth "cd54d8a30abe01e873e74ed1452cb71e"
265da668aa1SThomas Huth "8215fc47cb5225a9309b629679c074df"
266da668aa1SThomas Huth "a609bd04ef76fa4dd458238a1d8168f3"
267da668aa1SThomas Huth "5ace5138ac379e61957cc74bd2a50cb0"
268da668aa1SThomas Huth "1be275f9402b5f268910846ff659cd54"
269da668aa1SThomas Huth "3fa30a9d64e873da4ed1b803b71ee148"
270da668aa1SThomas Huth "fc472e52258c179b62f55cc0ab32a609"
271da668aa1SThomas Huth "907bef76d94dd4bf068a1de44ff35a2d"
272da668aa1SThomas Huth "5138836a9e61c853c7ae31a50c977ee2"
273da668aa1SThomas Huth "75dc402bb2058910fb42f65920543f86"
274da668aa1SThomas Huth "699d64cf56daad34b803ea7de148d347",
275da668aa1SThomas Huth .ciphertext =
276da668aa1SThomas Huth "07c20820721f49ef19cd6f3253052215"
277da668aa1SThomas Huth "a2852bdb85d2d8b9dd0d1b45cb6911d4"
278da668aa1SThomas Huth "eabeb2455d0caebea0c127ac659f537e"
279da668aa1SThomas Huth "afc21bb5b86d360c25c0f86d0b2901da"
280da668aa1SThomas Huth "1378dc89121243faf612ef8d87627883"
281da668aa1SThomas Huth "e2be41204c6d351bd10c30cfe2de2b03"
282da668aa1SThomas Huth "bf4573d4e55995d1b39b276297bdde7f"
283da668aa1SThomas Huth "a4d23980aa5023f074883da86a18793b"
284da668aa1SThomas Huth "c4966c8d2240926ed6ad2a1fde63c0e7"
285da668aa1SThomas Huth "07f72df7b5f3f0cc017c2a9bc210caaa"
286da668aa1SThomas Huth "fd2b3fc5f3f6fc9b45db53e45bf3c97b"
287da668aa1SThomas Huth "8e52ffc802b8ac9da10039da3d2d0e01"
288da668aa1SThomas Huth "097d8d5ebe53b9b08ee7e2966ab278ea"
289da668aa1SThomas Huth "de238ba5fa5ce3dabf8e316a55d16ab2"
290da668aa1SThomas Huth "b5466fa5f0eeba1f9f98b0664fd03fa9"
291da668aa1SThomas Huth "df5f58c4f4ff755c403a097e6e1c97d4"
292da668aa1SThomas Huth "cce7e771cf0b150871fa0797cde6ca1d"
293da668aa1SThomas Huth "14280ccf99137af1ebfafa9207de1da1"
294da668aa1SThomas Huth "d33669fe514d9f2e83374f1f4830ed04"
295da668aa1SThomas Huth "4da4ef3aca76f41c418f6337782f86a6"
296da668aa1SThomas Huth "ef417ed2af88ab675271c38ef8269372"
297da668aa1SThomas Huth "aad60ee70b46b13ab408a9a8a0cf200c"
298da668aa1SThomas Huth "52bc8b0556b2bc319b74b92929969a50"
299da668aa1SThomas Huth "dc45dc1aeb0c64d4d3057e5955c3f490"
300da668aa1SThomas Huth "c2abf89b8adacea1c3f4ad77dd44c8ac"
301da668aa1SThomas Huth "a3f1c9d2195cb0caa234c1f76cfdac65"
302da668aa1SThomas Huth "32dc48c4f2006b77f17d76acc031632a"
303da668aa1SThomas Huth "a53a62c891b10365cb43d106dfc367bc"
304da668aa1SThomas Huth "dce0cd35ce4965a0527ba70d07a91bb0"
305da668aa1SThomas Huth "407772c2ea0e3a7846b991b6e73d5142"
306da668aa1SThomas Huth "fd51b0c62c6313785ceefccfc4700034",
307da668aa1SThomas Huth },
308da668aa1SThomas Huth {
309da668aa1SThomas Huth /* RFC 2144, Appendix B.1 */
310da668aa1SThomas Huth .path = "/crypto/cipher/cast5-128",
311*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_CAST5_128,
312da668aa1SThomas Huth .mode = QCRYPTO_CIPHER_MODE_ECB,
313da668aa1SThomas Huth .key = "0123456712345678234567893456789A",
314da668aa1SThomas Huth .plaintext = "0123456789abcdef",
315da668aa1SThomas Huth .ciphertext = "238b4fe5847e44b2",
316da668aa1SThomas Huth },
317da668aa1SThomas Huth {
318da668aa1SThomas Huth /* libgcrypt serpent.c */
319da668aa1SThomas Huth .path = "/crypto/cipher/serpent-128",
320*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_SERPENT_128,
321da668aa1SThomas Huth .mode = QCRYPTO_CIPHER_MODE_ECB,
322da668aa1SThomas Huth .key = "00000000000000000000000000000000",
323da668aa1SThomas Huth .plaintext = "d29d576fcea3a3a7ed9099f29273d78e",
324da668aa1SThomas Huth .ciphertext = "b2288b968ae8b08648d1ce9606fd992d",
325da668aa1SThomas Huth },
326da668aa1SThomas Huth {
327da668aa1SThomas Huth /* libgcrypt serpent.c */
328da668aa1SThomas Huth .path = "/crypto/cipher/serpent-192",
329*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_SERPENT_192,
330da668aa1SThomas Huth .mode = QCRYPTO_CIPHER_MODE_ECB,
331da668aa1SThomas Huth .key = "00000000000000000000000000000000"
332da668aa1SThomas Huth "0000000000000000",
333da668aa1SThomas Huth .plaintext = "d29d576fceaba3a7ed9899f2927bd78e",
334da668aa1SThomas Huth .ciphertext = "130e353e1037c22405e8faefb2c3c3e9",
335da668aa1SThomas Huth },
336da668aa1SThomas Huth {
337da668aa1SThomas Huth /* libgcrypt serpent.c */
338da668aa1SThomas Huth .path = "/crypto/cipher/serpent-256a",
339*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_SERPENT_256,
340da668aa1SThomas Huth .mode = QCRYPTO_CIPHER_MODE_ECB,
341da668aa1SThomas Huth .key = "00000000000000000000000000000000"
342da668aa1SThomas Huth "00000000000000000000000000000000",
343da668aa1SThomas Huth .plaintext = "d095576fcea3e3a7ed98d9f29073d78e",
344da668aa1SThomas Huth .ciphertext = "b90ee5862de69168f2bdd5125b45472b",
345da668aa1SThomas Huth },
346da668aa1SThomas Huth {
347da668aa1SThomas Huth /* libgcrypt serpent.c */
348da668aa1SThomas Huth .path = "/crypto/cipher/serpent-256b",
349*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_SERPENT_256,
350da668aa1SThomas Huth .mode = QCRYPTO_CIPHER_MODE_ECB,
351da668aa1SThomas Huth .key = "00000000000000000000000000000000"
352da668aa1SThomas Huth "00000000000000000000000000000000",
353da668aa1SThomas Huth .plaintext = "00000000010000000200000003000000",
354da668aa1SThomas Huth .ciphertext = "2061a42782bd52ec691ec383b03ba77c",
355da668aa1SThomas Huth },
356da668aa1SThomas Huth {
357da668aa1SThomas Huth /* Twofish paper "Known Answer Test" */
358da668aa1SThomas Huth .path = "/crypto/cipher/twofish-128",
359*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_TWOFISH_128,
360da668aa1SThomas Huth .mode = QCRYPTO_CIPHER_MODE_ECB,
361da668aa1SThomas Huth .key = "d491db16e7b1c39e86cb086b789f5419",
362da668aa1SThomas Huth .plaintext = "019f9809de1711858faac3a3ba20fbc3",
363da668aa1SThomas Huth .ciphertext = "6363977de839486297e661c6c9d668eb",
364da668aa1SThomas Huth },
365da668aa1SThomas Huth {
366da668aa1SThomas Huth /* Twofish paper "Known Answer Test", I=3 */
367da668aa1SThomas Huth .path = "/crypto/cipher/twofish-192",
368*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_TWOFISH_192,
369da668aa1SThomas Huth .mode = QCRYPTO_CIPHER_MODE_ECB,
370da668aa1SThomas Huth .key = "88b2b2706b105e36b446bb6d731a1e88"
371da668aa1SThomas Huth "efa71f788965bd44",
372da668aa1SThomas Huth .plaintext = "39da69d6ba4997d585b6dc073ca341b2",
373da668aa1SThomas Huth .ciphertext = "182b02d81497ea45f9daacdc29193a65",
374da668aa1SThomas Huth },
375da668aa1SThomas Huth {
376da668aa1SThomas Huth /* Twofish paper "Known Answer Test", I=4 */
377da668aa1SThomas Huth .path = "/crypto/cipher/twofish-256",
378*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_TWOFISH_256,
379da668aa1SThomas Huth .mode = QCRYPTO_CIPHER_MODE_ECB,
380da668aa1SThomas Huth .key = "d43bb7556ea32e46f2a282b7d45b4e0d"
381da668aa1SThomas Huth "57ff739d4dc92c1bd7fc01700cc8216f",
382da668aa1SThomas Huth .plaintext = "90afe91bb288544f2c32dc239b2635e6",
383da668aa1SThomas Huth .ciphertext = "6cb4561c40bf0a9705931cb6d408e7fa",
384da668aa1SThomas Huth },
38552ed9f45SHyman Huang #ifdef CONFIG_CRYPTO_SM4
38652ed9f45SHyman Huang {
38752ed9f45SHyman Huang /* SM4, GB/T 32907-2016, Appendix A.1 */
38852ed9f45SHyman Huang .path = "/crypto/cipher/sm4",
389*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_SM4,
39052ed9f45SHyman Huang .mode = QCRYPTO_CIPHER_MODE_ECB,
39152ed9f45SHyman Huang .key = "0123456789abcdeffedcba9876543210",
39252ed9f45SHyman Huang .plaintext =
39352ed9f45SHyman Huang "0123456789abcdeffedcba9876543210",
39452ed9f45SHyman Huang .ciphertext =
39552ed9f45SHyman Huang "681edf34d206965e86b3e94f536e4246",
39652ed9f45SHyman Huang },
39752ed9f45SHyman Huang #endif
398da668aa1SThomas Huth {
399da668aa1SThomas Huth /* #1 32 byte key, 32 byte PTX */
400da668aa1SThomas Huth .path = "/crypto/cipher/aes-xts-128-1",
401*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_AES_128,
402da668aa1SThomas Huth .mode = QCRYPTO_CIPHER_MODE_XTS,
403da668aa1SThomas Huth .key =
404da668aa1SThomas Huth "00000000000000000000000000000000"
405da668aa1SThomas Huth "00000000000000000000000000000000",
406da668aa1SThomas Huth .iv =
407da668aa1SThomas Huth "00000000000000000000000000000000",
408da668aa1SThomas Huth .plaintext =
409da668aa1SThomas Huth "00000000000000000000000000000000"
410da668aa1SThomas Huth "00000000000000000000000000000000",
411da668aa1SThomas Huth .ciphertext =
412da668aa1SThomas Huth "917cf69ebd68b2ec9b9fe9a3eadda692"
413da668aa1SThomas Huth "cd43d2f59598ed858c02c2652fbf922e",
414da668aa1SThomas Huth },
415da668aa1SThomas Huth {
416da668aa1SThomas Huth /* #2, 32 byte key, 32 byte PTX */
417da668aa1SThomas Huth .path = "/crypto/cipher/aes-xts-128-2",
418*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_AES_128,
419da668aa1SThomas Huth .mode = QCRYPTO_CIPHER_MODE_XTS,
420da668aa1SThomas Huth .key =
421da668aa1SThomas Huth "11111111111111111111111111111111"
422da668aa1SThomas Huth "22222222222222222222222222222222",
423da668aa1SThomas Huth .iv =
424da668aa1SThomas Huth "33333333330000000000000000000000",
425da668aa1SThomas Huth .plaintext =
426da668aa1SThomas Huth "44444444444444444444444444444444"
427da668aa1SThomas Huth "44444444444444444444444444444444",
428da668aa1SThomas Huth .ciphertext =
429da668aa1SThomas Huth "c454185e6a16936e39334038acef838b"
430da668aa1SThomas Huth "fb186fff7480adc4289382ecd6d394f0",
431da668aa1SThomas Huth },
432da668aa1SThomas Huth {
433da668aa1SThomas Huth /* #5 from xts.7, 32 byte key, 32 byte PTX */
434da668aa1SThomas Huth .path = "/crypto/cipher/aes-xts-128-3",
435*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_AES_128,
436da668aa1SThomas Huth .mode = QCRYPTO_CIPHER_MODE_XTS,
437da668aa1SThomas Huth .key =
438da668aa1SThomas Huth "fffefdfcfbfaf9f8f7f6f5f4f3f2f1f0"
439da668aa1SThomas Huth "bfbebdbcbbbab9b8b7b6b5b4b3b2b1b0",
440da668aa1SThomas Huth .iv =
441da668aa1SThomas Huth "9a785634120000000000000000000000",
442da668aa1SThomas Huth .plaintext =
443da668aa1SThomas Huth "44444444444444444444444444444444"
444da668aa1SThomas Huth "44444444444444444444444444444444",
445da668aa1SThomas Huth .ciphertext =
446da668aa1SThomas Huth "b01f86f8edc1863706fa8a4253e34f28"
447da668aa1SThomas Huth "af319de38334870f4dd1f94cbe9832f1",
448da668aa1SThomas Huth },
449da668aa1SThomas Huth {
450da668aa1SThomas Huth /* #4, 32 byte key, 512 byte PTX */
451da668aa1SThomas Huth .path = "/crypto/cipher/aes-xts-128-4",
452*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_AES_128,
453da668aa1SThomas Huth .mode = QCRYPTO_CIPHER_MODE_XTS,
454da668aa1SThomas Huth .key =
455da668aa1SThomas Huth "27182818284590452353602874713526"
456da668aa1SThomas Huth "31415926535897932384626433832795",
457da668aa1SThomas Huth .iv =
458da668aa1SThomas Huth "00000000000000000000000000000000",
459da668aa1SThomas Huth .plaintext =
460da668aa1SThomas Huth "000102030405060708090a0b0c0d0e0f"
461da668aa1SThomas Huth "101112131415161718191a1b1c1d1e1f"
462da668aa1SThomas Huth "202122232425262728292a2b2c2d2e2f"
463da668aa1SThomas Huth "303132333435363738393a3b3c3d3e3f"
464da668aa1SThomas Huth "404142434445464748494a4b4c4d4e4f"
465da668aa1SThomas Huth "505152535455565758595a5b5c5d5e5f"
466da668aa1SThomas Huth "606162636465666768696a6b6c6d6e6f"
467da668aa1SThomas Huth "707172737475767778797a7b7c7d7e7f"
468da668aa1SThomas Huth "808182838485868788898a8b8c8d8e8f"
469da668aa1SThomas Huth "909192939495969798999a9b9c9d9e9f"
470da668aa1SThomas Huth "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf"
471da668aa1SThomas Huth "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf"
472da668aa1SThomas Huth "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf"
473da668aa1SThomas Huth "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf"
474da668aa1SThomas Huth "e0e1e2e3e4e5e6e7e8e9eaebecedeeef"
475da668aa1SThomas Huth "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"
476da668aa1SThomas Huth "000102030405060708090a0b0c0d0e0f"
477da668aa1SThomas Huth "101112131415161718191a1b1c1d1e1f"
478da668aa1SThomas Huth "202122232425262728292a2b2c2d2e2f"
479da668aa1SThomas Huth "303132333435363738393a3b3c3d3e3f"
480da668aa1SThomas Huth "404142434445464748494a4b4c4d4e4f"
481da668aa1SThomas Huth "505152535455565758595a5b5c5d5e5f"
482da668aa1SThomas Huth "606162636465666768696a6b6c6d6e6f"
483da668aa1SThomas Huth "707172737475767778797a7b7c7d7e7f"
484da668aa1SThomas Huth "808182838485868788898a8b8c8d8e8f"
485da668aa1SThomas Huth "909192939495969798999a9b9c9d9e9f"
486da668aa1SThomas Huth "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf"
487da668aa1SThomas Huth "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf"
488da668aa1SThomas Huth "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf"
489da668aa1SThomas Huth "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf"
490da668aa1SThomas Huth "e0e1e2e3e4e5e6e7e8e9eaebecedeeef"
491da668aa1SThomas Huth "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
492da668aa1SThomas Huth .ciphertext =
493da668aa1SThomas Huth "27a7479befa1d476489f308cd4cfa6e2"
494da668aa1SThomas Huth "a96e4bbe3208ff25287dd3819616e89c"
495da668aa1SThomas Huth "c78cf7f5e543445f8333d8fa7f560000"
496da668aa1SThomas Huth "05279fa5d8b5e4ad40e736ddb4d35412"
497da668aa1SThomas Huth "328063fd2aab53e5ea1e0a9f332500a5"
498da668aa1SThomas Huth "df9487d07a5c92cc512c8866c7e860ce"
499da668aa1SThomas Huth "93fdf166a24912b422976146ae20ce84"
500da668aa1SThomas Huth "6bb7dc9ba94a767aaef20c0d61ad0265"
501da668aa1SThomas Huth "5ea92dc4c4e41a8952c651d33174be51"
502da668aa1SThomas Huth "a10c421110e6d81588ede82103a252d8"
503da668aa1SThomas Huth "a750e8768defffed9122810aaeb99f91"
504da668aa1SThomas Huth "72af82b604dc4b8e51bcb08235a6f434"
505da668aa1SThomas Huth "1332e4ca60482a4ba1a03b3e65008fc5"
506da668aa1SThomas Huth "da76b70bf1690db4eae29c5f1badd03c"
507da668aa1SThomas Huth "5ccf2a55d705ddcd86d449511ceb7ec3"
508da668aa1SThomas Huth "0bf12b1fa35b913f9f747a8afd1b130e"
509da668aa1SThomas Huth "94bff94effd01a91735ca1726acd0b19"
510da668aa1SThomas Huth "7c4e5b03393697e126826fb6bbde8ecc"
511da668aa1SThomas Huth "1e08298516e2c9ed03ff3c1b7860f6de"
512da668aa1SThomas Huth "76d4cecd94c8119855ef5297ca67e9f3"
513da668aa1SThomas Huth "e7ff72b1e99785ca0a7e7720c5b36dc6"
514da668aa1SThomas Huth "d72cac9574c8cbbc2f801e23e56fd344"
515da668aa1SThomas Huth "b07f22154beba0f08ce8891e643ed995"
516da668aa1SThomas Huth "c94d9a69c9f1b5f499027a78572aeebd"
517da668aa1SThomas Huth "74d20cc39881c213ee770b1010e4bea7"
518da668aa1SThomas Huth "18846977ae119f7a023ab58cca0ad752"
519da668aa1SThomas Huth "afe656bb3c17256a9f6e9bf19fdd5a38"
520da668aa1SThomas Huth "fc82bbe872c5539edb609ef4f79c203e"
521da668aa1SThomas Huth "bb140f2e583cb2ad15b4aa5b655016a8"
522da668aa1SThomas Huth "449277dbd477ef2c8d6c017db738b18d"
523da668aa1SThomas Huth "eb4a427d1923ce3ff262735779a418f2"
524da668aa1SThomas Huth "0a282df920147beabe421ee5319d0568",
525da668aa1SThomas Huth },
526da668aa1SThomas Huth {
527da668aa1SThomas Huth /* Bad config - cast5-128 has 8 byte block size
528da668aa1SThomas Huth * which is incompatible with XTS
529da668aa1SThomas Huth */
530da668aa1SThomas Huth .path = "/crypto/cipher/cast5-xts-128",
531*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_CAST5_128,
532da668aa1SThomas Huth .mode = QCRYPTO_CIPHER_MODE_XTS,
533da668aa1SThomas Huth .key =
534da668aa1SThomas Huth "27182818284590452353602874713526"
535da668aa1SThomas Huth "31415926535897932384626433832795",
536da668aa1SThomas Huth },
537da668aa1SThomas Huth {
538da668aa1SThomas Huth /* NIST F.5.1 CTR-AES128.Encrypt */
539da668aa1SThomas Huth .path = "/crypto/cipher/aes-ctr-128",
540*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_AES_128,
541da668aa1SThomas Huth .mode = QCRYPTO_CIPHER_MODE_CTR,
542da668aa1SThomas Huth .key = "2b7e151628aed2a6abf7158809cf4f3c",
543da668aa1SThomas Huth .iv = "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
544da668aa1SThomas Huth .plaintext =
545da668aa1SThomas Huth "6bc1bee22e409f96e93d7e117393172a"
546da668aa1SThomas Huth "ae2d8a571e03ac9c9eb76fac45af8e51"
547da668aa1SThomas Huth "30c81c46a35ce411e5fbc1191a0a52ef"
548da668aa1SThomas Huth "f69f2445df4f9b17ad2b417be66c3710",
549da668aa1SThomas Huth .ciphertext =
550da668aa1SThomas Huth "874d6191b620e3261bef6864990db6ce"
551da668aa1SThomas Huth "9806f66b7970fdff8617187bb9fffdff"
552da668aa1SThomas Huth "5ae4df3edbd5d35e5b4f09020db03eab"
553da668aa1SThomas Huth "1e031dda2fbe03d1792170a0f3009cee",
554da668aa1SThomas Huth },
555da668aa1SThomas Huth {
556da668aa1SThomas Huth /* NIST F.5.3 CTR-AES192.Encrypt */
557da668aa1SThomas Huth .path = "/crypto/cipher/aes-ctr-192",
558*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_AES_192,
559da668aa1SThomas Huth .mode = QCRYPTO_CIPHER_MODE_CTR,
560da668aa1SThomas Huth .key = "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b",
561da668aa1SThomas Huth .iv = "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
562da668aa1SThomas Huth .plaintext =
563da668aa1SThomas Huth "6bc1bee22e409f96e93d7e117393172a"
564da668aa1SThomas Huth "ae2d8a571e03ac9c9eb76fac45af8e51"
565da668aa1SThomas Huth "30c81c46a35ce411e5fbc1191a0a52ef"
566da668aa1SThomas Huth "f69f2445df4f9b17ad2b417be66c3710",
567da668aa1SThomas Huth .ciphertext =
568da668aa1SThomas Huth "1abc932417521ca24f2b0459fe7e6e0b"
569da668aa1SThomas Huth "090339ec0aa6faefd5ccc2c6f4ce8e94"
570da668aa1SThomas Huth "1e36b26bd1ebc670d1bd1d665620abf7"
571da668aa1SThomas Huth "4f78a7f6d29809585a97daec58c6b050",
572da668aa1SThomas Huth },
573da668aa1SThomas Huth {
574da668aa1SThomas Huth /* NIST F.5.5 CTR-AES256.Encrypt */
575da668aa1SThomas Huth .path = "/crypto/cipher/aes-ctr-256",
576*a092c513SMarkus Armbruster .alg = QCRYPTO_CIPHER_ALGO_AES_256,
577da668aa1SThomas Huth .mode = QCRYPTO_CIPHER_MODE_CTR,
578da668aa1SThomas Huth .key = "603deb1015ca71be2b73aef0857d7781"
579da668aa1SThomas Huth "1f352c073b6108d72d9810a30914dff4",
580da668aa1SThomas Huth .iv = "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
581da668aa1SThomas Huth .plaintext =
582da668aa1SThomas Huth "6bc1bee22e409f96e93d7e117393172a"
583da668aa1SThomas Huth "ae2d8a571e03ac9c9eb76fac45af8e51"
584da668aa1SThomas Huth "30c81c46a35ce411e5fbc1191a0a52ef"
585da668aa1SThomas Huth "f69f2445df4f9b17ad2b417be66c3710",
586da668aa1SThomas Huth .ciphertext =
587da668aa1SThomas Huth "601ec313775789a5b7a7f504bbf3d228"
588da668aa1SThomas Huth "f443e3ca4d62b59aca84e990cacaf5c5"
589da668aa1SThomas Huth "2b0930daa23de94ce87017ba2d84988d"
590da668aa1SThomas Huth "dfc9c58db67aada613c2dd08457941a6",
591da668aa1SThomas Huth }
592da668aa1SThomas Huth };
593da668aa1SThomas Huth
594da668aa1SThomas Huth
unhex(char c)595da668aa1SThomas Huth static inline int unhex(char c)
596da668aa1SThomas Huth {
597da668aa1SThomas Huth if (c >= 'a' && c <= 'f') {
598da668aa1SThomas Huth return 10 + (c - 'a');
599da668aa1SThomas Huth }
600da668aa1SThomas Huth if (c >= 'A' && c <= 'F') {
601da668aa1SThomas Huth return 10 + (c - 'A');
602da668aa1SThomas Huth }
603da668aa1SThomas Huth return c - '0';
604da668aa1SThomas Huth }
605da668aa1SThomas Huth
hex(int i)606da668aa1SThomas Huth static inline char hex(int i)
607da668aa1SThomas Huth {
608da668aa1SThomas Huth if (i < 10) {
609da668aa1SThomas Huth return '0' + i;
610da668aa1SThomas Huth }
611da668aa1SThomas Huth return 'a' + (i - 10);
612da668aa1SThomas Huth }
613da668aa1SThomas Huth
unhex_string(const char * hexstr,uint8_t ** data)614da668aa1SThomas Huth static size_t unhex_string(const char *hexstr,
615da668aa1SThomas Huth uint8_t **data)
616da668aa1SThomas Huth {
617da668aa1SThomas Huth size_t len;
618da668aa1SThomas Huth size_t i;
619da668aa1SThomas Huth
620da668aa1SThomas Huth if (!hexstr) {
621da668aa1SThomas Huth *data = NULL;
622da668aa1SThomas Huth return 0;
623da668aa1SThomas Huth }
624da668aa1SThomas Huth
625da668aa1SThomas Huth len = strlen(hexstr);
626da668aa1SThomas Huth *data = g_new0(uint8_t, len / 2);
627da668aa1SThomas Huth
628da668aa1SThomas Huth for (i = 0; i < len; i += 2) {
629da668aa1SThomas Huth (*data)[i/2] = (unhex(hexstr[i]) << 4) | unhex(hexstr[i+1]);
630da668aa1SThomas Huth }
631da668aa1SThomas Huth return len / 2;
632da668aa1SThomas Huth }
633da668aa1SThomas Huth
hex_string(const uint8_t * bytes,size_t len)634da668aa1SThomas Huth static char *hex_string(const uint8_t *bytes,
635da668aa1SThomas Huth size_t len)
636da668aa1SThomas Huth {
637da668aa1SThomas Huth char *hexstr = g_new0(char, len * 2 + 1);
638da668aa1SThomas Huth size_t i;
639da668aa1SThomas Huth
640da668aa1SThomas Huth for (i = 0; i < len; i++) {
641da668aa1SThomas Huth hexstr[i*2] = hex((bytes[i] >> 4) & 0xf);
642da668aa1SThomas Huth hexstr[i*2+1] = hex(bytes[i] & 0xf);
643da668aa1SThomas Huth }
644da668aa1SThomas Huth hexstr[len*2] = '\0';
645da668aa1SThomas Huth
646da668aa1SThomas Huth return hexstr;
647da668aa1SThomas Huth }
648da668aa1SThomas Huth
test_cipher(const void * opaque)649da668aa1SThomas Huth static void test_cipher(const void *opaque)
650da668aa1SThomas Huth {
651da668aa1SThomas Huth const QCryptoCipherTestData *data = opaque;
652da668aa1SThomas Huth
653da668aa1SThomas Huth QCryptoCipher *cipher;
654da668aa1SThomas Huth uint8_t *key, *iv = NULL, *ciphertext = NULL,
655da668aa1SThomas Huth *plaintext = NULL, *outtext = NULL;
656da668aa1SThomas Huth size_t nkey, niv = 0, nciphertext = 0, nplaintext = 0;
657da668aa1SThomas Huth char *outtexthex = NULL;
658da668aa1SThomas Huth size_t ivsize, keysize, blocksize;
659da668aa1SThomas Huth Error *err = NULL;
660da668aa1SThomas Huth
661da668aa1SThomas Huth nkey = unhex_string(data->key, &key);
662da668aa1SThomas Huth if (data->iv) {
663da668aa1SThomas Huth niv = unhex_string(data->iv, &iv);
664da668aa1SThomas Huth }
665da668aa1SThomas Huth if (data->ciphertext) {
666da668aa1SThomas Huth nciphertext = unhex_string(data->ciphertext, &ciphertext);
667da668aa1SThomas Huth }
668da668aa1SThomas Huth if (data->plaintext) {
669da668aa1SThomas Huth nplaintext = unhex_string(data->plaintext, &plaintext);
670da668aa1SThomas Huth }
671da668aa1SThomas Huth
672da668aa1SThomas Huth g_assert(nciphertext == nplaintext);
673da668aa1SThomas Huth
674da668aa1SThomas Huth outtext = g_new0(uint8_t, nciphertext);
675da668aa1SThomas Huth
676da668aa1SThomas Huth cipher = qcrypto_cipher_new(
677da668aa1SThomas Huth data->alg, data->mode,
678da668aa1SThomas Huth key, nkey,
67948ca1cabSDaniel P. Berrangé data->plaintext ? &error_abort : &err);
680da668aa1SThomas Huth if (data->plaintext) {
681da668aa1SThomas Huth g_assert(cipher != NULL);
682da668aa1SThomas Huth } else {
683da668aa1SThomas Huth error_free_or_abort(&err);
684da668aa1SThomas Huth g_assert(cipher == NULL);
685da668aa1SThomas Huth goto cleanup;
686da668aa1SThomas Huth }
687da668aa1SThomas Huth
688da668aa1SThomas Huth keysize = qcrypto_cipher_get_key_len(data->alg);
689da668aa1SThomas Huth blocksize = qcrypto_cipher_get_block_len(data->alg);
690da668aa1SThomas Huth ivsize = qcrypto_cipher_get_iv_len(data->alg, data->mode);
691da668aa1SThomas Huth
692da668aa1SThomas Huth if (data->mode == QCRYPTO_CIPHER_MODE_XTS) {
693da668aa1SThomas Huth g_assert_cmpint(keysize * 2, ==, nkey);
694da668aa1SThomas Huth } else {
695da668aa1SThomas Huth g_assert_cmpint(keysize, ==, nkey);
696da668aa1SThomas Huth }
697da668aa1SThomas Huth g_assert_cmpint(ivsize, ==, niv);
698da668aa1SThomas Huth if (niv) {
699da668aa1SThomas Huth g_assert_cmpint(blocksize, ==, niv);
700da668aa1SThomas Huth }
701da668aa1SThomas Huth
702da668aa1SThomas Huth if (iv) {
703da668aa1SThomas Huth g_assert(qcrypto_cipher_setiv(cipher,
704da668aa1SThomas Huth iv, niv,
705da668aa1SThomas Huth &error_abort) == 0);
706da668aa1SThomas Huth }
707da668aa1SThomas Huth g_assert(qcrypto_cipher_encrypt(cipher,
708da668aa1SThomas Huth plaintext,
709da668aa1SThomas Huth outtext,
710da668aa1SThomas Huth nplaintext,
711da668aa1SThomas Huth &error_abort) == 0);
712da668aa1SThomas Huth
713da668aa1SThomas Huth outtexthex = hex_string(outtext, nciphertext);
714da668aa1SThomas Huth
715da668aa1SThomas Huth g_assert_cmpstr(outtexthex, ==, data->ciphertext);
716da668aa1SThomas Huth
717da668aa1SThomas Huth g_free(outtexthex);
718da668aa1SThomas Huth
719da668aa1SThomas Huth if (iv) {
720da668aa1SThomas Huth g_assert(qcrypto_cipher_setiv(cipher,
721da668aa1SThomas Huth iv, niv,
722da668aa1SThomas Huth &error_abort) == 0);
723da668aa1SThomas Huth }
724da668aa1SThomas Huth g_assert(qcrypto_cipher_decrypt(cipher,
725da668aa1SThomas Huth ciphertext,
726da668aa1SThomas Huth outtext,
727da668aa1SThomas Huth nplaintext,
728da668aa1SThomas Huth &error_abort) == 0);
729da668aa1SThomas Huth
730da668aa1SThomas Huth outtexthex = hex_string(outtext, nplaintext);
731da668aa1SThomas Huth
732da668aa1SThomas Huth g_assert_cmpstr(outtexthex, ==, data->plaintext);
733da668aa1SThomas Huth
734da668aa1SThomas Huth cleanup:
735da668aa1SThomas Huth g_free(outtext);
736da668aa1SThomas Huth g_free(outtexthex);
737da668aa1SThomas Huth g_free(key);
738da668aa1SThomas Huth g_free(iv);
739da668aa1SThomas Huth g_free(ciphertext);
740da668aa1SThomas Huth g_free(plaintext);
741da668aa1SThomas Huth qcrypto_cipher_free(cipher);
742da668aa1SThomas Huth }
743da668aa1SThomas Huth
744da668aa1SThomas Huth
test_cipher_null_iv(void)745da668aa1SThomas Huth static void test_cipher_null_iv(void)
746da668aa1SThomas Huth {
747da668aa1SThomas Huth QCryptoCipher *cipher;
748da668aa1SThomas Huth uint8_t key[32] = { 0 };
749da668aa1SThomas Huth uint8_t plaintext[32] = { 0 };
750da668aa1SThomas Huth uint8_t ciphertext[32] = { 0 };
751da668aa1SThomas Huth
752da668aa1SThomas Huth cipher = qcrypto_cipher_new(
753*a092c513SMarkus Armbruster QCRYPTO_CIPHER_ALGO_AES_256,
754da668aa1SThomas Huth QCRYPTO_CIPHER_MODE_CBC,
755da668aa1SThomas Huth key, sizeof(key),
756da668aa1SThomas Huth &error_abort);
757da668aa1SThomas Huth g_assert(cipher != NULL);
758da668aa1SThomas Huth
759da668aa1SThomas Huth /* Don't call qcrypto_cipher_setiv */
760da668aa1SThomas Huth
761da668aa1SThomas Huth qcrypto_cipher_encrypt(cipher,
762da668aa1SThomas Huth plaintext,
763da668aa1SThomas Huth ciphertext,
764da668aa1SThomas Huth sizeof(plaintext),
765da668aa1SThomas Huth &error_abort);
766da668aa1SThomas Huth
767da668aa1SThomas Huth qcrypto_cipher_free(cipher);
768da668aa1SThomas Huth }
769da668aa1SThomas Huth
test_cipher_short_plaintext(void)770da668aa1SThomas Huth static void test_cipher_short_plaintext(void)
771da668aa1SThomas Huth {
772da668aa1SThomas Huth Error *err = NULL;
773da668aa1SThomas Huth QCryptoCipher *cipher;
774da668aa1SThomas Huth uint8_t key[32] = { 0 };
775da668aa1SThomas Huth uint8_t plaintext1[20] = { 0 };
776da668aa1SThomas Huth uint8_t ciphertext1[20] = { 0 };
777da668aa1SThomas Huth uint8_t plaintext2[40] = { 0 };
778da668aa1SThomas Huth uint8_t ciphertext2[40] = { 0 };
779da668aa1SThomas Huth int ret;
780da668aa1SThomas Huth
781da668aa1SThomas Huth cipher = qcrypto_cipher_new(
782*a092c513SMarkus Armbruster QCRYPTO_CIPHER_ALGO_AES_256,
783da668aa1SThomas Huth QCRYPTO_CIPHER_MODE_CBC,
784da668aa1SThomas Huth key, sizeof(key),
785da668aa1SThomas Huth &error_abort);
786da668aa1SThomas Huth g_assert(cipher != NULL);
787da668aa1SThomas Huth
788da668aa1SThomas Huth /* Should report an error as plaintext is shorter
789da668aa1SThomas Huth * than block size
790da668aa1SThomas Huth */
791da668aa1SThomas Huth ret = qcrypto_cipher_encrypt(cipher,
792da668aa1SThomas Huth plaintext1,
793da668aa1SThomas Huth ciphertext1,
794da668aa1SThomas Huth sizeof(plaintext1),
795da668aa1SThomas Huth &err);
796da668aa1SThomas Huth g_assert(ret == -1);
797da668aa1SThomas Huth error_free_or_abort(&err);
798da668aa1SThomas Huth
799da668aa1SThomas Huth /* Should report an error as plaintext is larger than
800da668aa1SThomas Huth * block size, but not a multiple of block size
801da668aa1SThomas Huth */
802da668aa1SThomas Huth ret = qcrypto_cipher_encrypt(cipher,
803da668aa1SThomas Huth plaintext2,
804da668aa1SThomas Huth ciphertext2,
805da668aa1SThomas Huth sizeof(plaintext2),
806da668aa1SThomas Huth &err);
807da668aa1SThomas Huth g_assert(ret == -1);
808da668aa1SThomas Huth error_free_or_abort(&err);
809da668aa1SThomas Huth
810da668aa1SThomas Huth qcrypto_cipher_free(cipher);
811da668aa1SThomas Huth }
812da668aa1SThomas Huth
main(int argc,char ** argv)813da668aa1SThomas Huth int main(int argc, char **argv)
814da668aa1SThomas Huth {
815da668aa1SThomas Huth size_t i;
816da668aa1SThomas Huth
817da668aa1SThomas Huth g_test_init(&argc, &argv, NULL);
818da668aa1SThomas Huth
819da668aa1SThomas Huth g_assert(qcrypto_init(NULL) == 0);
820da668aa1SThomas Huth
821da668aa1SThomas Huth for (i = 0; i < G_N_ELEMENTS(test_data); i++) {
822da668aa1SThomas Huth if (qcrypto_cipher_supports(test_data[i].alg, test_data[i].mode)) {
823da668aa1SThomas Huth g_test_add_data_func(test_data[i].path, &test_data[i], test_cipher);
824c3b1aa1cSDaniel P. Berrangé } else {
825c3b1aa1cSDaniel P. Berrangé g_printerr("# skip unsupported %s:%s\n",
826*a092c513SMarkus Armbruster QCryptoCipherAlgo_str(test_data[i].alg),
827c3b1aa1cSDaniel P. Berrangé QCryptoCipherMode_str(test_data[i].mode));
828da668aa1SThomas Huth }
829da668aa1SThomas Huth }
830da668aa1SThomas Huth
831da668aa1SThomas Huth g_test_add_func("/crypto/cipher/null-iv",
832da668aa1SThomas Huth test_cipher_null_iv);
833da668aa1SThomas Huth
834da668aa1SThomas Huth g_test_add_func("/crypto/cipher/short-plaintext",
835da668aa1SThomas Huth test_cipher_short_plaintext);
836da668aa1SThomas Huth
837da668aa1SThomas Huth return g_test_run();
838da668aa1SThomas Huth }
839