184f7f180SDaniel P. Berrange /*
284f7f180SDaniel P. Berrange * QEMU Crypto XTS cipher mode
384f7f180SDaniel P. Berrange *
4a61f682fSDaniel P. Berrangé * Copyright (c) 2015-2018 Red Hat, Inc.
584f7f180SDaniel P. Berrange *
684f7f180SDaniel P. Berrange * This library is free software; you can redistribute it and/or
784f7f180SDaniel P. Berrange * modify it under the terms of the GNU Lesser General Public
884f7f180SDaniel P. Berrange * License as published by the Free Software Foundation; either
9*422c16e7SChetan Pant * version 2.1 of the License, or (at your option) any later version.
1084f7f180SDaniel P. Berrange *
1184f7f180SDaniel P. Berrange * This library is distributed in the hope that it will be useful,
1284f7f180SDaniel P. Berrange * but WITHOUT ANY WARRANTY; without even the implied warranty of
1384f7f180SDaniel P. Berrange * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1484f7f180SDaniel P. Berrange * Lesser General Public License for more details.
1584f7f180SDaniel P. Berrange *
1684f7f180SDaniel P. Berrange * You should have received a copy of the GNU Lesser General Public
1784f7f180SDaniel P. Berrange * License along with this library; if not, see <http://www.gnu.org/licenses/>.
1884f7f180SDaniel P. Berrange *
1984f7f180SDaniel P. Berrange * This code is originally derived from public domain / WTFPL code in
2084f7f180SDaniel P. Berrange * LibTomCrypt crytographic library http://libtom.org. The XTS code
2184f7f180SDaniel P. Berrange * was donated by Elliptic Semiconductor Inc (www.ellipticsemi.com)
2284f7f180SDaniel P. Berrange * to the LibTom Projects
2384f7f180SDaniel P. Berrange *
2484f7f180SDaniel P. Berrange */
2584f7f180SDaniel P. Berrange
2684f7f180SDaniel P. Berrange #include "qemu/osdep.h"
2784f7f180SDaniel P. Berrange #include "crypto/init.h"
2884f7f180SDaniel P. Berrange #include "crypto/xts.h"
2984f7f180SDaniel P. Berrange #include "crypto/aes.h"
3084f7f180SDaniel P. Berrange
3184f7f180SDaniel P. Berrange typedef struct {
3284f7f180SDaniel P. Berrange const char *path;
3384f7f180SDaniel P. Berrange int keylen;
3484f7f180SDaniel P. Berrange unsigned char key1[32];
3584f7f180SDaniel P. Berrange unsigned char key2[32];
3684f7f180SDaniel P. Berrange uint64_t seqnum;
3784f7f180SDaniel P. Berrange unsigned long PTLEN;
3884f7f180SDaniel P. Berrange unsigned char PTX[512], CTX[512];
3984f7f180SDaniel P. Berrange } QCryptoXTSTestData;
4084f7f180SDaniel P. Berrange
4184f7f180SDaniel P. Berrange static const QCryptoXTSTestData test_data[] = {
4284f7f180SDaniel P. Berrange /* #1 32 byte key, 32 byte PTX */
4384f7f180SDaniel P. Berrange {
4484f7f180SDaniel P. Berrange "/crypto/xts/t-1-key-32-ptx-32",
4584f7f180SDaniel P. Berrange 32,
4684f7f180SDaniel P. Berrange { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4784f7f180SDaniel P. Berrange 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
4884f7f180SDaniel P. Berrange { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4984f7f180SDaniel P. Berrange 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
5084f7f180SDaniel P. Berrange 0,
5184f7f180SDaniel P. Berrange 32,
5284f7f180SDaniel P. Berrange { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5384f7f180SDaniel P. Berrange 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5484f7f180SDaniel P. Berrange 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5584f7f180SDaniel P. Berrange 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
5684f7f180SDaniel P. Berrange { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
5784f7f180SDaniel P. Berrange 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
5884f7f180SDaniel P. Berrange 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
5984f7f180SDaniel P. Berrange 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
6084f7f180SDaniel P. Berrange },
6184f7f180SDaniel P. Berrange
6284f7f180SDaniel P. Berrange /* #2, 32 byte key, 32 byte PTX */
6384f7f180SDaniel P. Berrange {
6484f7f180SDaniel P. Berrange "/crypto/xts/t-2-key-32-ptx-32",
6584f7f180SDaniel P. Berrange 32,
6684f7f180SDaniel P. Berrange { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
6784f7f180SDaniel P. Berrange 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 },
6884f7f180SDaniel P. Berrange { 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
6984f7f180SDaniel P. Berrange 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
7084f7f180SDaniel P. Berrange 0x3333333333LL,
7184f7f180SDaniel P. Berrange 32,
7284f7f180SDaniel P. Berrange { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
7384f7f180SDaniel P. Berrange 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
7484f7f180SDaniel P. Berrange 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
7584f7f180SDaniel P. Berrange 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
7684f7f180SDaniel P. Berrange { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
7784f7f180SDaniel P. Berrange 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
7884f7f180SDaniel P. Berrange 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
7984f7f180SDaniel P. Berrange 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
8084f7f180SDaniel P. Berrange },
8184f7f180SDaniel P. Berrange
8284f7f180SDaniel P. Berrange /* #5 from xts.7, 32 byte key, 32 byte PTX */
8384f7f180SDaniel P. Berrange {
8484f7f180SDaniel P. Berrange "/crypto/xts/t-5-key-32-ptx-32",
8584f7f180SDaniel P. Berrange 32,
8684f7f180SDaniel P. Berrange { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
8784f7f180SDaniel P. Berrange 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0 },
8884f7f180SDaniel P. Berrange { 0xbf, 0xbe, 0xbd, 0xbc, 0xbb, 0xba, 0xb9, 0xb8,
8984f7f180SDaniel P. Berrange 0xb7, 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, 0xb1, 0xb0 },
9084f7f180SDaniel P. Berrange 0x123456789aLL,
9184f7f180SDaniel P. Berrange 32,
9284f7f180SDaniel P. Berrange { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
9384f7f180SDaniel P. Berrange 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
9484f7f180SDaniel P. Berrange 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
9584f7f180SDaniel P. Berrange 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
9684f7f180SDaniel P. Berrange { 0xb0, 0x1f, 0x86, 0xf8, 0xed, 0xc1, 0x86, 0x37,
9784f7f180SDaniel P. Berrange 0x06, 0xfa, 0x8a, 0x42, 0x53, 0xe3, 0x4f, 0x28,
9884f7f180SDaniel P. Berrange 0xaf, 0x31, 0x9d, 0xe3, 0x83, 0x34, 0x87, 0x0f,
9984f7f180SDaniel P. Berrange 0x4d, 0xd1, 0xf9, 0x4c, 0xbe, 0x98, 0x32, 0xf1 },
10084f7f180SDaniel P. Berrange },
10184f7f180SDaniel P. Berrange
10284f7f180SDaniel P. Berrange /* #4, 32 byte key, 512 byte PTX */
10384f7f180SDaniel P. Berrange {
10484f7f180SDaniel P. Berrange "/crypto/xts/t-4-key-32-ptx-512",
10584f7f180SDaniel P. Berrange 32,
10684f7f180SDaniel P. Berrange { 0x27, 0x18, 0x28, 0x18, 0x28, 0x45, 0x90, 0x45,
10784f7f180SDaniel P. Berrange 0x23, 0x53, 0x60, 0x28, 0x74, 0x71, 0x35, 0x26 },
10884f7f180SDaniel P. Berrange { 0x31, 0x41, 0x59, 0x26, 0x53, 0x58, 0x97, 0x93,
10984f7f180SDaniel P. Berrange 0x23, 0x84, 0x62, 0x64, 0x33, 0x83, 0x27, 0x95 },
11084f7f180SDaniel P. Berrange 0,
11184f7f180SDaniel P. Berrange 512,
11284f7f180SDaniel P. Berrange {
11384f7f180SDaniel P. Berrange 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
11484f7f180SDaniel P. Berrange 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
11584f7f180SDaniel P. Berrange 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
11684f7f180SDaniel P. Berrange 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
11784f7f180SDaniel P. Berrange 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
11884f7f180SDaniel P. Berrange 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
11984f7f180SDaniel P. Berrange 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
12084f7f180SDaniel P. Berrange 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
12184f7f180SDaniel P. Berrange 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
12284f7f180SDaniel P. Berrange 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
12384f7f180SDaniel P. Berrange 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
12484f7f180SDaniel P. Berrange 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
12584f7f180SDaniel P. Berrange 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
12684f7f180SDaniel P. Berrange 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
12784f7f180SDaniel P. Berrange 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
12884f7f180SDaniel P. Berrange 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
12984f7f180SDaniel P. Berrange 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
13084f7f180SDaniel P. Berrange 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
13184f7f180SDaniel P. Berrange 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
13284f7f180SDaniel P. Berrange 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
13384f7f180SDaniel P. Berrange 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
13484f7f180SDaniel P. Berrange 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
13584f7f180SDaniel P. Berrange 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
13684f7f180SDaniel P. Berrange 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
13784f7f180SDaniel P. Berrange 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
13884f7f180SDaniel P. Berrange 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
13984f7f180SDaniel P. Berrange 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
14084f7f180SDaniel P. Berrange 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
14184f7f180SDaniel P. Berrange 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
14284f7f180SDaniel P. Berrange 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
14384f7f180SDaniel P. Berrange 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
14484f7f180SDaniel P. Berrange 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
14584f7f180SDaniel P. Berrange 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
14684f7f180SDaniel P. Berrange 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
14784f7f180SDaniel P. Berrange 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
14884f7f180SDaniel P. Berrange 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
14984f7f180SDaniel P. Berrange 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
15084f7f180SDaniel P. Berrange 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
15184f7f180SDaniel P. Berrange 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
15284f7f180SDaniel P. Berrange 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
15384f7f180SDaniel P. Berrange 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
15484f7f180SDaniel P. Berrange 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
15584f7f180SDaniel P. Berrange 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
15684f7f180SDaniel P. Berrange 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
15784f7f180SDaniel P. Berrange 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
15884f7f180SDaniel P. Berrange 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
15984f7f180SDaniel P. Berrange 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
16084f7f180SDaniel P. Berrange 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
16184f7f180SDaniel P. Berrange 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
16284f7f180SDaniel P. Berrange 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
16384f7f180SDaniel P. Berrange 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
16484f7f180SDaniel P. Berrange 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
16584f7f180SDaniel P. Berrange 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
16684f7f180SDaniel P. Berrange 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
16784f7f180SDaniel P. Berrange 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
16884f7f180SDaniel P. Berrange 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
16984f7f180SDaniel P. Berrange 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
17084f7f180SDaniel P. Berrange 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
17184f7f180SDaniel P. Berrange 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
17284f7f180SDaniel P. Berrange 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
17384f7f180SDaniel P. Berrange 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
17484f7f180SDaniel P. Berrange 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
17584f7f180SDaniel P. Berrange 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
17684f7f180SDaniel P. Berrange 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
17784f7f180SDaniel P. Berrange },
17884f7f180SDaniel P. Berrange {
17984f7f180SDaniel P. Berrange 0x27, 0xa7, 0x47, 0x9b, 0xef, 0xa1, 0xd4, 0x76,
18084f7f180SDaniel P. Berrange 0x48, 0x9f, 0x30, 0x8c, 0xd4, 0xcf, 0xa6, 0xe2,
18184f7f180SDaniel P. Berrange 0xa9, 0x6e, 0x4b, 0xbe, 0x32, 0x08, 0xff, 0x25,
18284f7f180SDaniel P. Berrange 0x28, 0x7d, 0xd3, 0x81, 0x96, 0x16, 0xe8, 0x9c,
18384f7f180SDaniel P. Berrange 0xc7, 0x8c, 0xf7, 0xf5, 0xe5, 0x43, 0x44, 0x5f,
18484f7f180SDaniel P. Berrange 0x83, 0x33, 0xd8, 0xfa, 0x7f, 0x56, 0x00, 0x00,
18584f7f180SDaniel P. Berrange 0x05, 0x27, 0x9f, 0xa5, 0xd8, 0xb5, 0xe4, 0xad,
18684f7f180SDaniel P. Berrange 0x40, 0xe7, 0x36, 0xdd, 0xb4, 0xd3, 0x54, 0x12,
18784f7f180SDaniel P. Berrange 0x32, 0x80, 0x63, 0xfd, 0x2a, 0xab, 0x53, 0xe5,
18884f7f180SDaniel P. Berrange 0xea, 0x1e, 0x0a, 0x9f, 0x33, 0x25, 0x00, 0xa5,
18984f7f180SDaniel P. Berrange 0xdf, 0x94, 0x87, 0xd0, 0x7a, 0x5c, 0x92, 0xcc,
19084f7f180SDaniel P. Berrange 0x51, 0x2c, 0x88, 0x66, 0xc7, 0xe8, 0x60, 0xce,
19184f7f180SDaniel P. Berrange 0x93, 0xfd, 0xf1, 0x66, 0xa2, 0x49, 0x12, 0xb4,
19284f7f180SDaniel P. Berrange 0x22, 0x97, 0x61, 0x46, 0xae, 0x20, 0xce, 0x84,
19384f7f180SDaniel P. Berrange 0x6b, 0xb7, 0xdc, 0x9b, 0xa9, 0x4a, 0x76, 0x7a,
19484f7f180SDaniel P. Berrange 0xae, 0xf2, 0x0c, 0x0d, 0x61, 0xad, 0x02, 0x65,
19584f7f180SDaniel P. Berrange 0x5e, 0xa9, 0x2d, 0xc4, 0xc4, 0xe4, 0x1a, 0x89,
19684f7f180SDaniel P. Berrange 0x52, 0xc6, 0x51, 0xd3, 0x31, 0x74, 0xbe, 0x51,
19784f7f180SDaniel P. Berrange 0xa1, 0x0c, 0x42, 0x11, 0x10, 0xe6, 0xd8, 0x15,
19884f7f180SDaniel P. Berrange 0x88, 0xed, 0xe8, 0x21, 0x03, 0xa2, 0x52, 0xd8,
19984f7f180SDaniel P. Berrange 0xa7, 0x50, 0xe8, 0x76, 0x8d, 0xef, 0xff, 0xed,
20084f7f180SDaniel P. Berrange 0x91, 0x22, 0x81, 0x0a, 0xae, 0xb9, 0x9f, 0x91,
20184f7f180SDaniel P. Berrange 0x72, 0xaf, 0x82, 0xb6, 0x04, 0xdc, 0x4b, 0x8e,
20284f7f180SDaniel P. Berrange 0x51, 0xbc, 0xb0, 0x82, 0x35, 0xa6, 0xf4, 0x34,
20384f7f180SDaniel P. Berrange 0x13, 0x32, 0xe4, 0xca, 0x60, 0x48, 0x2a, 0x4b,
20484f7f180SDaniel P. Berrange 0xa1, 0xa0, 0x3b, 0x3e, 0x65, 0x00, 0x8f, 0xc5,
20584f7f180SDaniel P. Berrange 0xda, 0x76, 0xb7, 0x0b, 0xf1, 0x69, 0x0d, 0xb4,
20684f7f180SDaniel P. Berrange 0xea, 0xe2, 0x9c, 0x5f, 0x1b, 0xad, 0xd0, 0x3c,
20784f7f180SDaniel P. Berrange 0x5c, 0xcf, 0x2a, 0x55, 0xd7, 0x05, 0xdd, 0xcd,
20884f7f180SDaniel P. Berrange 0x86, 0xd4, 0x49, 0x51, 0x1c, 0xeb, 0x7e, 0xc3,
20984f7f180SDaniel P. Berrange 0x0b, 0xf1, 0x2b, 0x1f, 0xa3, 0x5b, 0x91, 0x3f,
21084f7f180SDaniel P. Berrange 0x9f, 0x74, 0x7a, 0x8a, 0xfd, 0x1b, 0x13, 0x0e,
21184f7f180SDaniel P. Berrange 0x94, 0xbf, 0xf9, 0x4e, 0xff, 0xd0, 0x1a, 0x91,
21284f7f180SDaniel P. Berrange 0x73, 0x5c, 0xa1, 0x72, 0x6a, 0xcd, 0x0b, 0x19,
21384f7f180SDaniel P. Berrange 0x7c, 0x4e, 0x5b, 0x03, 0x39, 0x36, 0x97, 0xe1,
21484f7f180SDaniel P. Berrange 0x26, 0x82, 0x6f, 0xb6, 0xbb, 0xde, 0x8e, 0xcc,
21584f7f180SDaniel P. Berrange 0x1e, 0x08, 0x29, 0x85, 0x16, 0xe2, 0xc9, 0xed,
21684f7f180SDaniel P. Berrange 0x03, 0xff, 0x3c, 0x1b, 0x78, 0x60, 0xf6, 0xde,
21784f7f180SDaniel P. Berrange 0x76, 0xd4, 0xce, 0xcd, 0x94, 0xc8, 0x11, 0x98,
21884f7f180SDaniel P. Berrange 0x55, 0xef, 0x52, 0x97, 0xca, 0x67, 0xe9, 0xf3,
21984f7f180SDaniel P. Berrange 0xe7, 0xff, 0x72, 0xb1, 0xe9, 0x97, 0x85, 0xca,
22084f7f180SDaniel P. Berrange 0x0a, 0x7e, 0x77, 0x20, 0xc5, 0xb3, 0x6d, 0xc6,
22184f7f180SDaniel P. Berrange 0xd7, 0x2c, 0xac, 0x95, 0x74, 0xc8, 0xcb, 0xbc,
22284f7f180SDaniel P. Berrange 0x2f, 0x80, 0x1e, 0x23, 0xe5, 0x6f, 0xd3, 0x44,
22384f7f180SDaniel P. Berrange 0xb0, 0x7f, 0x22, 0x15, 0x4b, 0xeb, 0xa0, 0xf0,
22484f7f180SDaniel P. Berrange 0x8c, 0xe8, 0x89, 0x1e, 0x64, 0x3e, 0xd9, 0x95,
22584f7f180SDaniel P. Berrange 0xc9, 0x4d, 0x9a, 0x69, 0xc9, 0xf1, 0xb5, 0xf4,
22684f7f180SDaniel P. Berrange 0x99, 0x02, 0x7a, 0x78, 0x57, 0x2a, 0xee, 0xbd,
22784f7f180SDaniel P. Berrange 0x74, 0xd2, 0x0c, 0xc3, 0x98, 0x81, 0xc2, 0x13,
22884f7f180SDaniel P. Berrange 0xee, 0x77, 0x0b, 0x10, 0x10, 0xe4, 0xbe, 0xa7,
22984f7f180SDaniel P. Berrange 0x18, 0x84, 0x69, 0x77, 0xae, 0x11, 0x9f, 0x7a,
23084f7f180SDaniel P. Berrange 0x02, 0x3a, 0xb5, 0x8c, 0xca, 0x0a, 0xd7, 0x52,
23184f7f180SDaniel P. Berrange 0xaf, 0xe6, 0x56, 0xbb, 0x3c, 0x17, 0x25, 0x6a,
23284f7f180SDaniel P. Berrange 0x9f, 0x6e, 0x9b, 0xf1, 0x9f, 0xdd, 0x5a, 0x38,
23384f7f180SDaniel P. Berrange 0xfc, 0x82, 0xbb, 0xe8, 0x72, 0xc5, 0x53, 0x9e,
23484f7f180SDaniel P. Berrange 0xdb, 0x60, 0x9e, 0xf4, 0xf7, 0x9c, 0x20, 0x3e,
23584f7f180SDaniel P. Berrange 0xbb, 0x14, 0x0f, 0x2e, 0x58, 0x3c, 0xb2, 0xad,
23684f7f180SDaniel P. Berrange 0x15, 0xb4, 0xaa, 0x5b, 0x65, 0x50, 0x16, 0xa8,
23784f7f180SDaniel P. Berrange 0x44, 0x92, 0x77, 0xdb, 0xd4, 0x77, 0xef, 0x2c,
23884f7f180SDaniel P. Berrange 0x8d, 0x6c, 0x01, 0x7d, 0xb7, 0x38, 0xb1, 0x8d,
23984f7f180SDaniel P. Berrange 0xeb, 0x4a, 0x42, 0x7d, 0x19, 0x23, 0xce, 0x3f,
24084f7f180SDaniel P. Berrange 0xf2, 0x62, 0x73, 0x57, 0x79, 0xa4, 0x18, 0xf2,
24184f7f180SDaniel P. Berrange 0x0a, 0x28, 0x2d, 0xf9, 0x20, 0x14, 0x7b, 0xea,
24284f7f180SDaniel P. Berrange 0xbe, 0x42, 0x1e, 0xe5, 0x31, 0x9d, 0x05, 0x68,
24384f7f180SDaniel P. Berrange }
24484f7f180SDaniel P. Berrange },
24584f7f180SDaniel P. Berrange
24684f7f180SDaniel P. Berrange /* #7, 32 byte key, 17 byte PTX */
24784f7f180SDaniel P. Berrange {
24884f7f180SDaniel P. Berrange "/crypto/xts/t-7-key-32-ptx-17",
24984f7f180SDaniel P. Berrange 32,
25084f7f180SDaniel P. Berrange { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
25184f7f180SDaniel P. Berrange 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0 },
25284f7f180SDaniel P. Berrange { 0xbf, 0xbe, 0xbd, 0xbc, 0xbb, 0xba, 0xb9, 0xb8,
25384f7f180SDaniel P. Berrange 0xb7, 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, 0xb1, 0xb0 },
25484f7f180SDaniel P. Berrange 0x123456789aLL,
25584f7f180SDaniel P. Berrange 17,
25684f7f180SDaniel P. Berrange { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
25784f7f180SDaniel P. Berrange 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 },
25884f7f180SDaniel P. Berrange { 0x6c, 0x16, 0x25, 0xdb, 0x46, 0x71, 0x52, 0x2d,
25984f7f180SDaniel P. Berrange 0x3d, 0x75, 0x99, 0x60, 0x1d, 0xe7, 0xca, 0x09, 0xed },
26084f7f180SDaniel P. Berrange },
26184f7f180SDaniel P. Berrange
26284f7f180SDaniel P. Berrange /* #15, 32 byte key, 25 byte PTX */
26384f7f180SDaniel P. Berrange {
26484f7f180SDaniel P. Berrange "/crypto/xts/t-15-key-32-ptx-25",
26584f7f180SDaniel P. Berrange 32,
26684f7f180SDaniel P. Berrange { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
26784f7f180SDaniel P. Berrange 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0 },
26884f7f180SDaniel P. Berrange { 0xbf, 0xbe, 0xbd, 0xbc, 0xbb, 0xba, 0xb9, 0xb8,
26984f7f180SDaniel P. Berrange 0xb7, 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, 0xb1, 0xb0 },
27084f7f180SDaniel P. Berrange 0x123456789aLL,
27184f7f180SDaniel P. Berrange 25,
27284f7f180SDaniel P. Berrange { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
27384f7f180SDaniel P. Berrange 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
27484f7f180SDaniel P. Berrange 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18 },
27584f7f180SDaniel P. Berrange { 0x8f, 0x4d, 0xcb, 0xad, 0x55, 0x55, 0x8d, 0x7b,
27684f7f180SDaniel P. Berrange 0x4e, 0x01, 0xd9, 0x37, 0x9c, 0xd4, 0xea, 0x22,
27784f7f180SDaniel P. Berrange 0xed, 0xbf, 0x9d, 0xac, 0xe4, 0x5d, 0x6f, 0x6a, 0x73 },
27884f7f180SDaniel P. Berrange },
27984f7f180SDaniel P. Berrange
28084f7f180SDaniel P. Berrange /* #21, 32 byte key, 31 byte PTX */
28184f7f180SDaniel P. Berrange {
28284f7f180SDaniel P. Berrange "/crypto/xts/t-21-key-32-ptx-31",
28384f7f180SDaniel P. Berrange 32,
28484f7f180SDaniel P. Berrange { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
28584f7f180SDaniel P. Berrange 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0 },
28684f7f180SDaniel P. Berrange { 0xbf, 0xbe, 0xbd, 0xbc, 0xbb, 0xba, 0xb9, 0xb8,
28784f7f180SDaniel P. Berrange 0xb7, 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, 0xb1, 0xb0 },
28884f7f180SDaniel P. Berrange 0x123456789aLL,
28984f7f180SDaniel P. Berrange 31,
29084f7f180SDaniel P. Berrange { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
29184f7f180SDaniel P. Berrange 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
29284f7f180SDaniel P. Berrange 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
29384f7f180SDaniel P. Berrange 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e },
29484f7f180SDaniel P. Berrange { 0xd0, 0x5b, 0xc0, 0x90, 0xa8, 0xe0, 0x4f, 0x1b,
29584f7f180SDaniel P. Berrange 0x3d, 0x3e, 0xcd, 0xd5, 0xba, 0xec, 0x0f, 0xd4,
29684f7f180SDaniel P. Berrange 0xed, 0xbf, 0x9d, 0xac, 0xe4, 0x5d, 0x6f, 0x6a,
29784f7f180SDaniel P. Berrange 0x73, 0x06, 0xe6, 0x4b, 0xe5, 0xdd, 0x82 },
29884f7f180SDaniel P. Berrange },
29984f7f180SDaniel P. Berrange };
30084f7f180SDaniel P. Berrange
30184f7f180SDaniel P. Berrange #define STORE64L(x, y) \
30284f7f180SDaniel P. Berrange do { \
30384f7f180SDaniel P. Berrange (y)[7] = (unsigned char)(((x) >> 56) & 255); \
30484f7f180SDaniel P. Berrange (y)[6] = (unsigned char)(((x) >> 48) & 255); \
30584f7f180SDaniel P. Berrange (y)[5] = (unsigned char)(((x) >> 40) & 255); \
30684f7f180SDaniel P. Berrange (y)[4] = (unsigned char)(((x) >> 32) & 255); \
30784f7f180SDaniel P. Berrange (y)[3] = (unsigned char)(((x) >> 24) & 255); \
30884f7f180SDaniel P. Berrange (y)[2] = (unsigned char)(((x) >> 16) & 255); \
30984f7f180SDaniel P. Berrange (y)[1] = (unsigned char)(((x) >> 8) & 255); \
31084f7f180SDaniel P. Berrange (y)[0] = (unsigned char)((x) & 255); \
31184f7f180SDaniel P. Berrange } while (0)
31284f7f180SDaniel P. Berrange
31384f7f180SDaniel P. Berrange struct TestAES {
31484f7f180SDaniel P. Berrange AES_KEY enc;
31584f7f180SDaniel P. Berrange AES_KEY dec;
31684f7f180SDaniel P. Berrange };
31784f7f180SDaniel P. Berrange
test_xts_aes_encrypt(const void * ctx,size_t length,uint8_t * dst,const uint8_t * src)31884f7f180SDaniel P. Berrange static void test_xts_aes_encrypt(const void *ctx,
31984f7f180SDaniel P. Berrange size_t length,
32084f7f180SDaniel P. Berrange uint8_t *dst,
32184f7f180SDaniel P. Berrange const uint8_t *src)
32284f7f180SDaniel P. Berrange {
32384f7f180SDaniel P. Berrange const struct TestAES *aesctx = ctx;
32484f7f180SDaniel P. Berrange
32584f7f180SDaniel P. Berrange AES_encrypt(src, dst, &aesctx->enc);
32684f7f180SDaniel P. Berrange }
32784f7f180SDaniel P. Berrange
32884f7f180SDaniel P. Berrange
test_xts_aes_decrypt(const void * ctx,size_t length,uint8_t * dst,const uint8_t * src)32984f7f180SDaniel P. Berrange static void test_xts_aes_decrypt(const void *ctx,
33084f7f180SDaniel P. Berrange size_t length,
33184f7f180SDaniel P. Berrange uint8_t *dst,
33284f7f180SDaniel P. Berrange const uint8_t *src)
33384f7f180SDaniel P. Berrange {
33484f7f180SDaniel P. Berrange const struct TestAES *aesctx = ctx;
33584f7f180SDaniel P. Berrange
33684f7f180SDaniel P. Berrange AES_decrypt(src, dst, &aesctx->dec);
33784f7f180SDaniel P. Berrange }
33884f7f180SDaniel P. Berrange
33984f7f180SDaniel P. Berrange
test_xts(const void * opaque)34084f7f180SDaniel P. Berrange static void test_xts(const void *opaque)
34184f7f180SDaniel P. Berrange {
34284f7f180SDaniel P. Berrange const QCryptoXTSTestData *data = opaque;
343a61f682fSDaniel P. Berrangé uint8_t out[512], Torg[16], T[16];
34484f7f180SDaniel P. Berrange uint64_t seq;
34584f7f180SDaniel P. Berrange struct TestAES aesdata;
34684f7f180SDaniel P. Berrange struct TestAES aestweak;
34784f7f180SDaniel P. Berrange
34884f7f180SDaniel P. Berrange AES_set_encrypt_key(data->key1, data->keylen / 2 * 8, &aesdata.enc);
34984f7f180SDaniel P. Berrange AES_set_decrypt_key(data->key1, data->keylen / 2 * 8, &aesdata.dec);
35084f7f180SDaniel P. Berrange AES_set_encrypt_key(data->key2, data->keylen / 2 * 8, &aestweak.enc);
35184f7f180SDaniel P. Berrange AES_set_decrypt_key(data->key2, data->keylen / 2 * 8, &aestweak.dec);
35284f7f180SDaniel P. Berrange
35384f7f180SDaniel P. Berrange seq = data->seqnum;
35484f7f180SDaniel P. Berrange STORE64L(seq, Torg);
35584f7f180SDaniel P. Berrange memset(Torg + 8, 0, 8);
35684f7f180SDaniel P. Berrange
35784f7f180SDaniel P. Berrange memcpy(T, Torg, sizeof(T));
35884f7f180SDaniel P. Berrange xts_encrypt(&aesdata, &aestweak,
35984f7f180SDaniel P. Berrange test_xts_aes_encrypt,
36084f7f180SDaniel P. Berrange test_xts_aes_decrypt,
3618cbfc942SDaniel P. Berrange T, data->PTLEN, out, data->PTX);
362a61f682fSDaniel P. Berrangé
363a61f682fSDaniel P. Berrangé g_assert(memcmp(out, data->CTX, data->PTLEN) == 0);
364a61f682fSDaniel P. Berrangé
365a61f682fSDaniel P. Berrangé memcpy(T, Torg, sizeof(T));
366a61f682fSDaniel P. Berrangé xts_decrypt(&aesdata, &aestweak,
367a61f682fSDaniel P. Berrangé test_xts_aes_encrypt,
368a61f682fSDaniel P. Berrangé test_xts_aes_decrypt,
369a61f682fSDaniel P. Berrangé T, data->PTLEN, out, data->CTX);
370a61f682fSDaniel P. Berrangé
371a61f682fSDaniel P. Berrangé g_assert(memcmp(out, data->PTX, data->PTLEN) == 0);
372a61f682fSDaniel P. Berrangé }
373a61f682fSDaniel P. Berrangé
374a61f682fSDaniel P. Berrangé
test_xts_split(const void * opaque)375a61f682fSDaniel P. Berrangé static void test_xts_split(const void *opaque)
376a61f682fSDaniel P. Berrangé {
377a61f682fSDaniel P. Berrangé const QCryptoXTSTestData *data = opaque;
378a61f682fSDaniel P. Berrangé uint8_t out[512], Torg[16], T[16];
379a61f682fSDaniel P. Berrangé uint64_t seq;
380a61f682fSDaniel P. Berrangé unsigned long len = data->PTLEN / 2;
381a61f682fSDaniel P. Berrangé struct TestAES aesdata;
382a61f682fSDaniel P. Berrangé struct TestAES aestweak;
383a61f682fSDaniel P. Berrangé
384a61f682fSDaniel P. Berrangé AES_set_encrypt_key(data->key1, data->keylen / 2 * 8, &aesdata.enc);
385a61f682fSDaniel P. Berrangé AES_set_decrypt_key(data->key1, data->keylen / 2 * 8, &aesdata.dec);
386a61f682fSDaniel P. Berrangé AES_set_encrypt_key(data->key2, data->keylen / 2 * 8, &aestweak.enc);
387a61f682fSDaniel P. Berrangé AES_set_decrypt_key(data->key2, data->keylen / 2 * 8, &aestweak.dec);
388a61f682fSDaniel P. Berrangé
389a61f682fSDaniel P. Berrangé seq = data->seqnum;
390a61f682fSDaniel P. Berrangé STORE64L(seq, Torg);
391a61f682fSDaniel P. Berrangé memset(Torg + 8, 0, 8);
392a61f682fSDaniel P. Berrangé
393a61f682fSDaniel P. Berrangé memcpy(T, Torg, sizeof(T));
39484f7f180SDaniel P. Berrange xts_encrypt(&aesdata, &aestweak,
39584f7f180SDaniel P. Berrange test_xts_aes_encrypt,
39684f7f180SDaniel P. Berrange test_xts_aes_decrypt,
3978cbfc942SDaniel P. Berrange T, len, out, data->PTX);
39884f7f180SDaniel P. Berrange xts_encrypt(&aesdata, &aestweak,
39984f7f180SDaniel P. Berrange test_xts_aes_encrypt,
40084f7f180SDaniel P. Berrange test_xts_aes_decrypt,
4018cbfc942SDaniel P. Berrange T, len, &out[len], &data->PTX[len]);
40284f7f180SDaniel P. Berrange
4038cbfc942SDaniel P. Berrange g_assert(memcmp(out, data->CTX, data->PTLEN) == 0);
40484f7f180SDaniel P. Berrange
40584f7f180SDaniel P. Berrange memcpy(T, Torg, sizeof(T));
40684f7f180SDaniel P. Berrange xts_decrypt(&aesdata, &aestweak,
40784f7f180SDaniel P. Berrange test_xts_aes_encrypt,
40884f7f180SDaniel P. Berrange test_xts_aes_decrypt,
4098cbfc942SDaniel P. Berrange T, len, out, data->CTX);
41084f7f180SDaniel P. Berrange xts_decrypt(&aesdata, &aestweak,
41184f7f180SDaniel P. Berrange test_xts_aes_encrypt,
41284f7f180SDaniel P. Berrange test_xts_aes_decrypt,
4138cbfc942SDaniel P. Berrange T, len, &out[len], &data->CTX[len]);
41484f7f180SDaniel P. Berrange
4158cbfc942SDaniel P. Berrange g_assert(memcmp(out, data->PTX, data->PTLEN) == 0);
41684f7f180SDaniel P. Berrange }
41784f7f180SDaniel P. Berrange
41884f7f180SDaniel P. Berrange
test_xts_unaligned(const void * opaque)4191e0fa32cSDaniel P. Berrangé static void test_xts_unaligned(const void *opaque)
4201e0fa32cSDaniel P. Berrangé {
4211e0fa32cSDaniel P. Berrangé #define BAD_ALIGN 3
4221e0fa32cSDaniel P. Berrangé const QCryptoXTSTestData *data = opaque;
4231e0fa32cSDaniel P. Berrangé uint8_t in[512 + BAD_ALIGN], out[512 + BAD_ALIGN];
4241e0fa32cSDaniel P. Berrangé uint8_t Torg[16], T[16 + BAD_ALIGN];
4251e0fa32cSDaniel P. Berrangé uint64_t seq;
4261e0fa32cSDaniel P. Berrangé struct TestAES aesdata;
4271e0fa32cSDaniel P. Berrangé struct TestAES aestweak;
4281e0fa32cSDaniel P. Berrangé
4291e0fa32cSDaniel P. Berrangé AES_set_encrypt_key(data->key1, data->keylen / 2 * 8, &aesdata.enc);
4301e0fa32cSDaniel P. Berrangé AES_set_decrypt_key(data->key1, data->keylen / 2 * 8, &aesdata.dec);
4311e0fa32cSDaniel P. Berrangé AES_set_encrypt_key(data->key2, data->keylen / 2 * 8, &aestweak.enc);
4321e0fa32cSDaniel P. Berrangé AES_set_decrypt_key(data->key2, data->keylen / 2 * 8, &aestweak.dec);
4331e0fa32cSDaniel P. Berrangé
4341e0fa32cSDaniel P. Berrangé seq = data->seqnum;
4351e0fa32cSDaniel P. Berrangé STORE64L(seq, Torg);
4361e0fa32cSDaniel P. Berrangé memset(Torg + 8, 0, 8);
4371e0fa32cSDaniel P. Berrangé
4381e0fa32cSDaniel P. Berrangé /* IV not aligned */
4391e0fa32cSDaniel P. Berrangé memcpy(T + BAD_ALIGN, Torg, 16);
4401e0fa32cSDaniel P. Berrangé memcpy(in, data->PTX, data->PTLEN);
4411e0fa32cSDaniel P. Berrangé xts_encrypt(&aesdata, &aestweak,
4421e0fa32cSDaniel P. Berrangé test_xts_aes_encrypt,
4431e0fa32cSDaniel P. Berrangé test_xts_aes_decrypt,
4441e0fa32cSDaniel P. Berrangé T + BAD_ALIGN, data->PTLEN, out, in);
4451e0fa32cSDaniel P. Berrangé
4461e0fa32cSDaniel P. Berrangé g_assert(memcmp(out, data->CTX, data->PTLEN) == 0);
4471e0fa32cSDaniel P. Berrangé
4481e0fa32cSDaniel P. Berrangé /* plain text not aligned */
4491e0fa32cSDaniel P. Berrangé memcpy(T, Torg, 16);
4501e0fa32cSDaniel P. Berrangé memcpy(in + BAD_ALIGN, data->PTX, data->PTLEN);
4511e0fa32cSDaniel P. Berrangé xts_encrypt(&aesdata, &aestweak,
4521e0fa32cSDaniel P. Berrangé test_xts_aes_encrypt,
4531e0fa32cSDaniel P. Berrangé test_xts_aes_decrypt,
4541e0fa32cSDaniel P. Berrangé T, data->PTLEN, out, in + BAD_ALIGN);
4551e0fa32cSDaniel P. Berrangé
4561e0fa32cSDaniel P. Berrangé g_assert(memcmp(out, data->CTX, data->PTLEN) == 0);
4571e0fa32cSDaniel P. Berrangé
4581e0fa32cSDaniel P. Berrangé /* cipher text not aligned */
4591e0fa32cSDaniel P. Berrangé memcpy(T, Torg, 16);
4601e0fa32cSDaniel P. Berrangé memcpy(in, data->PTX, data->PTLEN);
4611e0fa32cSDaniel P. Berrangé xts_encrypt(&aesdata, &aestweak,
4621e0fa32cSDaniel P. Berrangé test_xts_aes_encrypt,
4631e0fa32cSDaniel P. Berrangé test_xts_aes_decrypt,
4641e0fa32cSDaniel P. Berrangé T, data->PTLEN, out + BAD_ALIGN, in);
4651e0fa32cSDaniel P. Berrangé
4661e0fa32cSDaniel P. Berrangé g_assert(memcmp(out + BAD_ALIGN, data->CTX, data->PTLEN) == 0);
4671e0fa32cSDaniel P. Berrangé
4681e0fa32cSDaniel P. Berrangé
4691e0fa32cSDaniel P. Berrangé /* IV not aligned */
4701e0fa32cSDaniel P. Berrangé memcpy(T + BAD_ALIGN, Torg, 16);
4711e0fa32cSDaniel P. Berrangé memcpy(in, data->CTX, data->PTLEN);
4721e0fa32cSDaniel P. Berrangé xts_decrypt(&aesdata, &aestweak,
4731e0fa32cSDaniel P. Berrangé test_xts_aes_encrypt,
4741e0fa32cSDaniel P. Berrangé test_xts_aes_decrypt,
4751e0fa32cSDaniel P. Berrangé T + BAD_ALIGN, data->PTLEN, out, in);
4761e0fa32cSDaniel P. Berrangé
4771e0fa32cSDaniel P. Berrangé g_assert(memcmp(out, data->PTX, data->PTLEN) == 0);
4781e0fa32cSDaniel P. Berrangé
4791e0fa32cSDaniel P. Berrangé /* cipher text not aligned */
4801e0fa32cSDaniel P. Berrangé memcpy(T, Torg, 16);
4811e0fa32cSDaniel P. Berrangé memcpy(in + BAD_ALIGN, data->CTX, data->PTLEN);
4821e0fa32cSDaniel P. Berrangé xts_decrypt(&aesdata, &aestweak,
4831e0fa32cSDaniel P. Berrangé test_xts_aes_encrypt,
4841e0fa32cSDaniel P. Berrangé test_xts_aes_decrypt,
4851e0fa32cSDaniel P. Berrangé T, data->PTLEN, out, in + BAD_ALIGN);
4861e0fa32cSDaniel P. Berrangé
4871e0fa32cSDaniel P. Berrangé g_assert(memcmp(out, data->PTX, data->PTLEN) == 0);
4881e0fa32cSDaniel P. Berrangé
4891e0fa32cSDaniel P. Berrangé /* plain text not aligned */
4901e0fa32cSDaniel P. Berrangé memcpy(T, Torg, 16);
4911e0fa32cSDaniel P. Berrangé memcpy(in, data->CTX, data->PTLEN);
4921e0fa32cSDaniel P. Berrangé xts_decrypt(&aesdata, &aestweak,
4931e0fa32cSDaniel P. Berrangé test_xts_aes_encrypt,
4941e0fa32cSDaniel P. Berrangé test_xts_aes_decrypt,
4951e0fa32cSDaniel P. Berrangé T, data->PTLEN, out + BAD_ALIGN, in);
4961e0fa32cSDaniel P. Berrangé
4971e0fa32cSDaniel P. Berrangé g_assert(memcmp(out + BAD_ALIGN, data->PTX, data->PTLEN) == 0);
4981e0fa32cSDaniel P. Berrangé }
4991e0fa32cSDaniel P. Berrangé
5001e0fa32cSDaniel P. Berrangé
main(int argc,char ** argv)50184f7f180SDaniel P. Berrange int main(int argc, char **argv)
50284f7f180SDaniel P. Berrange {
50384f7f180SDaniel P. Berrange size_t i;
50484f7f180SDaniel P. Berrange
50584f7f180SDaniel P. Berrange g_test_init(&argc, &argv, NULL);
50684f7f180SDaniel P. Berrange
50784f7f180SDaniel P. Berrange g_assert(qcrypto_init(NULL) == 0);
50884f7f180SDaniel P. Berrange
50984f7f180SDaniel P. Berrange for (i = 0; i < G_N_ELEMENTS(test_data); i++) {
510a61f682fSDaniel P. Berrangé gchar *path = g_strdup_printf("%s/basic", test_data[i].path);
511a61f682fSDaniel P. Berrangé g_test_add_data_func(path, &test_data[i], test_xts);
512a61f682fSDaniel P. Berrangé g_free(path);
513a61f682fSDaniel P. Berrangé
514a61f682fSDaniel P. Berrangé /* skip the cases where the length is smaller than 2*blocklen
515a61f682fSDaniel P. Berrangé * or the length is not a multiple of 32
516a61f682fSDaniel P. Berrangé */
517a61f682fSDaniel P. Berrangé if ((test_data[i].PTLEN >= 32) && !(test_data[i].PTLEN % 32)) {
518a61f682fSDaniel P. Berrangé path = g_strdup_printf("%s/split", test_data[i].path);
519a61f682fSDaniel P. Berrangé g_test_add_data_func(path, &test_data[i], test_xts_split);
520a61f682fSDaniel P. Berrangé g_free(path);
521a61f682fSDaniel P. Berrangé }
5221e0fa32cSDaniel P. Berrangé
5231e0fa32cSDaniel P. Berrangé path = g_strdup_printf("%s/unaligned", test_data[i].path);
5241e0fa32cSDaniel P. Berrangé g_test_add_data_func(path, &test_data[i], test_xts_unaligned);
5251e0fa32cSDaniel P. Berrangé g_free(path);
52684f7f180SDaniel P. Berrange }
52784f7f180SDaniel P. Berrange
52884f7f180SDaniel P. Berrange return g_test_run();
52984f7f180SDaniel P. Berrange }
530