xref: /qemu/crypto/secret.c (revision 31b6aefd)
1ac1d8878SDaniel P. Berrange /*
2ac1d8878SDaniel P. Berrange  * QEMU crypto secret support
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
9b7cbb874SThomas Huth  * 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 
2142f7a448SPeter Maydell #include "qemu/osdep.h"
22ac1d8878SDaniel P. Berrange #include "crypto/secret.h"
23da34e65cSMarkus Armbruster #include "qapi/error.h"
24ac1d8878SDaniel P. Berrange #include "qom/object_interfaces.h"
250b8fa32fSMarkus Armbruster #include "qemu/module.h"
26ac1d8878SDaniel P. Berrange #include "trace.h"
27ac1d8878SDaniel P. Berrange 
28ac1d8878SDaniel P. Berrange 
29ac1d8878SDaniel P. Berrange static void
qcrypto_secret_load_data(QCryptoSecretCommon * sec_common,uint8_t ** output,size_t * outputlen,Error ** errp)30*4862bd3cSAlexey Krasikov qcrypto_secret_load_data(QCryptoSecretCommon *sec_common,
31ac1d8878SDaniel P. Berrange                          uint8_t **output,
32ac1d8878SDaniel P. Berrange                          size_t *outputlen,
33ac1d8878SDaniel P. Berrange                          Error **errp)
34ac1d8878SDaniel P. Berrange {
35ac1d8878SDaniel P. Berrange     char *data = NULL;
36ac1d8878SDaniel P. Berrange     size_t length = 0;
37ac1d8878SDaniel P. Berrange     GError *gerr = NULL;
38ac1d8878SDaniel P. Berrange 
39*4862bd3cSAlexey Krasikov     QCryptoSecret *secret = QCRYPTO_SECRET(sec_common);
40*4862bd3cSAlexey Krasikov 
41ac1d8878SDaniel P. Berrange     *output = NULL;
42ac1d8878SDaniel P. Berrange     *outputlen = 0;
43ac1d8878SDaniel P. Berrange 
44ac1d8878SDaniel P. Berrange     if (secret->file) {
45ac1d8878SDaniel P. Berrange         if (secret->data) {
46ac1d8878SDaniel P. Berrange             error_setg(errp,
47ac1d8878SDaniel P. Berrange                        "'file' and 'data' are mutually exclusive");
48ac1d8878SDaniel P. Berrange             return;
49ac1d8878SDaniel P. Berrange         }
50ac1d8878SDaniel P. Berrange         if (!g_file_get_contents(secret->file, &data, &length, &gerr)) {
51ac1d8878SDaniel P. Berrange             error_setg(errp,
52ac1d8878SDaniel P. Berrange                        "Unable to read %s: %s",
53ac1d8878SDaniel P. Berrange                        secret->file, gerr->message);
54ac1d8878SDaniel P. Berrange             g_error_free(gerr);
55ac1d8878SDaniel P. Berrange             return;
56ac1d8878SDaniel P. Berrange         }
57ac1d8878SDaniel P. Berrange         *output = (uint8_t *)data;
58ac1d8878SDaniel P. Berrange         *outputlen = length;
59ac1d8878SDaniel P. Berrange     } else if (secret->data) {
60ac1d8878SDaniel P. Berrange         *outputlen = strlen(secret->data);
61ac1d8878SDaniel P. Berrange         *output = (uint8_t *)g_strdup(secret->data);
62ac1d8878SDaniel P. Berrange     } else {
63ac1d8878SDaniel P. Berrange         error_setg(errp, "Either 'file' or 'data' must be provided");
64ac1d8878SDaniel P. Berrange     }
65ac1d8878SDaniel P. Berrange }
66ac1d8878SDaniel P. Berrange 
67ac1d8878SDaniel P. Berrange 
68ac1d8878SDaniel P. Berrange static void
qcrypto_secret_prop_set_data(Object * obj,const char * value,Error ** errp)69ac1d8878SDaniel P. Berrange qcrypto_secret_prop_set_data(Object *obj,
70ac1d8878SDaniel P. Berrange                              const char *value,
71ac1d8878SDaniel P. Berrange                              Error **errp)
72ac1d8878SDaniel P. Berrange {
73ac1d8878SDaniel P. Berrange     QCryptoSecret *secret = QCRYPTO_SECRET(obj);
74ac1d8878SDaniel P. Berrange 
75ac1d8878SDaniel P. Berrange     g_free(secret->data);
76ac1d8878SDaniel P. Berrange     secret->data = g_strdup(value);
77ac1d8878SDaniel P. Berrange }
78ac1d8878SDaniel P. Berrange 
79ac1d8878SDaniel P. Berrange 
80ac1d8878SDaniel P. Berrange static char *
qcrypto_secret_prop_get_data(Object * obj,Error ** errp)81ac1d8878SDaniel P. Berrange qcrypto_secret_prop_get_data(Object *obj,
82ac1d8878SDaniel P. Berrange                              Error **errp)
83ac1d8878SDaniel P. Berrange {
84ac1d8878SDaniel P. Berrange     QCryptoSecret *secret = QCRYPTO_SECRET(obj);
85ac1d8878SDaniel P. Berrange     return g_strdup(secret->data);
86ac1d8878SDaniel P. Berrange }
87ac1d8878SDaniel P. Berrange 
88ac1d8878SDaniel P. Berrange 
89ac1d8878SDaniel P. Berrange static void
qcrypto_secret_prop_set_file(Object * obj,const char * value,Error ** errp)90ac1d8878SDaniel P. Berrange qcrypto_secret_prop_set_file(Object *obj,
91ac1d8878SDaniel P. Berrange                              const char *value,
92ac1d8878SDaniel P. Berrange                              Error **errp)
93ac1d8878SDaniel P. Berrange {
94ac1d8878SDaniel P. Berrange     QCryptoSecret *secret = QCRYPTO_SECRET(obj);
95ac1d8878SDaniel P. Berrange 
96ac1d8878SDaniel P. Berrange     g_free(secret->file);
97ac1d8878SDaniel P. Berrange     secret->file = g_strdup(value);
98ac1d8878SDaniel P. Berrange }
99ac1d8878SDaniel P. Berrange 
100ac1d8878SDaniel P. Berrange 
101ac1d8878SDaniel P. Berrange static char *
qcrypto_secret_prop_get_file(Object * obj,Error ** errp)102ac1d8878SDaniel P. Berrange qcrypto_secret_prop_get_file(Object *obj,
103ac1d8878SDaniel P. Berrange                              Error **errp)
104ac1d8878SDaniel P. Berrange {
105ac1d8878SDaniel P. Berrange     QCryptoSecret *secret = QCRYPTO_SECRET(obj);
106ac1d8878SDaniel P. Berrange     return g_strdup(secret->file);
107ac1d8878SDaniel P. Berrange }
108ac1d8878SDaniel P. Berrange 
109ac1d8878SDaniel P. Berrange 
110ac1d8878SDaniel P. Berrange static void
qcrypto_secret_finalize(Object * obj)111ac1d8878SDaniel P. Berrange qcrypto_secret_finalize(Object *obj)
112ac1d8878SDaniel P. Berrange {
113ac1d8878SDaniel P. Berrange     QCryptoSecret *secret = QCRYPTO_SECRET(obj);
114ac1d8878SDaniel P. Berrange 
115ac1d8878SDaniel P. Berrange     g_free(secret->file);
116ac1d8878SDaniel P. Berrange     g_free(secret->data);
117ac1d8878SDaniel P. Berrange }
118ac1d8878SDaniel P. Berrange 
119ac1d8878SDaniel P. Berrange static void
qcrypto_secret_class_init(ObjectClass * oc,void * data)120ac1d8878SDaniel P. Berrange qcrypto_secret_class_init(ObjectClass *oc, void *data)
121ac1d8878SDaniel P. Berrange {
122*4862bd3cSAlexey Krasikov     QCryptoSecretCommonClass *sic = QCRYPTO_SECRET_COMMON_CLASS(oc);
123*4862bd3cSAlexey Krasikov     sic->load_data = qcrypto_secret_load_data;
124ac1d8878SDaniel P. Berrange 
1259884abeeSDaniel P. Berrange     object_class_property_add_str(oc, "data",
1269884abeeSDaniel P. Berrange                                   qcrypto_secret_prop_get_data,
127d2623129SMarkus Armbruster                                   qcrypto_secret_prop_set_data);
1289884abeeSDaniel P. Berrange     object_class_property_add_str(oc, "file",
1299884abeeSDaniel P. Berrange                                   qcrypto_secret_prop_get_file,
130d2623129SMarkus Armbruster                                   qcrypto_secret_prop_set_file);
131ac1d8878SDaniel P. Berrange }
132ac1d8878SDaniel P. Berrange 
133ac1d8878SDaniel P. Berrange 
134ac1d8878SDaniel P. Berrange static const TypeInfo qcrypto_secret_info = {
135*4862bd3cSAlexey Krasikov     .parent = TYPE_QCRYPTO_SECRET_COMMON,
136ac1d8878SDaniel P. Berrange     .name = TYPE_QCRYPTO_SECRET,
137ac1d8878SDaniel P. Berrange     .instance_size = sizeof(QCryptoSecret),
138ac1d8878SDaniel P. Berrange     .instance_finalize = qcrypto_secret_finalize,
139ac1d8878SDaniel P. Berrange     .class_size = sizeof(QCryptoSecretClass),
140ac1d8878SDaniel P. Berrange     .class_init = qcrypto_secret_class_init,
141ac1d8878SDaniel P. Berrange };
142ac1d8878SDaniel P. Berrange 
143ac1d8878SDaniel P. Berrange 
144ac1d8878SDaniel P. Berrange static void
qcrypto_secret_register_types(void)145ac1d8878SDaniel P. Berrange qcrypto_secret_register_types(void)
146ac1d8878SDaniel P. Berrange {
147ac1d8878SDaniel P. Berrange     type_register_static(&qcrypto_secret_info);
148ac1d8878SDaniel P. Berrange }
149ac1d8878SDaniel P. Berrange 
150ac1d8878SDaniel P. Berrange 
151ac1d8878SDaniel P. Berrange type_init(qcrypto_secret_register_types);
152