Merge QCryptoSecret object support
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABCAAGBQJWdDmJAAoJEL6G67QVEE/fJ4EP+gNC4ErBDpbg+I4RhLHv/FsF i2iEYkmBfFzUmiB8iSFlJY12XJ/CPnbrWks0WNHIoarUgtGuvfqH91KGkERxJQFE TkD65EOhNHWlP1zaI5r5ZMizhOdO6EPa0pbS/QH/UCy5qwu5IbG5EesOw00d7nL8 5gT39ehXAFljutRygWsa1JyOkDB04WNehVsly/l2t9v16aQUDJOC5mWVuoInrDEo ye1VG2Cx7Y1/FRo3fFCDwzYD+8jgxIBAu8Igwjk/95VbfBVl769PBAilQRc5zMHt //eMNdul6GooVKmu/K1JWkmjIZJFUiboEMgPJElWV1y8bWmhh++4J6EVb55owoDk VRv84cqiaYErVb+56gaImr92GSKezll0APWz6YlDsFZgPClCPnUjDSr39+23t1h4 LprirtbkAjw73T92kuQ7kzbXElWm7rSfcx5u1/S6YPP+EDzZpW9+h62lKGGnuS2M bzwFOOmWHe1MhbRSh+BOzGBf1wWhMSCKgLAOmPuRQ8slS91vfE66bIlqpIKBGgfn 42t0wZCEW8bqIe8xry5pC5UoDfm3cVDhgGHGyMLWWDMez0qDchaAkWNkIDtc8Juv a1WqE/0lP/sVb36yLVANvt1/Qvpg6M3JwMbTjVaJl2eTDDtwho4PK+Chxx0a8BGl Z6oGj1rmvCDD2Dsi/EXI =g+9G -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/berrange/tags/pull-qcrypto-secrets-base-2015-12-18-1' into staging Merge QCryptoSecret object support # gpg: Signature made Fri 18 Dec 2015 16:51:21 GMT using RSA key ID 15104FDF # gpg: Good signature from "Daniel P. Berrange <dan@berrange.com>" # gpg: aka "Daniel P. Berrange <berrange@redhat.com>" * remotes/berrange/tags/pull-qcrypto-secrets-base-2015-12-18-1: crypto: add support for loading encrypted x509 keys crypto: add QCryptoSecret object class for password/key handling qga: convert to use error checked base64 decode qemu-char: convert to use error checked base64 decode util: add base64 decoding function Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
c688084506
20 changed files with 1533 additions and 11 deletions
148
include/crypto/secret.h
Normal file
148
include/crypto/secret.h
Normal file
|
|
@ -0,0 +1,148 @@
|
|||
/*
|
||||
* QEMU crypto secret support
|
||||
*
|
||||
* Copyright (c) 2015 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef QCRYPTO_SECRET_H__
|
||||
#define QCRYPTO_SECRET_H__
|
||||
|
||||
#include "qemu-common.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qom/object.h"
|
||||
|
||||
#define TYPE_QCRYPTO_SECRET "secret"
|
||||
#define QCRYPTO_SECRET(obj) \
|
||||
OBJECT_CHECK(QCryptoSecret, (obj), TYPE_QCRYPTO_SECRET)
|
||||
|
||||
typedef struct QCryptoSecret QCryptoSecret;
|
||||
typedef struct QCryptoSecretClass QCryptoSecretClass;
|
||||
|
||||
/**
|
||||
* QCryptoSecret:
|
||||
*
|
||||
* The QCryptoSecret object provides storage of secrets,
|
||||
* which may be user passwords, encryption keys or any
|
||||
* other kind of sensitive data that is represented as
|
||||
* a sequence of bytes.
|
||||
*
|
||||
* The sensitive data associated with the secret can
|
||||
* be provided directly via the 'data' property, or
|
||||
* indirectly via the 'file' property. In the latter
|
||||
* case there is support for file descriptor passing
|
||||
* via the usual /dev/fdset/NN syntax that QEMU uses.
|
||||
*
|
||||
* The data for a secret can be provided in two formats,
|
||||
* either as a UTF-8 string (the default), or as base64
|
||||
* encoded 8-bit binary data. The latter is appropriate
|
||||
* for raw encryption keys, while the former is appropriate
|
||||
* for user entered passwords.
|
||||
*
|
||||
* The data may be optionally encrypted with AES-256-CBC,
|
||||
* and the decryption key provided by another
|
||||
* QCryptoSecret instance identified by the 'keyid'
|
||||
* property. When passing sensitive data directly
|
||||
* via the 'data' property it is strongly recommended
|
||||
* to use the AES encryption facility to prevent the
|
||||
* sensitive data being exposed in the process listing
|
||||
* or system log files.
|
||||
*
|
||||
* Providing data directly, insecurely (suitable for
|
||||
* ad hoc developer testing only)
|
||||
*
|
||||
* $QEMU -object secret,id=sec0,data=letmein
|
||||
*
|
||||
* Providing data indirectly:
|
||||
*
|
||||
* # printf "letmein" > password.txt
|
||||
* # $QEMU \
|
||||
* -object secret,id=sec0,file=password.txt
|
||||
*
|
||||
* Using a master encryption key with data.
|
||||
*
|
||||
* The master key needs to be created as 32 secure
|
||||
* random bytes (optionally base64 encoded)
|
||||
*
|
||||
* # openssl rand -base64 32 > key.b64
|
||||
* # KEY=$(base64 -d key.b64 | hexdump -v -e '/1 "%02X"')
|
||||
*
|
||||
* Each secret to be encrypted needs to have a random
|
||||
* initialization vector generated. These do not need
|
||||
* to be kept secret
|
||||
*
|
||||
* # openssl rand -base64 16 > iv.b64
|
||||
* # IV=$(base64 -d iv.b64 | hexdump -v -e '/1 "%02X"')
|
||||
*
|
||||
* A secret to be defined can now be encrypted
|
||||
*
|
||||
* # SECRET=$(printf "letmein" |
|
||||
* openssl enc -aes-256-cbc -a -K $KEY -iv $IV)
|
||||
*
|
||||
* When launching QEMU, create a master secret pointing
|
||||
* to key.b64 and specify that to be used to decrypt
|
||||
* the user password
|
||||
*
|
||||
* # $QEMU \
|
||||
* -object secret,id=secmaster0,format=base64,file=key.b64 \
|
||||
* -object secret,id=sec0,keyid=secmaster0,format=base64,\
|
||||
* data=$SECRET,iv=$(<iv.b64)
|
||||
*
|
||||
* When encrypting, the data can still be provided via an
|
||||
* external file, in which case it is possible to use either
|
||||
* raw binary data, or base64 encoded. This example uses
|
||||
* raw format
|
||||
*
|
||||
* # printf "letmein" |
|
||||
* openssl enc -aes-256-cbc -K $KEY -iv $IV -o pw.aes
|
||||
* # $QEMU \
|
||||
* -object secret,id=secmaster0,format=base64,file=key.b64 \
|
||||
* -object secret,id=sec0,keyid=secmaster0,\
|
||||
* file=pw.aes,iv=$(<iv.b64)
|
||||
*
|
||||
* Note that the ciphertext can be in either raw or base64
|
||||
* format, as indicated by the 'format' parameter, but the
|
||||
* plaintext resulting from decryption is expected to always
|
||||
* be in raw format.
|
||||
*/
|
||||
|
||||
struct QCryptoSecret {
|
||||
Object parent_obj;
|
||||
uint8_t *rawdata;
|
||||
size_t rawlen;
|
||||
QCryptoSecretFormat format;
|
||||
char *data;
|
||||
char *file;
|
||||
char *keyid;
|
||||
char *iv;
|
||||
};
|
||||
|
||||
|
||||
struct QCryptoSecretClass {
|
||||
ObjectClass parent_class;
|
||||
};
|
||||
|
||||
|
||||
extern int qcrypto_secret_lookup(const char *secretid,
|
||||
uint8_t **data,
|
||||
size_t *datalen,
|
||||
Error **errp);
|
||||
extern char *qcrypto_secret_lookup_as_utf8(const char *secretid,
|
||||
Error **errp);
|
||||
extern char *qcrypto_secret_lookup_as_base64(const char *secretid,
|
||||
Error **errp);
|
||||
|
||||
#endif /* QCRYPTO_SECRET_H__ */
|
||||
|
|
@ -101,6 +101,7 @@ struct QCryptoTLSCredsX509 {
|
|||
gnutls_certificate_credentials_t data;
|
||||
#endif
|
||||
bool sanityCheck;
|
||||
char *passwordid;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
58
include/qemu/base64.h
Normal file
58
include/qemu/base64.h
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
/*
|
||||
* QEMU base64 helpers
|
||||
*
|
||||
* Copyright (c) 2015 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef QEMU_BASE64_H__
|
||||
#define QEMU_BASE64_H__
|
||||
|
||||
#include "qemu-common.h"
|
||||
|
||||
|
||||
/**
|
||||
* qbase64_decode:
|
||||
* @input: the (possibly) base64 encoded text
|
||||
* @in_len: length of @input or -1 if NUL terminated
|
||||
* @out_len: filled with length of decoded data
|
||||
* @errp: pointer to a NULL-initialized error object
|
||||
*
|
||||
* Attempt to decode the (possibly) base64 encoded
|
||||
* text provided in @input. If the @input text may
|
||||
* contain embedded NUL characters, or may not be
|
||||
* NUL terminated, then @in_len must be set to the
|
||||
* known size of the @input buffer.
|
||||
*
|
||||
* Note that embedded NULs, or lack of a NUL terminator
|
||||
* are considered invalid base64 data and errors
|
||||
* will be reported to this effect.
|
||||
*
|
||||
* If decoding is successful, the decoded data will
|
||||
* be returned and @out_len set to indicate the
|
||||
* number of bytes in the decoded data. The caller
|
||||
* must use g_free() to free the returned data when
|
||||
* it is no longer required.
|
||||
*
|
||||
* Returns: the decoded data or NULL
|
||||
*/
|
||||
uint8_t *qbase64_decode(const char *input,
|
||||
size_t in_len,
|
||||
size_t *out_len,
|
||||
Error **errp);
|
||||
|
||||
|
||||
#endif /* QEMU_BUFFER_H__ */
|
||||
Loading…
Add table
Add a link
Reference in a new issue