1 /*- 2 * Copyright (c) 2013-2014 Mark R V Murray 3 * Copyright (c) 2013 Arthur Mesh <arthurmesh@gmail.com> 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer 11 * in this position and unchanged. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 * 27 * $FreeBSD$ 28 */ 29 30 #ifndef SYS_DEV_RANDOM_RANDOM_HARVESTQ_H_INCLUDED 31 #define SYS_DEV_RANDOM_RANDOM_HARVESTQ_H_INCLUDED 32 33 #define HARVESTSIZE 16 /* max size of each harvested entropy unit */ 34 35 /* These are used to queue harvested packets of entropy. The entropy 36 * buffer size is pretty arbitrary. 37 */ 38 struct harvest_event { 39 uintmax_t he_somecounter; /* fast counter for clock jitter */ 40 uint8_t he_entropy[HARVESTSIZE];/* some harvested entropy */ 41 u_int he_size; /* harvested entropy byte count */ 42 u_int he_bits; /* stats about the entropy */ 43 u_int he_destination; /* destination pool of this entropy */ 44 enum random_entropy_source he_source; /* origin of the entropy */ 45 }; 46 47 void random_harvestq_init(void (*)(struct harvest_event *), int); 48 void random_harvestq_deinit(void); 49 void random_harvestq_internal(const void *, u_int, u_int, enum random_entropy_source); 50 51 /* Pool count is used by anything needing to know how many entropy 52 * pools are currently being maintained. 53 * This is of use to (e.g.) the live source feed where we need to give 54 * all the pools a top-up. 55 */ 56 extern int harvest_pool_count; 57 58 /* This is in randomdev.c as it needs to be permanently in the kernel */ 59 void randomdev_set_wakeup_exit(void *); 60 61 /* Force all currently pending queue contents to clear, and kick the software processor */ 62 void random_harvestq_flush(void); 63 64 /* Function called to process one harvested stochastic event */ 65 extern void (*harvest_process_event)(struct harvest_event *); 66 67 /* Round-robin destination cache. */ 68 extern u_int harvest_destination[ENTROPYSOURCE]; 69 70 #endif /* SYS_DEV_RANDOM_RANDOM_HARVESTQ_H_INCLUDED */ 71