xref: /qemu/include/system/rng.h (revision 32cad1ffb81dcecf6f4a8af56d6e5892682839b1)
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"
20c821774aSEduardo Habkost OBJECT_DECLARE_TYPE(RngBackend, RngBackendClass,
21*30b5707cSEduardo Habkost                     RNG_BACKEND)
22a9b7b2adSAnthony Liguori 
230198c262SLaurent Vivier #define TYPE_RNG_BUILTIN "rng-builtin"
240198c262SLaurent Vivier 
2574074e8aSLadi Prosek typedef struct RngRequest RngRequest;
26a9b7b2adSAnthony Liguori 
27a9b7b2adSAnthony Liguori typedef void (EntropyReceiveFunc)(void *opaque,
28a9b7b2adSAnthony Liguori                                   const void *data,
29a9b7b2adSAnthony Liguori                                   size_t size);
30a9b7b2adSAnthony Liguori 
3174074e8aSLadi Prosek struct RngRequest
3274074e8aSLadi Prosek {
3374074e8aSLadi Prosek     EntropyReceiveFunc *receive_entropy;
3474074e8aSLadi Prosek     uint8_t *data;
3574074e8aSLadi Prosek     void *opaque;
3674074e8aSLadi Prosek     size_t offset;
3774074e8aSLadi Prosek     size_t size;
38443590c2SLadi Prosek     QSIMPLEQ_ENTRY(RngRequest) next;
3974074e8aSLadi Prosek };
4074074e8aSLadi Prosek 
41a9b7b2adSAnthony Liguori struct RngBackendClass
42a9b7b2adSAnthony Liguori {
43a9b7b2adSAnthony Liguori     ObjectClass parent_class;
44a9b7b2adSAnthony Liguori 
4560253ed1SLadi Prosek     void (*request_entropy)(RngBackend *s, RngRequest *req);
46a9b7b2adSAnthony Liguori 
47a9b7b2adSAnthony Liguori     void (*opened)(RngBackend *s, Error **errp);
48a9b7b2adSAnthony Liguori };
49a9b7b2adSAnthony Liguori 
50a9b7b2adSAnthony Liguori struct RngBackend
51a9b7b2adSAnthony Liguori {
52a9b7b2adSAnthony Liguori     Object parent;
53a9b7b2adSAnthony Liguori 
54a9b7b2adSAnthony Liguori     /*< protected >*/
55a9b7b2adSAnthony Liguori     bool opened;
56b58deb34SPaolo Bonzini     QSIMPLEQ_HEAD(, RngRequest) requests;
57a9b7b2adSAnthony Liguori };
58a9b7b2adSAnthony Liguori 
599f14b0adSLadi Prosek 
60a9b7b2adSAnthony Liguori /**
61a9b7b2adSAnthony Liguori  * rng_backend_request_entropy:
62a9b7b2adSAnthony Liguori  * @s: the backend to request entropy from
63a9b7b2adSAnthony Liguori  * @size: the number of bytes of data to request
64a9b7b2adSAnthony Liguori  * @receive_entropy: a function to be invoked when entropy is available
65a9b7b2adSAnthony Liguori  * @opaque: data that should be passed to @receive_entropy
66a9b7b2adSAnthony Liguori  *
67a9b7b2adSAnthony Liguori  * This function is used by the front-end to request entropy from an entropy
68a9b7b2adSAnthony Liguori  * source.  This function can be called multiple times before @receive_entropy
69a9b7b2adSAnthony Liguori  * is invoked with different values of @receive_entropy and @opaque.  The
7042015c9aSAmit Shah  * backend will queue each request and handle appropriately.
71a9b7b2adSAnthony Liguori  *
72a9b7b2adSAnthony Liguori  * The backend does not need to pass the full amount of data to @receive_entropy
7342015c9aSAmit Shah  * but will pass a value greater than 0.
74a9b7b2adSAnthony Liguori  */
75a9b7b2adSAnthony Liguori void rng_backend_request_entropy(RngBackend *s, size_t size,
76a9b7b2adSAnthony Liguori                                  EntropyReceiveFunc *receive_entropy,
77a9b7b2adSAnthony Liguori                                  void *opaque);
789f14b0adSLadi Prosek 
799f14b0adSLadi Prosek /**
809f14b0adSLadi Prosek  * rng_backend_free_request:
819f14b0adSLadi Prosek  * @s: the backend that created the request
829f14b0adSLadi Prosek  * @req: the request to finalize
839f14b0adSLadi Prosek  *
849f14b0adSLadi Prosek  * Used by child rng backend classes to finalize requests once they've been
859f14b0adSLadi Prosek  * processed. The request is removed from the list of active requests and
869f14b0adSLadi Prosek  * deleted.
879f14b0adSLadi Prosek  */
889f14b0adSLadi Prosek void rng_backend_finalize_request(RngBackend *s, RngRequest *req);
89a9b7b2adSAnthony Liguori #endif
90