summaryrefslogtreecommitdiff
path: root/static/netbsd/man4/crypto.4
diff options
context:
space:
mode:
Diffstat (limited to 'static/netbsd/man4/crypto.4')
-rw-r--r--static/netbsd/man4/crypto.4663
1 files changed, 663 insertions, 0 deletions
diff --git a/static/netbsd/man4/crypto.4 b/static/netbsd/man4/crypto.4
new file mode 100644
index 00000000..bf4cd509
--- /dev/null
+++ b/static/netbsd/man4/crypto.4
@@ -0,0 +1,663 @@
+.\" $NetBSD: crypto.4,v 1.26 2017/07/03 21:30:58 wiz Exp $
+.\"
+.\" Copyright (c) 2008 The NetBSD Foundation, Inc.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to The NetBSD Foundation
+.\" by Coyote Point Systems, Inc.
+.\"
+.\" 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.
+.\"
+.\"
+.\"
+.\" Copyright (c) 2004
+.\" Jonathan Stone <jonathan@dsg.stanford.edu>. All rights reserved.
+.\"
+.\" 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 Jonathan Stone 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 Jonathan Stone OR THE VOICES IN HIS HEAD
+.\" 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 January 27, 2014
+.Dt CRYPTO 4
+.Os
+.Sh NAME
+.Nm crypto ,
+.Nm swcrypto
+.Nd user-mode access to hardware-accelerated cryptography
+.Sh SYNOPSIS
+.Cd "hifn* at pci? dev ? function ?"
+.Cd "ubsec* at pci? dev ? function ?"
+.Pp
+.Cd pseudo-device crypto
+.Cd pseudo-device swcrypto
+.Pp
+.In sys/ioctl.h
+.In sys/time.h
+.In crypto/cryptodev.h
+.Sh DESCRIPTION
+The
+.Nm
+driver gives user-mode applications access to hardware-accelerated
+cryptographic transforms, as implemented by the
+.Xr opencrypto 9
+in-kernel interface.
+.Pp
+The
+.Cm swcrypto
+driver is a software-only implementation of the
+.Xr opencrypto 9
+interface, and must be included to use the interface without hardware
+acceleration.
+.Pp
+The
+.Pa /dev/crypto
+special device provides an
+.Xr ioctl 2
+based interface.
+User-mode applications should open the special device,
+then issue
+.Xr ioctl 2
+calls on the descriptor.
+User-mode access to
+.Pa /dev/crypto
+is generally controlled by three
+.Xr sysctl 8
+variables,
+.Ic kern.usercrypto ,
+.Ic kern.userasymcrypto ,
+and
+.Ic kern.cryptodevallowsoft .
+See
+.Xr sysctl 7
+for additional details.
+.Pp
+The
+.Nm
+device provides two distinct modes of operation: one mode for
+symmetric-keyed cryptographic requests, and a second mode for
+both asymmetric-key (public-key/private-key) requests, and for
+modular arithmetic (for Diffie-Hellman key exchange and other
+cryptographic protocols).
+The two modes are described separately below.
+.Sh THEORY OF OPERATION
+Regardless of whether symmetric-key or asymmetric-key operations are
+to be performed, use of the device requires a basic series of steps:
+.Pp
+.Bl -enum
+.It
+Open a file descriptor for the device.
+See
+.Xr open 2 .
+.It
+If any symmetric operation will be performed,
+create one session, with
+.Dv CIOCGSESSION ,
+or multiple sessions, with
+.Dv CIOCNGSESSION .
+Most applications will require at least one symmetric session.
+Since cipher and MAC keys are tied to sessions, many
+applications will require more.
+Asymmetric operations do not use sessions.
+.It
+Submit requests, synchronously with
+.Dv CIOCCRYPT
+(symmetric)
+or
+.Dv CIOCKEY
+(asymmetric)
+or asynchronously with
+.Dv CIOCNCRYPTM
+(symmetric)
+or
+.Dv CIOCNFKEYM
+(asymmetric).
+The asynchronous interface allows multiple requests to be submitted in one
+call if the user so desires.
+.It
+If the asynchronous interface is used, wait for results with
+.Xr select 2
+or
+.Xr poll 2 ,
+then collect them with
+.Dv CIOCNCRYPTRET
+(a particular request)
+or
+.Dv CIOCNCRYPTRETM
+(multiple requests).
+.It
+Destroy one session with
+.Dv CIOCFSESSION
+or many at once with
+.Dv CIOCNFSESSION .
+.It
+Close the device with
+.Xr close 2 .
+.El
+.Sh SYMMETRIC-KEY OPERATION
+The symmetric-key operation mode provides a context-based API
+to traditional symmetric-key encryption (or privacy) algorithms,
+or to keyed and unkeyed one-way hash (HMAC and MAC) algorithms.
+The symmetric-key mode also permits fused operation,
+where the hardware performs both a privacy algorithm and an integrity-check
+algorithm in a single pass over the data: either a fused
+encrypt/HMAC-generate operation, or a fused HMAC-verify/decrypt operation.
+.Pp
+To use symmetric mode, you must first create a session specifying
+the algorithm(s) and key(s) to use; then issue encrypt or decrypt
+requests against the session.
+.Ss Symmetric-key privacy algorithms
+Contingent upon device drivers for installed cryptographic hardware
+registering with
+.Xr opencrypto 9 ,
+as providers of a given algorithm, some or all of the following
+symmetric-key privacy algorithms may be available:
+.Pp
+.Bl -tag -compact -width CRYPTO_RIPEMD160_HMAC -offset indent
+.It CRYPTO_DES_CBC
+.It CRYPTO_3DES_CBC
+.It CRYPTO_BLF_CBC
+.It CRYPTO_CAST_CBC
+.It CRYPTO_SKIPJACK_CBC
+.It CRYPTO_AES_CBC
+.It CRYPTO_ARC4
+.El
+.Ss Integrity-check operations
+Contingent upon hardware support, some or all of the following
+keyed one-way hash algorithms may be available:
+.Pp
+.Bl -tag -compact -width CRYPTO_RIPEMD160_HMAC -offset indent
+.It CRYPTO_RIPEMD160_HMAC
+.It CRYPTO_MD5_KPDK
+.It CRYPTO_SHA1_KPDK
+.It CRYPTO_MD5_HMAC
+.It CRYPTO_SHA1_HMAC
+.It CRYPTO_SHA2_256_HMAC
+.It CRYPTO_SHA2_384_HMAC
+.It CRYPTO_SHA2_512_HMAC
+.It CRYPTO_MD5
+.It CRYPTO_SHA1
+.El
+.Pp
+The
+.Em CRYPTO_MD5
+and
+.Em CRYPTO_SHA1
+algorithms are actually unkeyed, but should be requested
+as symmetric-key hash algorithms with a zero-length key.
+.Ss IOCTL Request Descriptions
+.\"
+.Bl -tag -width CIOCKEY
+.\"
+.It Dv CRIOGET Fa int *fd
+This operation is deprecated and will be removed after
+.Nx 5.0 .
+It clones the fd argument to
+.Xr ioctl 2 ,
+yielding a new file descriptor for the creation of sessions.
+Because the device now clones on open, this operation is unnecessary.
+.\"
+.It Dv CIOCGSESSION Fa struct session_op *sessp
+.Bd -literal
+struct session_op {
+ u_int32_t cipher; /* e.g. CRYPTO_DES_CBC */
+ u_int32_t mac; /* e.g. CRYPTO_MD5_HMAC */
+
+ u_int32_t keylen; /* cipher key */
+ void * key;
+ int mackeylen; /* mac key */
+ void * mackey;
+
+ u_int32_t ses; /* returns: ses # */
+};
+
+.Ed
+Create a new cryptographic session on a file descriptor for the device;
+that is, a persistent object specific to the chosen
+privacy algorithm, integrity algorithm, and keys specified in
+.Fa sessp .
+The special value 0 for either privacy or integrity
+is reserved to indicate that the indicated operation (privacy or integrity)
+is not desired for this session.
+.Pp
+Multiple sessions may be bound to a single file descriptor.
+The session ID returned in
+.Fa sessp->ses
+is supplied as a required field in the symmetric-operation structure
+.Fa crypt_op
+for future encryption or hashing requests.
+.Pp
+This implementation will never return a session ID of 0 for a successful
+creation of a session, which is a
+.Nx
+extension.
+.Pp
+For non-zero symmetric-key privacy algorithms, the privacy algorithm
+must be specified in
+.Fa sessp->cipher ,
+the key length in
+.Fa sessp->keylen ,
+and the key value in the octets addressed by
+.Fa sessp->key .
+.Pp
+For keyed one-way hash algorithms, the one-way hash must be specified
+in
+.Fa sessp->mac ,
+the key length in
+.Fa sessp->mackey ,
+and the key value in the octets addressed by
+.Fa sessp->mackeylen .
+.\"
+.Pp
+Support for a specific combination of fused privacy and
+integrity-check algorithms depends on whether the underlying
+hardware supports that combination.
+Not all combinations are supported
+by all hardware, even if the hardware supports each operation as a
+stand-alone non-fused operation.
+.It Dv CIOCNGSESSION Fa struct crypt_sgop *sgop
+.Bd -literal
+struct crypt_sgop {
+ size_t count; /* how many */
+ struct session_n_op * sessions; /* where to get them */
+};
+
+struct session_n_op {
+ u_int32_t cipher; /* e.g. CRYPTO_DES_CBC */
+ u_int32_t mac; /* e.g. CRYPTO_MD5_HMAC */
+
+ u_int32_t keylen; /* cipher key */
+ void * key;
+ u_int32_t mackeylen; /* mac key */
+ void * mackey;
+
+ u_int32_t ses; /* returns: session # */
+ int status;
+};
+
+.Ed
+Create one or more sessions.
+Takes a counted array of
+.Fa session_n_op
+structures in
+.Fa sgop .
+For each requested session (array element n), the session number is returned in
+.Fa sgop->sessions[n].ses
+and the status for that session creation in
+.Fa sgop->sessions[n].status .
+.\"
+.It Dv CIOCCRYPT Fa struct crypt_op *cr_op
+.Bd -literal
+struct crypt_op {
+ u_int32_t ses;
+ u_int16_t op; /* e.g. COP_ENCRYPT */
+ u_int16_t flags;
+ u_int len;
+ void * src, *dst;
+ void * mac; /* must be large enough for result */
+ void * iv;
+};
+
+.Ed
+Request a symmetric-key (or hash) operation.
+The file descriptor argument to
+.Xr ioctl 2
+must have been bound to a valid session.
+To encrypt, set
+.Fa cr_op->op
+to
+.Dv COP_ENCRYPT .
+To decrypt, set
+.Fa cr_op->op
+to
+.Dv COP_DECRYPT .
+The field
+.Fa cr_op->len
+supplies the length of the input buffer; the fields
+.Fa cr_op->src ,
+.Fa cr_op->dst ,
+.Fa cr_op->mac ,
+.Fa cr_op->iv
+supply the addresses of the input buffer, output buffer,
+one-way hash, and initialization vector, respectively.
+.It Dv CIOCNCRYPTM Fa struct crypt_mop *cr_mop
+.Bd -literal
+struct crypt_mop {
+ size_t count; /* how many */
+ struct crypt_n_op * reqs; /* where to get them */
+};
+
+struct crypt_n_op {
+ u_int32_t ses;
+ u_int16_t op; /* e.g. COP_ENCRYPT */
+ u_int16_t flags;
+ u_int len;
+
+ u_int32_t reqid; /* request id */
+ int status; /* accepted or not */
+
+ void *opaque; /* opaque pointer ret to user */
+ u_int32_t keylen; /* cipher key - optional */
+ void * key;
+ u_int32_t mackeylen; /* mac key - optional */
+ void * mackey;
+
+ void * src, * dst;
+ void * mac;
+ void * iv;
+};
+
+.Ed
+This is the asynchronous version of CIOCCRYPT, which allows multiple
+symmetric-key (or hash) operations to be started (see CIOCRYPT
+above for the details for each operation).
+.Pp
+The
+.Fa cr_mop->count
+field specifies the number of operations provided in the
+cr_mop->reqs array.
+.Pp
+Each operation is assigned a unique request id returned in the
+.Fa cr_mop->reqs[n].reqid
+field.
+.Pp
+Each operation can accept an opaque value from the user to be passed back
+to the user when the operation completes
+(e.g., to track context for the request).
+The opaque field is
+.Fa cr_mop->reqs[n].opaque .
+.Pp
+If a problem occurs with starting any of the operations then that
+operation's
+.Fa cr_mop->reqs[n].status
+field is filled with the error code.
+The failure of an operation does not
+prevent the other operations from being started.
+.Pp
+The
+.Xr select 2
+or
+.Xr poll 2
+functions must be used on the device file descriptor to detect that
+some operation has completed; results are then retrieved with
+.Dv CIOCNCRYPTRETM .
+.Pp
+The
+.Fa key
+and
+.Fa mackey
+fields of the
+operation structure are currently unused.
+They are intended for use to
+immediately rekey an existing session before processing a new request.
+.It Dv CIOCFSESSION Fa u_int32_t *ses_id
+Destroys the /dev/crypto session associated with the file-descriptor
+argument.
+.It Dv CIOCNFSESSION Fa struct crypt_sfop *sfop
+.Bd -literal
+struct crypt_sfop {
+ size_t count;
+ u_int32_t *sesid;
+};
+
+.Ed
+Destroys the
+.Fa sfop->count
+sessions specified by the
+.Fa sfop
+array of session identifiers.
+.El
+.\"
+.Sh ASYMMETRIC-KEY OPERATION
+.Ss Asymmetric-key algorithms
+Contingent upon hardware support, the following asymmetric
+(public-key/private-key; or key-exchange subroutine) operations may
+also be available:
+.Pp
+.Bl -column "CRK_DH_COMPUTE_KEY" "Input parameter" "Output parameter" -offset indent -compact
+.It Em "Algorithm" Ta "Input parameter" Ta "Output parameter"
+.It Em " " Ta "Count" Ta "Count"
+.It Dv CRK_MOD_EXP Ta 3 Ta 1
+.It Dv CRK_MOD_EXP_CRT Ta 6 Ta 1
+.It Dv CRK_MOD_ADD Ta 3 Ta 1
+.It Dv CRK_MOD_ADDINV Ta 2 Ta 1
+.It Dv CRK_MOD_SUB Ta 3 Ta 1
+.It Dv CRK_MOD_MULT Ta 3 Ta 1
+.It Dv CRK_MOD_MULTINV Ta 2 Ta 1
+.It Dv CRK_MOD Ta 2 Ta 1
+.It Dv CRK_DSA_SIGN Ta 5 Ta 2
+.It Dv CRK_DSA_VERIFY Ta 7 Ta 0
+.It Dv CRK_DH_COMPUTE_KEY Ta 3 Ta 1
+.El
+.Pp
+See below for discussion of the input and output parameter counts.
+.Ss Asymmetric-key commands
+.Bl -tag -width CIOCKEY
+.It Dv CIOCASYMFEAT Fa int *feature_mask
+Returns a bitmask of supported asymmetric-key operations.
+Each of the above-listed asymmetric operations is present
+if and only if the bit position numbered by the code for that operation
+is set.
+For example,
+.Dv CRK_MOD_EXP
+is available if and only if the bit
+.Pq 1 << Dv CRK_MOD_EXP
+is set.
+.It Dv CIOCKEY Fa struct crypt_kop *kop
+.Bd -literal
+struct crypt_kop {
+ u_int crk_op; /* e.g. CRK_MOD_EXP */
+ u_int crk_status; /* return status */
+ u_short crk_iparams; /* # of input params */
+ u_short crk_oparams; /* # of output params */
+ u_int crk_pad1;
+ struct crparam crk_param[CRK_MAXPARAM];
+};
+
+/* Bignum parameter, in packed bytes. */
+struct crparam {
+ void * crp_p;
+ u_int crp_nbits;
+};
+
+.Ed
+Performs an asymmetric-key operation from the list above.
+The specific operation is supplied in
+.Fa kop->crk_op ;
+final status for the operation is returned in
+.Fa kop->crk_status .
+The number of input arguments and the number of output arguments
+is specified in
+.Fa kop->crk_iparams
+and
+.Fa kop->crk_iparams ,
+respectively.
+The field
+.Fa crk_param[]
+must be filled in with exactly
+.Fa kop->crk_iparams + kop->crk_oparams
+arguments, each encoded as a
+.Fa struct crparam
+(address, bitlength) pair.
+.Pp
+The semantics of these arguments are currently undocumented.
+.It Dv CIOCNFKEYM Fa struct crypt_mkop *mkop
+.Bd -literal
+struct crypt_mkop {
+ size_t count; /* how many */
+ struct crypt_n_op * reqs; /* where to get them */
+};
+
+struct crypt_n_kop {
+ u_int crk_op; /* e.g. CRK_MOD_EXP */
+ u_int crk_status; /* accepted or not */
+ u_short crk_iparams; /* # of input params */
+ u_short crk_oparams; /* # of output params */
+ u_int32_t crk_reqid; /* request id */
+ struct crparam crk_param[CRK_MAXPARAM];
+ void *crk_opaque; /* opaque pointer ret to user */
+};
+
+.Ed
+This is the asynchronous version of
+.Dv CIOCKEY ,
+which starts one or more key operations.
+See
+.Dv CIOCNCRYPTM
+above and
+.Dv CIOCNCRYPTRETM
+below
+for descriptions of the
+.Fa mkop>count ,
+.Fa mkop>reqs ,
+.Fa mkop>reqs[n].crk_reqid ,
+.Fa mkop>reqs[n].crk_status ,
+and
+.Fa mkop>reqs[n].crk_opaque
+fields of the argument structure, and result retrieval.
+.El
+.Ss Asynchronous status commands
+When requests are submitted with the
+.Dv CIOCNCRYPTM
+or
+.Dv CIOCNFKEYM
+commands, result retrieval is asynchronous
+(the submit ioctls return immediately).
+Use the
+.Xr select 2
+or
+.Xr poll 2
+functions to determine when the file descriptor has completed operations ready
+to be retrieved.
+.Bl -tag -width CIOCKEY
+.It Dv CIOCNCRYPTRET Fa struct crypt_result *cres
+.Bd -literal
+struct crypt_result {
+ u_int32_t reqid; /* request ID */
+ u_int32_t status; /* 0 if successful */
+ void * opaque; /* pointer from user */
+};
+
+.Ed
+Check for the status of the request specified by
+.Fa cres->reqid .
+This requires a linear search through all completed requests and should
+be used with extreme care if the number of requests pending on this
+file descriptor may be large.
+.Pp
+The
+.Fa cres->status
+field is set as follows:
+.Bl -tag -width EINPROGRESS
+.It 0
+The request has completed, and its results have been copied out to
+the original
+.Fa crypt_n_op or
+.Fa crypt_n_kop
+structure used to start the request.
+The copyout occurs during this ioctl,
+so the calling process must be the process that started the request.
+.It EINPROGRESS
+The request has not yet completed.
+.It EINVAL
+The request was not found.
+.El
+.Pp
+Other values indicate a problem during the processing of the request.
+.It Dv CIOCNCRYPTRETM Fa struct cryptret_t *cret
+.Bd -literal
+struct cryptret {
+ size_t count; /* space for how many */
+ struct crypt_result * results; /* where to put them */
+};
+
+.Ed
+Retrieve a number of completed requests.
+This ioctl accepts a count and
+an array (each array element is a
+.Fa crypt_result_t
+structure as used by
+.Dv CIOCNCRYPTRET
+above) and fills the array with up to
+.Fa cret->count
+results of completed requests.
+.Pp
+This ioctl fills in the
+.Fa cret->results[n].reqid field ,
+so that the request which has completed
+may be identified by the application.
+Note that the results may include
+requests submitted both as symmetric and asymmetric operations.
+.El
+.Sh SEE ALSO
+.Xr hifn 4 ,
+.Xr ubsec 4 ,
+.Xr opencrypto 9
+.Sh HISTORY
+The
+.Nm
+driver is derived from a version which appeared in
+.Fx 4.8 ,
+which in turn is based on code which appeared in
+.Ox 3.2 .
+.Pp
+The "new API" for asynchronous operation with multiple basic operations
+per system call (the "N" ioctl variants) was contributed by Coyote Point
+Systems, Inc. and first appeared in
+.Nx 5.0 .
+.Sh BUGS
+Error checking and reporting is weak.
+.Pp
+The values specified for symmetric-key key sizes to
+.Dv CIOCGSESSION
+must exactly match the values expected by
+.Xr opencrypto 9 .
+The output buffer and MAC buffers supplied to
+.Dv CIOCCRYPT
+must follow whether privacy or integrity algorithms were specified for
+session: if you request a
+.No non- Ns Dv NULL
+algorithm, you must supply a suitably-sized buffer.
+.Pp
+The scheme for passing arguments for asymmetric requests is baroque.
+.Pp
+The naming inconsistency between
+.Dv CRIOGET
+and the various
+.Dv CIOC Ns \&*
+names is an unfortunate historical artifact.