1*da668aa1SThomas Huth /* 2*da668aa1SThomas Huth * QEMU Crypto IV generator algorithms 3*da668aa1SThomas Huth * 4*da668aa1SThomas Huth * Copyright (c) 2015-2016 Red Hat, Inc. 5*da668aa1SThomas Huth * 6*da668aa1SThomas Huth * This library is free software; you can redistribute it and/or 7*da668aa1SThomas Huth * modify it under the terms of the GNU Lesser General Public 8*da668aa1SThomas Huth * License as published by the Free Software Foundation; either 9*da668aa1SThomas Huth * version 2.1 of the License, or (at your option) any later version. 10*da668aa1SThomas Huth * 11*da668aa1SThomas Huth * This library is distributed in the hope that it will be useful, 12*da668aa1SThomas Huth * but WITHOUT ANY WARRANTY; without even the implied warranty of 13*da668aa1SThomas Huth * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14*da668aa1SThomas Huth * Lesser General Public License for more details. 15*da668aa1SThomas Huth * 16*da668aa1SThomas Huth * You should have received a copy of the GNU Lesser General Public 17*da668aa1SThomas Huth * License along with this library; if not, see <http://www.gnu.org/licenses/>. 18*da668aa1SThomas Huth * 19*da668aa1SThomas Huth */ 20*da668aa1SThomas Huth 21*da668aa1SThomas Huth #include "qemu/osdep.h" 22*da668aa1SThomas Huth #include "qapi/error.h" 23*da668aa1SThomas Huth #include "crypto/ivgen.h" 24*da668aa1SThomas Huth 25*da668aa1SThomas Huth 26*da668aa1SThomas Huth struct QCryptoIVGenTestData { 27*da668aa1SThomas Huth const char *path; 28*da668aa1SThomas Huth uint64_t sector; 29*da668aa1SThomas Huth QCryptoIVGenAlgorithm ivalg; 30*da668aa1SThomas Huth QCryptoHashAlgorithm hashalg; 31*da668aa1SThomas Huth QCryptoCipherAlgorithm cipheralg; 32*da668aa1SThomas Huth const uint8_t *key; 33*da668aa1SThomas Huth size_t nkey; 34*da668aa1SThomas Huth const uint8_t *iv; 35*da668aa1SThomas Huth size_t niv; 36*da668aa1SThomas Huth } test_data[] = { 37*da668aa1SThomas Huth /* Small */ 38*da668aa1SThomas Huth { 39*da668aa1SThomas Huth "/crypto/ivgen/plain/1", 40*da668aa1SThomas Huth .sector = 0x1, 41*da668aa1SThomas Huth .ivalg = QCRYPTO_IVGEN_ALG_PLAIN, 42*da668aa1SThomas Huth .iv = (const uint8_t *)"\x01\x00\x00\x00\x00\x00\x00\x00" 43*da668aa1SThomas Huth "\x00\x00\x00\x00\x00\x00\x00\x00", 44*da668aa1SThomas Huth .niv = 16, 45*da668aa1SThomas Huth }, 46*da668aa1SThomas Huth /* Big ! */ 47*da668aa1SThomas Huth { 48*da668aa1SThomas Huth "/crypto/ivgen/plain/1f2e3d4c", 49*da668aa1SThomas Huth .sector = 0x1f2e3d4cULL, 50*da668aa1SThomas Huth .ivalg = QCRYPTO_IVGEN_ALG_PLAIN, 51*da668aa1SThomas Huth .iv = (const uint8_t *)"\x4c\x3d\x2e\x1f\x00\x00\x00\x00" 52*da668aa1SThomas Huth "\x00\x00\x00\x00\x00\x00\x00\x00", 53*da668aa1SThomas Huth .niv = 16, 54*da668aa1SThomas Huth }, 55*da668aa1SThomas Huth /* Truncation */ 56*da668aa1SThomas Huth { 57*da668aa1SThomas Huth "/crypto/ivgen/plain/1f2e3d4c5b6a7988", 58*da668aa1SThomas Huth .sector = 0x1f2e3d4c5b6a7988ULL, 59*da668aa1SThomas Huth .ivalg = QCRYPTO_IVGEN_ALG_PLAIN, 60*da668aa1SThomas Huth .iv = (const uint8_t *)"\x88\x79\x6a\x5b\x00\x00\x00\x00" 61*da668aa1SThomas Huth "\x00\x00\x00\x00\x00\x00\x00\x00", 62*da668aa1SThomas Huth .niv = 16, 63*da668aa1SThomas Huth }, 64*da668aa1SThomas Huth /* Small */ 65*da668aa1SThomas Huth { 66*da668aa1SThomas Huth "/crypto/ivgen/plain64/1", 67*da668aa1SThomas Huth .sector = 0x1, 68*da668aa1SThomas Huth .ivalg = QCRYPTO_IVGEN_ALG_PLAIN64, 69*da668aa1SThomas Huth .iv = (const uint8_t *)"\x01\x00\x00\x00\x00\x00\x00\x00" 70*da668aa1SThomas Huth "\x00\x00\x00\x00\x00\x00\x00\x00", 71*da668aa1SThomas Huth .niv = 16, 72*da668aa1SThomas Huth }, 73*da668aa1SThomas Huth /* Big ! */ 74*da668aa1SThomas Huth { 75*da668aa1SThomas Huth "/crypto/ivgen/plain64/1f2e3d4c", 76*da668aa1SThomas Huth .sector = 0x1f2e3d4cULL, 77*da668aa1SThomas Huth .ivalg = QCRYPTO_IVGEN_ALG_PLAIN64, 78*da668aa1SThomas Huth .iv = (const uint8_t *)"\x4c\x3d\x2e\x1f\x00\x00\x00\x00" 79*da668aa1SThomas Huth "\x00\x00\x00\x00\x00\x00\x00\x00", 80*da668aa1SThomas Huth .niv = 16, 81*da668aa1SThomas Huth }, 82*da668aa1SThomas Huth /* No Truncation */ 83*da668aa1SThomas Huth { 84*da668aa1SThomas Huth "/crypto/ivgen/plain64/1f2e3d4c5b6a7988", 85*da668aa1SThomas Huth .sector = 0x1f2e3d4c5b6a7988ULL, 86*da668aa1SThomas Huth .ivalg = QCRYPTO_IVGEN_ALG_PLAIN64, 87*da668aa1SThomas Huth .iv = (const uint8_t *)"\x88\x79\x6a\x5b\x4c\x3d\x2e\x1f" 88*da668aa1SThomas Huth "\x00\x00\x00\x00\x00\x00\x00\x00", 89*da668aa1SThomas Huth .niv = 16, 90*da668aa1SThomas Huth }, 91*da668aa1SThomas Huth /* Small */ 92*da668aa1SThomas Huth { 93*da668aa1SThomas Huth "/crypto/ivgen/essiv/1", 94*da668aa1SThomas Huth .sector = 0x1, 95*da668aa1SThomas Huth .ivalg = QCRYPTO_IVGEN_ALG_ESSIV, 96*da668aa1SThomas Huth .cipheralg = QCRYPTO_CIPHER_ALG_AES_128, 97*da668aa1SThomas Huth .hashalg = QCRYPTO_HASH_ALG_SHA256, 98*da668aa1SThomas Huth .key = (const uint8_t *)"\x00\x01\x02\x03\x04\x05\x06\x07" 99*da668aa1SThomas Huth "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f", 100*da668aa1SThomas Huth .nkey = 16, 101*da668aa1SThomas Huth .iv = (const uint8_t *)"\xd4\x83\x71\xb2\xa1\x94\x53\x88" 102*da668aa1SThomas Huth "\x1c\x7a\x2d\06\x2d\x0b\x65\x46", 103*da668aa1SThomas Huth .niv = 16, 104*da668aa1SThomas Huth }, 105*da668aa1SThomas Huth /* Big ! */ 106*da668aa1SThomas Huth { 107*da668aa1SThomas Huth "/crypto/ivgen/essiv/1f2e3d4c", 108*da668aa1SThomas Huth .sector = 0x1f2e3d4cULL, 109*da668aa1SThomas Huth .ivalg = QCRYPTO_IVGEN_ALG_ESSIV, 110*da668aa1SThomas Huth .cipheralg = QCRYPTO_CIPHER_ALG_AES_128, 111*da668aa1SThomas Huth .hashalg = QCRYPTO_HASH_ALG_SHA256, 112*da668aa1SThomas Huth .key = (const uint8_t *)"\x00\x01\x02\x03\x04\x05\x06\x07" 113*da668aa1SThomas Huth "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f", 114*da668aa1SThomas Huth .nkey = 16, 115*da668aa1SThomas Huth .iv = (const uint8_t *)"\x5d\x36\x09\x5d\xc6\x9e\x5e\xe9" 116*da668aa1SThomas Huth "\xe3\x02\x8d\xd8\x7a\x3d\xe7\x8f", 117*da668aa1SThomas Huth .niv = 16, 118*da668aa1SThomas Huth }, 119*da668aa1SThomas Huth /* No Truncation */ 120*da668aa1SThomas Huth { 121*da668aa1SThomas Huth "/crypto/ivgen/essiv/1f2e3d4c5b6a7988", 122*da668aa1SThomas Huth .sector = 0x1f2e3d4c5b6a7988ULL, 123*da668aa1SThomas Huth .ivalg = QCRYPTO_IVGEN_ALG_ESSIV, 124*da668aa1SThomas Huth .cipheralg = QCRYPTO_CIPHER_ALG_AES_128, 125*da668aa1SThomas Huth .hashalg = QCRYPTO_HASH_ALG_SHA256, 126*da668aa1SThomas Huth .key = (const uint8_t *)"\x00\x01\x02\x03\x04\x05\x06\x07" 127*da668aa1SThomas Huth "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f", 128*da668aa1SThomas Huth .nkey = 16, 129*da668aa1SThomas Huth .iv = (const uint8_t *)"\x58\xbb\x81\x94\x51\x83\x23\x23" 130*da668aa1SThomas Huth "\x7a\x08\x93\xa9\xdc\xd2\xd9\xab", 131*da668aa1SThomas Huth .niv = 16, 132*da668aa1SThomas Huth }, 133*da668aa1SThomas Huth }; 134*da668aa1SThomas Huth 135*da668aa1SThomas Huth 136*da668aa1SThomas Huth static void test_ivgen(const void *opaque) 137*da668aa1SThomas Huth { 138*da668aa1SThomas Huth const struct QCryptoIVGenTestData *data = opaque; 139*da668aa1SThomas Huth uint8_t *iv = g_new0(uint8_t, data->niv); 140*da668aa1SThomas Huth QCryptoIVGen *ivgen = qcrypto_ivgen_new( 141*da668aa1SThomas Huth data->ivalg, 142*da668aa1SThomas Huth data->cipheralg, 143*da668aa1SThomas Huth data->hashalg, 144*da668aa1SThomas Huth data->key, 145*da668aa1SThomas Huth data->nkey, 146*da668aa1SThomas Huth &error_abort); 147*da668aa1SThomas Huth 148*da668aa1SThomas Huth qcrypto_ivgen_calculate(ivgen, 149*da668aa1SThomas Huth data->sector, 150*da668aa1SThomas Huth iv, 151*da668aa1SThomas Huth data->niv, 152*da668aa1SThomas Huth &error_abort); 153*da668aa1SThomas Huth 154*da668aa1SThomas Huth g_assert(memcmp(iv, data->iv, data->niv) == 0); 155*da668aa1SThomas Huth 156*da668aa1SThomas Huth qcrypto_ivgen_free(ivgen); 157*da668aa1SThomas Huth g_free(iv); 158*da668aa1SThomas Huth } 159*da668aa1SThomas Huth 160*da668aa1SThomas Huth int main(int argc, char **argv) 161*da668aa1SThomas Huth { 162*da668aa1SThomas Huth size_t i; 163*da668aa1SThomas Huth g_test_init(&argc, &argv, NULL); 164*da668aa1SThomas Huth for (i = 0; i < G_N_ELEMENTS(test_data); i++) { 165*da668aa1SThomas Huth if (test_data[i].ivalg == QCRYPTO_IVGEN_ALG_ESSIV && 166*da668aa1SThomas Huth !qcrypto_hash_supports(test_data[i].hashalg)) { 167*da668aa1SThomas Huth continue; 168*da668aa1SThomas Huth } 169*da668aa1SThomas Huth g_test_add_data_func(test_data[i].path, 170*da668aa1SThomas Huth &(test_data[i]), 171*da668aa1SThomas Huth test_ivgen); 172*da668aa1SThomas Huth } 173*da668aa1SThomas Huth return g_test_run(); 174*da668aa1SThomas Huth } 175