random_adaptor_example.c revision 256381
133965Sjdp/*- 2218822Sdim * Copyright (c) 2013 Arthur Mesh <arthurmesh@gmail.com> 3218822Sdim * All rights reserved. 433965Sjdp * 533965Sjdp * Redistribution and use in source and binary forms, with or without 633965Sjdp * modification, are permitted provided that the following conditions 733965Sjdp * are met: 833965Sjdp * 1. Redistributions of source code must retain the above copyright 933965Sjdp * notice, this list of conditions and the following disclaimer 1033965Sjdp * in this position and unchanged. 1133965Sjdp * 2. Redistributions in binary form must reproduce the above copyright 1233965Sjdp * notice, this list of conditions and the following disclaimer in the 1333965Sjdp * documentation and/or other materials provided with the distribution. 1433965Sjdp * 1533965Sjdp * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1633965Sjdp * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1733965Sjdp * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1833965Sjdp * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19218822Sdim * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20218822Sdim * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2133965Sjdp * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2233965Sjdp * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2333965Sjdp * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2433965Sjdp * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2533965Sjdp * 2633965Sjdp */ 2733965Sjdp 2833965Sjdp#include <sys/cdefs.h> 2933965Sjdp__FBSDID("$FreeBSD: stable/10/share/examples/kld/random_adaptor/random_adaptor_example.c 256381 2013-10-12 15:31:36Z markm $"); 3033965Sjdp 3138889Sjdp#include <sys/param.h> 3233965Sjdp#include <sys/kernel.h> 3338889Sjdp#include <sys/lock.h> 3433965Sjdp#include <sys/module.h> 3533965Sjdp#include <sys/random.h> 3638889Sjdp#include <sys/systm.h> 3733965Sjdp 3833965Sjdp#include <dev/random/live_entropy_sources.h> 3933965Sjdp#include <dev/random/random_adaptors.h> 4060484Sobrien#include <dev/random/randomdev.h> 4133965Sjdp 4233965Sjdpstatic int random_example_read(void *, int); 4333965Sjdp 44130561Sobrienstruct random_adaptor random_example = { 45130561Sobrien .ident = "Example RNG", 46130561Sobrien .source = RANDOM_PURE_BOGUS, /* Make sure this is in 47130561Sobrien * sys/random.h and is unique */ 48130561Sobrien .read = random_example_read, 49130561Sobrien}; 50130561Sobrien 51130561Sobrien/* 52130561Sobrien * Used under the license provided @ http://xkcd.com/221/ 53130561Sobrien * http://creativecommons.org/licenses/by-nc/2.5/ 54130561Sobrien */ 55130561Sobrienstatic uint8_t 56130561SobriengetRandomNumber(void) 57130561Sobrien{ 58130561Sobrien return 4; /* chosen by fair dice roll, guaranteed to be random */ 5933965Sjdp} 6038889Sjdp 6138889Sjdpstatic int 6238889Sjdprandom_example_read(void *buf, int c) 6338889Sjdp{ 6438889Sjdp uint8_t *b; 6533965Sjdp int count; 6633965Sjdp 6733965Sjdp b = buf; 68 69 for (count = 0; count < c; count++) 70 b[count] = getRandomNumber(); 71 72 printf("returning %d bytes of pure randomness\n", c); 73 return (c); 74} 75 76static int 77random_example_modevent(module_t mod, int type, void *unused) 78{ 79 int error = 0; 80 81 switch (type) { 82 case MOD_LOAD: 83 live_entropy_source_register(&random_example); 84 break; 85 86 case MOD_UNLOAD: 87 live_entropy_source_deregister(&random_example); 88 break; 89 90 case MOD_SHUTDOWN: 91 break; 92 93 default: 94 error = EOPNOTSUPP; 95 break; 96 } 97 98 return (error); 99} 100 101LIVE_ENTROPY_SRC_MODULE(live_entropy_source_example, random_example_modevent, 1); 102