The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/qat/qat_api/common/crypto/sym/include/lac_sym_cipher.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /* SPDX-License-Identifier: BSD-3-Clause */
    2 /* Copyright(c) 2007-2022 Intel Corporation */
    3 /* $FreeBSD$ */
    4 
    5 /**
    6  *****************************************************************************
    7  * @file lac_sym_cipher.h
    8  *
    9  * @defgroup  LacCipher  Cipher
   10  *
   11  * @ingroup LacSym
   12  *
   13  * API functions of the cipher component
   14  *
   15  * @lld_start
   16  * @lld_overview
   17  * There is a single \ref icp_LacSym "Symmetric LAC API" for hash, cipher,
   18  * auth encryption and algorithm chaining. This API is implemented by the
   19  * \ref LacSym "Symmetric" module. It demultiplexes calls to this API into
   20  * their basic operation and does some common parameter checking and deals
   21  * with accesses to the session table.
   22  *
   23  * The cipher component supports data encryption/decryption using the AES, DES,
   24  * and Triple-DES cipher algorithms, in ECB, CBC and CTR modes.  The ARC4 stream
   25  * cipher algorithm is also supported.  Data may be provided as a full packet,
   26  * or as a sequence of partial packets.  The result of the operation can be
   27  * written back to the source buffer (in-place) or to a seperate output buffer
   28  * (out-of-place).  Data must be encapsulated in ICP buffers.
   29  *
   30  * The cipher component is responsible for implementing the cipher-specific
   31  * functionality for registering and de-registering a session, for the perform
   32  * operation and for processing the QAT responses to cipher requests. Statistics
   33  * are maintained for cipher in the symmetric \ref CpaCySymStats64 "stats"
   34  * structure. This module has been seperated out into two. The cipher QAT module
   35  * deals entirely with QAT data structures. The cipher module itself has minimal
   36  * exposure to the QAT data structures.
   37  *
   38  * @lld_dependencies
   39  * - \ref LacCommon
   40  * - \ref LacSymQat "Symmetric QAT": Hash uses the lookup table provided by
   41  *   this module to validate user input. Hash also uses this module to build
   42  *   the hash QAT request message, request param structure, populate the
   43  *   content descriptor, allocate and populate the hash state prefix buffer.
   44  *   Hash also registers its function to process the QAT response with this
   45  *   module.
   46  * - OSAL : For memory functions, atomics and locking
   47  *
   48  * @lld_module_algorithms
   49  * In general, all the cipher algorithms supported by this component are
   50  * implemented entirely by the QAT.  However, in the case of the ARC4 algorithm,
   51  * it was deemed more efficient to carry out some processing on IA.  During
   52  * session registration, an initial state is derived from the base key provided
   53  * by the user, using a simple ARC4 Key Scheduling Algorithm (KSA). Then the
   54  * base key is discarded, but the state is maintained for the duration of the
   55  * session.
   56  *
   57  * The ARC4 key scheduling algorithm (KSA) is specified as follows
   58  * (taken from http://en.wikipedia.org/wiki/RC4_(cipher)):
   59  * \code
   60  * for i from 0 to 255
   61  *     S[i] := i
   62  * endfor
   63  * j := 0
   64  * for i from 0 to 255
   65  *     j := (j + S[i] + key[i mod keylength]) mod 256
   66  *     swap(S[i],S[j])
   67  * endfor
   68  * \endcode
   69  *
   70  * On registration of a new ARC4 session, the user provides a base key of any
   71  * length from 1 to 256 bytes.  This algorithm produces the initial ARC4 state
   72  * (key matrix + i & j index values) from that base key.  This ARC4 state is
   73  * used as input for each ARC4 cipher operation in that session, and is updated
   74  * by the QAT after each operation.  The ARC4 state is stored in a session
   75  * descriptor, and it's memory is freed when the session is deregistered.
   76  *
   77  * <b>Block Vs. Stream Ciphers</b>\n
   78  * Block ciphers are treated slightly differently than Stream ciphers by this
   79  * cipher component.  Supported stream ciphers consist of AES and
   80  * TripleDES algorithms in CTR mode, and ARC4. The 2 primary differences are:
   81  * - Data buffers for block ciphers are required to be a multiple of the
   82  *   block size defined for the algorithm (e.g. 8 bytes for DES).  For stream
   83  *   ciphers, there is no such restriction.
   84  * - For stream ciphers, decryption is performed by setting the QAT hardware
   85  *   to encryption mode.
   86  *
   87  * <b>Memory address alignment of data buffers </b>\n
   88  * The QAT requires that most data buffers are aligned on an 8-byte memory
   89  * address boundary (64-byte boundary for optimum performance).  For Cipher,
   90  * this applies to the cipher key buffer passed in the Content Descriptor,
   91  * and the IV/State buffer passed in the Request Parameters block in each
   92  * request.  Both of these buffers are provided by the user.  It does not
   93  * apply to the cipher source/destination data buffers.
   94  * Alignment of the key buffer is ensured because the key is always copied
   95  * from the user provided buffer into a new (aligned) buffer for the QAT
   96  * (the hardware setup block, which configures the QAT slice).  This is done
   97  * once only during session registration, and the user's key buffer can be
   98  * effectively discarded after that.
   99  * The IV/State buffer is provided per-request by the user, so it is recommended
  100  * to the user to provide aligned buffers for optimal performance.  In the case
  101  * where an unaligned buffer is provided, a new temporary buffer is allocated
  102  * and the user's IV/State data is copied into this buffer.  The aligned buffer
  103  * is then passed to the QAT in the request.  In the response callback, if the
  104  * IV was updated by the QAT, the contents are copied back to the user's buffer
  105  * and the temporary buffer is freed.
  106  *
  107  * @lld_process_context
  108  *
  109  * Session Register Sequence Diagram: For ARC4 cipher algorithm
  110  * \msc
  111  *  APP [label="Application"], SYM [label="Symmetric LAC"],
  112  *  Achain [label="Alg chain"], Cipher, SQAT [label="Symmetric QAT"];
  113  *
  114  *  APP=>SYM [ label = "cpaCySymInitSession(cbFunc)",
  115  *             URL="\ref cpaCySymInitSession()"] ;
  116  *  SYM=>SYM [ label = "LacSymSession_ParamCheck()",
  117  *             URL="\ref LacSymSession_ParamCheck()"];
  118  *  SYM=>Achain [ label = "LacAlgChain_SessionInit()",
  119  *                URL="\ref LacAlgChain_SessionInit()"];
  120  *  Achain=>Cipher [ label = "LacCipher_SessionSetupDataCheck()",
  121  *               URL="\ref LacCipher_SessionSetupDataCheck()"];
  122  *  Achain<<Cipher [ label="return"];
  123  *  Achain=>SQAT [ label = "LacSymQat_CipherContentDescPopulate()",
  124  *               URL="\ref LacSymQat_CipherContentDescPopulate()"];
  125  *  Achain<<SQAT [ label="return"];
  126  *  Achain=>SQAT [ label = "LacSymQat_CipherArc4StateInit()",
  127  *               URL="\ref LacSymQat_CipherArc4StateInit()"];
  128  *  Achain<<SQAT [ label="return"];
  129  *  SYM<<Achain [ label = "status" ];
  130  *  SYM=>SYM [label = "LAC_SYM_STAT_INC", URL="\ref LAC_SYM_STAT_INC"];
  131  *  APP<<SYM [label = "status"];
  132  * \endmsc
  133  *
  134  * Perform Sequence Diagram: TripleDES CBC-mode encryption, in-place full
  135  *packet, asynchronous mode \msc APP [label="Application"], SYM
  136  *[label="Symmetric LAC"], SC [label="Symmetric Common"], Achain [label="Alg
  137  *chain"], Cipher, SQAT [label="Symmetric QAT"], BUF [label="LAC Buffer Desc"],
  138  *SYMQ [label="Symmetric Queue"], SYMCB [label="Symmetric Callback"], LMP
  139  *[label="LAC Mem Pool"], QATCOMMS [label="QAT Comms"];
  140  *
  141  *  APP=>SYM [ label = "cpaCySymPerformOp()",
  142  *             URL="\ref cpaCySymPerformOp()"] ;
  143  *  SYM=>SYM [ label = "LacSym_Perform()",
  144  *            URL="\ref LacSym_Perform()"];
  145  *  SYM=>SYM [ label = "LacSymPerform_BufferParamCheck()",
  146  *            URL="\ref LacSymPerform_BufferParamCheck()"];
  147  *  SYM<<SYM [ label = "status"];
  148  *  SYM=>Achain [ label = "LacAlgChain_Perform()",
  149  *                URL="\ref LacCipher()"];
  150  *  Achain=>Cipher [ label = "LacCipher_PerformParamCheck()",
  151  *                   URL="\ref LacCipher_PerformParamCheck()"];
  152  *  Achain<<Cipher [ label="status"];
  153  *  Achain=>LMP [label="Lac_MemPoolEntryAlloc()",
  154  *              URL="\ref Lac_MemPoolEntryAlloc()"];
  155  *  Achain<<LMP [label="return"];
  156  *  Achain=>Cipher [ label = "LacCipher_PerformIvCheckAndAlign()",
  157  *                   URL="\ref LacCipher_PerformIvCheckAndAlign()"];
  158  *  Achain<<Cipher [ label="status"];
  159  *  Achain=>SQAT [ label = "LacSymQat_CipherRequestParamsPopulate()",
  160  *               URL="\ref LacSymQat_CipherRequestParamsPopulate()"];
  161  *  Achain<<SQAT [ label="return"];
  162  *  Achain=>BUF [ label = "LacBuffDesc_BufferListDescWrite()",
  163  *                URL = "\ref LacBuffDesc_BufferListDescWrite()"];
  164  *  Achain<<BUF [ label="return"];
  165  *  Achain=>SQAT [ label = "SalQatMsg_CmnMsgAndReqParamsPopulate()",
  166  *               URL="\ref SalQatMsg_CmnMsgAndReqParamsPopulate()"];
  167  *  Achain<<SQAT [ label="return"];
  168  *  Achain=>SYMQ [ label = "LacSymQueue_RequestSend()",
  169  *             URL="\ref LacSymQueue_RequestSend()"];
  170  *  SYMQ=>QATCOMMS [ label = "QatComms_MsgSend()",
  171  *                   URL="\ref QatComms_MsgSend()"];
  172  *  SYMQ<<QATCOMMS [ label="status"];
  173  *  Achain<<SYMQ [ label="status"];
  174  *  SYM<<Achain[ label="status"];
  175  *  SYM=>SYM [ label = "LacSym_PartialPacketStateUpdate()",
  176  *            URL="\ref LacSym_PartialPacketStateUpdate()"];
  177  *  SYM<<SYM [ label = "return"];
  178  *  SYM=>SC [label = "LAC_SYM_STAT_INC", URL="\ref LAC_SYM_STAT_INC"];
  179  *  SYM<<SC [ label="return"];
  180  *  SYM<<SYM [ label = "status"];
  181  *  APP<<SYM [label = "status"];
  182  *  ... [label = "QAT processing the request and generates response"];
  183  *  ...;
  184  *  QATCOMMS=>QATCOMMS [label ="QatComms_ResponseMsgHandler()",
  185  *                       URL="\ref QatComms_ResponseMsgHandler()"];
  186  *  QATCOMMS=>SQAT [label ="LacSymQat_SymRespHandler()",
  187  *                   URL="\ref LacSymQat_SymRespHandler()"];
  188  *  SQAT=>SYMCB [label="LacSymCb_ProcessCallback()",
  189  *              URL="\ref LacSymCb_ProcessCallback()"];
  190  *  SYMCB=>SYMCB [label="LacSymCb_ProcessCallbackInternal()",
  191  *              URL="\ref LacSymCb_ProcessCallbackInternal()"];
  192  *  SYMCB=>LMP [label="Lac_MemPoolEntryFree()",
  193  *              URL="\ref Lac_MemPoolEntryFree()"];
  194  *  SYMCB<<LMP [label="return"];
  195  *  SYMCB=>SC [label = "LAC_SYM_STAT_INC", URL="\ref LAC_SYM_STAT_INC"];
  196  *  SYMCB<<SC [label = "return"];
  197  *  SYMCB=>APP [label="cbFunc"];
  198  *  SYMCB<<APP [label="return"];
  199  *  SQAT<<SYMCB [label="return"];
  200  *  QATCOMMS<<SQAT [label="return"];
  201  * \endmsc
  202  *
  203  * #See the sequence diagram for cpaCySymInitSession()
  204  *
  205  * @lld_end
  206  *
  207  *****************************************************************************/
  208 
  209 /***************************************************************************/
  210 
  211 #ifndef LAC_SYM_CIPHER_H
  212 #define LAC_SYM_CIPHER_H
  213 
  214 /*
  215 ******************************************************************************
  216 * Include public/global header files
  217 ******************************************************************************
  218 */
  219 
  220 #include "cpa.h"
  221 #include "cpa_cy_sym.h"
  222 
  223 /*
  224 *******************************************************************************
  225 * Include private header files
  226 *******************************************************************************
  227 */
  228 
  229 #include "lac_session.h"
  230 #include "lac_sym.h"
  231 #include "lac_sal_types_crypto.h"
  232 
  233 /*
  234  * WARNING: There are no checks done on the parameters of the functions in
  235  * this file. The expected values of the parameters are documented and it is
  236  * up to the caller to provide valid values.
  237  */
  238 
  239 /***************************************************************************/
  240 
  241 /**
  242  *****************************************************************************
  243  * @ingroup LacCipher
  244  *      Cipher session setup data check
  245  *
  246  * @description
  247  *      This function will check any algorithm-specific fields
  248  *      in the session cipher setup data structure
  249  *
  250  * @param[in] pCipherSetupData       Pointer to session cipher context
  251  *
  252  * @retval CPA_STATUS_SUCCESS        Function executed successfully.
  253  * @retval CPA_STATUS_FAIL           Function failed.
  254  * @retval CPA_STATUS_INVALID_PARAM  Invalid parameter.
  255  *
  256  *****************************************************************************/
  257 CpaStatus
  258 LacCipher_SessionSetupDataCheck(const CpaCySymCipherSetupData *pCipherSetupData,
  259                                 Cpa32U capabilitiesMask);
  260 
  261 /**
  262 *******************************************************************************
  263 * @ingroup LacCipher
  264 *      Function that checks the perform common parameters for cipher
  265 *
  266 * @description
  267 *      This function checks the perform parameters for cipher operations
  268 *
  269 * @param[in] cipherAlgorithm  read only pointer to cipher context structure
  270 *
  271 * @param[in] pOpData          read only pointer to user-supplied data for this
  272 *                             cipher operation
  273 * @param[in] packetLen        read only length of data in buffer
  274 *
  275 * @retval CPA_STATUS_SUCCESS        Success
  276 * @retval CPA_STATUS_INVALID_PARAM  Invalid parameter
  277 *
  278 *****************************************************************************/
  279 CpaStatus LacCipher_PerformParamCheck(CpaCySymCipherAlgorithm cipherAlgorithm,
  280                                       const CpaCySymOpData *pOpData,
  281                                       const Cpa64U packetLen);
  282 
  283 /**
  284  *****************************************************************************
  285  * @ingroup LacCipher
  286  *      Cipher perform IV check
  287  *
  288  * @description
  289  *      This function will perform algorithm-specific checks on the
  290  *      cipher Initialisation Vector data provided by the user.
  291  *
  292  * @param[in] pCbCookie         Pointer to struct containing internal cookie
  293  *                              data for the operation
  294  * @param[in] qatPacketType     QAT partial packet type (start/mid/end/none)
  295  * @param[out] ppIvBuffer       Returns a pointer to an IV buffer.
  296  *
  297  *
  298  * @retval CPA_STATUS_SUCCESS       Function executed successfully.
  299  * @retval CPA_STATUS_FAIL           Function failed.
  300  * @retval CPA_STATUS_INVALID_PARAM  Invalid parameter.
  301  *
  302  * @see LacCipher_Perform(), LacCipher_IvBufferRestore()
  303  *
  304  * @note LacCipher_IvBufferRestore() must be called when the request is
  305  *       completed to update the users IV buffer, only in the case of partial
  306  *       packet requests
  307  *
  308  *****************************************************************************/
  309 CpaStatus LacCipher_PerformIvCheck(sal_service_t *pService,
  310                                    lac_sym_bulk_cookie_t *pCbCookie,
  311                                    Cpa32U qatPacketType,
  312                                    Cpa8U **ppIvBuffer);
  313 
  314 /**
  315  *****************************************************************************
  316  * @ingroup LacCipher
  317  *      Return cipher slice type for given algorithm
  318  *
  319  * @description
  320  *      This function will check what cipher slice type should be used for given
  321  *      algorithms and CPM generation combination.
  322  *      Since CPM2.0 there is new UCS cipher slice available.
  323  *
  324  * @param[in] pService          Pointer to service struct
  325  * @param[in] cipherAlgorithm   cipher algorithm
  326  * @param[in] hashAlgorithm     hash algorithm
  327  *
  328  *****************************************************************************/
  329 Cpa32U LacCipher_GetCipherSliceType(sal_crypto_service_t *pService,
  330                                     CpaCySymCipherAlgorithm algorithm,
  331                                     CpaCySymHashAlgorithm hash);
  332 #endif /* LAC_SYM_CIPHER_H */

Cache object: 42e1897d5f754ff3f7ff96d819c191b8


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.