random_adaptor_example.c revision 256281
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: stable/10/share/examples/kld/random_adaptor/random_adaptor_example.c 255075 2013-08-30 17:47:53Z 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 40#define RNG_NAME "example" 41 42static int random_example_read(void *, int); 43 44struct random_adaptor random_example = { 45 .ident = "Example RNG", 46 .init = (random_init_func_t *)random_null_func, 47 .deinit = (random_deinit_func_t *)random_null_func, 48 .read = random_example_read, 49 .write = (random_write_func_t *)random_null_func, 50 .reseed = (random_reseed_func_t *)random_null_func, 51 .seeded = 1, 52}; 53 54/* 55 * Used under the license provided @ http://xkcd.com/221/ 56 * http://creativecommons.org/licenses/by-nc/2.5/ 57 */ 58static u_char 59getRandomNumber(void) 60{ 61 return 4; /* chosen by fair dice roll, guaranteed to be random */ 62} 63 64static int 65random_example_read(void *buf, int c) 66{ 67 u_char *b; 68 int count; 69 70 b = buf; 71 72 for (count = 0; count < c; count++) { 73 b[count] = getRandomNumber(); 74 } 75 76 printf("returning %d bytes of pure randomness\n", c); 77 return (c); 78} 79 80static int 81random_example_modevent(module_t mod, int type, void *unused) 82{ 83 84 switch (type) { 85 case MOD_LOAD: 86 random_adaptor_register(RNG_NAME, &random_example); 87 EVENTHANDLER_INVOKE(random_adaptor_attach, &random_example); 88 return (0); 89 } 90 91 return (EINVAL); 92} 93 94RANDOM_ADAPTOR_MODULE(random_example, random_example_modevent, 1); 95