xref: /qemu/tests/unit/test-crypto-xts.c (revision da668aa15b99150a8595c491aee00d5d2426aaf9)
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