184f7f180SDaniel P. Berrange /* 284f7f180SDaniel P. Berrange * QEMU Crypto XTS cipher mode 384f7f180SDaniel P. Berrange * 484f7f180SDaniel P. Berrange * Copyright (c) 2015-2016 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; 343*8cbfc942SDaniel P. Berrange unsigned char out[512], Torg[16], T[16]; 34484f7f180SDaniel P. Berrange uint64_t seq; 34584f7f180SDaniel P. Berrange int j; 34684f7f180SDaniel P. Berrange unsigned long len; 34784f7f180SDaniel P. Berrange struct TestAES aesdata; 34884f7f180SDaniel P. Berrange struct TestAES aestweak; 34984f7f180SDaniel P. Berrange 35084f7f180SDaniel P. Berrange for (j = 0; j < 2; j++) { 35184f7f180SDaniel P. Berrange /* skip the cases where 35284f7f180SDaniel P. Berrange * the length is smaller than 2*blocklen 35384f7f180SDaniel P. Berrange * or the length is not a multiple of 32 35484f7f180SDaniel P. Berrange */ 35584f7f180SDaniel P. Berrange if ((j == 1) && ((data->PTLEN < 32) || (data->PTLEN % 32))) { 35684f7f180SDaniel P. Berrange continue; 35784f7f180SDaniel P. Berrange } 35884f7f180SDaniel P. Berrange len = data->PTLEN / 2; 35984f7f180SDaniel P. Berrange 36084f7f180SDaniel P. Berrange AES_set_encrypt_key(data->key1, data->keylen / 2 * 8, &aesdata.enc); 36184f7f180SDaniel P. Berrange AES_set_decrypt_key(data->key1, data->keylen / 2 * 8, &aesdata.dec); 36284f7f180SDaniel P. Berrange AES_set_encrypt_key(data->key2, data->keylen / 2 * 8, &aestweak.enc); 36384f7f180SDaniel P. Berrange AES_set_decrypt_key(data->key2, data->keylen / 2 * 8, &aestweak.dec); 36484f7f180SDaniel P. Berrange 36584f7f180SDaniel P. Berrange seq = data->seqnum; 36684f7f180SDaniel P. Berrange STORE64L(seq, Torg); 36784f7f180SDaniel P. Berrange memset(Torg + 8, 0, 8); 36884f7f180SDaniel P. Berrange 36984f7f180SDaniel P. Berrange memcpy(T, Torg, sizeof(T)); 37084f7f180SDaniel P. Berrange if (j == 0) { 37184f7f180SDaniel P. Berrange xts_encrypt(&aesdata, &aestweak, 37284f7f180SDaniel P. Berrange test_xts_aes_encrypt, 37384f7f180SDaniel P. Berrange test_xts_aes_decrypt, 374*8cbfc942SDaniel P. Berrange T, data->PTLEN, out, data->PTX); 37584f7f180SDaniel P. Berrange } else { 37684f7f180SDaniel P. Berrange xts_encrypt(&aesdata, &aestweak, 37784f7f180SDaniel P. Berrange test_xts_aes_encrypt, 37884f7f180SDaniel P. Berrange test_xts_aes_decrypt, 379*8cbfc942SDaniel P. Berrange T, len, out, data->PTX); 38084f7f180SDaniel P. Berrange xts_encrypt(&aesdata, &aestweak, 38184f7f180SDaniel P. Berrange test_xts_aes_encrypt, 38284f7f180SDaniel P. Berrange test_xts_aes_decrypt, 383*8cbfc942SDaniel P. Berrange T, len, &out[len], &data->PTX[len]); 38484f7f180SDaniel P. Berrange } 38584f7f180SDaniel P. Berrange 386*8cbfc942SDaniel P. Berrange g_assert(memcmp(out, data->CTX, data->PTLEN) == 0); 38784f7f180SDaniel P. Berrange 38884f7f180SDaniel P. Berrange memcpy(T, Torg, sizeof(T)); 38984f7f180SDaniel P. Berrange if (j == 0) { 39084f7f180SDaniel P. Berrange xts_decrypt(&aesdata, &aestweak, 39184f7f180SDaniel P. Berrange test_xts_aes_encrypt, 39284f7f180SDaniel P. Berrange test_xts_aes_decrypt, 393*8cbfc942SDaniel P. Berrange T, data->PTLEN, out, data->CTX); 39484f7f180SDaniel P. Berrange } else { 39584f7f180SDaniel P. Berrange xts_decrypt(&aesdata, &aestweak, 39684f7f180SDaniel P. Berrange test_xts_aes_encrypt, 39784f7f180SDaniel P. Berrange test_xts_aes_decrypt, 398*8cbfc942SDaniel P. Berrange T, len, out, data->CTX); 39984f7f180SDaniel P. Berrange xts_decrypt(&aesdata, &aestweak, 40084f7f180SDaniel P. Berrange test_xts_aes_encrypt, 40184f7f180SDaniel P. Berrange test_xts_aes_decrypt, 402*8cbfc942SDaniel P. Berrange T, len, &out[len], &data->CTX[len]); 40384f7f180SDaniel P. Berrange } 40484f7f180SDaniel P. Berrange 405*8cbfc942SDaniel P. Berrange g_assert(memcmp(out, data->PTX, data->PTLEN) == 0); 40684f7f180SDaniel P. Berrange } 40784f7f180SDaniel P. Berrange } 40884f7f180SDaniel P. Berrange 40984f7f180SDaniel P. Berrange 41084f7f180SDaniel P. Berrange int main(int argc, char **argv) 41184f7f180SDaniel P. Berrange { 41284f7f180SDaniel P. Berrange size_t i; 41384f7f180SDaniel P. Berrange 41484f7f180SDaniel P. Berrange g_test_init(&argc, &argv, NULL); 41584f7f180SDaniel P. Berrange 41684f7f180SDaniel P. Berrange g_assert(qcrypto_init(NULL) == 0); 41784f7f180SDaniel P. Berrange 41884f7f180SDaniel P. Berrange for (i = 0; i < G_N_ELEMENTS(test_data); i++) { 41984f7f180SDaniel P. Berrange g_test_add_data_func(test_data[i].path, &test_data[i], test_xts); 42084f7f180SDaniel P. Berrange } 42184f7f180SDaniel P. Berrange 42284f7f180SDaniel P. Berrange return g_test_run(); 42384f7f180SDaniel P. Berrange } 424