LCOV - code coverage report
Current view: top level - include/crypto - skcipher.h (source / functions) Hit Total Coverage
Test: Real Lines: 0 33 0.0 %
Date: 2020-10-17 15:46:16 Functions: 0 1 0.0 %
Legend: Neither, QEMU, Real, Both Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: GPL-2.0-or-later */
       2                 :            : /*
       3                 :            :  * Symmetric key ciphers.
       4                 :            :  * 
       5                 :            :  * Copyright (c) 2007-2015 Herbert Xu <herbert@gondor.apana.org.au>
       6                 :            :  */
       7                 :            : 
       8                 :            : #ifndef _CRYPTO_SKCIPHER_H
       9                 :            : #define _CRYPTO_SKCIPHER_H
      10                 :            : 
      11                 :            : #include <linux/crypto.h>
      12                 :            : #include <linux/kernel.h>
      13                 :            : #include <linux/slab.h>
      14                 :            : 
      15                 :            : /**
      16                 :            :  *      struct skcipher_request - Symmetric key cipher request
      17                 :            :  *      @cryptlen: Number of bytes to encrypt or decrypt
      18                 :            :  *      @iv: Initialisation Vector
      19                 :            :  *      @src: Source SG list
      20                 :            :  *      @dst: Destination SG list
      21                 :            :  *      @base: Underlying async request request
      22                 :            :  *      @__ctx: Start of private context data
      23                 :            :  */
      24                 :            : struct skcipher_request {
      25                 :            :         unsigned int cryptlen;
      26                 :            : 
      27                 :            :         u8 *iv;
      28                 :            : 
      29                 :            :         struct scatterlist *src;
      30                 :            :         struct scatterlist *dst;
      31                 :            : 
      32                 :            :         struct crypto_async_request base;
      33                 :            : 
      34                 :            :         void *__ctx[] CRYPTO_MINALIGN_ATTR;
      35                 :            : };
      36                 :            : 
      37                 :            : struct crypto_skcipher {
      38                 :            :         int (*setkey)(struct crypto_skcipher *tfm, const u8 *key,
      39                 :            :                       unsigned int keylen);
      40                 :            :         int (*encrypt)(struct skcipher_request *req);
      41                 :            :         int (*decrypt)(struct skcipher_request *req);
      42                 :            : 
      43                 :            :         unsigned int ivsize;
      44                 :            :         unsigned int reqsize;
      45                 :            :         unsigned int keysize;
      46                 :            : 
      47                 :            :         struct crypto_tfm base;
      48                 :            : };
      49                 :            : 
      50                 :            : struct crypto_sync_skcipher {
      51                 :            :         struct crypto_skcipher base;
      52                 :            : };
      53                 :            : 
      54                 :            : /**
      55                 :            :  * struct skcipher_alg - symmetric key cipher definition
      56                 :            :  * @min_keysize: Minimum key size supported by the transformation. This is the
      57                 :            :  *               smallest key length supported by this transformation algorithm.
      58                 :            :  *               This must be set to one of the pre-defined values as this is
      59                 :            :  *               not hardware specific. Possible values for this field can be
      60                 :            :  *               found via git grep "_MIN_KEY_SIZE" include/crypto/
      61                 :            :  * @max_keysize: Maximum key size supported by the transformation. This is the
      62                 :            :  *               largest key length supported by this transformation algorithm.
      63                 :            :  *               This must be set to one of the pre-defined values as this is
      64                 :            :  *               not hardware specific. Possible values for this field can be
      65                 :            :  *               found via git grep "_MAX_KEY_SIZE" include/crypto/
      66                 :            :  * @setkey: Set key for the transformation. This function is used to either
      67                 :            :  *          program a supplied key into the hardware or store the key in the
      68                 :            :  *          transformation context for programming it later. Note that this
      69                 :            :  *          function does modify the transformation context. This function can
      70                 :            :  *          be called multiple times during the existence of the transformation
      71                 :            :  *          object, so one must make sure the key is properly reprogrammed into
      72                 :            :  *          the hardware. This function is also responsible for checking the key
      73                 :            :  *          length for validity. In case a software fallback was put in place in
      74                 :            :  *          the @cra_init call, this function might need to use the fallback if
      75                 :            :  *          the algorithm doesn't support all of the key sizes.
      76                 :            :  * @encrypt: Encrypt a scatterlist of blocks. This function is used to encrypt
      77                 :            :  *           the supplied scatterlist containing the blocks of data. The crypto
      78                 :            :  *           API consumer is responsible for aligning the entries of the
      79                 :            :  *           scatterlist properly and making sure the chunks are correctly
      80                 :            :  *           sized. In case a software fallback was put in place in the
      81                 :            :  *           @cra_init call, this function might need to use the fallback if
      82                 :            :  *           the algorithm doesn't support all of the key sizes. In case the
      83                 :            :  *           key was stored in transformation context, the key might need to be
      84                 :            :  *           re-programmed into the hardware in this function. This function
      85                 :            :  *           shall not modify the transformation context, as this function may
      86                 :            :  *           be called in parallel with the same transformation object.
      87                 :            :  * @decrypt: Decrypt a single block. This is a reverse counterpart to @encrypt
      88                 :            :  *           and the conditions are exactly the same.
      89                 :            :  * @init: Initialize the cryptographic transformation object. This function
      90                 :            :  *        is used to initialize the cryptographic transformation object.
      91                 :            :  *        This function is called only once at the instantiation time, right
      92                 :            :  *        after the transformation context was allocated. In case the
      93                 :            :  *        cryptographic hardware has some special requirements which need to
      94                 :            :  *        be handled by software, this function shall check for the precise
      95                 :            :  *        requirement of the transformation and put any software fallbacks
      96                 :            :  *        in place.
      97                 :            :  * @exit: Deinitialize the cryptographic transformation object. This is a
      98                 :            :  *        counterpart to @init, used to remove various changes set in
      99                 :            :  *        @init.
     100                 :            :  * @ivsize: IV size applicable for transformation. The consumer must provide an
     101                 :            :  *          IV of exactly that size to perform the encrypt or decrypt operation.
     102                 :            :  * @chunksize: Equal to the block size except for stream ciphers such as
     103                 :            :  *             CTR where it is set to the underlying block size.
     104                 :            :  * @walksize: Equal to the chunk size except in cases where the algorithm is
     105                 :            :  *            considerably more efficient if it can operate on multiple chunks
     106                 :            :  *            in parallel. Should be a multiple of chunksize.
     107                 :            :  * @base: Definition of a generic crypto algorithm.
     108                 :            :  *
     109                 :            :  * All fields except @ivsize are mandatory and must be filled.
     110                 :            :  */
     111                 :            : struct skcipher_alg {
     112                 :            :         int (*setkey)(struct crypto_skcipher *tfm, const u8 *key,
     113                 :            :                       unsigned int keylen);
     114                 :            :         int (*encrypt)(struct skcipher_request *req);
     115                 :            :         int (*decrypt)(struct skcipher_request *req);
     116                 :            :         int (*init)(struct crypto_skcipher *tfm);
     117                 :            :         void (*exit)(struct crypto_skcipher *tfm);
     118                 :            : 
     119                 :            :         unsigned int min_keysize;
     120                 :            :         unsigned int max_keysize;
     121                 :            :         unsigned int ivsize;
     122                 :            :         unsigned int chunksize;
     123                 :            :         unsigned int walksize;
     124                 :            : 
     125                 :            :         struct crypto_alg base;
     126                 :            : };
     127                 :            : 
     128                 :            : #define MAX_SYNC_SKCIPHER_REQSIZE      384
     129                 :            : /*
     130                 :            :  * This performs a type-check against the "tfm" argument to make sure
     131                 :            :  * all users have the correct skcipher tfm for doing on-stack requests.
     132                 :            :  */
     133                 :            : #define SYNC_SKCIPHER_REQUEST_ON_STACK(name, tfm) \
     134                 :            :         char __##name##_desc[sizeof(struct skcipher_request) + \
     135                 :            :                              MAX_SYNC_SKCIPHER_REQSIZE + \
     136                 :            :                              (!(sizeof((struct crypto_sync_skcipher *)1 == \
     137                 :            :                                        (typeof(tfm))1))) \
     138                 :            :                             ] CRYPTO_MINALIGN_ATTR; \
     139                 :            :         struct skcipher_request *name = (void *)__##name##_desc
     140                 :            : 
     141                 :            : /**
     142                 :            :  * DOC: Symmetric Key Cipher API
     143                 :            :  *
     144                 :            :  * Symmetric key cipher API is used with the ciphers of type
     145                 :            :  * CRYPTO_ALG_TYPE_SKCIPHER (listed as type "skcipher" in /proc/crypto).
     146                 :            :  *
     147                 :            :  * Asynchronous cipher operations imply that the function invocation for a
     148                 :            :  * cipher request returns immediately before the completion of the operation.
     149                 :            :  * The cipher request is scheduled as a separate kernel thread and therefore
     150                 :            :  * load-balanced on the different CPUs via the process scheduler. To allow
     151                 :            :  * the kernel crypto API to inform the caller about the completion of a cipher
     152                 :            :  * request, the caller must provide a callback function. That function is
     153                 :            :  * invoked with the cipher handle when the request completes.
     154                 :            :  *
     155                 :            :  * To support the asynchronous operation, additional information than just the
     156                 :            :  * cipher handle must be supplied to the kernel crypto API. That additional
     157                 :            :  * information is given by filling in the skcipher_request data structure.
     158                 :            :  *
     159                 :            :  * For the symmetric key cipher API, the state is maintained with the tfm
     160                 :            :  * cipher handle. A single tfm can be used across multiple calls and in
     161                 :            :  * parallel. For asynchronous block cipher calls, context data supplied and
     162                 :            :  * only used by the caller can be referenced the request data structure in
     163                 :            :  * addition to the IV used for the cipher request. The maintenance of such
     164                 :            :  * state information would be important for a crypto driver implementer to
     165                 :            :  * have, because when calling the callback function upon completion of the
     166                 :            :  * cipher operation, that callback function may need some information about
     167                 :            :  * which operation just finished if it invoked multiple in parallel. This
     168                 :            :  * state information is unused by the kernel crypto API.
     169                 :            :  */
     170                 :            : 
     171                 :            : static inline struct crypto_skcipher *__crypto_skcipher_cast(
     172                 :            :         struct crypto_tfm *tfm)
     173                 :            : {
     174                 :          0 :         return container_of(tfm, struct crypto_skcipher, base);
     175                 :            : }
     176                 :            : 
     177                 :            : /**
     178                 :            :  * crypto_alloc_skcipher() - allocate symmetric key cipher handle
     179                 :            :  * @alg_name: is the cra_name / name or cra_driver_name / driver name of the
     180                 :            :  *            skcipher cipher
     181                 :            :  * @type: specifies the type of the cipher
     182                 :            :  * @mask: specifies the mask for the cipher
     183                 :            :  *
     184                 :            :  * Allocate a cipher handle for an skcipher. The returned struct
     185                 :            :  * crypto_skcipher is the cipher handle that is required for any subsequent
     186                 :            :  * API invocation for that skcipher.
     187                 :            :  *
     188                 :            :  * Return: allocated cipher handle in case of success; IS_ERR() is true in case
     189                 :            :  *         of an error, PTR_ERR() returns the error code.
     190                 :            :  */
     191                 :            : struct crypto_skcipher *crypto_alloc_skcipher(const char *alg_name,
     192                 :            :                                               u32 type, u32 mask);
     193                 :            : 
     194                 :            : struct crypto_sync_skcipher *crypto_alloc_sync_skcipher(const char *alg_name,
     195                 :            :                                               u32 type, u32 mask);
     196                 :            : 
     197                 :            : static inline struct crypto_tfm *crypto_skcipher_tfm(
     198                 :            :         struct crypto_skcipher *tfm)
     199                 :            : {
     200                 :          0 :         return &tfm->base;
     201                 :            : }
     202                 :            : 
     203                 :            : /**
     204                 :            :  * crypto_free_skcipher() - zeroize and free cipher handle
     205                 :            :  * @tfm: cipher handle to be freed
     206                 :            :  */
     207                 :            : static inline void crypto_free_skcipher(struct crypto_skcipher *tfm)
     208                 :            : {
     209                 :          0 :         crypto_destroy_tfm(tfm, crypto_skcipher_tfm(tfm));
     210                 :            : }
     211                 :            : 
     212                 :            : static inline void crypto_free_sync_skcipher(struct crypto_sync_skcipher *tfm)
     213                 :            : {
     214                 :          0 :         crypto_free_skcipher(&tfm->base);
     215                 :            : }
     216                 :            : 
     217                 :            : /**
     218                 :            :  * crypto_has_skcipher() - Search for the availability of an skcipher.
     219                 :            :  * @alg_name: is the cra_name / name or cra_driver_name / driver name of the
     220                 :            :  *            skcipher
     221                 :            :  * @type: specifies the type of the cipher
     222                 :            :  * @mask: specifies the mask for the cipher
     223                 :            :  *
     224                 :            :  * Return: true when the skcipher is known to the kernel crypto API; false
     225                 :            :  *         otherwise
     226                 :            :  */
     227                 :            : static inline int crypto_has_skcipher(const char *alg_name, u32 type,
     228                 :            :                                         u32 mask)
     229                 :            : {
     230                 :          0 :         return crypto_has_alg(alg_name, crypto_skcipher_type(type),
     231                 :            :                               crypto_skcipher_mask(mask));
     232                 :            : }
     233                 :            : 
     234                 :            : /**
     235                 :            :  * crypto_has_skcipher2() - Search for the availability of an skcipher.
     236                 :            :  * @alg_name: is the cra_name / name or cra_driver_name / driver name of the
     237                 :            :  *            skcipher
     238                 :            :  * @type: specifies the type of the skcipher
     239                 :            :  * @mask: specifies the mask for the skcipher
     240                 :            :  *
     241                 :            :  * Return: true when the skcipher is known to the kernel crypto API; false
     242                 :            :  *         otherwise
     243                 :            :  */
     244                 :            : int crypto_has_skcipher2(const char *alg_name, u32 type, u32 mask);
     245                 :            : 
     246                 :            : static inline const char *crypto_skcipher_driver_name(
     247                 :            :         struct crypto_skcipher *tfm)
     248                 :            : {
     249                 :            :         return crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm));
     250                 :            : }
     251                 :            : 
     252                 :            : static inline struct skcipher_alg *crypto_skcipher_alg(
     253                 :            :         struct crypto_skcipher *tfm)
     254                 :            : {
     255                 :          0 :         return container_of(crypto_skcipher_tfm(tfm)->__crt_alg,
     256                 :            :                             struct skcipher_alg, base);
     257                 :            : }
     258                 :            : 
     259                 :            : static inline unsigned int crypto_skcipher_alg_ivsize(struct skcipher_alg *alg)
     260                 :            : {
     261                 :          0 :         if ((alg->base.cra_flags & CRYPTO_ALG_TYPE_MASK) ==
     262                 :            :             CRYPTO_ALG_TYPE_BLKCIPHER)
     263                 :          0 :                 return alg->base.cra_blkcipher.ivsize;
     264                 :            : 
     265                 :          0 :         if (alg->base.cra_ablkcipher.encrypt)
     266                 :          0 :                 return alg->base.cra_ablkcipher.ivsize;
     267                 :            : 
     268                 :          0 :         return alg->ivsize;
     269                 :            : }
     270                 :            : 
     271                 :            : /**
     272                 :            :  * crypto_skcipher_ivsize() - obtain IV size
     273                 :            :  * @tfm: cipher handle
     274                 :            :  *
     275                 :            :  * The size of the IV for the skcipher referenced by the cipher handle is
     276                 :            :  * returned. This IV size may be zero if the cipher does not need an IV.
     277                 :            :  *
     278                 :            :  * Return: IV size in bytes
     279                 :            :  */
     280                 :            : static inline unsigned int crypto_skcipher_ivsize(struct crypto_skcipher *tfm)
     281                 :            : {
     282                 :          0 :         return tfm->ivsize;
     283                 :            : }
     284                 :            : 
     285                 :            : static inline unsigned int crypto_sync_skcipher_ivsize(
     286                 :            :         struct crypto_sync_skcipher *tfm)
     287                 :            : {
     288                 :            :         return crypto_skcipher_ivsize(&tfm->base);
     289                 :            : }
     290                 :            : 
     291                 :            : /**
     292                 :            :  * crypto_skcipher_blocksize() - obtain block size of cipher
     293                 :            :  * @tfm: cipher handle
     294                 :            :  *
     295                 :            :  * The block size for the skcipher referenced with the cipher handle is
     296                 :            :  * returned. The caller may use that information to allocate appropriate
     297                 :            :  * memory for the data returned by the encryption or decryption operation
     298                 :            :  *
     299                 :            :  * Return: block size of cipher
     300                 :            :  */
     301                 :            : static inline unsigned int crypto_skcipher_blocksize(
     302                 :            :         struct crypto_skcipher *tfm)
     303                 :            : {
     304                 :            :         return crypto_tfm_alg_blocksize(crypto_skcipher_tfm(tfm));
     305                 :            : }
     306                 :            : 
     307                 :            : static inline unsigned int crypto_skcipher_alg_chunksize(
     308                 :            :         struct skcipher_alg *alg)
     309                 :            : {
     310                 :          0 :         if ((alg->base.cra_flags & CRYPTO_ALG_TYPE_MASK) ==
     311                 :            :             CRYPTO_ALG_TYPE_BLKCIPHER)
     312                 :          0 :                 return alg->base.cra_blocksize;
     313                 :            : 
     314                 :          0 :         if (alg->base.cra_ablkcipher.encrypt)
     315                 :          0 :                 return alg->base.cra_blocksize;
     316                 :            : 
     317                 :          0 :         return alg->chunksize;
     318                 :            : }
     319                 :            : 
     320                 :            : /**
     321                 :            :  * crypto_skcipher_chunksize() - obtain chunk size
     322                 :            :  * @tfm: cipher handle
     323                 :            :  *
     324                 :            :  * The block size is set to one for ciphers such as CTR.  However,
     325                 :            :  * you still need to provide incremental updates in multiples of
     326                 :            :  * the underlying block size as the IV does not have sub-block
     327                 :            :  * granularity.  This is known in this API as the chunk size.
     328                 :            :  *
     329                 :            :  * Return: chunk size in bytes
     330                 :            :  */
     331                 :            : static inline unsigned int crypto_skcipher_chunksize(
     332                 :            :         struct crypto_skcipher *tfm)
     333                 :            : {
     334                 :            :         return crypto_skcipher_alg_chunksize(crypto_skcipher_alg(tfm));
     335                 :            : }
     336                 :            : 
     337                 :            : static inline unsigned int crypto_sync_skcipher_blocksize(
     338                 :            :         struct crypto_sync_skcipher *tfm)
     339                 :            : {
     340                 :            :         return crypto_skcipher_blocksize(&tfm->base);
     341                 :            : }
     342                 :            : 
     343                 :            : static inline unsigned int crypto_skcipher_alignmask(
     344                 :            :         struct crypto_skcipher *tfm)
     345                 :            : {
     346                 :            :         return crypto_tfm_alg_alignmask(crypto_skcipher_tfm(tfm));
     347                 :            : }
     348                 :            : 
     349                 :            : static inline u32 crypto_skcipher_get_flags(struct crypto_skcipher *tfm)
     350                 :            : {
     351                 :            :         return crypto_tfm_get_flags(crypto_skcipher_tfm(tfm));
     352                 :            : }
     353                 :            : 
     354                 :            : static inline void crypto_skcipher_set_flags(struct crypto_skcipher *tfm,
     355                 :            :                                                u32 flags)
     356                 :            : {
     357                 :            :         crypto_tfm_set_flags(crypto_skcipher_tfm(tfm), flags);
     358                 :            : }
     359                 :            : 
     360                 :            : static inline void crypto_skcipher_clear_flags(struct crypto_skcipher *tfm,
     361                 :            :                                                  u32 flags)
     362                 :            : {
     363                 :            :         crypto_tfm_clear_flags(crypto_skcipher_tfm(tfm), flags);
     364                 :            : }
     365                 :            : 
     366                 :            : static inline u32 crypto_sync_skcipher_get_flags(
     367                 :            :         struct crypto_sync_skcipher *tfm)
     368                 :            : {
     369                 :            :         return crypto_skcipher_get_flags(&tfm->base);
     370                 :            : }
     371                 :            : 
     372                 :            : static inline void crypto_sync_skcipher_set_flags(
     373                 :            :         struct crypto_sync_skcipher *tfm, u32 flags)
     374                 :            : {
     375                 :            :         crypto_skcipher_set_flags(&tfm->base, flags);
     376                 :            : }
     377                 :            : 
     378                 :            : static inline void crypto_sync_skcipher_clear_flags(
     379                 :            :         struct crypto_sync_skcipher *tfm, u32 flags)
     380                 :            : {
     381                 :            :         crypto_skcipher_clear_flags(&tfm->base, flags);
     382                 :            : }
     383                 :            : 
     384                 :            : /**
     385                 :            :  * crypto_skcipher_setkey() - set key for cipher
     386                 :            :  * @tfm: cipher handle
     387                 :            :  * @key: buffer holding the key
     388                 :            :  * @keylen: length of the key in bytes
     389                 :            :  *
     390                 :            :  * The caller provided key is set for the skcipher referenced by the cipher
     391                 :            :  * handle.
     392                 :            :  *
     393                 :            :  * Note, the key length determines the cipher type. Many block ciphers implement
     394                 :            :  * different cipher modes depending on the key size, such as AES-128 vs AES-192
     395                 :            :  * vs. AES-256. When providing a 16 byte key for an AES cipher handle, AES-128
     396                 :            :  * is performed.
     397                 :            :  *
     398                 :            :  * Return: 0 if the setting of the key was successful; < 0 if an error occurred
     399                 :            :  */
     400                 :            : static inline int crypto_skcipher_setkey(struct crypto_skcipher *tfm,
     401                 :            :                                          const u8 *key, unsigned int keylen)
     402                 :            : {
     403                 :          0 :         return tfm->setkey(tfm, key, keylen);
     404                 :            : }
     405                 :            : 
     406                 :            : static inline int crypto_sync_skcipher_setkey(struct crypto_sync_skcipher *tfm,
     407                 :            :                                          const u8 *key, unsigned int keylen)
     408                 :            : {
     409                 :            :         return crypto_skcipher_setkey(&tfm->base, key, keylen);
     410                 :            : }
     411                 :            : 
     412                 :            : static inline unsigned int crypto_skcipher_default_keysize(
     413                 :            :         struct crypto_skcipher *tfm)
     414                 :            : {
     415                 :            :         return tfm->keysize;
     416                 :            : }
     417                 :            : 
     418                 :            : /**
     419                 :            :  * crypto_skcipher_reqtfm() - obtain cipher handle from request
     420                 :            :  * @req: skcipher_request out of which the cipher handle is to be obtained
     421                 :            :  *
     422                 :            :  * Return the crypto_skcipher handle when furnishing an skcipher_request
     423                 :            :  * data structure.
     424                 :            :  *
     425                 :            :  * Return: crypto_skcipher handle
     426                 :            :  */
     427                 :            : static inline struct crypto_skcipher *crypto_skcipher_reqtfm(
     428                 :            :         struct skcipher_request *req)
     429                 :            : {
     430                 :          0 :         return __crypto_skcipher_cast(req->base.tfm);
     431                 :            : }
     432                 :            : 
     433                 :            : static inline struct crypto_sync_skcipher *crypto_sync_skcipher_reqtfm(
     434                 :            :         struct skcipher_request *req)
     435                 :            : {
     436                 :            :         struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
     437                 :            : 
     438                 :            :         return container_of(tfm, struct crypto_sync_skcipher, base);
     439                 :            : }
     440                 :            : 
     441                 :            : /**
     442                 :            :  * crypto_skcipher_encrypt() - encrypt plaintext
     443                 :            :  * @req: reference to the skcipher_request handle that holds all information
     444                 :            :  *       needed to perform the cipher operation
     445                 :            :  *
     446                 :            :  * Encrypt plaintext data using the skcipher_request handle. That data
     447                 :            :  * structure and how it is filled with data is discussed with the
     448                 :            :  * skcipher_request_* functions.
     449                 :            :  *
     450                 :            :  * Return: 0 if the cipher operation was successful; < 0 if an error occurred
     451                 :            :  */
     452                 :            : int crypto_skcipher_encrypt(struct skcipher_request *req);
     453                 :            : 
     454                 :            : /**
     455                 :            :  * crypto_skcipher_decrypt() - decrypt ciphertext
     456                 :            :  * @req: reference to the skcipher_request handle that holds all information
     457                 :            :  *       needed to perform the cipher operation
     458                 :            :  *
     459                 :            :  * Decrypt ciphertext data using the skcipher_request handle. That data
     460                 :            :  * structure and how it is filled with data is discussed with the
     461                 :            :  * skcipher_request_* functions.
     462                 :            :  *
     463                 :            :  * Return: 0 if the cipher operation was successful; < 0 if an error occurred
     464                 :            :  */
     465                 :            : int crypto_skcipher_decrypt(struct skcipher_request *req);
     466                 :            : 
     467                 :            : /**
     468                 :            :  * DOC: Symmetric Key Cipher Request Handle
     469                 :            :  *
     470                 :            :  * The skcipher_request data structure contains all pointers to data
     471                 :            :  * required for the symmetric key cipher operation. This includes the cipher
     472                 :            :  * handle (which can be used by multiple skcipher_request instances), pointer
     473                 :            :  * to plaintext and ciphertext, asynchronous callback function, etc. It acts
     474                 :            :  * as a handle to the skcipher_request_* API calls in a similar way as
     475                 :            :  * skcipher handle to the crypto_skcipher_* API calls.
     476                 :            :  */
     477                 :            : 
     478                 :            : /**
     479                 :            :  * crypto_skcipher_reqsize() - obtain size of the request data structure
     480                 :            :  * @tfm: cipher handle
     481                 :            :  *
     482                 :            :  * Return: number of bytes
     483                 :            :  */
     484                 :            : static inline unsigned int crypto_skcipher_reqsize(struct crypto_skcipher *tfm)
     485                 :            : {
     486                 :          0 :         return tfm->reqsize;
     487                 :            : }
     488                 :            : 
     489                 :            : /**
     490                 :            :  * skcipher_request_set_tfm() - update cipher handle reference in request
     491                 :            :  * @req: request handle to be modified
     492                 :            :  * @tfm: cipher handle that shall be added to the request handle
     493                 :            :  *
     494                 :            :  * Allow the caller to replace the existing skcipher handle in the request
     495                 :            :  * data structure with a different one.
     496                 :            :  */
     497                 :            : static inline void skcipher_request_set_tfm(struct skcipher_request *req,
     498                 :            :                                             struct crypto_skcipher *tfm)
     499                 :            : {
     500                 :          0 :         req->base.tfm = crypto_skcipher_tfm(tfm);
     501                 :            : }
     502                 :            : 
     503                 :            : static inline void skcipher_request_set_sync_tfm(struct skcipher_request *req,
     504                 :            :                                             struct crypto_sync_skcipher *tfm)
     505                 :            : {
     506                 :            :         skcipher_request_set_tfm(req, &tfm->base);
     507                 :            : }
     508                 :            : 
     509                 :            : static inline struct skcipher_request *skcipher_request_cast(
     510                 :            :         struct crypto_async_request *req)
     511                 :            : {
     512                 :            :         return container_of(req, struct skcipher_request, base);
     513                 :            : }
     514                 :            : 
     515                 :            : /**
     516                 :            :  * skcipher_request_alloc() - allocate request data structure
     517                 :            :  * @tfm: cipher handle to be registered with the request
     518                 :            :  * @gfp: memory allocation flag that is handed to kmalloc by the API call.
     519                 :            :  *
     520                 :            :  * Allocate the request data structure that must be used with the skcipher
     521                 :            :  * encrypt and decrypt API calls. During the allocation, the provided skcipher
     522                 :            :  * handle is registered in the request data structure.
     523                 :            :  *
     524                 :            :  * Return: allocated request handle in case of success, or NULL if out of memory
     525                 :            :  */
     526                 :          0 : static inline struct skcipher_request *skcipher_request_alloc(
     527                 :            :         struct crypto_skcipher *tfm, gfp_t gfp)
     528                 :            : {
     529                 :            :         struct skcipher_request *req;
     530                 :            : 
     531                 :          0 :         req = kmalloc(sizeof(struct skcipher_request) +
     532                 :            :                       crypto_skcipher_reqsize(tfm), gfp);
     533                 :            : 
     534                 :          0 :         if (likely(req))
     535                 :            :                 skcipher_request_set_tfm(req, tfm);
     536                 :            : 
     537                 :          0 :         return req;
     538                 :            : }
     539                 :            : 
     540                 :            : /**
     541                 :            :  * skcipher_request_free() - zeroize and free request data structure
     542                 :            :  * @req: request data structure cipher handle to be freed
     543                 :            :  */
     544                 :            : static inline void skcipher_request_free(struct skcipher_request *req)
     545                 :            : {
     546                 :          0 :         kzfree(req);
     547                 :            : }
     548                 :            : 
     549                 :            : static inline void skcipher_request_zero(struct skcipher_request *req)
     550                 :            : {
     551                 :            :         struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
     552                 :            : 
     553                 :            :         memzero_explicit(req, sizeof(*req) + crypto_skcipher_reqsize(tfm));
     554                 :            : }
     555                 :            : 
     556                 :            : /**
     557                 :            :  * skcipher_request_set_callback() - set asynchronous callback function
     558                 :            :  * @req: request handle
     559                 :            :  * @flags: specify zero or an ORing of the flags
     560                 :            :  *         CRYPTO_TFM_REQ_MAY_BACKLOG the request queue may back log and
     561                 :            :  *         increase the wait queue beyond the initial maximum size;
     562                 :            :  *         CRYPTO_TFM_REQ_MAY_SLEEP the request processing may sleep
     563                 :            :  * @compl: callback function pointer to be registered with the request handle
     564                 :            :  * @data: The data pointer refers to memory that is not used by the kernel
     565                 :            :  *        crypto API, but provided to the callback function for it to use. Here,
     566                 :            :  *        the caller can provide a reference to memory the callback function can
     567                 :            :  *        operate on. As the callback function is invoked asynchronously to the
     568                 :            :  *        related functionality, it may need to access data structures of the
     569                 :            :  *        related functionality which can be referenced using this pointer. The
     570                 :            :  *        callback function can access the memory via the "data" field in the
     571                 :            :  *        crypto_async_request data structure provided to the callback function.
     572                 :            :  *
     573                 :            :  * This function allows setting the callback function that is triggered once the
     574                 :            :  * cipher operation completes.
     575                 :            :  *
     576                 :            :  * The callback function is registered with the skcipher_request handle and
     577                 :            :  * must comply with the following template::
     578                 :            :  *
     579                 :            :  *      void callback_function(struct crypto_async_request *req, int error)
     580                 :            :  */
     581                 :            : static inline void skcipher_request_set_callback(struct skcipher_request *req,
     582                 :            :                                                  u32 flags,
     583                 :            :                                                  crypto_completion_t compl,
     584                 :            :                                                  void *data)
     585                 :            : {
     586                 :          0 :         req->base.complete = compl;
     587                 :          0 :         req->base.data = data;
     588                 :          0 :         req->base.flags = flags;
     589                 :            : }
     590                 :            : 
     591                 :            : /**
     592                 :            :  * skcipher_request_set_crypt() - set data buffers
     593                 :            :  * @req: request handle
     594                 :            :  * @src: source scatter / gather list
     595                 :            :  * @dst: destination scatter / gather list
     596                 :            :  * @cryptlen: number of bytes to process from @src
     597                 :            :  * @iv: IV for the cipher operation which must comply with the IV size defined
     598                 :            :  *      by crypto_skcipher_ivsize
     599                 :            :  *
     600                 :            :  * This function allows setting of the source data and destination data
     601                 :            :  * scatter / gather lists.
     602                 :            :  *
     603                 :            :  * For encryption, the source is treated as the plaintext and the
     604                 :            :  * destination is the ciphertext. For a decryption operation, the use is
     605                 :            :  * reversed - the source is the ciphertext and the destination is the plaintext.
     606                 :            :  */
     607                 :            : static inline void skcipher_request_set_crypt(
     608                 :            :         struct skcipher_request *req,
     609                 :            :         struct scatterlist *src, struct scatterlist *dst,
     610                 :            :         unsigned int cryptlen, void *iv)
     611                 :            : {
     612                 :          0 :         req->src = src;
     613                 :          0 :         req->dst = dst;
     614                 :          0 :         req->cryptlen = cryptlen;
     615                 :          0 :         req->iv = iv;
     616                 :            : }
     617                 :            : 
     618                 :            : #endif  /* _CRYPTO_SKCIPHER_H */
     619                 :            : 
    

Generated by: LCOV version 1.14