1 /* 2 * QEMU Random Number Generator Backend 3 * 4 * Copyright IBM, Corp. 2012 5 * 6 * Authors: 7 * Anthony Liguori <aliguori@us.ibm.com> 8 * 9 * This work is licensed under the terms of the GNU GPL, version 2 or later. 10 * See the COPYING file in the top-level directory. 11 */ 12 13 #ifndef QEMU_RNG_H 14 #define QEMU_RNG_H 15 16 #include "qemu/queue.h" 17 #include "qom/object.h" 18 19 #define TYPE_RNG_BACKEND "rng-backend" 20 #define RNG_BACKEND(obj) \ 21 OBJECT_CHECK(RngBackend, (obj), TYPE_RNG_BACKEND) 22 #define RNG_BACKEND_GET_CLASS(obj) \ 23 OBJECT_GET_CLASS(RngBackendClass, (obj), TYPE_RNG_BACKEND) 24 #define RNG_BACKEND_CLASS(klass) \ 25 OBJECT_CLASS_CHECK(RngBackendClass, (klass), TYPE_RNG_BACKEND) 26 27 #define TYPE_RNG_BUILTIN "rng-builtin" 28 29 typedef struct RngRequest RngRequest; 30 typedef struct RngBackendClass RngBackendClass; 31 typedef struct RngBackend RngBackend; 32 33 typedef void (EntropyReceiveFunc)(void *opaque, 34 const void *data, 35 size_t size); 36 37 struct RngRequest 38 { 39 EntropyReceiveFunc *receive_entropy; 40 uint8_t *data; 41 void *opaque; 42 size_t offset; 43 size_t size; 44 QSIMPLEQ_ENTRY(RngRequest) next; 45 }; 46 47 struct RngBackendClass 48 { 49 ObjectClass parent_class; 50 51 void (*request_entropy)(RngBackend *s, RngRequest *req); 52 53 void (*opened)(RngBackend *s, Error **errp); 54 }; 55 56 struct RngBackend 57 { 58 Object parent; 59 60 /*< protected >*/ 61 bool opened; 62 QSIMPLEQ_HEAD(, RngRequest) requests; 63 }; 64 65 66 /** 67 * rng_backend_request_entropy: 68 * @s: the backend to request entropy from 69 * @size: the number of bytes of data to request 70 * @receive_entropy: a function to be invoked when entropy is available 71 * @opaque: data that should be passed to @receive_entropy 72 * 73 * This function is used by the front-end to request entropy from an entropy 74 * source. This function can be called multiple times before @receive_entropy 75 * is invoked with different values of @receive_entropy and @opaque. The 76 * backend will queue each request and handle appropriately. 77 * 78 * The backend does not need to pass the full amount of data to @receive_entropy 79 * but will pass a value greater than 0. 80 */ 81 void rng_backend_request_entropy(RngBackend *s, size_t size, 82 EntropyReceiveFunc *receive_entropy, 83 void *opaque); 84 85 /** 86 * rng_backend_free_request: 87 * @s: the backend that created the request 88 * @req: the request to finalize 89 * 90 * Used by child rng backend classes to finalize requests once they've been 91 * processed. The request is removed from the list of active requests and 92 * deleted. 93 */ 94 void rng_backend_finalize_request(RngBackend *s, RngRequest *req); 95 #endif 96