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 984f7f180SDaniel P. Berrange * version 2 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 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 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 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é 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 419*1e0fa32cSDaniel P. Berrangé static void test_xts_unaligned(const void *opaque) 420*1e0fa32cSDaniel P. Berrangé { 421*1e0fa32cSDaniel P. Berrangé #define BAD_ALIGN 3 422*1e0fa32cSDaniel P. Berrangé const QCryptoXTSTestData *data = opaque; 423*1e0fa32cSDaniel P. Berrangé uint8_t in[512 + BAD_ALIGN], out[512 + BAD_ALIGN]; 424*1e0fa32cSDaniel P. Berrangé uint8_t Torg[16], T[16 + BAD_ALIGN]; 425*1e0fa32cSDaniel P. Berrangé uint64_t seq; 426*1e0fa32cSDaniel P. Berrangé struct TestAES aesdata; 427*1e0fa32cSDaniel P. Berrangé struct TestAES aestweak; 428*1e0fa32cSDaniel P. Berrangé 429*1e0fa32cSDaniel P. Berrangé AES_set_encrypt_key(data->key1, data->keylen / 2 * 8, &aesdata.enc); 430*1e0fa32cSDaniel P. Berrangé AES_set_decrypt_key(data->key1, data->keylen / 2 * 8, &aesdata.dec); 431*1e0fa32cSDaniel P. Berrangé AES_set_encrypt_key(data->key2, data->keylen / 2 * 8, &aestweak.enc); 432*1e0fa32cSDaniel P. Berrangé AES_set_decrypt_key(data->key2, data->keylen / 2 * 8, &aestweak.dec); 433*1e0fa32cSDaniel P. Berrangé 434*1e0fa32cSDaniel P. Berrangé seq = data->seqnum; 435*1e0fa32cSDaniel P. Berrangé STORE64L(seq, Torg); 436*1e0fa32cSDaniel P. Berrangé memset(Torg + 8, 0, 8); 437*1e0fa32cSDaniel P. Berrangé 438*1e0fa32cSDaniel P. Berrangé /* IV not aligned */ 439*1e0fa32cSDaniel P. Berrangé memcpy(T + BAD_ALIGN, Torg, 16); 440*1e0fa32cSDaniel P. Berrangé memcpy(in, data->PTX, data->PTLEN); 441*1e0fa32cSDaniel P. Berrangé xts_encrypt(&aesdata, &aestweak, 442*1e0fa32cSDaniel P. Berrangé test_xts_aes_encrypt, 443*1e0fa32cSDaniel P. Berrangé test_xts_aes_decrypt, 444*1e0fa32cSDaniel P. Berrangé T + BAD_ALIGN, data->PTLEN, out, in); 445*1e0fa32cSDaniel P. Berrangé 446*1e0fa32cSDaniel P. Berrangé g_assert(memcmp(out, data->CTX, data->PTLEN) == 0); 447*1e0fa32cSDaniel P. Berrangé 448*1e0fa32cSDaniel P. Berrangé /* plain text not aligned */ 449*1e0fa32cSDaniel P. Berrangé memcpy(T, Torg, 16); 450*1e0fa32cSDaniel P. Berrangé memcpy(in + BAD_ALIGN, data->PTX, data->PTLEN); 451*1e0fa32cSDaniel P. Berrangé xts_encrypt(&aesdata, &aestweak, 452*1e0fa32cSDaniel P. Berrangé test_xts_aes_encrypt, 453*1e0fa32cSDaniel P. Berrangé test_xts_aes_decrypt, 454*1e0fa32cSDaniel P. Berrangé T, data->PTLEN, out, in + BAD_ALIGN); 455*1e0fa32cSDaniel P. Berrangé 456*1e0fa32cSDaniel P. Berrangé g_assert(memcmp(out, data->CTX, data->PTLEN) == 0); 457*1e0fa32cSDaniel P. Berrangé 458*1e0fa32cSDaniel P. Berrangé /* cipher text not aligned */ 459*1e0fa32cSDaniel P. Berrangé memcpy(T, Torg, 16); 460*1e0fa32cSDaniel P. Berrangé memcpy(in, data->PTX, data->PTLEN); 461*1e0fa32cSDaniel P. Berrangé xts_encrypt(&aesdata, &aestweak, 462*1e0fa32cSDaniel P. Berrangé test_xts_aes_encrypt, 463*1e0fa32cSDaniel P. Berrangé test_xts_aes_decrypt, 464*1e0fa32cSDaniel P. Berrangé T, data->PTLEN, out + BAD_ALIGN, in); 465*1e0fa32cSDaniel P. Berrangé 466*1e0fa32cSDaniel P. Berrangé g_assert(memcmp(out + BAD_ALIGN, data->CTX, data->PTLEN) == 0); 467*1e0fa32cSDaniel P. Berrangé 468*1e0fa32cSDaniel P. Berrangé 469*1e0fa32cSDaniel P. Berrangé /* IV not aligned */ 470*1e0fa32cSDaniel P. Berrangé memcpy(T + BAD_ALIGN, Torg, 16); 471*1e0fa32cSDaniel P. Berrangé memcpy(in, data->CTX, data->PTLEN); 472*1e0fa32cSDaniel P. Berrangé xts_decrypt(&aesdata, &aestweak, 473*1e0fa32cSDaniel P. Berrangé test_xts_aes_encrypt, 474*1e0fa32cSDaniel P. Berrangé test_xts_aes_decrypt, 475*1e0fa32cSDaniel P. Berrangé T + BAD_ALIGN, data->PTLEN, out, in); 476*1e0fa32cSDaniel P. Berrangé 477*1e0fa32cSDaniel P. Berrangé g_assert(memcmp(out, data->PTX, data->PTLEN) == 0); 478*1e0fa32cSDaniel P. Berrangé 479*1e0fa32cSDaniel P. Berrangé /* cipher text not aligned */ 480*1e0fa32cSDaniel P. Berrangé memcpy(T, Torg, 16); 481*1e0fa32cSDaniel P. Berrangé memcpy(in + BAD_ALIGN, data->CTX, data->PTLEN); 482*1e0fa32cSDaniel P. Berrangé xts_decrypt(&aesdata, &aestweak, 483*1e0fa32cSDaniel P. Berrangé test_xts_aes_encrypt, 484*1e0fa32cSDaniel P. Berrangé test_xts_aes_decrypt, 485*1e0fa32cSDaniel P. Berrangé T, data->PTLEN, out, in + BAD_ALIGN); 486*1e0fa32cSDaniel P. Berrangé 487*1e0fa32cSDaniel P. Berrangé g_assert(memcmp(out, data->PTX, data->PTLEN) == 0); 488*1e0fa32cSDaniel P. Berrangé 489*1e0fa32cSDaniel P. Berrangé /* plain text not aligned */ 490*1e0fa32cSDaniel P. Berrangé memcpy(T, Torg, 16); 491*1e0fa32cSDaniel P. Berrangé memcpy(in, data->CTX, data->PTLEN); 492*1e0fa32cSDaniel P. Berrangé xts_decrypt(&aesdata, &aestweak, 493*1e0fa32cSDaniel P. Berrangé test_xts_aes_encrypt, 494*1e0fa32cSDaniel P. Berrangé test_xts_aes_decrypt, 495*1e0fa32cSDaniel P. Berrangé T, data->PTLEN, out + BAD_ALIGN, in); 496*1e0fa32cSDaniel P. Berrangé 497*1e0fa32cSDaniel P. Berrangé g_assert(memcmp(out + BAD_ALIGN, data->PTX, data->PTLEN) == 0); 498*1e0fa32cSDaniel P. Berrangé } 499*1e0fa32cSDaniel P. Berrangé 500*1e0fa32cSDaniel P. Berrangé 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é } 522*1e0fa32cSDaniel P. Berrangé 523*1e0fa32cSDaniel P. Berrangé path = g_strdup_printf("%s/unaligned", test_data[i].path); 524*1e0fa32cSDaniel P. Berrangé g_test_add_data_func(path, &test_data[i], test_xts_unaligned); 525*1e0fa32cSDaniel P. Berrangé g_free(path); 52684f7f180SDaniel P. Berrange } 52784f7f180SDaniel P. Berrange 52884f7f180SDaniel P. Berrange return g_test_run(); 52984f7f180SDaniel P. Berrange } 530