xref: /qemu/include/system/rng.h (revision 0198c2621a1e57d4ceaca1326897f007963c12df)
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 
16dc5e9ac7SMarkus Armbruster #include "qemu/queue.h"
1714cccb61SPaolo Bonzini #include "qom/object.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*0198c262SLaurent Vivier #define TYPE_RNG_BUILTIN "rng-builtin"
28*0198c262SLaurent Vivier 
2974074e8aSLadi Prosek typedef struct RngRequest RngRequest;
30a9b7b2adSAnthony Liguori typedef struct RngBackendClass RngBackendClass;
31a9b7b2adSAnthony Liguori typedef struct RngBackend RngBackend;
32a9b7b2adSAnthony Liguori 
33a9b7b2adSAnthony Liguori typedef void (EntropyReceiveFunc)(void *opaque,
34a9b7b2adSAnthony Liguori                                   const void *data,
35a9b7b2adSAnthony Liguori                                   size_t size);
36a9b7b2adSAnthony Liguori 
3774074e8aSLadi Prosek struct RngRequest
3874074e8aSLadi Prosek {
3974074e8aSLadi Prosek     EntropyReceiveFunc *receive_entropy;
4074074e8aSLadi Prosek     uint8_t *data;
4174074e8aSLadi Prosek     void *opaque;
4274074e8aSLadi Prosek     size_t offset;
4374074e8aSLadi Prosek     size_t size;
44443590c2SLadi Prosek     QSIMPLEQ_ENTRY(RngRequest) next;
4574074e8aSLadi Prosek };
4674074e8aSLadi Prosek 
47a9b7b2adSAnthony Liguori struct RngBackendClass
48a9b7b2adSAnthony Liguori {
49a9b7b2adSAnthony Liguori     ObjectClass parent_class;
50a9b7b2adSAnthony Liguori 
5160253ed1SLadi Prosek     void (*request_entropy)(RngBackend *s, RngRequest *req);
52a9b7b2adSAnthony Liguori 
53a9b7b2adSAnthony Liguori     void (*opened)(RngBackend *s, Error **errp);
54a9b7b2adSAnthony Liguori };
55a9b7b2adSAnthony Liguori 
56a9b7b2adSAnthony Liguori struct RngBackend
57a9b7b2adSAnthony Liguori {
58a9b7b2adSAnthony Liguori     Object parent;
59a9b7b2adSAnthony Liguori 
60a9b7b2adSAnthony Liguori     /*< protected >*/
61a9b7b2adSAnthony Liguori     bool opened;
62b58deb34SPaolo Bonzini     QSIMPLEQ_HEAD(, RngRequest) requests;
63a9b7b2adSAnthony Liguori };
64a9b7b2adSAnthony Liguori 
659f14b0adSLadi Prosek 
66a9b7b2adSAnthony Liguori /**
67a9b7b2adSAnthony Liguori  * rng_backend_request_entropy:
68a9b7b2adSAnthony Liguori  * @s: the backend to request entropy from
69a9b7b2adSAnthony Liguori  * @size: the number of bytes of data to request
70a9b7b2adSAnthony Liguori  * @receive_entropy: a function to be invoked when entropy is available
71a9b7b2adSAnthony Liguori  * @opaque: data that should be passed to @receive_entropy
72a9b7b2adSAnthony Liguori  *
73a9b7b2adSAnthony Liguori  * This function is used by the front-end to request entropy from an entropy
74a9b7b2adSAnthony Liguori  * source.  This function can be called multiple times before @receive_entropy
75a9b7b2adSAnthony Liguori  * is invoked with different values of @receive_entropy and @opaque.  The
7642015c9aSAmit Shah  * backend will queue each request and handle appropriately.
77a9b7b2adSAnthony Liguori  *
78a9b7b2adSAnthony Liguori  * The backend does not need to pass the full amount of data to @receive_entropy
7942015c9aSAmit Shah  * but will pass a value greater than 0.
80a9b7b2adSAnthony Liguori  */
81a9b7b2adSAnthony Liguori void rng_backend_request_entropy(RngBackend *s, size_t size,
82a9b7b2adSAnthony Liguori                                  EntropyReceiveFunc *receive_entropy,
83a9b7b2adSAnthony Liguori                                  void *opaque);
849f14b0adSLadi Prosek 
859f14b0adSLadi Prosek /**
869f14b0adSLadi Prosek  * rng_backend_free_request:
879f14b0adSLadi Prosek  * @s: the backend that created the request
889f14b0adSLadi Prosek  * @req: the request to finalize
899f14b0adSLadi Prosek  *
909f14b0adSLadi Prosek  * Used by child rng backend classes to finalize requests once they've been
919f14b0adSLadi Prosek  * processed. The request is removed from the list of active requests and
929f14b0adSLadi Prosek  * deleted.
939f14b0adSLadi Prosek  */
949f14b0adSLadi Prosek void rng_backend_finalize_request(RngBackend *s, RngRequest *req);
95a9b7b2adSAnthony Liguori #endif
96