random_adaptor_example.c revision 254784
1/*- 2 * Copyright (c) 2013 Arthur Mesh <arthurmesh@gmail.com> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer 10 * in this position and unchanged. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * 26 */ 27 28#include <sys/cdefs.h> 29__FBSDID("$FreeBSD: projects/random_number_generator/share/examples/kld/random_adaptor/random_adaptor_example.c 254784 2013-08-24 13:54:56Z markm $"); 30 31#include <sys/param.h> 32#include <sys/kernel.h> 33#include <sys/module.h> 34#include <sys/selinfo.h> 35#include <sys/systm.h> 36 37#include <dev/random/random_adaptors.h> 38#include <dev/random/randomdev.h> 39 40static int random_example_entropy_control; 41 42#define RNG_NAME "example" 43 44static int random_example_read(void *, int); 45static void random_example_init(void); 46 47struct random_adaptor random_example = { 48 .ident = "Example RNG", 49 .init = random_example_init, 50 .deinit = (random_deinit_func_t *)random_null_func, 51 .read = random_example_read, 52 .write = (random_write_func_t *)random_null_func, 53 .reseed = (random_reseed_func_t *)random_null_func, 54 .seeded = 1, 55}; 56 57static void 58random_example_init(void) 59{ 60 61 /* 62 * Init() is called only if this RNG was chosen to plugin in to 63 * random(4). In which case, we should no longer use this adaptor as 64 * an entropy source. 65 */ 66 random_example_entropy_control = 1; 67} 68 69/* 70 * Used under the license provided @ http://xkcd.com/221/ 71 * http://creativecommons.org/licenses/by-nc/2.5/ 72 */ 73static u_char 74getRandomNumber(void) 75{ 76 return 4; /* chosen by fair dice roll, guaranteed to be random */ 77} 78 79static int 80random_example_read(void *buf, int c) 81{ 82 u_char *b; 83 int count; 84 85 b = buf; 86 87 for (count = 0; count < c; count++) { 88 b[count] = getRandomNumber(); 89 } 90 91 printf("returning %d bytes of pure randomness\n", c); 92 return (c); 93} 94 95static int 96random_example_modevent(module_t mod, int type, void *unused) 97{ 98 99 switch (type) { 100 case MOD_LOAD: 101 /* start off by using this as an entropy source */ 102 random_adaptor_use_as_entropy(RNG_NAME, &random_example, 103 &random_example_entropy_control); 104 random_adaptor_register(RNG_NAME, &random_example); 105 EVENTHANDLER_INVOKE(random_adaptor_attach, &random_example); 106 return (0); 107 } 108 109 return (EINVAL); 110} 111 112RANDOM_ADAPTOR_MODULE(random_example, random_example_modevent, 1); 113