2012-06-25 19:03:47 +04:00
|
|
|
/*
|
|
|
|
* QEMU Random Number Generator Backend
|
|
|
|
*
|
|
|
|
* Copyright IBM, Corp. 2012
|
|
|
|
*
|
|
|
|
* Authors:
|
|
|
|
* Anthony Liguori <aliguori@us.ibm.com>
|
|
|
|
*
|
|
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
|
|
|
* See the COPYING file in the top-level directory.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef QEMU_RNG_H
|
|
|
|
#define QEMU_RNG_H
|
|
|
|
|
2019-08-12 08:23:49 +03:00
|
|
|
#include "qemu/queue.h"
|
2012-12-17 21:19:50 +04:00
|
|
|
#include "qom/object.h"
|
2012-06-25 19:03:47 +04:00
|
|
|
|
|
|
|
#define TYPE_RNG_BACKEND "rng-backend"
|
|
|
|
#define RNG_BACKEND(obj) \
|
|
|
|
OBJECT_CHECK(RngBackend, (obj), TYPE_RNG_BACKEND)
|
|
|
|
#define RNG_BACKEND_GET_CLASS(obj) \
|
|
|
|
OBJECT_GET_CLASS(RngBackendClass, (obj), TYPE_RNG_BACKEND)
|
|
|
|
#define RNG_BACKEND_CLASS(klass) \
|
|
|
|
OBJECT_CLASS_CHECK(RngBackendClass, (klass), TYPE_RNG_BACKEND)
|
|
|
|
|
2019-08-20 19:06:15 +03:00
|
|
|
#define TYPE_RNG_BUILTIN "rng-builtin"
|
|
|
|
|
2016-03-03 11:37:16 +03:00
|
|
|
typedef struct RngRequest RngRequest;
|
2012-06-25 19:03:47 +04:00
|
|
|
typedef struct RngBackendClass RngBackendClass;
|
|
|
|
typedef struct RngBackend RngBackend;
|
|
|
|
|
|
|
|
typedef void (EntropyReceiveFunc)(void *opaque,
|
|
|
|
const void *data,
|
|
|
|
size_t size);
|
|
|
|
|
2016-03-03 11:37:16 +03:00
|
|
|
struct RngRequest
|
|
|
|
{
|
|
|
|
EntropyReceiveFunc *receive_entropy;
|
|
|
|
uint8_t *data;
|
|
|
|
void *opaque;
|
|
|
|
size_t offset;
|
|
|
|
size_t size;
|
2016-03-03 16:16:11 +03:00
|
|
|
QSIMPLEQ_ENTRY(RngRequest) next;
|
2016-03-03 11:37:16 +03:00
|
|
|
};
|
|
|
|
|
2012-06-25 19:03:47 +04:00
|
|
|
struct RngBackendClass
|
|
|
|
{
|
|
|
|
ObjectClass parent_class;
|
|
|
|
|
2016-03-03 11:37:18 +03:00
|
|
|
void (*request_entropy)(RngBackend *s, RngRequest *req);
|
2012-06-25 19:03:47 +04:00
|
|
|
|
|
|
|
void (*opened)(RngBackend *s, Error **errp);
|
|
|
|
};
|
|
|
|
|
|
|
|
struct RngBackend
|
|
|
|
{
|
|
|
|
Object parent;
|
|
|
|
|
|
|
|
/*< protected >*/
|
|
|
|
bool opened;
|
2018-12-06 13:58:10 +03:00
|
|
|
QSIMPLEQ_HEAD(, RngRequest) requests;
|
2012-06-25 19:03:47 +04:00
|
|
|
};
|
|
|
|
|
2016-03-03 11:37:17 +03:00
|
|
|
|
2012-06-25 19:03:47 +04:00
|
|
|
/**
|
|
|
|
* rng_backend_request_entropy:
|
|
|
|
* @s: the backend to request entropy from
|
|
|
|
* @size: the number of bytes of data to request
|
|
|
|
* @receive_entropy: a function to be invoked when entropy is available
|
|
|
|
* @opaque: data that should be passed to @receive_entropy
|
|
|
|
*
|
|
|
|
* This function is used by the front-end to request entropy from an entropy
|
|
|
|
* source. This function can be called multiple times before @receive_entropy
|
|
|
|
* is invoked with different values of @receive_entropy and @opaque. The
|
2012-11-21 09:51:21 +04:00
|
|
|
* backend will queue each request and handle appropriately.
|
2012-06-25 19:03:47 +04:00
|
|
|
*
|
|
|
|
* The backend does not need to pass the full amount of data to @receive_entropy
|
2012-11-21 09:51:21 +04:00
|
|
|
* but will pass a value greater than 0.
|
2012-06-25 19:03:47 +04:00
|
|
|
*/
|
|
|
|
void rng_backend_request_entropy(RngBackend *s, size_t size,
|
|
|
|
EntropyReceiveFunc *receive_entropy,
|
|
|
|
void *opaque);
|
2016-03-03 11:37:17 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* rng_backend_free_request:
|
|
|
|
* @s: the backend that created the request
|
|
|
|
* @req: the request to finalize
|
|
|
|
*
|
|
|
|
* Used by child rng backend classes to finalize requests once they've been
|
|
|
|
* processed. The request is removed from the list of active requests and
|
|
|
|
* deleted.
|
|
|
|
*/
|
|
|
|
void rng_backend_finalize_request(RngBackend *s, RngRequest *req);
|
2012-06-25 19:03:47 +04:00
|
|
|
#endif
|