188 lines
6.2 KiB
Groff
188 lines
6.2 KiB
Groff
.\" $NetBSD: rnd.9,v 1.17 2008/09/16 23:29:49 jmcneill Exp $
|
|
.\"
|
|
.\" Copyright (c) 1997 The NetBSD Foundation, Inc.
|
|
.\" All rights reserved.
|
|
.\"
|
|
.\" This documentation is derived from text contributed to The NetBSD
|
|
.\" Foundation by S.P.Zeidler (aka stargazer).
|
|
.\"
|
|
.\" Redistribution and use in source and binary forms, with or without
|
|
.\" modification, are permitted provided that the following conditions
|
|
.\" are met:
|
|
.\" 1. Redistributions of source code must retain the above copyright
|
|
.\" notice, this list of conditions and the following disclaimer.
|
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
|
.\" notice, this list of conditions and the following disclaimer in the
|
|
.\" documentation and/or other materials provided with the distribution.
|
|
.\"
|
|
.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
|
.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
|
.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
|
.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
.\" POSSIBILITY OF SUCH DAMAGE.
|
|
.\"
|
|
.Dd September 16, 2008
|
|
.Dt RND 9
|
|
.Os
|
|
.Sh NAME
|
|
.Nm RND ,
|
|
.Nm rnd_attach_source ,
|
|
.Nm rnd_detach_source ,
|
|
.Nm rnd_add_data ,
|
|
.Nm rnd_add_uint32
|
|
.Nd functions to make a device available for entropy collection
|
|
.Sh SYNOPSIS
|
|
.In sys/rnd.h
|
|
.Ft void
|
|
.Fn rnd_attach_source "rndsource_element_t *rnd_source" "char *devname" "uint32_t source_type" "uint32_t flags"
|
|
.Ft void
|
|
.Fn rnd_detach_source "rndsource_element_t *rnd_source"
|
|
.Ft void
|
|
.Fn rnd_add_data "rndsource_element_t *rnd_source" "void *data" "uint32_t len" "uint32_t entropy"
|
|
.Ft void
|
|
.Fn rnd_add_uint32 "rndsource_element_t *rnd_source" "uint32_t datum"
|
|
.Sh DESCRIPTION
|
|
These
|
|
.Nm
|
|
functions make a device available for entropy collection for
|
|
.Pa /dev/random .
|
|
.Pp
|
|
Ideally the first argument
|
|
.Fa rnd_source
|
|
of these functions gets included in the devices' entity struct,
|
|
but any means to permanently (static) attach one such argument
|
|
to one incarnation of the device is ok.
|
|
Do not share
|
|
.Fa rnd_source
|
|
structures between two devices.
|
|
.Pp
|
|
.Bl -tag -width 8n
|
|
.It Fn rnd_attach_source "rndsource_element_t *rnd_source" "char *devname" "uint32_t source_type" "uint32_t flags"
|
|
This function announces the availability of a device for entropy collection.
|
|
It must be called before the source struct pointed to by
|
|
.Fa rnd_source
|
|
is used in any of the following functions.
|
|
.Pp
|
|
.Fa devname
|
|
is the name of the device.
|
|
It is used to print a message (if the kernel is compiled with
|
|
``options RND_VERBOSE'') and also for status information printed with
|
|
.Xr rndctl 8 .
|
|
.Pp
|
|
.Fa source_type
|
|
is
|
|
.Dv RND_TYPE_NET
|
|
for network devices,
|
|
.Dv RND_TYPE_DISK
|
|
for physical disks,
|
|
.Dv RND_TYPE_TAPE
|
|
for a tape drive,
|
|
.Dv RND_TYPE_TTY
|
|
for a tty, and
|
|
.Dv RND_TYPE_RNG
|
|
for a random number generator.
|
|
.Dv RND_TYPE_UNKNOWN
|
|
is not to be used as a type.
|
|
It is used internally to the rnd system.
|
|
.Pp
|
|
.Fa flags
|
|
are the logical OR of
|
|
.Dv RND_FLAG_NO_COLLECT
|
|
(don't collect or estimate)
|
|
.Dv RND_FLAG_NO_ESTIMATE
|
|
(don't estimate)
|
|
to control the default setting for collection and estimation.
|
|
Note that devices of type
|
|
.Dv RND_TYPE_NET
|
|
default to
|
|
.Dv RND_FLAG_NO_ESTIMATE .
|
|
.Pp
|
|
.It Fn rnd_detach_source "rndsource_element_t *rnd_source"
|
|
This function disconnects the device from entropy collection.
|
|
.It Fn rnd_add_uint32 "rndsource_element_t *rnd_source" "uint32_t datum"
|
|
This function adds the value of
|
|
.Va datum
|
|
to the entropy pool.
|
|
No entropy is assumed to be collected from this value, it merely helps
|
|
stir the entropy pool.
|
|
All entropy is gathered from jitter between the timing of events.
|
|
.Pp
|
|
Note that using a constant for
|
|
.Va datum
|
|
does not weaken security, but it does
|
|
not help.
|
|
Try to use something that can change, such as an interrupt status register
|
|
which might have a bit set for receive ready or transmit ready, or other
|
|
device status information.
|
|
.Pp
|
|
To allow the system to gather the timing information accurately, this call
|
|
should be placed within the actual hardware interrupt service routine.
|
|
Care must be taken to ensure that the interrupt was actually serviced by
|
|
the interrupt handler, since on some systems interrupts can be shared.
|
|
.Pp
|
|
This function loses nearly all usefulness if it is called from a scheduled
|
|
software interrupt.
|
|
If that is the only way to add the device as an entropy source, don't.
|
|
.Pp
|
|
If it is desired to mix in the
|
|
.Va datum
|
|
and to add in a timestamp, but not to actually estimate entropy from a source
|
|
of randomness, passing
|
|
.Dv NULL
|
|
for
|
|
.Va rnd_source
|
|
is permitted, and the device does not need to be attached.
|
|
.It Fn rnd_add_data "rndsource_element_t *rnd_source" "void *data" "uint32_t len" "uint32_t entropy"
|
|
adds (hopefully) random
|
|
.Fa data
|
|
to the entropy pool.
|
|
.Fa len
|
|
is the number of bytes in
|
|
.Fa data
|
|
and
|
|
.Fa entropy
|
|
is an "entropy quality" measurement.
|
|
If every bit of
|
|
.Fa data
|
|
is known to be random,
|
|
.Fa entropy
|
|
is the number of bits in
|
|
.Fa data .
|
|
.Pp
|
|
Timing information is also used to add entropy into the system, using
|
|
inter-event timings.
|
|
.Pp
|
|
If it is desired to mix in the
|
|
.Va data
|
|
and to add in a timestamp, but not to actually estimate entropy from a source
|
|
of randomness, passing
|
|
.Dv NULL
|
|
for
|
|
.Va rnd_source
|
|
is permitted, and the device does not need to be attached.
|
|
.El
|
|
.\" .Sh ERRORS
|
|
.Sh FILES
|
|
These functions are declared in src/sys/sys/rnd.h and defined in
|
|
src/sys/dev/rnd.c.
|
|
.Sh SEE ALSO
|
|
.Xr rnd 4 ,
|
|
.Xr rndctl 8
|
|
.Sh HISTORY
|
|
The random device was introduced in
|
|
.Nx 1.3 .
|
|
.Sh AUTHORS
|
|
This implementation was written by Michael Graff \*[Lt]explorer@flame.org\*[Gt]
|
|
using ideas and algorithms gathered from many sources, including
|
|
the driver written by Ted Ts'o.
|
|
.Sh BUGS
|
|
The only good sources of randomness are quantum mechanical, and most
|
|
computers avidly avoid having true sources of randomness included.
|
|
Don't expect to surpass "pretty good".
|