xref: /qemu/tests/unit/test-crypto-secret.c (revision 212c217f7d540fdbf1df4b65653ad5592073bb8e)
1ac1d8878SDaniel P. Berrange /*
2ac1d8878SDaniel P. Berrange  * QEMU Crypto secret handling
3ac1d8878SDaniel P. Berrange  *
4ac1d8878SDaniel P. Berrange  * Copyright (c) 2015 Red Hat, Inc.
5ac1d8878SDaniel P. Berrange  *
6ac1d8878SDaniel P. Berrange  * This library is free software; you can redistribute it and/or
7ac1d8878SDaniel P. Berrange  * modify it under the terms of the GNU Lesser General Public
8ac1d8878SDaniel P. Berrange  * License as published by the Free Software Foundation; either
9422c16e7SChetan Pant  * version 2.1 of the License, or (at your option) any later version.
10ac1d8878SDaniel P. Berrange  *
11ac1d8878SDaniel P. Berrange  * This library is distributed in the hope that it will be useful,
12ac1d8878SDaniel P. Berrange  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13ac1d8878SDaniel P. Berrange  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14ac1d8878SDaniel P. Berrange  * Lesser General Public License for more details.
15ac1d8878SDaniel P. Berrange  *
16ac1d8878SDaniel P. Berrange  * You should have received a copy of the GNU Lesser General Public
17ac1d8878SDaniel P. Berrange  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18ac1d8878SDaniel P. Berrange  *
19ac1d8878SDaniel P. Berrange  */
20ac1d8878SDaniel P. Berrange 
21681c28a3SPeter Maydell #include "qemu/osdep.h"
22ac1d8878SDaniel P. Berrange 
23ac1d8878SDaniel P. Berrange #include "crypto/init.h"
24ac1d8878SDaniel P. Berrange #include "crypto/secret.h"
25*212c217fSDaniel P. Berrangé #include "crypto/cipher.h"
26da34e65cSMarkus Armbruster #include "qapi/error.h"
277136fc1dSMarkus Armbruster #include "qemu/module.h"
289a29e020SJuan Quintela #if defined(CONFIG_KEYUTILS) && defined(CONFIG_SECRET_KEYRING)
2992500362SAlexey Krasikov #include "crypto/secret_keyring.h"
3092500362SAlexey Krasikov #include <keyutils.h>
3192500362SAlexey Krasikov #endif
32ac1d8878SDaniel P. Berrange 
test_secret_direct(void)33ac1d8878SDaniel P. Berrange static void test_secret_direct(void)
34ac1d8878SDaniel P. Berrange {
35ac1d8878SDaniel P. Berrange     Object *sec = object_new_with_props(
36ac1d8878SDaniel P. Berrange         TYPE_QCRYPTO_SECRET,
37ac1d8878SDaniel P. Berrange         object_get_objects_root(),
38ac1d8878SDaniel P. Berrange         "sec0",
39ac1d8878SDaniel P. Berrange         &error_abort,
40ac1d8878SDaniel P. Berrange         "data", "123456",
41ac1d8878SDaniel P. Berrange         NULL);
42ac1d8878SDaniel P. Berrange 
43ac1d8878SDaniel P. Berrange     char *pw = qcrypto_secret_lookup_as_utf8("sec0",
44ac1d8878SDaniel P. Berrange                                              &error_abort);
45ac1d8878SDaniel P. Berrange 
46ac1d8878SDaniel P. Berrange     g_assert_cmpstr(pw, ==, "123456");
47ac1d8878SDaniel P. Berrange 
48ac1d8878SDaniel P. Berrange     object_unparent(sec);
49ac1d8878SDaniel P. Berrange     g_free(pw);
50ac1d8878SDaniel P. Berrange }
51ac1d8878SDaniel P. Berrange 
52ac1d8878SDaniel P. Berrange 
test_secret_indirect_good(void)53ac1d8878SDaniel P. Berrange static void test_secret_indirect_good(void)
54ac1d8878SDaniel P. Berrange {
55ac1d8878SDaniel P. Berrange     Object *sec;
56ac1d8878SDaniel P. Berrange     char *fname = NULL;
57e7ed11f0SDaniel P. Berrange     int fd = g_file_open_tmp("qemu-test-crypto-secret-XXXXXX",
58ac1d8878SDaniel P. Berrange                              &fname,
59ac1d8878SDaniel P. Berrange                              NULL);
60ac1d8878SDaniel P. Berrange 
61ac1d8878SDaniel P. Berrange     g_assert(fd >= 0);
62ac1d8878SDaniel P. Berrange     g_assert_nonnull(fname);
63ac1d8878SDaniel P. Berrange 
64ac1d8878SDaniel P. Berrange     g_assert(write(fd, "123456", 6) == 6);
65ac1d8878SDaniel P. Berrange 
66ac1d8878SDaniel P. Berrange     sec = object_new_with_props(
67ac1d8878SDaniel P. Berrange         TYPE_QCRYPTO_SECRET,
68ac1d8878SDaniel P. Berrange         object_get_objects_root(),
69ac1d8878SDaniel P. Berrange         "sec0",
70ac1d8878SDaniel P. Berrange         &error_abort,
71ac1d8878SDaniel P. Berrange         "file", fname,
72ac1d8878SDaniel P. Berrange         NULL);
73ac1d8878SDaniel P. Berrange 
74ac1d8878SDaniel P. Berrange     char *pw = qcrypto_secret_lookup_as_utf8("sec0",
75ac1d8878SDaniel P. Berrange                                              &error_abort);
76ac1d8878SDaniel P. Berrange 
77ac1d8878SDaniel P. Berrange     g_assert_cmpstr(pw, ==, "123456");
78ac1d8878SDaniel P. Berrange 
79ac1d8878SDaniel P. Berrange     object_unparent(sec);
80ac1d8878SDaniel P. Berrange     g_free(pw);
81ac1d8878SDaniel P. Berrange     close(fd);
82e7ed11f0SDaniel P. Berrange     unlink(fname);
83ac1d8878SDaniel P. Berrange     g_free(fname);
84ac1d8878SDaniel P. Berrange }
85ac1d8878SDaniel P. Berrange 
86ac1d8878SDaniel P. Berrange 
test_secret_indirect_badfile(void)87ac1d8878SDaniel P. Berrange static void test_secret_indirect_badfile(void)
88ac1d8878SDaniel P. Berrange {
89ac1d8878SDaniel P. Berrange     Object *sec = object_new_with_props(
90ac1d8878SDaniel P. Berrange         TYPE_QCRYPTO_SECRET,
91ac1d8878SDaniel P. Berrange         object_get_objects_root(),
92ac1d8878SDaniel P. Berrange         "sec0",
93ac1d8878SDaniel P. Berrange         NULL,
94ac1d8878SDaniel P. Berrange         "file", "does-not-exist",
95ac1d8878SDaniel P. Berrange         NULL);
96ac1d8878SDaniel P. Berrange 
97ac1d8878SDaniel P. Berrange     g_assert(sec == NULL);
98ac1d8878SDaniel P. Berrange }
99ac1d8878SDaniel P. Berrange 
100ac1d8878SDaniel P. Berrange 
test_secret_indirect_emptyfile(void)101ac1d8878SDaniel P. Berrange static void test_secret_indirect_emptyfile(void)
102ac1d8878SDaniel P. Berrange {
103ac1d8878SDaniel P. Berrange     Object *sec;
104ac1d8878SDaniel P. Berrange     char *fname = NULL;
105e7ed11f0SDaniel P. Berrange     int fd = g_file_open_tmp("qemu-test-crypto-secretXXXXXX",
106ac1d8878SDaniel P. Berrange                              &fname,
107ac1d8878SDaniel P. Berrange                              NULL);
108ac1d8878SDaniel P. Berrange 
109ac1d8878SDaniel P. Berrange     g_assert(fd >= 0);
110ac1d8878SDaniel P. Berrange     g_assert_nonnull(fname);
111ac1d8878SDaniel P. Berrange 
112ac1d8878SDaniel P. Berrange     sec = object_new_with_props(
113ac1d8878SDaniel P. Berrange         TYPE_QCRYPTO_SECRET,
114ac1d8878SDaniel P. Berrange         object_get_objects_root(),
115ac1d8878SDaniel P. Berrange         "sec0",
116ac1d8878SDaniel P. Berrange         &error_abort,
117ac1d8878SDaniel P. Berrange         "file", fname,
118ac1d8878SDaniel P. Berrange         NULL);
119ac1d8878SDaniel P. Berrange 
120ac1d8878SDaniel P. Berrange     char *pw = qcrypto_secret_lookup_as_utf8("sec0",
121ac1d8878SDaniel P. Berrange                                              &error_abort);
122ac1d8878SDaniel P. Berrange 
123ac1d8878SDaniel P. Berrange     g_assert_cmpstr(pw, ==, "");
124ac1d8878SDaniel P. Berrange 
125ac1d8878SDaniel P. Berrange     object_unparent(sec);
126ac1d8878SDaniel P. Berrange     g_free(pw);
127ac1d8878SDaniel P. Berrange     close(fd);
128e7ed11f0SDaniel P. Berrange     unlink(fname);
129ac1d8878SDaniel P. Berrange     g_free(fname);
130ac1d8878SDaniel P. Berrange }
131ac1d8878SDaniel P. Berrange 
1329a29e020SJuan Quintela #if defined(CONFIG_KEYUTILS) && defined(CONFIG_SECRET_KEYRING)
13392500362SAlexey Krasikov 
13492500362SAlexey Krasikov #define DESCRIPTION "qemu_test_secret"
13592500362SAlexey Krasikov #define PAYLOAD "Test Payload"
13692500362SAlexey Krasikov 
13792500362SAlexey Krasikov 
test_secret_keyring_good(void)13892500362SAlexey Krasikov static void test_secret_keyring_good(void)
13992500362SAlexey Krasikov {
14092500362SAlexey Krasikov     char key_str[16];
14192500362SAlexey Krasikov     Object *sec;
14292500362SAlexey Krasikov     int32_t key = add_key("user", DESCRIPTION, PAYLOAD,
14392500362SAlexey Krasikov                           strlen(PAYLOAD), KEY_SPEC_PROCESS_KEYRING);
14492500362SAlexey Krasikov 
14592500362SAlexey Krasikov     g_assert(key >= 0);
14692500362SAlexey Krasikov 
14792500362SAlexey Krasikov     snprintf(key_str, sizeof(key_str), "0x%08x", key);
14892500362SAlexey Krasikov     sec = object_new_with_props(
14992500362SAlexey Krasikov         TYPE_QCRYPTO_SECRET_KEYRING,
15092500362SAlexey Krasikov         object_get_objects_root(),
15192500362SAlexey Krasikov         "sec0",
15292500362SAlexey Krasikov         &error_abort,
15392500362SAlexey Krasikov         "serial", key_str,
15492500362SAlexey Krasikov         NULL);
15592500362SAlexey Krasikov 
15692500362SAlexey Krasikov     assert(0 <= keyctl_unlink(key, KEY_SPEC_PROCESS_KEYRING));
15792500362SAlexey Krasikov     char *pw = qcrypto_secret_lookup_as_utf8("sec0",
15892500362SAlexey Krasikov                                              &error_abort);
15992500362SAlexey Krasikov     g_assert_cmpstr(pw, ==, PAYLOAD);
16092500362SAlexey Krasikov 
16192500362SAlexey Krasikov     object_unparent(sec);
16292500362SAlexey Krasikov     g_free(pw);
16392500362SAlexey Krasikov }
16492500362SAlexey Krasikov 
16592500362SAlexey Krasikov 
test_secret_keyring_revoked_key(void)16692500362SAlexey Krasikov static void test_secret_keyring_revoked_key(void)
16792500362SAlexey Krasikov {
16892500362SAlexey Krasikov     char key_str[16];
16992500362SAlexey Krasikov     Object *sec;
17092500362SAlexey Krasikov     int32_t key = add_key("user", DESCRIPTION, PAYLOAD,
17192500362SAlexey Krasikov                           strlen(PAYLOAD), KEY_SPEC_PROCESS_KEYRING);
17292500362SAlexey Krasikov     g_assert(key >= 0);
17392500362SAlexey Krasikov     g_assert_false(keyctl_revoke(key));
17492500362SAlexey Krasikov 
17592500362SAlexey Krasikov     snprintf(key_str, sizeof(key_str), "0x%08x", key);
17692500362SAlexey Krasikov     sec = object_new_with_props(
17792500362SAlexey Krasikov         TYPE_QCRYPTO_SECRET_KEYRING,
17892500362SAlexey Krasikov         object_get_objects_root(),
17992500362SAlexey Krasikov         "sec0",
18092500362SAlexey Krasikov         NULL,
18192500362SAlexey Krasikov         "serial", key_str,
18292500362SAlexey Krasikov         NULL);
18392500362SAlexey Krasikov 
18492500362SAlexey Krasikov     g_assert(errno == EKEYREVOKED);
18592500362SAlexey Krasikov     g_assert(sec == NULL);
18692500362SAlexey Krasikov 
18792500362SAlexey Krasikov     keyctl_unlink(key, KEY_SPEC_PROCESS_KEYRING);
18892500362SAlexey Krasikov }
18992500362SAlexey Krasikov 
19092500362SAlexey Krasikov 
test_secret_keyring_expired_key(void)19192500362SAlexey Krasikov static void test_secret_keyring_expired_key(void)
19292500362SAlexey Krasikov {
19392500362SAlexey Krasikov     char key_str[16];
19492500362SAlexey Krasikov     Object *sec;
19592500362SAlexey Krasikov     int32_t key = add_key("user", DESCRIPTION, PAYLOAD,
19692500362SAlexey Krasikov                           strlen(PAYLOAD), KEY_SPEC_PROCESS_KEYRING);
19792500362SAlexey Krasikov     g_assert(key >= 0);
19892500362SAlexey Krasikov     g_assert_false(keyctl_set_timeout(key, 1));
19992500362SAlexey Krasikov     sleep(1);
20092500362SAlexey Krasikov 
20192500362SAlexey Krasikov     snprintf(key_str, sizeof(key_str), "0x%08x", key);
20292500362SAlexey Krasikov     sec = object_new_with_props(
20392500362SAlexey Krasikov         TYPE_QCRYPTO_SECRET_KEYRING,
20492500362SAlexey Krasikov         object_get_objects_root(),
20592500362SAlexey Krasikov         "sec0",
20692500362SAlexey Krasikov         NULL,
20792500362SAlexey Krasikov         "serial", key_str,
20892500362SAlexey Krasikov         NULL);
20992500362SAlexey Krasikov 
21092500362SAlexey Krasikov     g_assert(errno == EKEYEXPIRED);
21192500362SAlexey Krasikov     g_assert(sec == NULL);
21292500362SAlexey Krasikov 
21392500362SAlexey Krasikov     keyctl_unlink(key, KEY_SPEC_PROCESS_KEYRING);
21492500362SAlexey Krasikov }
21592500362SAlexey Krasikov 
21692500362SAlexey Krasikov 
test_secret_keyring_bad_serial_key(void)21792500362SAlexey Krasikov static void test_secret_keyring_bad_serial_key(void)
21892500362SAlexey Krasikov {
21992500362SAlexey Krasikov     Object *sec;
22092500362SAlexey Krasikov 
22192500362SAlexey Krasikov     sec = object_new_with_props(
22292500362SAlexey Krasikov         TYPE_QCRYPTO_SECRET_KEYRING,
22392500362SAlexey Krasikov         object_get_objects_root(),
22492500362SAlexey Krasikov         "sec0",
22592500362SAlexey Krasikov         NULL,
22692500362SAlexey Krasikov         "serial", "1",
22792500362SAlexey Krasikov         NULL);
22892500362SAlexey Krasikov 
22992500362SAlexey Krasikov     g_assert(errno == ENOKEY);
23092500362SAlexey Krasikov     g_assert(sec == NULL);
23192500362SAlexey Krasikov }
23292500362SAlexey Krasikov 
23392500362SAlexey Krasikov /*
23492500362SAlexey Krasikov  * TODO
23592500362SAlexey Krasikov  * test_secret_keyring_bad_key_access_right() is not working yet.
23692500362SAlexey Krasikov  * We don't know yet if this due a bug in the Linux kernel or
23792500362SAlexey Krasikov  * whether it's normal syscall behavior.
23892500362SAlexey Krasikov  * We've requested information from kernel maintainers.
23992500362SAlexey Krasikov  * See: <https://www.spinics.net/lists/keyrings/index.html>
24092500362SAlexey Krasikov  * Thread: 'security/keys: remove possessor verify after key permission check'
24192500362SAlexey Krasikov  */
24292500362SAlexey Krasikov 
test_secret_keyring_bad_key_access_right(void)24392500362SAlexey Krasikov static void test_secret_keyring_bad_key_access_right(void)
24492500362SAlexey Krasikov {
24592500362SAlexey Krasikov     char key_str[16];
24692500362SAlexey Krasikov     Object *sec;
24792500362SAlexey Krasikov 
24896420a30SMichael Tokarev     g_test_skip("TODO: Need response from Linux kernel maintainers");
24992500362SAlexey Krasikov     return;
25092500362SAlexey Krasikov 
25192500362SAlexey Krasikov     int32_t key = add_key("user", DESCRIPTION, PAYLOAD,
25292500362SAlexey Krasikov                           strlen(PAYLOAD), KEY_SPEC_PROCESS_KEYRING);
25392500362SAlexey Krasikov     g_assert(key >= 0);
25492500362SAlexey Krasikov     g_assert_false(keyctl_setperm(key, KEY_POS_ALL & (~KEY_POS_READ)));
25592500362SAlexey Krasikov 
25692500362SAlexey Krasikov     snprintf(key_str, sizeof(key_str), "0x%08x", key);
25792500362SAlexey Krasikov 
25892500362SAlexey Krasikov     sec = object_new_with_props(
25992500362SAlexey Krasikov         TYPE_QCRYPTO_SECRET_KEYRING,
26092500362SAlexey Krasikov         object_get_objects_root(),
26192500362SAlexey Krasikov         "sec0",
26292500362SAlexey Krasikov         NULL,
26392500362SAlexey Krasikov         "serial", key_str,
26492500362SAlexey Krasikov         NULL);
26592500362SAlexey Krasikov 
26692500362SAlexey Krasikov     g_assert(errno == EACCES);
26792500362SAlexey Krasikov     g_assert(sec == NULL);
26892500362SAlexey Krasikov 
26992500362SAlexey Krasikov     keyctl_unlink(key, KEY_SPEC_PROCESS_KEYRING);
27092500362SAlexey Krasikov }
27192500362SAlexey Krasikov 
2729a29e020SJuan Quintela #endif /* CONFIG_KEYUTILS && CONFIG_SECRET_KEYRING */
273ac1d8878SDaniel P. Berrange 
test_secret_noconv_base64_good(void)274ac1d8878SDaniel P. Berrange static void test_secret_noconv_base64_good(void)
275ac1d8878SDaniel P. Berrange {
276ac1d8878SDaniel P. Berrange     Object *sec = object_new_with_props(
277ac1d8878SDaniel P. Berrange         TYPE_QCRYPTO_SECRET,
278ac1d8878SDaniel P. Berrange         object_get_objects_root(),
279ac1d8878SDaniel P. Berrange         "sec0",
280ac1d8878SDaniel P. Berrange         &error_abort,
281ac1d8878SDaniel P. Berrange         "data", "MTIzNDU2",
282ac1d8878SDaniel P. Berrange         "format", "base64",
283ac1d8878SDaniel P. Berrange         NULL);
284ac1d8878SDaniel P. Berrange 
285ac1d8878SDaniel P. Berrange     char *pw = qcrypto_secret_lookup_as_base64("sec0",
286ac1d8878SDaniel P. Berrange                                                &error_abort);
287ac1d8878SDaniel P. Berrange 
288ac1d8878SDaniel P. Berrange     g_assert_cmpstr(pw, ==, "MTIzNDU2");
289ac1d8878SDaniel P. Berrange 
290ac1d8878SDaniel P. Berrange     object_unparent(sec);
291ac1d8878SDaniel P. Berrange     g_free(pw);
292ac1d8878SDaniel P. Berrange }
293ac1d8878SDaniel P. Berrange 
294ac1d8878SDaniel P. Berrange 
test_secret_noconv_base64_bad(void)295ac1d8878SDaniel P. Berrange static void test_secret_noconv_base64_bad(void)
296ac1d8878SDaniel P. Berrange {
297ac1d8878SDaniel P. Berrange     Object *sec = object_new_with_props(
298ac1d8878SDaniel P. Berrange         TYPE_QCRYPTO_SECRET,
299ac1d8878SDaniel P. Berrange         object_get_objects_root(),
300ac1d8878SDaniel P. Berrange         "sec0",
301ac1d8878SDaniel P. Berrange         NULL,
302ac1d8878SDaniel P. Berrange         "data", "MTI$NDU2",
303ac1d8878SDaniel P. Berrange         "format", "base64",
304ac1d8878SDaniel P. Berrange         NULL);
305ac1d8878SDaniel P. Berrange 
306ac1d8878SDaniel P. Berrange     g_assert(sec == NULL);
307ac1d8878SDaniel P. Berrange }
308ac1d8878SDaniel P. Berrange 
309ac1d8878SDaniel P. Berrange 
test_secret_noconv_utf8(void)310ac1d8878SDaniel P. Berrange static void test_secret_noconv_utf8(void)
311ac1d8878SDaniel P. Berrange {
312ac1d8878SDaniel P. Berrange     Object *sec = object_new_with_props(
313ac1d8878SDaniel P. Berrange         TYPE_QCRYPTO_SECRET,
314ac1d8878SDaniel P. Berrange         object_get_objects_root(),
315ac1d8878SDaniel P. Berrange         "sec0",
316ac1d8878SDaniel P. Berrange         &error_abort,
317ac1d8878SDaniel P. Berrange         "data", "123456",
318ac1d8878SDaniel P. Berrange         "format", "raw",
319ac1d8878SDaniel P. Berrange         NULL);
320ac1d8878SDaniel P. Berrange 
321ac1d8878SDaniel P. Berrange     char *pw = qcrypto_secret_lookup_as_utf8("sec0",
322ac1d8878SDaniel P. Berrange                                              &error_abort);
323ac1d8878SDaniel P. Berrange 
324ac1d8878SDaniel P. Berrange     g_assert_cmpstr(pw, ==, "123456");
325ac1d8878SDaniel P. Berrange 
326ac1d8878SDaniel P. Berrange     object_unparent(sec);
327ac1d8878SDaniel P. Berrange     g_free(pw);
328ac1d8878SDaniel P. Berrange }
329ac1d8878SDaniel P. Berrange 
330ac1d8878SDaniel P. Berrange 
test_secret_conv_base64_utf8valid(void)331ac1d8878SDaniel P. Berrange static void test_secret_conv_base64_utf8valid(void)
332ac1d8878SDaniel P. Berrange {
333ac1d8878SDaniel P. Berrange     Object *sec = object_new_with_props(
334ac1d8878SDaniel P. Berrange         TYPE_QCRYPTO_SECRET,
335ac1d8878SDaniel P. Berrange         object_get_objects_root(),
336ac1d8878SDaniel P. Berrange         "sec0",
337ac1d8878SDaniel P. Berrange         &error_abort,
338ac1d8878SDaniel P. Berrange         "data", "MTIzNDU2",
339ac1d8878SDaniel P. Berrange         "format", "base64",
340ac1d8878SDaniel P. Berrange         NULL);
341ac1d8878SDaniel P. Berrange 
342ac1d8878SDaniel P. Berrange     char *pw = qcrypto_secret_lookup_as_utf8("sec0",
343ac1d8878SDaniel P. Berrange                                              &error_abort);
344ac1d8878SDaniel P. Berrange 
345ac1d8878SDaniel P. Berrange     g_assert_cmpstr(pw, ==, "123456");
346ac1d8878SDaniel P. Berrange 
347ac1d8878SDaniel P. Berrange     object_unparent(sec);
348ac1d8878SDaniel P. Berrange     g_free(pw);
349ac1d8878SDaniel P. Berrange }
350ac1d8878SDaniel P. Berrange 
351ac1d8878SDaniel P. Berrange 
test_secret_conv_base64_utf8invalid(void)352ac1d8878SDaniel P. Berrange static void test_secret_conv_base64_utf8invalid(void)
353ac1d8878SDaniel P. Berrange {
354ac1d8878SDaniel P. Berrange     Object *sec = object_new_with_props(
355ac1d8878SDaniel P. Berrange         TYPE_QCRYPTO_SECRET,
356ac1d8878SDaniel P. Berrange         object_get_objects_root(),
357ac1d8878SDaniel P. Berrange         "sec0",
358ac1d8878SDaniel P. Berrange         &error_abort,
359ac1d8878SDaniel P. Berrange         "data", "f0VMRgIBAQAAAA==",
360ac1d8878SDaniel P. Berrange         "format", "base64",
361ac1d8878SDaniel P. Berrange         NULL);
362ac1d8878SDaniel P. Berrange 
363ac1d8878SDaniel P. Berrange     char *pw = qcrypto_secret_lookup_as_utf8("sec0",
364ac1d8878SDaniel P. Berrange                                              NULL);
365ac1d8878SDaniel P. Berrange     g_assert(pw == NULL);
366ac1d8878SDaniel P. Berrange 
367ac1d8878SDaniel P. Berrange     object_unparent(sec);
368ac1d8878SDaniel P. Berrange }
369ac1d8878SDaniel P. Berrange 
370ac1d8878SDaniel P. Berrange 
test_secret_conv_utf8_base64(void)371ac1d8878SDaniel P. Berrange static void test_secret_conv_utf8_base64(void)
372ac1d8878SDaniel P. Berrange {
373ac1d8878SDaniel P. Berrange     Object *sec = object_new_with_props(
374ac1d8878SDaniel P. Berrange         TYPE_QCRYPTO_SECRET,
375ac1d8878SDaniel P. Berrange         object_get_objects_root(),
376ac1d8878SDaniel P. Berrange         "sec0",
377ac1d8878SDaniel P. Berrange         &error_abort,
378ac1d8878SDaniel P. Berrange         "data", "123456",
379ac1d8878SDaniel P. Berrange         NULL);
380ac1d8878SDaniel P. Berrange 
381ac1d8878SDaniel P. Berrange     char *pw = qcrypto_secret_lookup_as_base64("sec0",
382ac1d8878SDaniel P. Berrange                                                &error_abort);
383ac1d8878SDaniel P. Berrange 
384ac1d8878SDaniel P. Berrange     g_assert_cmpstr(pw, ==, "MTIzNDU2");
385ac1d8878SDaniel P. Berrange 
386ac1d8878SDaniel P. Berrange     object_unparent(sec);
387ac1d8878SDaniel P. Berrange     g_free(pw);
388ac1d8878SDaniel P. Berrange }
389ac1d8878SDaniel P. Berrange 
390ac1d8878SDaniel P. Berrange 
test_secret_crypt_raw(void)391ac1d8878SDaniel P. Berrange static void test_secret_crypt_raw(void)
392ac1d8878SDaniel P. Berrange {
393ac1d8878SDaniel P. Berrange     Object *master = object_new_with_props(
394ac1d8878SDaniel P. Berrange         TYPE_QCRYPTO_SECRET,
395ac1d8878SDaniel P. Berrange         object_get_objects_root(),
396ac1d8878SDaniel P. Berrange         "master",
397ac1d8878SDaniel P. Berrange         &error_abort,
398ac1d8878SDaniel P. Berrange         "data", "9miloPQCzGy+TL6aonfzVcptibCmCIhKzrnlfwiWivk=",
399ac1d8878SDaniel P. Berrange         "format", "base64",
400ac1d8878SDaniel P. Berrange         NULL);
401ac1d8878SDaniel P. Berrange     Object *sec = object_new_with_props(
402ac1d8878SDaniel P. Berrange         TYPE_QCRYPTO_SECRET,
403ac1d8878SDaniel P. Berrange         object_get_objects_root(),
404ac1d8878SDaniel P. Berrange         "sec0",
405ac1d8878SDaniel P. Berrange         &error_abort,
406ac1d8878SDaniel P. Berrange         "data",
407ac1d8878SDaniel P. Berrange         "\xCC\xBF\xF7\x09\x46\x19\x0B\x52\x2A\x3A\xB4\x6B\xCD\x7A\xB0\xB0",
408ac1d8878SDaniel P. Berrange         "format", "raw",
409ac1d8878SDaniel P. Berrange         "keyid", "master",
410ac1d8878SDaniel P. Berrange         "iv", "0I7Gw/TKuA+Old2W2apQ3g==",
411ac1d8878SDaniel P. Berrange         NULL);
412ac1d8878SDaniel P. Berrange 
413ac1d8878SDaniel P. Berrange     char *pw = qcrypto_secret_lookup_as_utf8("sec0",
414ac1d8878SDaniel P. Berrange                                              &error_abort);
415ac1d8878SDaniel P. Berrange 
416ac1d8878SDaniel P. Berrange     g_assert_cmpstr(pw, ==, "123456");
417ac1d8878SDaniel P. Berrange 
418ac1d8878SDaniel P. Berrange     object_unparent(sec);
419ac1d8878SDaniel P. Berrange     object_unparent(master);
420ac1d8878SDaniel P. Berrange     g_free(pw);
421ac1d8878SDaniel P. Berrange }
422ac1d8878SDaniel P. Berrange 
423ac1d8878SDaniel P. Berrange 
test_secret_crypt_base64(void)424ac1d8878SDaniel P. Berrange static void test_secret_crypt_base64(void)
425ac1d8878SDaniel P. Berrange {
426ac1d8878SDaniel P. Berrange     Object *master = object_new_with_props(
427ac1d8878SDaniel P. Berrange         TYPE_QCRYPTO_SECRET,
428ac1d8878SDaniel P. Berrange         object_get_objects_root(),
429ac1d8878SDaniel P. Berrange         "master",
430ac1d8878SDaniel P. Berrange         &error_abort,
431ac1d8878SDaniel P. Berrange         "data", "9miloPQCzGy+TL6aonfzVcptibCmCIhKzrnlfwiWivk=",
432ac1d8878SDaniel P. Berrange         "format", "base64",
433ac1d8878SDaniel P. Berrange         NULL);
434ac1d8878SDaniel P. Berrange     Object *sec = object_new_with_props(
435ac1d8878SDaniel P. Berrange         TYPE_QCRYPTO_SECRET,
436ac1d8878SDaniel P. Berrange         object_get_objects_root(),
437ac1d8878SDaniel P. Berrange         "sec0",
438ac1d8878SDaniel P. Berrange         &error_abort,
439ac1d8878SDaniel P. Berrange         "data", "zL/3CUYZC1IqOrRrzXqwsA==",
440ac1d8878SDaniel P. Berrange         "format", "base64",
441ac1d8878SDaniel P. Berrange         "keyid", "master",
442ac1d8878SDaniel P. Berrange         "iv", "0I7Gw/TKuA+Old2W2apQ3g==",
443ac1d8878SDaniel P. Berrange         NULL);
444ac1d8878SDaniel P. Berrange 
445ac1d8878SDaniel P. Berrange     char *pw = qcrypto_secret_lookup_as_utf8("sec0",
446ac1d8878SDaniel P. Berrange                                              &error_abort);
447ac1d8878SDaniel P. Berrange 
448ac1d8878SDaniel P. Berrange     g_assert_cmpstr(pw, ==, "123456");
449ac1d8878SDaniel P. Berrange 
450ac1d8878SDaniel P. Berrange     object_unparent(sec);
451ac1d8878SDaniel P. Berrange     object_unparent(master);
452ac1d8878SDaniel P. Berrange     g_free(pw);
453ac1d8878SDaniel P. Berrange }
454ac1d8878SDaniel P. Berrange 
455ac1d8878SDaniel P. Berrange 
test_secret_crypt_short_key(void)456ac1d8878SDaniel P. Berrange static void test_secret_crypt_short_key(void)
457ac1d8878SDaniel P. Berrange {
458ac1d8878SDaniel P. Berrange     Object *master = object_new_with_props(
459ac1d8878SDaniel P. Berrange         TYPE_QCRYPTO_SECRET,
460ac1d8878SDaniel P. Berrange         object_get_objects_root(),
461ac1d8878SDaniel P. Berrange         "master",
462ac1d8878SDaniel P. Berrange         &error_abort,
463ac1d8878SDaniel P. Berrange         "data", "9miloPQCzGy+TL6aonfzVc",
464ac1d8878SDaniel P. Berrange         "format", "base64",
465ac1d8878SDaniel P. Berrange         NULL);
466ac1d8878SDaniel P. Berrange     Object *sec = object_new_with_props(
467ac1d8878SDaniel P. Berrange         TYPE_QCRYPTO_SECRET,
468ac1d8878SDaniel P. Berrange         object_get_objects_root(),
469ac1d8878SDaniel P. Berrange         "sec0",
470ac1d8878SDaniel P. Berrange         NULL,
471ac1d8878SDaniel P. Berrange         "data", "zL/3CUYZC1IqOrRrzXqwsA==",
472ac1d8878SDaniel P. Berrange         "format", "raw",
473ac1d8878SDaniel P. Berrange         "keyid", "master",
474ac1d8878SDaniel P. Berrange         "iv", "0I7Gw/TKuA+Old2W2apQ3g==",
475ac1d8878SDaniel P. Berrange         NULL);
476ac1d8878SDaniel P. Berrange 
477ac1d8878SDaniel P. Berrange     g_assert(sec == NULL);
478ac1d8878SDaniel P. Berrange     object_unparent(master);
479ac1d8878SDaniel P. Berrange }
480ac1d8878SDaniel P. Berrange 
481ac1d8878SDaniel P. Berrange 
test_secret_crypt_short_iv(void)482ac1d8878SDaniel P. Berrange static void test_secret_crypt_short_iv(void)
483ac1d8878SDaniel P. Berrange {
484ac1d8878SDaniel P. Berrange     Object *master = object_new_with_props(
485ac1d8878SDaniel P. Berrange         TYPE_QCRYPTO_SECRET,
486ac1d8878SDaniel P. Berrange         object_get_objects_root(),
487ac1d8878SDaniel P. Berrange         "master",
488ac1d8878SDaniel P. Berrange         &error_abort,
489ac1d8878SDaniel P. Berrange         "data", "9miloPQCzGy+TL6aonfzVcptibCmCIhKzrnlfwiWivk=",
490ac1d8878SDaniel P. Berrange         "format", "base64",
491ac1d8878SDaniel P. Berrange         NULL);
492ac1d8878SDaniel P. Berrange     Object *sec = object_new_with_props(
493ac1d8878SDaniel P. Berrange         TYPE_QCRYPTO_SECRET,
494ac1d8878SDaniel P. Berrange         object_get_objects_root(),
495ac1d8878SDaniel P. Berrange         "sec0",
496ac1d8878SDaniel P. Berrange         NULL,
497ac1d8878SDaniel P. Berrange         "data", "zL/3CUYZC1IqOrRrzXqwsA==",
498ac1d8878SDaniel P. Berrange         "format", "raw",
499ac1d8878SDaniel P. Berrange         "keyid", "master",
500ac1d8878SDaniel P. Berrange         "iv", "0I7Gw/TKuA+Old2W2a",
501ac1d8878SDaniel P. Berrange         NULL);
502ac1d8878SDaniel P. Berrange 
503ac1d8878SDaniel P. Berrange     g_assert(sec == NULL);
504ac1d8878SDaniel P. Berrange     object_unparent(master);
505ac1d8878SDaniel P. Berrange }
506ac1d8878SDaniel P. Berrange 
507ac1d8878SDaniel P. Berrange 
test_secret_crypt_missing_iv(void)508ac1d8878SDaniel P. Berrange static void test_secret_crypt_missing_iv(void)
509ac1d8878SDaniel P. Berrange {
510ac1d8878SDaniel P. Berrange     Object *master = object_new_with_props(
511ac1d8878SDaniel P. Berrange         TYPE_QCRYPTO_SECRET,
512ac1d8878SDaniel P. Berrange         object_get_objects_root(),
513ac1d8878SDaniel P. Berrange         "master",
514ac1d8878SDaniel P. Berrange         &error_abort,
515ac1d8878SDaniel P. Berrange         "data", "9miloPQCzGy+TL6aonfzVcptibCmCIhKzrnlfwiWivk=",
516ac1d8878SDaniel P. Berrange         "format", "base64",
517ac1d8878SDaniel P. Berrange         NULL);
518ac1d8878SDaniel P. Berrange     Object *sec = object_new_with_props(
519ac1d8878SDaniel P. Berrange         TYPE_QCRYPTO_SECRET,
520ac1d8878SDaniel P. Berrange         object_get_objects_root(),
521ac1d8878SDaniel P. Berrange         "sec0",
522ac1d8878SDaniel P. Berrange         NULL,
523ac1d8878SDaniel P. Berrange         "data", "zL/3CUYZC1IqOrRrzXqwsA==",
524ac1d8878SDaniel P. Berrange         "format", "raw",
525ac1d8878SDaniel P. Berrange         "keyid", "master",
526ac1d8878SDaniel P. Berrange         NULL);
527ac1d8878SDaniel P. Berrange 
528ac1d8878SDaniel P. Berrange     g_assert(sec == NULL);
529ac1d8878SDaniel P. Berrange     object_unparent(master);
530ac1d8878SDaniel P. Berrange }
531ac1d8878SDaniel P. Berrange 
532ac1d8878SDaniel P. Berrange 
test_secret_crypt_bad_iv(void)533ac1d8878SDaniel P. Berrange static void test_secret_crypt_bad_iv(void)
534ac1d8878SDaniel P. Berrange {
535ac1d8878SDaniel P. Berrange     Object *master = object_new_with_props(
536ac1d8878SDaniel P. Berrange         TYPE_QCRYPTO_SECRET,
537ac1d8878SDaniel P. Berrange         object_get_objects_root(),
538ac1d8878SDaniel P. Berrange         "master",
539ac1d8878SDaniel P. Berrange         &error_abort,
540ac1d8878SDaniel P. Berrange         "data", "9miloPQCzGy+TL6aonfzVcptibCmCIhKzrnlfwiWivk=",
541ac1d8878SDaniel P. Berrange         "format", "base64",
542ac1d8878SDaniel P. Berrange         NULL);
543ac1d8878SDaniel P. Berrange     Object *sec = object_new_with_props(
544ac1d8878SDaniel P. Berrange         TYPE_QCRYPTO_SECRET,
545ac1d8878SDaniel P. Berrange         object_get_objects_root(),
546ac1d8878SDaniel P. Berrange         "sec0",
547ac1d8878SDaniel P. Berrange         NULL,
548ac1d8878SDaniel P. Berrange         "data", "zL/3CUYZC1IqOrRrzXqwsA==",
549ac1d8878SDaniel P. Berrange         "format", "raw",
550ac1d8878SDaniel P. Berrange         "keyid", "master",
551ac1d8878SDaniel P. Berrange         "iv", "0I7Gw/TK$$uA+Old2W2a",
552ac1d8878SDaniel P. Berrange         NULL);
553ac1d8878SDaniel P. Berrange 
554ac1d8878SDaniel P. Berrange     g_assert(sec == NULL);
555ac1d8878SDaniel P. Berrange     object_unparent(master);
556ac1d8878SDaniel P. Berrange }
557ac1d8878SDaniel P. Berrange 
558ac1d8878SDaniel P. Berrange 
main(int argc,char ** argv)559ac1d8878SDaniel P. Berrange int main(int argc, char **argv)
560ac1d8878SDaniel P. Berrange {
561ac1d8878SDaniel P. Berrange     module_call_init(MODULE_INIT_QOM);
562ac1d8878SDaniel P. Berrange     g_test_init(&argc, &argv, NULL);
563ac1d8878SDaniel P. Berrange 
564ac1d8878SDaniel P. Berrange     g_assert(qcrypto_init(NULL) == 0);
565ac1d8878SDaniel P. Berrange 
566ac1d8878SDaniel P. Berrange     g_test_add_func("/crypto/secret/direct",
567ac1d8878SDaniel P. Berrange                     test_secret_direct);
568ac1d8878SDaniel P. Berrange     g_test_add_func("/crypto/secret/indirect/good",
569ac1d8878SDaniel P. Berrange                     test_secret_indirect_good);
570ac1d8878SDaniel P. Berrange     g_test_add_func("/crypto/secret/indirect/badfile",
571ac1d8878SDaniel P. Berrange                     test_secret_indirect_badfile);
572ac1d8878SDaniel P. Berrange     g_test_add_func("/crypto/secret/indirect/emptyfile",
573ac1d8878SDaniel P. Berrange                     test_secret_indirect_emptyfile);
574ac1d8878SDaniel P. Berrange 
5759a29e020SJuan Quintela #if defined(CONFIG_KEYUTILS) && defined(CONFIG_SECRET_KEYRING)
57692500362SAlexey Krasikov     g_test_add_func("/crypto/secret/keyring/good",
57792500362SAlexey Krasikov                     test_secret_keyring_good);
57892500362SAlexey Krasikov     g_test_add_func("/crypto/secret/keyring/revoked_key",
57992500362SAlexey Krasikov                     test_secret_keyring_revoked_key);
58092500362SAlexey Krasikov     g_test_add_func("/crypto/secret/keyring/expired_key",
58192500362SAlexey Krasikov                     test_secret_keyring_expired_key);
58292500362SAlexey Krasikov     g_test_add_func("/crypto/secret/keyring/bad_serial_key",
58392500362SAlexey Krasikov                     test_secret_keyring_bad_serial_key);
58492500362SAlexey Krasikov     g_test_add_func("/crypto/secret/keyring/bad_key_access_right",
58592500362SAlexey Krasikov                     test_secret_keyring_bad_key_access_right);
5869a29e020SJuan Quintela #endif /* CONFIG_KEYUTILS && CONFIG_SECRET_KEYRING */
58792500362SAlexey Krasikov 
588ac1d8878SDaniel P. Berrange     g_test_add_func("/crypto/secret/noconv/base64/good",
589ac1d8878SDaniel P. Berrange                     test_secret_noconv_base64_good);
590ac1d8878SDaniel P. Berrange     g_test_add_func("/crypto/secret/noconv/base64/bad",
591ac1d8878SDaniel P. Berrange                     test_secret_noconv_base64_bad);
592ac1d8878SDaniel P. Berrange     g_test_add_func("/crypto/secret/noconv/utf8",
593ac1d8878SDaniel P. Berrange                     test_secret_noconv_utf8);
594ac1d8878SDaniel P. Berrange     g_test_add_func("/crypto/secret/conv/base64/utf8valid",
595ac1d8878SDaniel P. Berrange                     test_secret_conv_base64_utf8valid);
596ac1d8878SDaniel P. Berrange     g_test_add_func("/crypto/secret/conv/base64/utf8invalid",
597ac1d8878SDaniel P. Berrange                     test_secret_conv_base64_utf8invalid);
598ac1d8878SDaniel P. Berrange     g_test_add_func("/crypto/secret/conv/utf8/base64",
599ac1d8878SDaniel P. Berrange                     test_secret_conv_utf8_base64);
600ac1d8878SDaniel P. Berrange 
601*212c217fSDaniel P. Berrangé     if (qcrypto_cipher_supports(QCRYPTO_CIPHER_ALGO_AES_128,
602*212c217fSDaniel P. Berrangé                                 QCRYPTO_CIPHER_MODE_CBC)) {
603ac1d8878SDaniel P. Berrange         g_test_add_func("/crypto/secret/crypt/raw",
604ac1d8878SDaniel P. Berrange                         test_secret_crypt_raw);
605ac1d8878SDaniel P. Berrange         g_test_add_func("/crypto/secret/crypt/base64",
606ac1d8878SDaniel P. Berrange                         test_secret_crypt_base64);
607ac1d8878SDaniel P. Berrange         g_test_add_func("/crypto/secret/crypt/shortkey",
608ac1d8878SDaniel P. Berrange                         test_secret_crypt_short_key);
609ac1d8878SDaniel P. Berrange         g_test_add_func("/crypto/secret/crypt/shortiv",
610ac1d8878SDaniel P. Berrange                         test_secret_crypt_short_iv);
611ac1d8878SDaniel P. Berrange         g_test_add_func("/crypto/secret/crypt/missingiv",
612ac1d8878SDaniel P. Berrange                         test_secret_crypt_missing_iv);
613ac1d8878SDaniel P. Berrange         g_test_add_func("/crypto/secret/crypt/badiv",
614ac1d8878SDaniel P. Berrange                         test_secret_crypt_bad_iv);
615*212c217fSDaniel P. Berrangé     }
616ac1d8878SDaniel P. Berrange 
617ac1d8878SDaniel P. Berrange     return g_test_run();
618ac1d8878SDaniel P. Berrange }
619