xref: /qemu/include/system/rng.h (revision b58deb344ddff3b9d8b265bf73a65274767ee5f4)
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 
2774074e8aSLadi 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 
3574074e8aSLadi Prosek struct RngRequest
3674074e8aSLadi Prosek {
3774074e8aSLadi Prosek     EntropyReceiveFunc *receive_entropy;
3874074e8aSLadi Prosek     uint8_t *data;
3974074e8aSLadi Prosek     void *opaque;
4074074e8aSLadi Prosek     size_t offset;
4174074e8aSLadi Prosek     size_t size;
42443590c2SLadi Prosek     QSIMPLEQ_ENTRY(RngRequest) next;
4374074e8aSLadi Prosek };
4474074e8aSLadi Prosek 
45a9b7b2adSAnthony Liguori struct RngBackendClass
46a9b7b2adSAnthony Liguori {
47a9b7b2adSAnthony Liguori     ObjectClass parent_class;
48a9b7b2adSAnthony Liguori 
4960253ed1SLadi Prosek     void (*request_entropy)(RngBackend *s, RngRequest *req);
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*b58deb34SPaolo Bonzini     QSIMPLEQ_HEAD(, RngRequest) requests;
61a9b7b2adSAnthony Liguori };
62a9b7b2adSAnthony Liguori 
639f14b0adSLadi Prosek 
64a9b7b2adSAnthony Liguori /**
65a9b7b2adSAnthony Liguori  * rng_backend_request_entropy:
66a9b7b2adSAnthony Liguori  * @s: the backend to request entropy from
67a9b7b2adSAnthony Liguori  * @size: the number of bytes of data to request
68a9b7b2adSAnthony Liguori  * @receive_entropy: a function to be invoked when entropy is available
69a9b7b2adSAnthony Liguori  * @opaque: data that should be passed to @receive_entropy
70a9b7b2adSAnthony Liguori  *
71a9b7b2adSAnthony Liguori  * This function is used by the front-end to request entropy from an entropy
72a9b7b2adSAnthony Liguori  * source.  This function can be called multiple times before @receive_entropy
73a9b7b2adSAnthony Liguori  * is invoked with different values of @receive_entropy and @opaque.  The
7442015c9aSAmit Shah  * backend will queue each request and handle appropriately.
75a9b7b2adSAnthony Liguori  *
76a9b7b2adSAnthony Liguori  * The backend does not need to pass the full amount of data to @receive_entropy
7742015c9aSAmit Shah  * but will pass a value greater than 0.
78a9b7b2adSAnthony Liguori  */
79a9b7b2adSAnthony Liguori void rng_backend_request_entropy(RngBackend *s, size_t size,
80a9b7b2adSAnthony Liguori                                  EntropyReceiveFunc *receive_entropy,
81a9b7b2adSAnthony Liguori                                  void *opaque);
829f14b0adSLadi Prosek 
839f14b0adSLadi Prosek /**
849f14b0adSLadi Prosek  * rng_backend_free_request:
859f14b0adSLadi Prosek  * @s: the backend that created the request
869f14b0adSLadi Prosek  * @req: the request to finalize
879f14b0adSLadi Prosek  *
889f14b0adSLadi Prosek  * Used by child rng backend classes to finalize requests once they've been
899f14b0adSLadi Prosek  * processed. The request is removed from the list of active requests and
909f14b0adSLadi Prosek  * deleted.
919f14b0adSLadi Prosek  */
929f14b0adSLadi Prosek void rng_backend_finalize_request(RngBackend *s, RngRequest *req);
93a9b7b2adSAnthony Liguori #endif
94