1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#include "qemu/osdep.h"
22#include "qapi/error.h"
23#include "crypto/ivgen.h"
24
25
26struct QCryptoIVGenTestData {
27 const char *path;
28 uint64_t sector;
29 QCryptoIVGenAlgorithm ivalg;
30 QCryptoHashAlgorithm hashalg;
31 QCryptoCipherAlgorithm cipheralg;
32 const uint8_t *key;
33 size_t nkey;
34 const uint8_t *iv;
35 size_t niv;
36} test_data[] = {
37
38 {
39 "/crypto/ivgen/plain/1",
40 .sector = 0x1,
41 .ivalg = QCRYPTO_IVGEN_ALG_PLAIN,
42 .iv = (const uint8_t *)"\x01\x00\x00\x00\x00\x00\x00\x00"
43 "\x00\x00\x00\x00\x00\x00\x00\x00",
44 .niv = 16,
45 },
46
47 {
48 "/crypto/ivgen/plain/1f2e3d4c",
49 .sector = 0x1f2e3d4cULL,
50 .ivalg = QCRYPTO_IVGEN_ALG_PLAIN,
51 .iv = (const uint8_t *)"\x4c\x3d\x2e\x1f\x00\x00\x00\x00"
52 "\x00\x00\x00\x00\x00\x00\x00\x00",
53 .niv = 16,
54 },
55
56 {
57 "/crypto/ivgen/plain/1f2e3d4c5b6a7988",
58 .sector = 0x1f2e3d4c5b6a7988ULL,
59 .ivalg = QCRYPTO_IVGEN_ALG_PLAIN,
60 .iv = (const uint8_t *)"\x88\x79\x6a\x5b\x00\x00\x00\x00"
61 "\x00\x00\x00\x00\x00\x00\x00\x00",
62 .niv = 16,
63 },
64
65 {
66 "/crypto/ivgen/plain64/1",
67 .sector = 0x1,
68 .ivalg = QCRYPTO_IVGEN_ALG_PLAIN64,
69 .iv = (const uint8_t *)"\x01\x00\x00\x00\x00\x00\x00\x00"
70 "\x00\x00\x00\x00\x00\x00\x00\x00",
71 .niv = 16,
72 },
73
74 {
75 "/crypto/ivgen/plain64/1f2e3d4c",
76 .sector = 0x1f2e3d4cULL,
77 .ivalg = QCRYPTO_IVGEN_ALG_PLAIN64,
78 .iv = (const uint8_t *)"\x4c\x3d\x2e\x1f\x00\x00\x00\x00"
79 "\x00\x00\x00\x00\x00\x00\x00\x00",
80 .niv = 16,
81 },
82
83 {
84 "/crypto/ivgen/plain64/1f2e3d4c5b6a7988",
85 .sector = 0x1f2e3d4c5b6a7988ULL,
86 .ivalg = QCRYPTO_IVGEN_ALG_PLAIN64,
87 .iv = (const uint8_t *)"\x88\x79\x6a\x5b\x4c\x3d\x2e\x1f"
88 "\x00\x00\x00\x00\x00\x00\x00\x00",
89 .niv = 16,
90 },
91
92 {
93 "/crypto/ivgen/essiv/1",
94 .sector = 0x1,
95 .ivalg = QCRYPTO_IVGEN_ALG_ESSIV,
96 .cipheralg = QCRYPTO_CIPHER_ALG_AES_128,
97 .hashalg = QCRYPTO_HASH_ALG_SHA256,
98 .key = (const uint8_t *)"\x00\x01\x02\x03\x04\x05\x06\x07"
99 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
100 .nkey = 16,
101 .iv = (const uint8_t *)"\xd4\x83\x71\xb2\xa1\x94\x53\x88"
102 "\x1c\x7a\x2d\06\x2d\x0b\x65\x46",
103 .niv = 16,
104 },
105
106 {
107 "/crypto/ivgen/essiv/1f2e3d4c",
108 .sector = 0x1f2e3d4cULL,
109 .ivalg = QCRYPTO_IVGEN_ALG_ESSIV,
110 .cipheralg = QCRYPTO_CIPHER_ALG_AES_128,
111 .hashalg = QCRYPTO_HASH_ALG_SHA256,
112 .key = (const uint8_t *)"\x00\x01\x02\x03\x04\x05\x06\x07"
113 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
114 .nkey = 16,
115 .iv = (const uint8_t *)"\x5d\x36\x09\x5d\xc6\x9e\x5e\xe9"
116 "\xe3\x02\x8d\xd8\x7a\x3d\xe7\x8f",
117 .niv = 16,
118 },
119
120 {
121 "/crypto/ivgen/essiv/1f2e3d4c5b6a7988",
122 .sector = 0x1f2e3d4c5b6a7988ULL,
123 .ivalg = QCRYPTO_IVGEN_ALG_ESSIV,
124 .cipheralg = QCRYPTO_CIPHER_ALG_AES_128,
125 .hashalg = QCRYPTO_HASH_ALG_SHA256,
126 .key = (const uint8_t *)"\x00\x01\x02\x03\x04\x05\x06\x07"
127 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
128 .nkey = 16,
129 .iv = (const uint8_t *)"\x58\xbb\x81\x94\x51\x83\x23\x23"
130 "\x7a\x08\x93\xa9\xdc\xd2\xd9\xab",
131 .niv = 16,
132 },
133};
134
135
136static void test_ivgen(const void *opaque)
137{
138 const struct QCryptoIVGenTestData *data = opaque;
139 uint8_t *iv = g_new0(uint8_t, data->niv);
140 QCryptoIVGen *ivgen = qcrypto_ivgen_new(
141 data->ivalg,
142 data->cipheralg,
143 data->hashalg,
144 data->key,
145 data->nkey,
146 &error_abort);
147
148 qcrypto_ivgen_calculate(ivgen,
149 data->sector,
150 iv,
151 data->niv,
152 &error_abort);
153
154 g_assert(memcmp(iv, data->iv, data->niv) == 0);
155
156 qcrypto_ivgen_free(ivgen);
157 g_free(iv);
158}
159
160int main(int argc, char **argv)
161{
162 size_t i;
163 g_test_init(&argc, &argv, NULL);
164 for (i = 0; i < G_N_ELEMENTS(test_data); i++) {
165 if (test_data[i].ivalg == QCRYPTO_IVGEN_ALG_ESSIV &&
166 !qcrypto_hash_supports(test_data[i].hashalg)) {
167 continue;
168 }
169 g_test_add_data_func(test_data[i].path,
170 &(test_data[i]),
171 test_ivgen);
172 }
173 return g_test_run();
174}
175