root/include/crypto/skcipher.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. __crypto_skcipher_cast
  2. crypto_skcipher_tfm
  3. crypto_free_skcipher
  4. crypto_free_sync_skcipher
  5. crypto_has_skcipher
  6. crypto_skcipher_driver_name
  7. crypto_skcipher_alg
  8. crypto_skcipher_alg_ivsize
  9. crypto_skcipher_ivsize
  10. crypto_sync_skcipher_ivsize
  11. crypto_skcipher_blocksize
  12. crypto_skcipher_alg_chunksize
  13. crypto_skcipher_chunksize
  14. crypto_sync_skcipher_blocksize
  15. crypto_skcipher_alignmask
  16. crypto_skcipher_get_flags
  17. crypto_skcipher_set_flags
  18. crypto_skcipher_clear_flags
  19. crypto_sync_skcipher_get_flags
  20. crypto_sync_skcipher_set_flags
  21. crypto_sync_skcipher_clear_flags
  22. crypto_skcipher_setkey
  23. crypto_sync_skcipher_setkey
  24. crypto_skcipher_default_keysize
  25. crypto_skcipher_reqtfm
  26. crypto_sync_skcipher_reqtfm
  27. crypto_skcipher_reqsize
  28. skcipher_request_set_tfm
  29. skcipher_request_set_sync_tfm
  30. skcipher_request_cast
  31. skcipher_request_alloc
  32. skcipher_request_free
  33. skcipher_request_zero
  34. skcipher_request_set_callback
  35. skcipher_request_set_crypt

   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         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         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         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         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         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         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         if ((alg->base.cra_flags & CRYPTO_ALG_TYPE_MASK) ==
 262             CRYPTO_ALG_TYPE_BLKCIPHER)
 263                 return alg->base.cra_blkcipher.ivsize;
 264 
 265         if (alg->base.cra_ablkcipher.encrypt)
 266                 return alg->base.cra_ablkcipher.ivsize;
 267 
 268         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         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         if ((alg->base.cra_flags & CRYPTO_ALG_TYPE_MASK) ==
 311             CRYPTO_ALG_TYPE_BLKCIPHER)
 312                 return alg->base.cra_blocksize;
 313 
 314         if (alg->base.cra_ablkcipher.encrypt)
 315                 return alg->base.cra_blocksize;
 316 
 317         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         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         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         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         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 static inline struct skcipher_request *skcipher_request_alloc(
 527         struct crypto_skcipher *tfm, gfp_t gfp)
 528 {
 529         struct skcipher_request *req;
 530 
 531         req = kmalloc(sizeof(struct skcipher_request) +
 532                       crypto_skcipher_reqsize(tfm), gfp);
 533 
 534         if (likely(req))
 535                 skcipher_request_set_tfm(req, tfm);
 536 
 537         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         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         req->base.complete = compl;
 587         req->base.data = data;
 588         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         req->src = src;
 613         req->dst = dst;
 614         req->cryptlen = cryptlen;
 615         req->iv = iv;
 616 }
 617 
 618 #endif  /* _CRYPTO_SKCIPHER_H */
 619 

/* [<][>][^][v][top][bottom][index][help] */