/*
 * QEMU Crypto XTS cipher mode
 *
 * Copyright (c) 2015-2018 Red Hat, Inc.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
 *
 * This code is originally derived from public domain / WTFPL code in
 * LibTomCrypt crytographic library http://libtom.org. The XTS code
 * was donated by Elliptic Semiconductor Inc (www.ellipticsemi.com)
 * to the LibTom Projects
 *
 */

#include "qemu/osdep.h"
#include "crypto/init.h"
#include "crypto/xts.h"
#include "crypto/aes.h"

typedef struct {
    const char *path;
    int keylen;
    unsigned char key1[32];
    unsigned char key2[32];
    uint64_t seqnum;
    unsigned long PTLEN;
    unsigned char PTX[512], CTX[512];
} QCryptoXTSTestData;

static const QCryptoXTSTestData test_data[] = {
    /* #1 32 byte key, 32 byte PTX */
    {
        "/crypto/xts/t-1-key-32-ptx-32",
        32,
        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
        0,
        32,
        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
        { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec,
          0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92,
          0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85,
          0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e },
    },

    /* #2, 32 byte key, 32 byte PTX */
    {
        "/crypto/xts/t-2-key-32-ptx-32",
        32,
        { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
          0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 },
        { 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
          0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 },
        0x3333333333LL,
        32,
        { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
          0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
          0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
          0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
        { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e,
          0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b,
          0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4,
          0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 },
    },

    /* #5 from xts.7, 32 byte key, 32 byte PTX */
    {
        "/crypto/xts/t-5-key-32-ptx-32",
        32,
        { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
          0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0 },
        { 0xbf, 0xbe, 0xbd, 0xbc, 0xbb, 0xba, 0xb9, 0xb8,
          0xb7, 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, 0xb1, 0xb0 },
        0x123456789aLL,
        32,
        { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
          0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
          0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
          0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 },
        { 0xb0, 0x1f, 0x86, 0xf8, 0xed, 0xc1, 0x86, 0x37,
          0x06, 0xfa, 0x8a, 0x42, 0x53, 0xe3, 0x4f, 0x28,
          0xaf, 0x31, 0x9d, 0xe3, 0x83, 0x34, 0x87, 0x0f,
          0x4d, 0xd1, 0xf9, 0x4c, 0xbe, 0x98, 0x32, 0xf1 },
    },

    /* #4, 32 byte key, 512 byte PTX  */
    {
        "/crypto/xts/t-4-key-32-ptx-512",
        32,
        { 0x27, 0x18, 0x28, 0x18, 0x28, 0x45, 0x90, 0x45,
          0x23, 0x53, 0x60, 0x28, 0x74, 0x71, 0x35, 0x26 },
        { 0x31, 0x41, 0x59, 0x26, 0x53, 0x58, 0x97, 0x93,
          0x23, 0x84, 0x62, 0x64, 0x33, 0x83, 0x27, 0x95 },
        0,
        512,
        {
            0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
            0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
            0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
            0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
            0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
            0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
            0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
            0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
            0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
            0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
            0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
            0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
            0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
            0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
            0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
            0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
            0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
            0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
            0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
            0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
            0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
            0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
            0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
            0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
            0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
            0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
            0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
            0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
            0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
            0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
            0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
            0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
            0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
            0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
            0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
            0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
            0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
            0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
            0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
            0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
            0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
            0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
            0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
            0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
            0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
            0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
            0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
            0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
            0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
            0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
            0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
            0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
            0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
            0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
            0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
            0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
            0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
            0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
            0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
            0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
            0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
            0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
            0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
            0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
        },
        {
            0x27, 0xa7, 0x47, 0x9b, 0xef, 0xa1, 0xd4, 0x76,
            0x48, 0x9f, 0x30, 0x8c, 0xd4, 0xcf, 0xa6, 0xe2,
            0xa9, 0x6e, 0x4b, 0xbe, 0x32, 0x08, 0xff, 0x25,
            0x28, 0x7d, 0xd3, 0x81, 0x96, 0x16, 0xe8, 0x9c,
            0xc7, 0x8c, 0xf7, 0xf5, 0xe5, 0x43, 0x44, 0x5f,
            0x83, 0x33, 0xd8, 0xfa, 0x7f, 0x56, 0x00, 0x00,
            0x05, 0x27, 0x9f, 0xa5, 0xd8, 0xb5, 0xe4, 0xad,
            0x40, 0xe7, 0x36, 0xdd, 0xb4, 0xd3, 0x54, 0x12,
            0x32, 0x80, 0x63, 0xfd, 0x2a, 0xab, 0x53, 0xe5,
            0xea, 0x1e, 0x0a, 0x9f, 0x33, 0x25, 0x00, 0xa5,
            0xdf, 0x94, 0x87, 0xd0, 0x7a, 0x5c, 0x92, 0xcc,
            0x51, 0x2c, 0x88, 0x66, 0xc7, 0xe8, 0x60, 0xce,
            0x93, 0xfd, 0xf1, 0x66, 0xa2, 0x49, 0x12, 0xb4,
            0x22, 0x97, 0x61, 0x46, 0xae, 0x20, 0xce, 0x84,
            0x6b, 0xb7, 0xdc, 0x9b, 0xa9, 0x4a, 0x76, 0x7a,
            0xae, 0xf2, 0x0c, 0x0d, 0x61, 0xad, 0x02, 0x65,
            0x5e, 0xa9, 0x2d, 0xc4, 0xc4, 0xe4, 0x1a, 0x89,
            0x52, 0xc6, 0x51, 0xd3, 0x31, 0x74, 0xbe, 0x51,
            0xa1, 0x0c, 0x42, 0x11, 0x10, 0xe6, 0xd8, 0x15,
            0x88, 0xed, 0xe8, 0x21, 0x03, 0xa2, 0x52, 0xd8,
            0xa7, 0x50, 0xe8, 0x76, 0x8d, 0xef, 0xff, 0xed,
            0x91, 0x22, 0x81, 0x0a, 0xae, 0xb9, 0x9f, 0x91,
            0x72, 0xaf, 0x82, 0xb6, 0x04, 0xdc, 0x4b, 0x8e,
            0x51, 0xbc, 0xb0, 0x82, 0x35, 0xa6, 0xf4, 0x34,
            0x13, 0x32, 0xe4, 0xca, 0x60, 0x48, 0x2a, 0x4b,
            0xa1, 0xa0, 0x3b, 0x3e, 0x65, 0x00, 0x8f, 0xc5,
            0xda, 0x76, 0xb7, 0x0b, 0xf1, 0x69, 0x0d, 0xb4,
            0xea, 0xe2, 0x9c, 0x5f, 0x1b, 0xad, 0xd0, 0x3c,
            0x5c, 0xcf, 0x2a, 0x55, 0xd7, 0x05, 0xdd, 0xcd,
            0x86, 0xd4, 0x49, 0x51, 0x1c, 0xeb, 0x7e, 0xc3,
            0x0b, 0xf1, 0x2b, 0x1f, 0xa3, 0x5b, 0x91, 0x3f,
            0x9f, 0x74, 0x7a, 0x8a, 0xfd, 0x1b, 0x13, 0x0e,
            0x94, 0xbf, 0xf9, 0x4e, 0xff, 0xd0, 0x1a, 0x91,
            0x73, 0x5c, 0xa1, 0x72, 0x6a, 0xcd, 0x0b, 0x19,
            0x7c, 0x4e, 0x5b, 0x03, 0x39, 0x36, 0x97, 0xe1,
            0x26, 0x82, 0x6f, 0xb6, 0xbb, 0xde, 0x8e, 0xcc,
            0x1e, 0x08, 0x29, 0x85, 0x16, 0xe2, 0xc9, 0xed,
            0x03, 0xff, 0x3c, 0x1b, 0x78, 0x60, 0xf6, 0xde,
            0x76, 0xd4, 0xce, 0xcd, 0x94, 0xc8, 0x11, 0x98,
            0x55, 0xef, 0x52, 0x97, 0xca, 0x67, 0xe9, 0xf3,
            0xe7, 0xff, 0x72, 0xb1, 0xe9, 0x97, 0x85, 0xca,
            0x0a, 0x7e, 0x77, 0x20, 0xc5, 0xb3, 0x6d, 0xc6,
            0xd7, 0x2c, 0xac, 0x95, 0x74, 0xc8, 0xcb, 0xbc,
            0x2f, 0x80, 0x1e, 0x23, 0xe5, 0x6f, 0xd3, 0x44,
            0xb0, 0x7f, 0x22, 0x15, 0x4b, 0xeb, 0xa0, 0xf0,
            0x8c, 0xe8, 0x89, 0x1e, 0x64, 0x3e, 0xd9, 0x95,
            0xc9, 0x4d, 0x9a, 0x69, 0xc9, 0xf1, 0xb5, 0xf4,
            0x99, 0x02, 0x7a, 0x78, 0x57, 0x2a, 0xee, 0xbd,
            0x74, 0xd2, 0x0c, 0xc3, 0x98, 0x81, 0xc2, 0x13,
            0xee, 0x77, 0x0b, 0x10, 0x10, 0xe4, 0xbe, 0xa7,
            0x18, 0x84, 0x69, 0x77, 0xae, 0x11, 0x9f, 0x7a,
            0x02, 0x3a, 0xb5, 0x8c, 0xca, 0x0a, 0xd7, 0x52,
            0xaf, 0xe6, 0x56, 0xbb, 0x3c, 0x17, 0x25, 0x6a,
            0x9f, 0x6e, 0x9b, 0xf1, 0x9f, 0xdd, 0x5a, 0x38,
            0xfc, 0x82, 0xbb, 0xe8, 0x72, 0xc5, 0x53, 0x9e,
            0xdb, 0x60, 0x9e, 0xf4, 0xf7, 0x9c, 0x20, 0x3e,
            0xbb, 0x14, 0x0f, 0x2e, 0x58, 0x3c, 0xb2, 0xad,
            0x15, 0xb4, 0xaa, 0x5b, 0x65, 0x50, 0x16, 0xa8,
            0x44, 0x92, 0x77, 0xdb, 0xd4, 0x77, 0xef, 0x2c,
            0x8d, 0x6c, 0x01, 0x7d, 0xb7, 0x38, 0xb1, 0x8d,
            0xeb, 0x4a, 0x42, 0x7d, 0x19, 0x23, 0xce, 0x3f,
            0xf2, 0x62, 0x73, 0x57, 0x79, 0xa4, 0x18, 0xf2,
            0x0a, 0x28, 0x2d, 0xf9, 0x20, 0x14, 0x7b, 0xea,
            0xbe, 0x42, 0x1e, 0xe5, 0x31, 0x9d, 0x05, 0x68,
        }
    },

    /* #7, 32 byte key, 17 byte PTX */
    {
        "/crypto/xts/t-7-key-32-ptx-17",
        32,
        { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
          0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0 },
        { 0xbf, 0xbe, 0xbd, 0xbc, 0xbb, 0xba, 0xb9, 0xb8,
          0xb7, 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, 0xb1, 0xb0 },
        0x123456789aLL,
        17,
        { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
          0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 },
        { 0x6c, 0x16, 0x25, 0xdb, 0x46, 0x71, 0x52, 0x2d,
          0x3d, 0x75, 0x99, 0x60, 0x1d, 0xe7, 0xca, 0x09, 0xed },
    },

    /* #15, 32 byte key, 25 byte PTX */
    {
        "/crypto/xts/t-15-key-32-ptx-25",
        32,
        { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
          0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0 },
        { 0xbf, 0xbe, 0xbd, 0xbc, 0xbb, 0xba, 0xb9, 0xb8,
          0xb7, 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, 0xb1, 0xb0 },
        0x123456789aLL,
        25,
        { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
          0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
          0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18 },
        { 0x8f, 0x4d, 0xcb, 0xad, 0x55, 0x55, 0x8d, 0x7b,
          0x4e, 0x01, 0xd9, 0x37, 0x9c, 0xd4, 0xea, 0x22,
          0xed, 0xbf, 0x9d, 0xac, 0xe4, 0x5d, 0x6f, 0x6a, 0x73 },
    },

    /* #21, 32 byte key, 31 byte PTX */
    {
        "/crypto/xts/t-21-key-32-ptx-31",
        32,
        { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
          0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0 },
        { 0xbf, 0xbe, 0xbd, 0xbc, 0xbb, 0xba, 0xb9, 0xb8,
          0xb7, 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, 0xb1, 0xb0 },
        0x123456789aLL,
        31,
        { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
          0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
          0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
          0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e },
        { 0xd0, 0x5b, 0xc0, 0x90, 0xa8, 0xe0, 0x4f, 0x1b,
          0x3d, 0x3e, 0xcd, 0xd5, 0xba, 0xec, 0x0f, 0xd4,
          0xed, 0xbf, 0x9d, 0xac, 0xe4, 0x5d, 0x6f, 0x6a,
          0x73, 0x06, 0xe6, 0x4b, 0xe5, 0xdd, 0x82 },
    },
};

#define STORE64L(x, y)                                                  \
    do {                                                                \
        (y)[7] = (unsigned char)(((x) >> 56) & 255);                    \
        (y)[6] = (unsigned char)(((x) >> 48) & 255);                    \
        (y)[5] = (unsigned char)(((x) >> 40) & 255);                    \
        (y)[4] = (unsigned char)(((x) >> 32) & 255);                    \
        (y)[3] = (unsigned char)(((x) >> 24) & 255);                    \
        (y)[2] = (unsigned char)(((x) >> 16) & 255);                    \
        (y)[1] = (unsigned char)(((x) >> 8) & 255);                     \
        (y)[0] = (unsigned char)((x) & 255);                            \
    } while (0)

struct TestAES {
    AES_KEY enc;
    AES_KEY dec;
};

static void test_xts_aes_encrypt(const void *ctx,
                                 size_t length,
                                 uint8_t *dst,
                                 const uint8_t *src)
{
    const struct TestAES *aesctx = ctx;

    AES_encrypt(src, dst, &aesctx->enc);
}


static void test_xts_aes_decrypt(const void *ctx,
                                 size_t length,
                                 uint8_t *dst,
                                 const uint8_t *src)
{
    const struct TestAES *aesctx = ctx;

    AES_decrypt(src, dst, &aesctx->dec);
}


static void test_xts(const void *opaque)
{
    const QCryptoXTSTestData *data = opaque;
    uint8_t out[512], Torg[16], T[16];
    uint64_t seq;
    struct TestAES aesdata;
    struct TestAES aestweak;

    AES_set_encrypt_key(data->key1, data->keylen / 2 * 8, &aesdata.enc);
    AES_set_decrypt_key(data->key1, data->keylen / 2 * 8, &aesdata.dec);
    AES_set_encrypt_key(data->key2, data->keylen / 2 * 8, &aestweak.enc);
    AES_set_decrypt_key(data->key2, data->keylen / 2 * 8, &aestweak.dec);

    seq = data->seqnum;
    STORE64L(seq, Torg);
    memset(Torg + 8, 0, 8);

    memcpy(T, Torg, sizeof(T));
    xts_encrypt(&aesdata, &aestweak,
                test_xts_aes_encrypt,
                test_xts_aes_decrypt,
                T, data->PTLEN, out, data->PTX);

    g_assert(memcmp(out, data->CTX, data->PTLEN) == 0);

    memcpy(T, Torg, sizeof(T));
    xts_decrypt(&aesdata, &aestweak,
                test_xts_aes_encrypt,
                test_xts_aes_decrypt,
                T, data->PTLEN, out, data->CTX);

    g_assert(memcmp(out, data->PTX, data->PTLEN) == 0);
}


static void test_xts_split(const void *opaque)
{
    const QCryptoXTSTestData *data = opaque;
    uint8_t out[512], Torg[16], T[16];
    uint64_t seq;
    unsigned long len = data->PTLEN / 2;
    struct TestAES aesdata;
    struct TestAES aestweak;

    AES_set_encrypt_key(data->key1, data->keylen / 2 * 8, &aesdata.enc);
    AES_set_decrypt_key(data->key1, data->keylen / 2 * 8, &aesdata.dec);
    AES_set_encrypt_key(data->key2, data->keylen / 2 * 8, &aestweak.enc);
    AES_set_decrypt_key(data->key2, data->keylen / 2 * 8, &aestweak.dec);

    seq = data->seqnum;
    STORE64L(seq, Torg);
    memset(Torg + 8, 0, 8);

    memcpy(T, Torg, sizeof(T));
    xts_encrypt(&aesdata, &aestweak,
                test_xts_aes_encrypt,
                test_xts_aes_decrypt,
                T, len, out, data->PTX);
    xts_encrypt(&aesdata, &aestweak,
                test_xts_aes_encrypt,
                test_xts_aes_decrypt,
                T, len, &out[len], &data->PTX[len]);

    g_assert(memcmp(out, data->CTX, data->PTLEN) == 0);

    memcpy(T, Torg, sizeof(T));
    xts_decrypt(&aesdata, &aestweak,
                test_xts_aes_encrypt,
                test_xts_aes_decrypt,
                T, len, out, data->CTX);
    xts_decrypt(&aesdata, &aestweak,
                test_xts_aes_encrypt,
                test_xts_aes_decrypt,
                T, len, &out[len], &data->CTX[len]);

    g_assert(memcmp(out, data->PTX, data->PTLEN) == 0);
}


static void test_xts_unaligned(const void *opaque)
{
#define BAD_ALIGN 3
    const QCryptoXTSTestData *data = opaque;
    uint8_t in[512 + BAD_ALIGN], out[512 + BAD_ALIGN];
    uint8_t Torg[16], T[16 + BAD_ALIGN];
    uint64_t seq;
    struct TestAES aesdata;
    struct TestAES aestweak;

    AES_set_encrypt_key(data->key1, data->keylen / 2 * 8, &aesdata.enc);
    AES_set_decrypt_key(data->key1, data->keylen / 2 * 8, &aesdata.dec);
    AES_set_encrypt_key(data->key2, data->keylen / 2 * 8, &aestweak.enc);
    AES_set_decrypt_key(data->key2, data->keylen / 2 * 8, &aestweak.dec);

    seq = data->seqnum;
    STORE64L(seq, Torg);
    memset(Torg + 8, 0, 8);

    /* IV not aligned */
    memcpy(T + BAD_ALIGN, Torg, 16);
    memcpy(in, data->PTX, data->PTLEN);
    xts_encrypt(&aesdata, &aestweak,
                test_xts_aes_encrypt,
                test_xts_aes_decrypt,
                T + BAD_ALIGN, data->PTLEN, out, in);

    g_assert(memcmp(out, data->CTX, data->PTLEN) == 0);

    /* plain text not aligned */
    memcpy(T, Torg, 16);
    memcpy(in + BAD_ALIGN, data->PTX, data->PTLEN);
    xts_encrypt(&aesdata, &aestweak,
                test_xts_aes_encrypt,
                test_xts_aes_decrypt,
                T, data->PTLEN, out, in + BAD_ALIGN);

    g_assert(memcmp(out, data->CTX, data->PTLEN) == 0);

    /* cipher text not aligned */
    memcpy(T, Torg, 16);
    memcpy(in, data->PTX, data->PTLEN);
    xts_encrypt(&aesdata, &aestweak,
                test_xts_aes_encrypt,
                test_xts_aes_decrypt,
                T, data->PTLEN, out + BAD_ALIGN, in);

    g_assert(memcmp(out + BAD_ALIGN, data->CTX, data->PTLEN) == 0);


    /* IV not aligned */
    memcpy(T + BAD_ALIGN, Torg, 16);
    memcpy(in, data->CTX, data->PTLEN);
    xts_decrypt(&aesdata, &aestweak,
                test_xts_aes_encrypt,
                test_xts_aes_decrypt,
                T + BAD_ALIGN, data->PTLEN, out, in);

    g_assert(memcmp(out, data->PTX, data->PTLEN) == 0);

    /* cipher text not aligned */
    memcpy(T, Torg, 16);
    memcpy(in + BAD_ALIGN, data->CTX, data->PTLEN);
    xts_decrypt(&aesdata, &aestweak,
                test_xts_aes_encrypt,
                test_xts_aes_decrypt,
                T, data->PTLEN, out, in + BAD_ALIGN);

    g_assert(memcmp(out, data->PTX, data->PTLEN) == 0);

    /* plain text not aligned */
    memcpy(T, Torg, 16);
    memcpy(in, data->CTX, data->PTLEN);
    xts_decrypt(&aesdata, &aestweak,
                test_xts_aes_encrypt,
                test_xts_aes_decrypt,
                T, data->PTLEN, out + BAD_ALIGN, in);

    g_assert(memcmp(out + BAD_ALIGN, data->PTX, data->PTLEN) == 0);
}


int main(int argc, char **argv)
{
    size_t i;

    g_test_init(&argc, &argv, NULL);

    g_assert(qcrypto_init(NULL) == 0);

    for (i = 0; i < G_N_ELEMENTS(test_data); i++) {
        gchar *path = g_strdup_printf("%s/basic", test_data[i].path);
        g_test_add_data_func(path, &test_data[i], test_xts);
        g_free(path);

        /* skip the cases where the length is smaller than 2*blocklen
         * or the length is not a multiple of 32
         */
        if ((test_data[i].PTLEN >= 32) && !(test_data[i].PTLEN % 32)) {
            path = g_strdup_printf("%s/split", test_data[i].path);
            g_test_add_data_func(path, &test_data[i], test_xts_split);
            g_free(path);
        }

        path = g_strdup_printf("%s/unaligned", test_data[i].path);
        g_test_add_data_func(path, &test_data[i], test_xts_unaligned);
        g_free(path);
    }

    return g_test_run();
}
