16ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/*
26ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * rand_source.h
36ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
46ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * implements a random source based on /dev/random
56ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
66ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * David A. McGrew
76ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * Cisco Systems, Inc.
86ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */
96ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/*
106ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
116ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * Copyright(c) 2001-2006 Cisco Systems, Inc.
126ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * All rights reserved.
136ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
146ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * Redistribution and use in source and binary forms, with or without
156ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * modification, are permitted provided that the following conditions
166ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * are met:
176ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
186ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   Redistributions of source code must retain the above copyright
196ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   notice, this list of conditions and the following disclaimer.
206ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
216ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   Redistributions in binary form must reproduce the above
226ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   copyright notice, this list of conditions and the following
236ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   disclaimer in the documentation and/or other materials provided
246ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   with the distribution.
256ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
266ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   Neither the name of the Cisco Systems, Inc. nor the names of its
276ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   contributors may be used to endorse or promote products derived
286ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *   from this software without specific prior written permission.
296ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
306ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
316ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
326ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
336ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
346ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
356ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
366ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
376ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
386ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
396ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
406ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
416ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * OF THE POSSIBILITY OF SUCH DAMAGE.
426ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
436ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */
446ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
456ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
466ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifndef RAND_SOURCE
476ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define RAND_SOURCE
486ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
496ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#include "err.h"
506ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#include "datatypes.h"
516ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
526ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgerr_status_t
536ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgrand_source_init(void);
546ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
556ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/*
566ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * rand_source_get_octet_string() writes a random octet string.
576ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
586ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * The function call rand_source_get_octet_string(dest, len) writes
596ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * len octets of random data to the location to which dest points,
606ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * and returns an error code.  This error code should be checked,
616ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * and if a failure is reported, the data in the buffer MUST NOT
626ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * be used.
636ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
646ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * warning: If the return code is not checked, then non-random
656ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *          data may inadvertently be used.
666ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
676ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * returns:
686ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *     - err_status_ok    if no problems occured.
696ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *     - [other]          a problem occured, and no assumptions should
706ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *                        be made about the contents of the destination
716ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *                        buffer.
726ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */
736ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
746ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgerr_status_t
756ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgrand_source_get_octet_string(void *dest, uint32_t length);
766ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
776ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgerr_status_t
786ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgrand_source_deinit(void);
796ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
806ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/*
816ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * function prototype for a random source function
826ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org *
836ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * A rand_source_func_t writes num_octets at the location indicated by
846ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * dest and returns err_status_ok.  Any other return value indicates
856ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * failure.
866ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */
876ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
886ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef err_status_t (*rand_source_func_t)
896ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org     (void *dest, uint32_t num_octets);
906ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org
916ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif /* RAND_SOURCE */
92