xref: /qemu/include/system/rng.h (revision 74074e8a7c60592cf1cc6469dbc2550d24aeded3)
1a9b7b2adSAnthony Liguori /*
2a9b7b2adSAnthony Liguori  * QEMU Random Number Generator Backend
3a9b7b2adSAnthony Liguori  *
4a9b7b2adSAnthony Liguori  * Copyright IBM, Corp. 2012
5a9b7b2adSAnthony Liguori  *
6a9b7b2adSAnthony Liguori  * Authors:
7a9b7b2adSAnthony Liguori  *  Anthony Liguori   <aliguori@us.ibm.com>
8a9b7b2adSAnthony Liguori  *
9a9b7b2adSAnthony Liguori  * This work is licensed under the terms of the GNU GPL, version 2 or later.
10a9b7b2adSAnthony Liguori  * See the COPYING file in the top-level directory.
11a9b7b2adSAnthony Liguori  */
12a9b7b2adSAnthony Liguori 
13a9b7b2adSAnthony Liguori #ifndef QEMU_RNG_H
14a9b7b2adSAnthony Liguori #define QEMU_RNG_H
15a9b7b2adSAnthony Liguori 
1614cccb61SPaolo Bonzini #include "qom/object.h"
17a9b7b2adSAnthony Liguori #include "qemu-common.h"
18a9b7b2adSAnthony Liguori 
19a9b7b2adSAnthony Liguori #define TYPE_RNG_BACKEND "rng-backend"
20a9b7b2adSAnthony Liguori #define RNG_BACKEND(obj) \
21a9b7b2adSAnthony Liguori     OBJECT_CHECK(RngBackend, (obj), TYPE_RNG_BACKEND)
22a9b7b2adSAnthony Liguori #define RNG_BACKEND_GET_CLASS(obj) \
23a9b7b2adSAnthony Liguori     OBJECT_GET_CLASS(RngBackendClass, (obj), TYPE_RNG_BACKEND)
24a9b7b2adSAnthony Liguori #define RNG_BACKEND_CLASS(klass) \
25a9b7b2adSAnthony Liguori     OBJECT_CLASS_CHECK(RngBackendClass, (klass), TYPE_RNG_BACKEND)
26a9b7b2adSAnthony Liguori 
27*74074e8aSLadi Prosek typedef struct RngRequest RngRequest;
28a9b7b2adSAnthony Liguori typedef struct RngBackendClass RngBackendClass;
29a9b7b2adSAnthony Liguori typedef struct RngBackend RngBackend;
30a9b7b2adSAnthony Liguori 
31a9b7b2adSAnthony Liguori typedef void (EntropyReceiveFunc)(void *opaque,
32a9b7b2adSAnthony Liguori                                   const void *data,
33a9b7b2adSAnthony Liguori                                   size_t size);
34a9b7b2adSAnthony Liguori 
35*74074e8aSLadi Prosek struct RngRequest
36*74074e8aSLadi Prosek {
37*74074e8aSLadi Prosek     EntropyReceiveFunc *receive_entropy;
38*74074e8aSLadi Prosek     uint8_t *data;
39*74074e8aSLadi Prosek     void *opaque;
40*74074e8aSLadi Prosek     size_t offset;
41*74074e8aSLadi Prosek     size_t size;
42*74074e8aSLadi Prosek };
43*74074e8aSLadi Prosek 
44a9b7b2adSAnthony Liguori struct RngBackendClass
45a9b7b2adSAnthony Liguori {
46a9b7b2adSAnthony Liguori     ObjectClass parent_class;
47a9b7b2adSAnthony Liguori 
48a9b7b2adSAnthony Liguori     void (*request_entropy)(RngBackend *s, size_t size,
49805a2505SStefan Weil                             EntropyReceiveFunc *receive_entropy, void *opaque);
50a9b7b2adSAnthony Liguori 
51a9b7b2adSAnthony Liguori     void (*opened)(RngBackend *s, Error **errp);
52a9b7b2adSAnthony Liguori };
53a9b7b2adSAnthony Liguori 
54a9b7b2adSAnthony Liguori struct RngBackend
55a9b7b2adSAnthony Liguori {
56a9b7b2adSAnthony Liguori     Object parent;
57a9b7b2adSAnthony Liguori 
58a9b7b2adSAnthony Liguori     /*< protected >*/
59a9b7b2adSAnthony Liguori     bool opened;
60*74074e8aSLadi Prosek     GSList *requests;
61a9b7b2adSAnthony Liguori };
62a9b7b2adSAnthony Liguori 
63a9b7b2adSAnthony Liguori /**
64a9b7b2adSAnthony Liguori  * rng_backend_request_entropy:
65a9b7b2adSAnthony Liguori  * @s: the backend to request entropy from
66a9b7b2adSAnthony Liguori  * @size: the number of bytes of data to request
67a9b7b2adSAnthony Liguori  * @receive_entropy: a function to be invoked when entropy is available
68a9b7b2adSAnthony Liguori  * @opaque: data that should be passed to @receive_entropy
69a9b7b2adSAnthony Liguori  *
70a9b7b2adSAnthony Liguori  * This function is used by the front-end to request entropy from an entropy
71a9b7b2adSAnthony Liguori  * source.  This function can be called multiple times before @receive_entropy
72a9b7b2adSAnthony Liguori  * is invoked with different values of @receive_entropy and @opaque.  The
7342015c9aSAmit Shah  * backend will queue each request and handle appropriately.
74a9b7b2adSAnthony Liguori  *
75a9b7b2adSAnthony Liguori  * The backend does not need to pass the full amount of data to @receive_entropy
7642015c9aSAmit Shah  * but will pass a value greater than 0.
77a9b7b2adSAnthony Liguori  */
78a9b7b2adSAnthony Liguori void rng_backend_request_entropy(RngBackend *s, size_t size,
79a9b7b2adSAnthony Liguori                                  EntropyReceiveFunc *receive_entropy,
80a9b7b2adSAnthony Liguori                                  void *opaque);
81a9b7b2adSAnthony Liguori #endif
82