crypto_session —
    state used for symmetric cryptographic services
#include
    <opencrypto/cryptodev.h>
struct auth_hash *
  
  crypto_auth_hash(const
    struct crypto_session_params *csp);
struct enc_xform *
  
  crypto_cipher(const
    struct crypto_session_params *csp);
const struct crypto_session_params *
  
  crypto_get_params(crypto_session_t
    cses);
int
  
  crypto_newsession(crypto_session_t
    *cses, const struct crypto_session_params *csp,
    int crid);
int
  
  crypto_freesession(crypto_session_t
    cses);
Symmetric cryptographic operations in the kernel are associated
    with cryptographic sessions. Sessions hold state shared across multiple
    requests. Active sessions are associated with a single cryptographic
  driver.
The crypto_session_t type represents an
    opaque reference to an active session. Session objects are allocated and
    managed by the cryptographic framework.
New sessions are created by
    crypto_newsession().
    csp describes various parameters associated with the
    new session such as the algorithms to use and any session-wide keys.
    crid can be used to request either a specific
    cryptographic driver or classes of drivers. For the latter case,
    crid should be set to a mask of the following
  values:
  - CRYPTOCAP_F_HARDWARE
- Request hardware drivers. Hardware drivers do not use the host CPU to
      perform operations. Typically, a separate co-processor performs the
      operations asynchronously.
- CRYPTOCAP_F_SOFTWARE
- Request software drivers. Software drivers use the host CPU to perform
      operations. The kernel includes a simple, yet portable implementation of
      each supported algorithm in the
      cryptosoft(4)
      driver. Additional software drivers may also be available on architectures
      which provide instructions designed to accelerate cryptographic
      operations.
If both hardware and software drivers are requested, hardware
    drivers are preferred over software drivers. Accelerated software drivers
    are preferred over the baseline software driver. If multiple hardware
    drivers are available, the framework will distribute sessions across these
    drivers in a round-robin fashion.
On success,
    crypto_newsession()
    saves a reference to the newly created session in
    cses.
crypto_freesession()
    is used to free the resources associated with the session
    cses.
crypto_auth_hash()
    returns a structure describing the baseline software implementation of an
    authentication algorithm requested by csp. If
    csp does not specify an authentication algorithm, or
    requests an invalid algorithm, NULL is returned.
crypto_cipher()
    returns a structure describing the baseline software implementation of an
    encryption algorithm requested by csp. If
    csp does not specify an encryption algorithm, or
    requests an invalid algorithm, NULL is returned.
crypto_get_params()
    returns a pointer to the session parameters used by
    cses.
Session parameters are used to describe the cryptographic
    operations performed by cryptographic requests. Parameters are stored in an
    instance of struct crypto_session_params. When
    initializing parameters to pass to
    crypto_newsession(), the entire structure should
    first be zeroed. Needed fields should then be set leaving unused fields as
    zero. This structure contains the following fields:
  - csp_mode
- Type of operation to perform. This field must be set to one of the
      following:
    
      - CSP_MODE_COMPRESS
- Compress or decompress request payload.
        The compression algorithm is specified in
            csp_cipher_alg. 
- CSP_MODE_CIPHER
- Encrypt or decrypt request payload.
        The encryption algorithm is specified in
            csp_cipher_alg. 
- CSP_MODE_DIGEST
- Compute or verify a digest, or hash, of request payload.
        The authentication algorithm is specified in
            csp_auth_alg. 
- CSP_MODE_AEAD
- Authenticated encryption with additional data. Decryption operations
          require the digest, or tag, and fail if it does not match.
        The AEAD algorithm is specified in
            csp_cipher_alg. 
- CSP_MODE_ETA
- Encrypt-then-Authenticate. In this mode, encryption operations encrypt
          the payload and then compute an authentication digest over the request
          additional authentication data followed by the encrypted payload.
          Decryption operations fail without decrypting the data if the provided
          digest does not match.
        The encryption algorithm is specified in
            csp_cipher_alg and the authentication
            algorithm is specified in csp_auth_alg. 
 
- csp_flags
- A mask of optional driver features. Drivers will only attach to a session
      if they support all of the requested features.
    
      - CSP_F_SEPARATE_OUTPUT
- Support requests that use separate input and output buffers. Sessions
          with this flag set permit requests with either a single buffer that is
          modified in-place, or requests with separate input and output buffers.
          Sessions without this flag only permit requests with a single buffer
          that is modified in-place.
- CSP_F_SEPARATE_AAD
- Support requests that use a separate buffer for AAD rather than
          providing AAD as a region in the input buffer. Sessions with this flag
          set permit requests with AAD passed in either in a region of the input
          buffer or in a single, virtually-contiguous buffer. Sessions without
          this flag only permit requests with AAD passed in as a region in the
          input buffer.
- CSP_F_ESN
- Support requests that use a separate buffer for IPsec ESN (Extended
          Sequence Numbers).
        Sessions with this flag set permit requests with IPsec ESN
            passed in special buffer. It is required for IPsec ESN support of
            encrypt and authenticate mode where the high-order 32 bits of the
            sequence number are appended after the Next Header (RFC 4303). 
 
- csp_ivlen
- If either the cipher or authentication algorithms require an explicit
      initialization vector (IV) or nonce, this specifies the length in bytes.
      All requests for a session use the same IV length.
- csp_cipher_alg
- Encryption or compression algorithm.
- csp_cipher_klen
- Length of encryption or decryption key in bytes. All requests for a
      session use the same key length.
- csp_cipher_key
- Pointer to encryption or decryption key. If all requests for a session use
      request-specific keys, this field should be left as
      NULL. This pointer and associated key must remain
      valid for the duration of the crypto session.
- csp_auth_alg
- Authentication algorithm.
- csp_auth_klen
- Length of authentication key in bytes. If the authentication algorithm
      does not use a key, this field should be left as zero.
- csp_auth_key
- Pointer to the authentication key. If all requests for a session use
      request-specific keys, this field should be left as
      NULL. This pointer and associated key must remain
      valid for the duration of the crypto session.
- csp_auth_mlen
- The length in bytes of the digest. If zero, the full length of the digest
      is used. If non-zero, the first csp_auth_mlen bytes
      of the digest are used.
crypto_newsession() returns a non-zero
    value if an error occurs or zero on success.
crypto_auth_hash() and
    crypto_cipher() return NULL
    if the request is valid or a pointer to a structure on success.
The current implementation of
    crypto_freesession does not provide a way for the
    caller to know that there are no other references to the keys stored in the
    session's associated parameters. This function should probably sleep until
    any in-flight cryptographic operations associated with the session are
    completed.