| 1 |
|
| 2 | |
| 3 | * AEAD: Authenticated Encryption with Associated Data
|
| 4 | *
|
| 5 | * Copyright (c) 2007-2015 Herbert Xu <[email protected]>
|
| 6 |
|
| 7 |
|
| 8 | #ifndef _CRYPTO_AEAD_H
|
| 9 | #define _CRYPTO_AEAD_H
|
| 10 |
|
| 11 | #include <linux/atomic.h>
|
| 12 | #include <linux/container_of.h>
|
| 13 | #include <linux/crypto.h>
|
| 14 | #include <linux/slab.h>
|
| 15 | #include <linux/types.h>
|
| 16 |
|
| 17 | |
| 18 | * DOC: Authenticated Encryption With Associated Data (AEAD) Cipher API
|
| 19 | *
|
| 20 | * The AEAD cipher API is used with the ciphers of type CRYPTO_ALG_TYPE_AEAD
|
| 21 | * (listed as type "aead" in /proc/crypto)
|
| 22 | *
|
| 23 | * The most prominent examples for this type of encryption is GCM and CCM.
|
| 24 | * However, the kernel supports other types of AEAD ciphers which are defined
|
| 25 | * with the following cipher string:
|
| 26 | *
|
| 27 | * authenc(keyed message digest, block cipher)
|
| 28 | *
|
| 29 | * For example: authenc(hmac(sha256), cbc(aes))
|
| 30 | *
|
| 31 | * The example code provided for the symmetric key cipher operation applies
|
| 32 | * here as well. Naturally all *skcipher* symbols must be exchanged the *aead*
|
| 33 | * pendants discussed in the following. In addition, for the AEAD operation,
|
| 34 | * the aead_request_set_ad function must be used to set the pointer to the
|
| 35 | * associated data memory location before performing the encryption or
|
| 36 | * decryption operation. Another deviation from the asynchronous block cipher
|
| 37 | * operation is that the caller should explicitly check for -EBADMSG of the
|
| 38 | * crypto_aead_decrypt. That error indicates an authentication error, i.e.
|
| 39 | * a breach in the integrity of the message. In essence, that -EBADMSG error
|
| 40 | * code is the key bonus an AEAD cipher has over "standard" block chaining
|
| 41 | * modes.
|
| 42 | *
|
| 43 | * Memory Structure:
|
| 44 | *
|
| 45 | * The source scatterlist must contain the concatenation of
|
| 46 | * associated data || plaintext or ciphertext.
|
| 47 | *
|
| 48 | * The destination scatterlist has the same layout, except that the plaintext
|
| 49 | * (resp. ciphertext) will grow (resp. shrink) by the authentication tag size
|
| 50 | * during encryption (resp. decryption). The authentication tag is generated
|
| 51 | * during the encryption operation and appended to the ciphertext. During
|
| 52 | * decryption, the authentication tag is consumed along with the ciphertext and
|
| 53 | * used to verify the integrity of the plaintext and the associated data.
|
| 54 | *
|
| 55 | * In-place encryption/decryption is enabled by using the same scatterlist
|
| 56 | * pointer for both the source and destination.
|
| 57 | *
|
| 58 | * Even in the out-of-place case, space must be reserved in the destination for
|
| 59 | * the associated data, even though it won't be written to. This makes the
|
| 60 | * in-place and out-of-place cases more consistent. It is permissible for the
|
| 61 | * "destination" associated data to alias the "source" associated data.
|
| 62 | *
|
| 63 | * As with the other scatterlist crypto APIs, zero-length scatterlist elements
|
| 64 | * are not allowed in the used part of the scatterlist. Thus, if there is no
|
| 65 | * associated data, the first element must point to the plaintext/ciphertext.
|
| 66 | *
|
| 67 | * To meet the needs of IPsec, a special quirk applies to rfc4106, rfc4309,
|
| 68 | * rfc4543, and rfc7539esp ciphers. For these ciphers, the final 'ivsize' bytes
|
| 69 | * of the associated data buffer must contain a second copy of the IV. This is
|
| 70 | * in addition to the copy passed to aead_request_set_crypt(). These two IV
|
| 71 | * copies must not differ; different implementations of the same algorithm may
|
| 72 | * behave differently in that case. Note that the algorithm might not actually
|
| 73 | * treat the IV as associated data; nevertheless the length passed to
|
| 74 | * aead_request_set_ad() must include it.
|
| 75 |
|
| 76 |
|
| 77 | struct crypto_aead;
|
| 78 | struct scatterlist;
|
| 79 |
|
| 80 | |
| 81 | * struct aead_request - AEAD request
|
| 82 | * @base: Common attributes for async crypto requests
|
| 83 | * @assoclen: Length in bytes of associated data for authentication
|
| 84 | * @cryptlen: Length of data to be encrypted or decrypted
|
| 85 | * @iv: Initialisation vector
|
| 86 | * @src: Source data
|
| 87 | * @dst: Destination data
|
| 88 | * @__ctx: Start of private context data
|
| 89 |
|
| 90 | struct aead_request {
|
| 91 | struct crypto_async_request base;
|
| 92 |
|
| 93 | unsigned int assoclen;
|
| 94 | unsigned int cryptlen;
|
| 95 |
|
| 96 | u8 *iv;
|
| 97 |
|
| 98 | struct scatterlist *src;
|
| 99 | struct scatterlist *dst;
|
| 100 |
|
| 101 | void *__ctx[] CRYPTO_MINALIGN_ATTR;
|
| 102 | };
|
| 103 |
|
| 104 | |
| 105 | * struct aead_alg - AEAD cipher definition
|
| 106 | * @maxauthsize: Set the maximum authentication tag size supported by the
|
| 107 | * transformation. A transformation may support smaller tag sizes.
|
| 108 | * As the authentication tag is a message digest to ensure the
|
| 109 | * integrity of the encrypted data, a consumer typically wants the
|
| 110 | * largest authentication tag possible as defined by this
|
| 111 | * variable.
|
| 112 | * @setauthsize: Set authentication size for the AEAD transformation. This
|
| 113 | * function is used to specify the consumer requested size of the
|
| 114 | * authentication tag to be either generated by the transformation
|
| 115 | * during encryption or the size of the authentication tag to be
|
| 116 | * supplied during the decryption operation. This function is also
|
| 117 | * responsible for checking the authentication tag size for
|
| 118 | * validity.
|
| 119 | * @setkey: see struct skcipher_alg
|
| 120 | * @encrypt: see struct skcipher_alg
|
| 121 | * @decrypt: see struct skcipher_alg
|
| 122 | * @ivsize: see struct skcipher_alg
|
| 123 | * @chunksize: see struct skcipher_alg
|
| 124 | * @init: Initialize the cryptographic transformation object. This function
|
| 125 | * is used to initialize the cryptographic transformation object.
|
| 126 | * This function is called only once at the instantiation time, right
|
| 127 | * after the transformation context was allocated. In case the
|
| 128 | * cryptographic hardware has some special requirements which need to
|
| 129 | * be handled by software, this function shall check for the precise
|
| 130 | * requirement of the transformation and put any software fallbacks
|
| 131 | * in place.
|
| 132 | * @exit: Deinitialize the cryptographic transformation object. This is a
|
| 133 | * counterpart to @init, used to remove various changes set in
|
| 134 | * @init.
|
| 135 | * @base: Definition of a generic crypto cipher algorithm.
|
| 136 | *
|
| 137 | * All fields except @ivsize is mandatory and must be filled.
|
| 138 |
|
| 139 | struct aead_alg {
|
| 140 | int (*setkey)(struct crypto_aead *tfm, const u8 *key,
|
| 141 | unsigned int keylen);
|
| 142 | int (*setauthsize)(struct crypto_aead *tfm, unsigned int authsize);
|
| 143 | int (*encrypt)(struct aead_request *req);
|
| 144 | int (*decrypt)(struct aead_request *req);
|
| 145 | int (*init)(struct crypto_aead *tfm);
|
| 146 | void (*exit)(struct crypto_aead *tfm);
|
| 147 |
|
| 148 | unsigned int ivsize;
|
| 149 | unsigned int maxauthsize;
|
| 150 | unsigned int chunksize;
|
| 151 |
|
| 152 | struct crypto_alg base;
|
| 153 | };
|
| 154 |
|
| 155 | struct crypto_aead {
|
| 156 | unsigned int authsize;
|
| 157 | unsigned int reqsize;
|
| 158 |
|
| 159 | struct crypto_tfm base;
|
| 160 | };
|
| 161 |
|
| 162 | struct crypto_sync_aead {
|
| 163 | struct crypto_aead base;
|
| 164 | };
|
| 165 |
|
| 166 | #define MAX_SYNC_AEAD_REQSIZE 384
|
| 167 |
|
| 168 | #define SYNC_AEAD_REQUEST_ON_STACK(name, _tfm) \
|
| 169 | char __##name##_desc[sizeof(struct aead_request) + \
|
| 170 | MAX_SYNC_AEAD_REQSIZE \
|
| 171 | ] CRYPTO_MINALIGN_ATTR; \
|
| 172 | struct aead_request *name = \
|
| 173 | (((struct aead_request *)__##name##_desc)->base.tfm = \
|
| 174 | crypto_sync_aead_tfm((_tfm)), \
|
| 175 | (void *)__##name##_desc)
|
| 176 |
|
| 177 | static inline struct crypto_aead *__crypto_aead_cast(struct crypto_tfm *tfm)
|
| 178 | {
|
| 179 | return container_of(tfm, struct crypto_aead, base);
|
| 180 | }
|
| 181 |
|
| 182 | |
| 183 | * crypto_alloc_aead() - allocate AEAD cipher handle
|
| 184 | * @alg_name: is the cra_name / name or cra_driver_name / driver name of the
|
| 185 | * AEAD cipher
|
| 186 | * @type: specifies the type of the cipher
|
| 187 | * @mask: specifies the mask for the cipher
|
| 188 | *
|
| 189 | * Allocate a cipher handle for an AEAD. The returned struct
|
| 190 | * crypto_aead is the cipher handle that is required for any subsequent
|
| 191 | * API invocation for that AEAD.
|
| 192 | *
|
| 193 | * Return: allocated cipher handle in case of success; IS_ERR() is true in case
|
| 194 | * of an error, PTR_ERR() returns the error code.
|
| 195 |
|
| 196 | struct crypto_aead *crypto_alloc_aead(const char *alg_name, u32 type, u32 mask);
|
| 197 |
|
| 198 | struct crypto_sync_aead *crypto_alloc_sync_aead(const char *alg_name, u32 type, u32 mask);
|
| 199 |
|
| 200 | static inline struct crypto_tfm *crypto_aead_tfm(struct crypto_aead *tfm)
|
| 201 | {
|
| 202 | return &tfm->base;
|
| 203 | }
|
| 204 |
|
| 205 | static inline struct crypto_tfm *crypto_sync_aead_tfm(struct crypto_sync_aead *tfm)
|
| 206 | {
|
| 207 | return crypto_aead_tfm(&tfm->base);
|
| 208 | }
|
| 209 |
|
| 210 | |
| 211 | * crypto_free_aead() - zeroize and free aead handle
|
| 212 | * @tfm: cipher handle to be freed
|
| 213 | *
|
| 214 | * If @tfm is a NULL or error pointer, this function does nothing.
|
| 215 |
|
| 216 | static inline void crypto_free_aead(struct crypto_aead *tfm)
|
| 217 | {
|
| 218 | crypto_destroy_tfm(tfm, crypto_aead_tfm(tfm));
|
| 219 | }
|
| 220 |
|
| 221 | static inline void crypto_free_sync_aead(struct crypto_sync_aead *tfm)
|
| 222 | {
|
| 223 | crypto_free_aead(&tfm->base);
|
| 224 | }
|
| 225 |
|
| 226 | |
| 227 | * crypto_has_aead() - Search for the availability of an aead.
|
| 228 | * @alg_name: is the cra_name / name or cra_driver_name / driver name of the
|
| 229 | * aead
|
| 230 | * @type: specifies the type of the aead
|
| 231 | * @mask: specifies the mask for the aead
|
| 232 | *
|
| 233 | * Return: true when the aead is known to the kernel crypto API; false
|
| 234 | * otherwise
|
| 235 |
|
| 236 | int crypto_has_aead(const char *alg_name, u32 type, u32 mask);
|
| 237 |
|
| 238 | static inline const char *crypto_aead_driver_name(struct crypto_aead *tfm)
|
| 239 | {
|
| 240 | return crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
|
| 241 | }
|
| 242 |
|
| 243 | static inline struct aead_alg *crypto_aead_alg(struct crypto_aead *tfm)
|
| 244 | {
|
| 245 | return container_of(crypto_aead_tfm(tfm)->__crt_alg,
|
| 246 | struct aead_alg, base);
|
| 247 | }
|
| 248 |
|
| 249 | static inline unsigned int crypto_aead_alg_ivsize(struct aead_alg *alg)
|
| 250 | {
|
| 251 | return alg->ivsize;
|
| 252 | }
|
| 253 |
|
| 254 | |
| 255 | * crypto_aead_ivsize() - obtain IV size
|
| 256 | * @tfm: cipher handle
|
| 257 | *
|
| 258 | * The size of the IV for the aead referenced by the cipher handle is
|
| 259 | * returned. This IV size may be zero if the cipher does not need an IV.
|
| 260 | *
|
| 261 | * Return: IV size in bytes
|
| 262 |
|
| 263 | static inline unsigned int crypto_aead_ivsize(struct crypto_aead *tfm)
|
| 264 | {
|
| 265 | return crypto_aead_alg_ivsize(crypto_aead_alg(tfm));
|
| 266 | }
|
| 267 |
|
| 268 | static inline unsigned int crypto_sync_aead_ivsize(struct crypto_sync_aead *tfm)
|
| 269 | {
|
| 270 | return crypto_aead_ivsize(&tfm->base);
|
| 271 | }
|
| 272 |
|
| 273 | |
| 274 | * crypto_aead_authsize() - obtain maximum authentication data size
|
| 275 | * @tfm: cipher handle
|
| 276 | *
|
| 277 | * The maximum size of the authentication data for the AEAD cipher referenced
|
| 278 | * by the AEAD cipher handle is returned. The authentication data size may be
|
| 279 | * zero if the cipher implements a hard-coded maximum.
|
| 280 | *
|
| 281 | * The authentication data may also be known as "tag value".
|
| 282 | *
|
| 283 | * Return: authentication data size / tag size in bytes
|
| 284 |
|
| 285 | static inline unsigned int crypto_aead_authsize(struct crypto_aead *tfm)
|
| 286 | {
|
| 287 | return tfm->authsize;
|
| 288 | }
|
| 289 |
|
| 290 | static inline unsigned int crypto_sync_aead_authsize(struct crypto_sync_aead *tfm)
|
| 291 | {
|
| 292 | return crypto_aead_authsize(&tfm->base);
|
| 293 | }
|
| 294 |
|
| 295 | static inline unsigned int crypto_aead_alg_maxauthsize(struct aead_alg *alg)
|
| 296 | {
|
| 297 | return alg->maxauthsize;
|
| 298 | }
|
| 299 |
|
| 300 | static inline unsigned int crypto_aead_maxauthsize(struct crypto_aead *aead)
|
| 301 | {
|
| 302 | return crypto_aead_alg_maxauthsize(crypto_aead_alg(aead));
|
| 303 | }
|
| 304 |
|
| 305 | static inline unsigned int crypto_sync_aead_maxauthsize(struct crypto_sync_aead *tfm)
|
| 306 | {
|
| 307 | return crypto_aead_maxauthsize(&tfm->base);
|
| 308 | }
|
| 309 |
|
| 310 | |
| 311 | * crypto_aead_blocksize() - obtain block size of cipher
|
| 312 | * @tfm: cipher handle
|
| 313 | *
|
| 314 | * The block size for the AEAD referenced with the cipher handle is returned.
|
| 315 | * The caller may use that information to allocate appropriate memory for the
|
| 316 | * data returned by the encryption or decryption operation
|
| 317 | *
|
| 318 | * Return: block size of cipher
|
| 319 |
|
| 320 | static inline unsigned int crypto_aead_blocksize(struct crypto_aead *tfm)
|
| 321 | {
|
| 322 | return crypto_tfm_alg_blocksize(crypto_aead_tfm(tfm));
|
| 323 | }
|
| 324 |
|
| 325 | static inline unsigned int crypto_sync_aead_blocksize(struct crypto_sync_aead *tfm)
|
| 326 | {
|
| 327 | return crypto_aead_blocksize(&tfm->base);
|
| 328 | }
|
| 329 |
|
| 330 | static inline unsigned int crypto_aead_alignmask(struct crypto_aead *tfm)
|
| 331 | {
|
| 332 | return crypto_tfm_alg_alignmask(crypto_aead_tfm(tfm));
|
| 333 | }
|
| 334 |
|
| 335 | static inline u32 crypto_aead_get_flags(struct crypto_aead *tfm)
|
| 336 | {
|
| 337 | return crypto_tfm_get_flags(crypto_aead_tfm(tfm));
|
| 338 | }
|
| 339 |
|
| 340 | static inline void crypto_aead_set_flags(struct crypto_aead *tfm, u32 flags)
|
| 341 | {
|
| 342 | crypto_tfm_set_flags(crypto_aead_tfm(tfm), flags);
|
| 343 | }
|
| 344 |
|
| 345 | static inline void crypto_aead_clear_flags(struct crypto_aead *tfm, u32 flags)
|
| 346 | {
|
| 347 | crypto_tfm_clear_flags(crypto_aead_tfm(tfm), flags);
|
| 348 | }
|
| 349 |
|
| 350 | static inline u32 crypto_sync_aead_get_flags(struct crypto_sync_aead *tfm)
|
| 351 | {
|
| 352 | return crypto_aead_get_flags(&tfm->base);
|
| 353 | }
|
| 354 |
|
| 355 | static inline void crypto_sync_aead_set_flags(struct crypto_sync_aead *tfm, u32 flags)
|
| 356 | {
|
| 357 | crypto_aead_set_flags(&tfm->base, flags);
|
| 358 | }
|
| 359 |
|
| 360 | static inline void crypto_sync_aead_clear_flags(struct crypto_sync_aead *tfm, u32 flags)
|
| 361 | {
|
| 362 | crypto_aead_clear_flags(&tfm->base, flags);
|
| 363 | }
|
| 364 |
|
| 365 | |
| 366 | * crypto_aead_setkey() - set key for cipher
|
| 367 | * @tfm: cipher handle
|
| 368 | * @key: buffer holding the key
|
| 369 | * @keylen: length of the key in bytes
|
| 370 | *
|
| 371 | * The caller provided key is set for the AEAD referenced by the cipher
|
| 372 | * handle.
|
| 373 | *
|
| 374 | * Note, the key length determines the cipher type. Many block ciphers implement
|
| 375 | * different cipher modes depending on the key size, such as AES-128 vs AES-192
|
| 376 | * vs. AES-256. When providing a 16 byte key for an AES cipher handle, AES-128
|
| 377 | * is performed.
|
| 378 | *
|
| 379 | * Return: 0 if the setting of the key was successful; < 0 if an error occurred
|
| 380 |
|
| 381 | int crypto_aead_setkey(struct crypto_aead *tfm,
|
| 382 | const u8 *key, unsigned int keylen);
|
| 383 |
|
| 384 | static inline int crypto_sync_aead_setkey(struct crypto_sync_aead *tfm,
|
| 385 | const u8 *key, unsigned int keylen)
|
| 386 | {
|
| 387 | return crypto_aead_setkey(&tfm->base, key, keylen);
|
| 388 | }
|
| 389 |
|
| 390 | |
| 391 | * crypto_aead_setauthsize() - set authentication data size
|
| 392 | * @tfm: cipher handle
|
| 393 | * @authsize: size of the authentication data / tag in bytes
|
| 394 | *
|
| 395 | * Set the authentication data size / tag size. AEAD requires an authentication
|
| 396 | * tag (or MAC) in addition to the associated data.
|
| 397 | *
|
| 398 | * Return: 0 if the setting of the key was successful; < 0 if an error occurred
|
| 399 |
|
| 400 | int crypto_aead_setauthsize(struct crypto_aead *tfm, unsigned int authsize);
|
| 401 |
|
| 402 | static inline int crypto_sync_aead_setauthsize(struct crypto_sync_aead *tfm,
|
| 403 | unsigned int authsize)
|
| 404 | {
|
| 405 | return crypto_aead_setauthsize(&tfm->base, authsize);
|
| 406 | }
|
| 407 |
|
| 408 | static inline struct crypto_aead *crypto_aead_reqtfm(struct aead_request *req)
|
| 409 | {
|
| 410 | return __crypto_aead_cast(req->base.tfm);
|
| 411 | }
|
| 412 |
|
| 413 | static inline struct crypto_sync_aead *crypto_sync_aead_reqtfm(struct aead_request *req)
|
| 414 | {
|
| 415 | struct crypto_aead *tfm = crypto_aead_reqtfm(req);
|
| 416 |
|
| 417 | return container_of(tfm, struct crypto_sync_aead, base);
|
| 418 | }
|
| 419 |
|
| 420 | |
| 421 | * crypto_aead_encrypt() - encrypt plaintext
|
| 422 | * @req: reference to the aead_request handle that holds all information
|
| 423 | * needed to perform the cipher operation
|
| 424 | *
|
| 425 | * Encrypt plaintext data using the aead_request handle. That data structure
|
| 426 | * and how it is filled with data is discussed with the aead_request_*
|
| 427 | * functions.
|
| 428 | *
|
| 429 | * IMPORTANT NOTE The encryption operation creates the authentication data /
|
| 430 | * tag. That data is concatenated with the created ciphertext.
|
| 431 | * The ciphertext memory size is therefore the given number of
|
| 432 | * block cipher blocks + the size defined by the
|
| 433 | * crypto_aead_setauthsize invocation. The caller must ensure
|
| 434 | * that sufficient memory is available for the ciphertext and
|
| 435 | * the authentication tag.
|
| 436 | *
|
| 437 | * Return: 0 if the cipher operation was successful; < 0 if an error occurred
|
| 438 |
|
| 439 | int crypto_aead_encrypt(struct aead_request *req);
|
| 440 |
|
| 441 | |
| 442 | * crypto_aead_decrypt() - decrypt ciphertext
|
| 443 | * @req: reference to the aead_request handle that holds all information
|
| 444 | * needed to perform the cipher operation
|
| 445 | *
|
| 446 | * Decrypt ciphertext data using the aead_request handle. That data structure
|
| 447 | * and how it is filled with data is discussed with the aead_request_*
|
| 448 | * functions.
|
| 449 | *
|
| 450 | * IMPORTANT NOTE The caller must concatenate the ciphertext followed by the
|
| 451 | * authentication data / tag. That authentication data / tag
|
| 452 | * must have the size defined by the crypto_aead_setauthsize
|
| 453 | * invocation.
|
| 454 | *
|
| 455 | *
|
| 456 | * Return: 0 if the cipher operation was successful; -EBADMSG: The AEAD
|
| 457 | * cipher operation performs the authentication of the data during the
|
| 458 | * decryption operation. Therefore, the function returns this error if
|
| 459 | * the authentication of the ciphertext was unsuccessful (i.e. the
|
| 460 | * integrity of the ciphertext or the associated data was violated);
|
| 461 | * < 0 if an error occurred.
|
| 462 |
|
| 463 | int crypto_aead_decrypt(struct aead_request *req);
|
| 464 |
|
| 465 | |
| 466 | * DOC: Asynchronous AEAD Request Handle
|
| 467 | *
|
| 468 | * The aead_request data structure contains all pointers to data required for
|
| 469 | * the AEAD cipher operation. This includes the cipher handle (which can be
|
| 470 | * used by multiple aead_request instances), pointer to plaintext and
|
| 471 | * ciphertext, asynchronous callback function, etc. It acts as a handle to the
|
| 472 | * aead_request_* API calls in a similar way as AEAD handle to the
|
| 473 | * crypto_aead_* API calls.
|
| 474 |
|
| 475 |
|
| 476 | |
| 477 | * crypto_aead_reqsize() - obtain size of the request data structure
|
| 478 | * @tfm: cipher handle
|
| 479 | *
|
| 480 | * Return: number of bytes
|
| 481 |
|
| 482 | static inline unsigned int crypto_aead_reqsize(struct crypto_aead *tfm)
|
| 483 | {
|
| 484 | return tfm->reqsize;
|
| 485 | }
|
| 486 |
|
| 487 | |
| 488 | * aead_request_set_tfm() - update cipher handle reference in request
|
| 489 | * @req: request handle to be modified
|
| 490 | * @tfm: cipher handle that shall be added to the request handle
|
| 491 | *
|
| 492 | * Allow the caller to replace the existing aead handle in the request
|
| 493 | * data structure with a different one.
|
| 494 |
|
| 495 | static inline void aead_request_set_tfm(struct aead_request *req,
|
| 496 | struct crypto_aead *tfm)
|
| 497 | {
|
| 498 | req->base.tfm = crypto_aead_tfm(tfm);
|
| 499 | }
|
| 500 |
|
| 501 | static inline void aead_request_set_sync_tfm(struct aead_request *req,
|
| 502 | struct crypto_sync_aead *tfm)
|
| 503 | {
|
| 504 | aead_request_set_tfm(req, &tfm->base);
|
| 505 | }
|
| 506 |
|
| 507 | |
| 508 | * aead_request_alloc() - allocate request data structure
|
| 509 | * @tfm: cipher handle to be registered with the request
|
| 510 | * @gfp: memory allocation flag that is handed to kmalloc by the API call.
|
| 511 | *
|
| 512 | * Allocate the request data structure that must be used with the AEAD
|
| 513 | * encrypt and decrypt API calls. During the allocation, the provided aead
|
| 514 | * handle is registered in the request data structure.
|
| 515 | *
|
| 516 | * Return: allocated request handle in case of success, or NULL if out of memory
|
| 517 |
|
| 518 | static inline struct aead_request *aead_request_alloc(struct crypto_aead *tfm,
|
| 519 | gfp_t gfp)
|
| 520 | {
|
| 521 | struct aead_request *req;
|
| 522 |
|
| 523 | req = kmalloc(sizeof(*req) + crypto_aead_reqsize(tfm), gfp);
|
| 524 |
|
| 525 | if (likely(req))
|
| 526 | aead_request_set_tfm(req, tfm);
|
| 527 |
|
| 528 | return req;
|
| 529 | }
|
| 530 |
|
| 531 | |
| 532 | * aead_request_free() - zeroize and free request data structure
|
| 533 | * @req: request data structure cipher handle to be freed
|
| 534 |
|
| 535 | static inline void aead_request_free(struct aead_request *req)
|
| 536 | {
|
| 537 | kfree_sensitive(req);
|
| 538 | }
|
| 539 |
|
| 540 | |
| 541 | * aead_request_set_callback() - set asynchronous callback function
|
| 542 | * @req: request handle
|
| 543 | * @flags: specify zero or an ORing of the flags
|
| 544 | * CRYPTO_TFM_REQ_MAY_BACKLOG the request queue may back log and
|
| 545 | * increase the wait queue beyond the initial maximum size;
|
| 546 | * CRYPTO_TFM_REQ_MAY_SLEEP the request processing may sleep
|
| 547 | * @compl: callback function pointer to be registered with the request handle
|
| 548 | * @data: The data pointer refers to memory that is not used by the kernel
|
| 549 | * crypto API, but provided to the callback function for it to use. Here,
|
| 550 | * the caller can provide a reference to memory the callback function can
|
| 551 | * operate on. As the callback function is invoked asynchronously to the
|
| 552 | * related functionality, it may need to access data structures of the
|
| 553 | * related functionality which can be referenced using this pointer. The
|
| 554 | * callback function can access the memory via the "data" field in the
|
| 555 | * crypto_async_request data structure provided to the callback function.
|
| 556 | *
|
| 557 | * Setting the callback function that is triggered once the cipher operation
|
| 558 | * completes
|
| 559 | *
|
| 560 | * The callback function is registered with the aead_request handle and
|
| 561 | * must comply with the following template::
|
| 562 | *
|
| 563 | * void callback_function(struct crypto_async_request *req, int error)
|
| 564 |
|
| 565 | static inline void aead_request_set_callback(struct aead_request *req,
|
| 566 | u32 flags,
|
| 567 | crypto_completion_t compl,
|
| 568 | void *data)
|
| 569 | {
|
| 570 | req->base.complete = compl;
|
| 571 | req->base.data = data;
|
| 572 | req->base.flags = flags;
|
| 573 | }
|
| 574 |
|
| 575 | |
| 576 | * aead_request_set_crypt - set data buffers
|
| 577 | * @req: request handle
|
| 578 | * @src: source scatter / gather list
|
| 579 | * @dst: destination scatter / gather list
|
| 580 | * @cryptlen: number of bytes to process from @src
|
| 581 | * @iv: IV for the cipher operation which must comply with the IV size defined
|
| 582 | * by crypto_aead_ivsize()
|
| 583 | *
|
| 584 | * Setting the source data and destination data scatter / gather lists which
|
| 585 | * hold the associated data concatenated with the plaintext or ciphertext. See
|
| 586 | * below for the authentication tag.
|
| 587 | *
|
| 588 | * For encryption, the source is treated as the plaintext and the
|
| 589 | * destination is the ciphertext. For a decryption operation, the use is
|
| 590 | * reversed - the source is the ciphertext and the destination is the plaintext.
|
| 591 | *
|
| 592 | * The memory structure for cipher operation has the following structure:
|
| 593 | *
|
| 594 | * - AEAD encryption input: assoc data || plaintext
|
| 595 | * - AEAD encryption output: assoc data || ciphertext || auth tag
|
| 596 | * - AEAD decryption input: assoc data || ciphertext || auth tag
|
| 597 | * - AEAD decryption output: assoc data || plaintext
|
| 598 | *
|
| 599 | * Albeit the kernel requires the presence of the AAD buffer, however,
|
| 600 | * the kernel does not fill the AAD buffer in the output case. If the
|
| 601 | * caller wants to have that data buffer filled, the caller must either
|
| 602 | * use an in-place cipher operation (i.e. same memory location for
|
| 603 | * input/output memory location).
|
| 604 |
|
| 605 | static inline void aead_request_set_crypt(struct aead_request *req,
|
| 606 | struct scatterlist *src,
|
| 607 | struct scatterlist *dst,
|
| 608 | unsigned int cryptlen, u8 *iv)
|
| 609 | {
|
| 610 | req->src = src;
|
| 611 | req->dst = dst;
|
| 612 | req->cryptlen = cryptlen;
|
| 613 | req->iv = iv;
|
| 614 | }
|
| 615 |
|
| 616 | |
| 617 | * aead_request_set_ad - set associated data information
|
| 618 | * @req: request handle
|
| 619 | * @assoclen: number of bytes in associated data
|
| 620 | *
|
| 621 | * Setting the AD information. This function sets the length of
|
| 622 | * the associated data.
|
| 623 |
|
| 624 | static inline void aead_request_set_ad(struct aead_request *req,
|
| 625 | unsigned int assoclen)
|
| 626 | {
|
| 627 | req->assoclen = assoclen;
|
| 628 | }
|
| 629 |
|
| 630 | #endif
|