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