diff options
-rw-r--r-- | share/man/man9/crypto.9 | 467 |
1 files changed, 467 insertions, 0 deletions
diff --git a/share/man/man9/crypto.9 b/share/man/man9/crypto.9 new file mode 100644 index 00000000000..a19626f7f04 --- /dev/null +++ b/share/man/man9/crypto.9 @@ -0,0 +1,467 @@ +.\" $OpenBSD: crypto.9,v 1.1 2000/04/28 05:42:50 angelos Exp $ +.\" +.\" The author of this man page is Angelos D. Keromytis (angelos@cis.upenn.edu) +.\" +.\" Copyright (c) 2000 Angelos D. Keromytis +.\" +.\" Permission to use, copy, and modify this software without fee +.\" is hereby granted, provided that this entire notice is included in +.\" all source code copies of any software which is or includes a copy or +.\" modification of this software. +.\" +.\" THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR +.\" IMPLIED WARRANTY. IN PARTICULAR, NONE OF THE AUTHORS MAKES ANY +.\" REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE +.\" MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR +.\" PURPOSE. +.\" +.Dd April 21, 2000 +.Dt CRYPTO 9 +.Os +.Sh NAME +.Nm crypto +.Nd API for cryptographic services in the kernel +.Sh SYNOPSIS +.Fd #include <crypto/crypto> +.Ft int32_t +.Fn crypto_get_driverid "void" +.Ft int +.Fn crypto_register "u_int32_t" "int" "void *" "void *" "void *" +.Ft int +.Fn crypto_unregister "u_int32_t" "int" +.Ft int +.Fn crypto_newsession "u_int64_t *" "struct cryptoini *" +.Ft int +.Fn crypto_freesession "u_int64_t" +.Ft int +.Fn crypto_dispatch "struct cryptop *" +.Ft struct cryptop * +.Fn crypto_getreq "int" +.Ft void +.Fn crypto_freereq "void" +.Bd -literal + +#define EALG_MAX_BLOCK_LEN 8 + +struct cryptoini +{ + int cri_alg; + int cri_klen; + int cri_rnd; + caddr_t cri_key; + u_int8_t cri_iv[EALG_MAX_BLOCK_LEN]; + struct cryptoini *cri_next; +}; + +struct cryptodesc +{ + int crd_skip; + int crd_len; + int crd_inject; + int crd_flags; + struct cryptoini CRD_INI; + struct cryptodesc *crd_next; +}; + +struct cryptop +{ + u_int64_t crp_sid; + int crp_ilen; + int crp_olen; + int crp_alloctype; + int crp_etype; + int crp_flags; + caddr_t crp_buf; + caddr_t crp_opaque1; + caddr_t crp_opaque2; + caddr_t crp_opaque3; + caddr_t crp_opaque4; + struct cryptodesc *crp_desc; + int (*crp_callback) (struct cryptop *); +}; +.Ed +.br +.Sh DESCRIPTION +.Nm +is a framework for drivers of cryptographic hardware to register with +the kernel so ``consumers'' (other kernel subsystems, and eventually +users through an appropriate device) are able to make use of +it. Drivers register with the framework the algorithms they support, +and provide entry points (functions) the framework may call to +establish, use, and tear down sessions. Sessions are used to cache +cryptographic information in a particular driver (or associated +hardware), so initialization is not needed with every +request. Consumers of cryptographic services pass a set of +descriptors that instruct the framework (and the drivers registered +with it) of the operations that should be applied on the data (more +than one cryptographic operation can be requested). +.Pp +Since the consumers may not be associated with a process, drivers may +not use +.Xr tsleep 9 . +The same holds for the framework. Thus, a callback mechanism is used +to notify a consumer that a request has been completed (the +callback is specified by the consumer on an per-request basis). The +callback is invoked by the framework whether the request was +successfully completed or not. An error indication is provided in the +latter case. A specific error code, +.Va EAGAIN , +is used to indicate that a session number has changed and that the +request may be re-submitted immediately with the new session +number. Errors are only returned to the invoking function if not +enough information to call the callback is available (meaning, there +was a fatal error in verifying the arguments). For session +initialization and teardown there is no callback mechanism used. +.Pp +The +.Fn crypto_newsession +routine is called by consumers of cryptographic services (such as the +.Xr ipsec 4 +stack) that wish to establish a new session with the framework. On +success, the first argument will contain the Session Identifier +(SID). The second argument contains all the necessary information for +the driver to establish the session. The various fields in the +.Va cryptoini +structure are: +.Bl -tag -width foobarmoocow +.It cri_alg +Contains an algorithm identifier. Currently supported algorithms are: +.Bd -literal +CRYPTO_DES_CBC +CRYPTO_3DES_CBC +CRYPTO_BLF_CBC +CRYPTO_CAST_CBC +CRYPTO_SKIPJACK_CBC +CRYPTO_MD5_HMAC96 +CRYPTO_SHA1_HMAC96 +CRYPTO_RIPEMD160_HMAC96 +CRYPTO_MD5_KPDK +CRYPTO_SHA1_KPDK +.Ed +.Br +.It cri_klen +Specifies the length of the key in bits, for variable-size key +algorithms. +.It cri_rnd +Specifies the number of rounds to be used with the algorithm, for +variable-round algorithms. +.It cri_key +Contains the key to be used with the algorithm. +.It cri_iv +Contains an explicit initialization vector (IV), if it does not prefix +the data. This field is ignored during initialization. If no IV is +explicitly passed (see below on details), a random IV is used by the +device driver processing the request. +.It cri_next +Contains a pointer to another +.Va cryptoini +structure. Multiple such structures may be linked, to establish +multi-algorithm sessions ( +.Xr ipsec 4 +is an example consumer of such a feature). +.El +.Pp +The +.Va cryptoini +structure and its contents will not be modified by the framework (or +the drivers used). Subsequent requests for processing that use the +SID returned will avoid the cost of re-initializing the hardware (in +essence, SID acts as an index in the session cache of the driver). +.Pp +.Fn crypto_freesession +is called with the SID returned by +.Fn crypto_newsession +to disestablish the session. +.Pp +.Fn crypto_dispatch +is called to process a request. The various fields in the +.Va cryptop +structure are: +.Bl -tag -width crp_alloctype +.It crp_sid +Contains the SID. +.It crp_ilen +Indicates the total length in bytes of the buffer to be processed. +.It crp_olen +On return, contains the total length of the result. For symmetric +crypto operations, this will be the same as the input length. +.It crp_alloctype +Indicates the type of buffer, as used in the kernel +.Xr malloc 9 +routine. This will be used if the framework needs to allocate a new +buffer for the result (or for re-formatting the input). +.It crp_callback +This routine is invoked upon completion of the request, whether +successful or not. If the request was not successful, an error code is +set in the +.Va crp_etype +field. +.It crp_etype +Contains the error type, if any errors were encountered, or zero if +the request was successfully processed. If the +.Va EAGAIN +error code is returned, the SID has changed (and has been recorded in +the +.Va crp_sid +field). The consumer should record the new SID and use it in all +subsequent requests. In this case, the request may be re-submitted +immediately. This mechanism is used by the framework to perform +session migration (move a session from one driver to another, because +of availability, performance, or other considerations). +.Pp +Note that this field only makes sense when examined by +the callback routine specified in +.Va crp_callback . +Errors are returned to the invoker of +.Fn crypto_process +only when enough information is not present to call the callback +routine (i.e., if the pointer passed is +.Dv NULL +or if no callback routine was specified). +.It crp_flags +Is a bitmask of flags associated with this request. Currently defined +flags are: +.Bl -tag -width CRYPTO_F_IMBUF +.It CRYPTO_F_IMBUF +The buffer pointed to by +.Va crp_buf +is an mbuf chain. +.El +.Br +.It crp_buf +Points to the input buffer. On return (when the callback is invoked), +it contains the result of the request. The input buffer may be an mbuf +chain or a contiguous buffer (of a type identified by +.Va crp_alloctype ), +depending on +.Va crp_flags . +.It crp_opaque1 +.It crp_opaque2 +.It crp_opaque3 +.It crp_opaque4 +These are passed through the crypto framework untouched and are +intended for the invoking application's use. +.It crp_desc +This is a linked list of descriptors. Each descriptor provides +information about what type of cryptographic operation should be done +on the input buffer. The various fields are: +.Bl -tag -width=crd_inject +.It crd_skip +The offset in the input buffer where processing should start. +.It crd_len +How many bytes, after +.Va crd_skip , +should be processed. +.It crd_inject +Offset from the beginning of the buffer to insert any results. For +encryption algorithms, this is where the initialization vector +(IV) will be inserted when encrypting or where it can be found when +decrypting (subject to +.Va crd_flags ). +For MAC algorithms, this is where the result of the keyed hash will be +inserted. +.It crd_flags +The following flags are defined: +.Bl -tag -width=CRD_F_IV_EXPLICIT +.it CRD_F_ENCRYPT +For encryption algorithms, this bit is set when encryption is required +(when not set, decryption is performed). +.It CRD_F_IV_PRESENT +For encryption algorithms, this bit is set when the IV already +precedes the data, so the +.Va crd_inject +value will be ignored and no IV will be written in the +buffer. Otherwise, the IV used to encrypt the packet will be written +at the location pointed to by +.Va crd_inject . +The IV length is assumed to be equal to the blocksize of the +encryption algorithm. Some applications that do special ``IV +cooking'', such as the half-IV mode in +.Xr ipsec 4 , +can use this flag to indicate the the IV should not be written on the +packet. This flag is typically used in conjunction with the +.Va CRD_F_IV_EXPLICIT +flag. +.It CRD_F_IV_EXPLICIT +For encryption algorithms, this bit is set when the IV is explicitly +provided by the consumer in the +.Va crd_iv +fiels. Otherwise, for encryption operations the IV is provided for by +the driver used to perform the operation, whereas for decryption +operations it is pointed to by the +.Va crd_inject +field. This flag is typically used when the IV is calculated ``on the +fly'' by the consumer, and does not precede the data (some +.Xr ipsec 4 +configurations, and the encrypted swap are two such examples). +.El +.It crd_alg +.It crd_klen +.It crd_rnd +.It crd_key +.It crd_iv +These have the exact same meaning as the corresponding fields in the +.Va cryptoini +structure. These fields will not be modified by the framework or the +device drivers. Since this information accompanies every cryptographic +operation request, drivers may re-initialize state on-demand +(typically an expensive operation). Furthermore, the cryptographic +framework may re-route requests as a result of full queues or hardware +failure, as described above. +.It crd_next +Point to the next descriptor. Linked operations are useful in +protocols such as +.Xr ipsec 4 , +where multiple cryptographic transforms may be applied on the same +block of data. +.El +.El +.Pp +.Fn crypto_getreq +allocates a +.Va cryptop +structure with a linked list of as many +.Va cryptodesc +structures as were specified in the argument passed to it. +.Pp +.Fn crypto_freereq +deallocates a structure +.Va cryptop +and any +.Va cryptodesc +structures linked to it. Note that it is the responsibility of the +callback routine to do the necessary cleanups associated with the +opaque fields in the +.Va cryptop +structure. +.Pp +.Sh DRIVER-SIDE API +The +.Fn crypto_get_driverid , +.Fn crypto_register , +and +.Fn crypto_unregister +routines are used by drivers that provide support for cryptographic +primitives to register and unregister with the kernel crypto services +framework. Drivers must first use the +.Fn crypto_get_driverid +function to acquire a driver identifier. For each algorithm the driver +supports, it must then call +.Fn crypto_register . +The first two arguments are the driver and algorithm identifiers. The +last three arguments must be provided in the first call to +.Fn crypto_register +and are ignored in all subsequent calls. They are pointers to three +driver-provided functions that the framework may call to establish new +cryptographic context with the driver, free already established +context, and ask for a request to be processed (encrypt, decrypt, +etc.) +.Fn crypto_unregister +is called by drivers that wish to withdraw support for an +algorithm. The two arguments are the driver and algorithm identifiers +respectively. Typically, drivers for +.Xr pcmcia 4 +crypto cards that are being ejected will invoke this routine for all +algorithms supported by the card. +.Pp +The calling convention for the three driver-supplied routines is: +.Bd -literal +int (*newsession) (u_int32_t *, struct cryptoini *); +int (*freesession) (u_int64_t); +int (*process) (struct cryptop *); +.Ed +.Pp +On invocation, the first argument to +.Fn newsession +contains the driver identifier obtained via +.Fn crypto_get_driverid . +On successfully returning, it should contain a driver-specific session +identifier. The second argument is identical to that of +.Fn crypto_newsession . +.Pp +The +.Fn freesession +routine takes as argument the SID (which is the concatenation of the +driver identifier and the driver-specific session identifier). It +should clear any context associated with the session (clear hardware +registers, memory, etc.) +.Pp +The +.Fn process +routine is invoked with a request to perform crypto processing. This +routine must not block, but should queue the request and return +immediately. Upon processing the request, the callback routine +should be invoked. In case of error, the error indication must be +placed in the +.Va crp_etype +field of the +.Va cryptop +structure, and the callback routine invoked as well, to perform the +necessary cleanup or to re-issue the request. Session migration may be +performed, as mentioned previously. +.Pp +.Sh RETURN VALUES +.Fn crypto_register , +.Fn crypto_unregister , +.Fn crypto_newsession , +and +.Fn crypto_freesession +return 0 on success, or an error code on failure. +.Fn crypto_get_driverid +returns a non-negative value on error,and \-1 on failure. +.Fn crypto_getreq +returns a pointer to a +.Va cryptop +structure and +.Dv NULL +on failure. +.Fn crypto_dispatch +returns +.Dv EINVAL +is its argument or the callback function was +.Dv NULL , +and 0 otherwise. The callback is provided with an error code in case +of failure, in the +.Va crp_etype +field. +.Br +.Sh CODE REFERENCES +Most of the framework code can be found in +.Pa sys/crypto/crypto.c +.Br +.Sh SEE ALSO +.Xr ipsec 4 , +.Xr malloc 9 , +.Xr pcmcia 4 , +.Xr tsleep 9 +.Br +.Sh BUGS +The framework currently assumes that all the algorithms in a +.Fn crypto_newsession +operation must be available by the same driver. If that's not the +case, session initialization will fail. +.Pp +The framework also needs a mechanism for determining which driver is +best for a specific set of algorithms associated with a session. Some +type of benchmarking is in order here. +.Pp +Multiple instances of the same algorithm in the same session are not +supported. Note that 3DES is considered one algorithm (and not three +instances of DES). Thus, 3DES and DES could be mixed in the same +request. +.Pp +A queue for completed operations should be implemented and processed +at some software +.Xr spl 9 +level, to avoid overall system latency issues, and potential kernel +stack exhaustion while processing a callback. +.Pp +We need a userland device for exposing the framework to userland. This +will be particularly useful for public key operations in hardware. +.Pp +We have not experimented yet with public key operations hardware. The +framework should support this. +.Pp +When SMP time comes, we will support use of a second processor (or +more) as a crypto device (this is actually AMP, but we need the same +basic support). |