at v2.6.27 34 kB view raw
1/* 2 * Scatterlist Cryptographic API. 3 * 4 * Copyright (c) 2002 James Morris <jmorris@intercode.com.au> 5 * Copyright (c) 2002 David S. Miller (davem@redhat.com) 6 * Copyright (c) 2005 Herbert Xu <herbert@gondor.apana.org.au> 7 * 8 * Portions derived from Cryptoapi, by Alexander Kjeldaas <astor@fast.no> 9 * and Nettle, by Niels Möller. 10 * 11 * This program is free software; you can redistribute it and/or modify it 12 * under the terms of the GNU General Public License as published by the Free 13 * Software Foundation; either version 2 of the License, or (at your option) 14 * any later version. 15 * 16 */ 17#ifndef _LINUX_CRYPTO_H 18#define _LINUX_CRYPTO_H 19 20#include <asm/atomic.h> 21#include <linux/module.h> 22#include <linux/kernel.h> 23#include <linux/list.h> 24#include <linux/slab.h> 25#include <linux/string.h> 26#include <linux/uaccess.h> 27 28/* 29 * Algorithm masks and types. 30 */ 31#define CRYPTO_ALG_TYPE_MASK 0x0000000f 32#define CRYPTO_ALG_TYPE_CIPHER 0x00000001 33#define CRYPTO_ALG_TYPE_COMPRESS 0x00000002 34#define CRYPTO_ALG_TYPE_AEAD 0x00000003 35#define CRYPTO_ALG_TYPE_BLKCIPHER 0x00000004 36#define CRYPTO_ALG_TYPE_ABLKCIPHER 0x00000005 37#define CRYPTO_ALG_TYPE_GIVCIPHER 0x00000006 38#define CRYPTO_ALG_TYPE_DIGEST 0x00000008 39#define CRYPTO_ALG_TYPE_HASH 0x00000009 40#define CRYPTO_ALG_TYPE_AHASH 0x0000000a 41 42#define CRYPTO_ALG_TYPE_HASH_MASK 0x0000000e 43#define CRYPTO_ALG_TYPE_AHASH_MASK 0x0000000c 44#define CRYPTO_ALG_TYPE_BLKCIPHER_MASK 0x0000000c 45 46#define CRYPTO_ALG_LARVAL 0x00000010 47#define CRYPTO_ALG_DEAD 0x00000020 48#define CRYPTO_ALG_DYING 0x00000040 49#define CRYPTO_ALG_ASYNC 0x00000080 50 51/* 52 * Set this bit if and only if the algorithm requires another algorithm of 53 * the same type to handle corner cases. 54 */ 55#define CRYPTO_ALG_NEED_FALLBACK 0x00000100 56 57/* 58 * This bit is set for symmetric key ciphers that have already been wrapped 59 * with a generic IV generator to prevent them from being wrapped again. 60 */ 61#define CRYPTO_ALG_GENIV 0x00000200 62 63/* 64 * Transform masks and values (for crt_flags). 65 */ 66#define CRYPTO_TFM_REQ_MASK 0x000fff00 67#define CRYPTO_TFM_RES_MASK 0xfff00000 68 69#define CRYPTO_TFM_REQ_WEAK_KEY 0x00000100 70#define CRYPTO_TFM_REQ_MAY_SLEEP 0x00000200 71#define CRYPTO_TFM_REQ_MAY_BACKLOG 0x00000400 72#define CRYPTO_TFM_RES_WEAK_KEY 0x00100000 73#define CRYPTO_TFM_RES_BAD_KEY_LEN 0x00200000 74#define CRYPTO_TFM_RES_BAD_KEY_SCHED 0x00400000 75#define CRYPTO_TFM_RES_BAD_BLOCK_LEN 0x00800000 76#define CRYPTO_TFM_RES_BAD_FLAGS 0x01000000 77 78/* 79 * Miscellaneous stuff. 80 */ 81#define CRYPTO_MAX_ALG_NAME 64 82 83/* 84 * The macro CRYPTO_MINALIGN_ATTR (along with the void * type in the actual 85 * declaration) is used to ensure that the crypto_tfm context structure is 86 * aligned correctly for the given architecture so that there are no alignment 87 * faults for C data types. In particular, this is required on platforms such 88 * as arm where pointers are 32-bit aligned but there are data types such as 89 * u64 which require 64-bit alignment. 90 */ 91#if defined(ARCH_KMALLOC_MINALIGN) 92#define CRYPTO_MINALIGN ARCH_KMALLOC_MINALIGN 93#elif defined(ARCH_SLAB_MINALIGN) 94#define CRYPTO_MINALIGN ARCH_SLAB_MINALIGN 95#else 96#define CRYPTO_MINALIGN __alignof__(unsigned long long) 97#endif 98 99#define CRYPTO_MINALIGN_ATTR __attribute__ ((__aligned__(CRYPTO_MINALIGN))) 100 101struct scatterlist; 102struct crypto_ablkcipher; 103struct crypto_async_request; 104struct crypto_aead; 105struct crypto_blkcipher; 106struct crypto_hash; 107struct crypto_ahash; 108struct crypto_tfm; 109struct crypto_type; 110struct aead_givcrypt_request; 111struct skcipher_givcrypt_request; 112 113typedef void (*crypto_completion_t)(struct crypto_async_request *req, int err); 114 115struct crypto_async_request { 116 struct list_head list; 117 crypto_completion_t complete; 118 void *data; 119 struct crypto_tfm *tfm; 120 121 u32 flags; 122}; 123 124struct ablkcipher_request { 125 struct crypto_async_request base; 126 127 unsigned int nbytes; 128 129 void *info; 130 131 struct scatterlist *src; 132 struct scatterlist *dst; 133 134 void *__ctx[] CRYPTO_MINALIGN_ATTR; 135}; 136 137struct ahash_request { 138 struct crypto_async_request base; 139 140 unsigned int nbytes; 141 struct scatterlist *src; 142 u8 *result; 143 144 void *__ctx[] CRYPTO_MINALIGN_ATTR; 145}; 146 147/** 148 * struct aead_request - AEAD request 149 * @base: Common attributes for async crypto requests 150 * @assoclen: Length in bytes of associated data for authentication 151 * @cryptlen: Length of data to be encrypted or decrypted 152 * @iv: Initialisation vector 153 * @assoc: Associated data 154 * @src: Source data 155 * @dst: Destination data 156 * @__ctx: Start of private context data 157 */ 158struct aead_request { 159 struct crypto_async_request base; 160 161 unsigned int assoclen; 162 unsigned int cryptlen; 163 164 u8 *iv; 165 166 struct scatterlist *assoc; 167 struct scatterlist *src; 168 struct scatterlist *dst; 169 170 void *__ctx[] CRYPTO_MINALIGN_ATTR; 171}; 172 173struct blkcipher_desc { 174 struct crypto_blkcipher *tfm; 175 void *info; 176 u32 flags; 177}; 178 179struct cipher_desc { 180 struct crypto_tfm *tfm; 181 void (*crfn)(struct crypto_tfm *tfm, u8 *dst, const u8 *src); 182 unsigned int (*prfn)(const struct cipher_desc *desc, u8 *dst, 183 const u8 *src, unsigned int nbytes); 184 void *info; 185}; 186 187struct hash_desc { 188 struct crypto_hash *tfm; 189 u32 flags; 190}; 191 192/* 193 * Algorithms: modular crypto algorithm implementations, managed 194 * via crypto_register_alg() and crypto_unregister_alg(). 195 */ 196struct ablkcipher_alg { 197 int (*setkey)(struct crypto_ablkcipher *tfm, const u8 *key, 198 unsigned int keylen); 199 int (*encrypt)(struct ablkcipher_request *req); 200 int (*decrypt)(struct ablkcipher_request *req); 201 int (*givencrypt)(struct skcipher_givcrypt_request *req); 202 int (*givdecrypt)(struct skcipher_givcrypt_request *req); 203 204 const char *geniv; 205 206 unsigned int min_keysize; 207 unsigned int max_keysize; 208 unsigned int ivsize; 209}; 210 211struct ahash_alg { 212 int (*init)(struct ahash_request *req); 213 int (*update)(struct ahash_request *req); 214 int (*final)(struct ahash_request *req); 215 int (*digest)(struct ahash_request *req); 216 int (*setkey)(struct crypto_ahash *tfm, const u8 *key, 217 unsigned int keylen); 218 219 unsigned int digestsize; 220}; 221 222struct aead_alg { 223 int (*setkey)(struct crypto_aead *tfm, const u8 *key, 224 unsigned int keylen); 225 int (*setauthsize)(struct crypto_aead *tfm, unsigned int authsize); 226 int (*encrypt)(struct aead_request *req); 227 int (*decrypt)(struct aead_request *req); 228 int (*givencrypt)(struct aead_givcrypt_request *req); 229 int (*givdecrypt)(struct aead_givcrypt_request *req); 230 231 const char *geniv; 232 233 unsigned int ivsize; 234 unsigned int maxauthsize; 235}; 236 237struct blkcipher_alg { 238 int (*setkey)(struct crypto_tfm *tfm, const u8 *key, 239 unsigned int keylen); 240 int (*encrypt)(struct blkcipher_desc *desc, 241 struct scatterlist *dst, struct scatterlist *src, 242 unsigned int nbytes); 243 int (*decrypt)(struct blkcipher_desc *desc, 244 struct scatterlist *dst, struct scatterlist *src, 245 unsigned int nbytes); 246 247 const char *geniv; 248 249 unsigned int min_keysize; 250 unsigned int max_keysize; 251 unsigned int ivsize; 252}; 253 254struct cipher_alg { 255 unsigned int cia_min_keysize; 256 unsigned int cia_max_keysize; 257 int (*cia_setkey)(struct crypto_tfm *tfm, const u8 *key, 258 unsigned int keylen); 259 void (*cia_encrypt)(struct crypto_tfm *tfm, u8 *dst, const u8 *src); 260 void (*cia_decrypt)(struct crypto_tfm *tfm, u8 *dst, const u8 *src); 261}; 262 263struct digest_alg { 264 unsigned int dia_digestsize; 265 void (*dia_init)(struct crypto_tfm *tfm); 266 void (*dia_update)(struct crypto_tfm *tfm, const u8 *data, 267 unsigned int len); 268 void (*dia_final)(struct crypto_tfm *tfm, u8 *out); 269 int (*dia_setkey)(struct crypto_tfm *tfm, const u8 *key, 270 unsigned int keylen); 271}; 272 273struct hash_alg { 274 int (*init)(struct hash_desc *desc); 275 int (*update)(struct hash_desc *desc, struct scatterlist *sg, 276 unsigned int nbytes); 277 int (*final)(struct hash_desc *desc, u8 *out); 278 int (*digest)(struct hash_desc *desc, struct scatterlist *sg, 279 unsigned int nbytes, u8 *out); 280 int (*setkey)(struct crypto_hash *tfm, const u8 *key, 281 unsigned int keylen); 282 283 unsigned int digestsize; 284}; 285 286struct compress_alg { 287 int (*coa_compress)(struct crypto_tfm *tfm, const u8 *src, 288 unsigned int slen, u8 *dst, unsigned int *dlen); 289 int (*coa_decompress)(struct crypto_tfm *tfm, const u8 *src, 290 unsigned int slen, u8 *dst, unsigned int *dlen); 291}; 292 293#define cra_ablkcipher cra_u.ablkcipher 294#define cra_aead cra_u.aead 295#define cra_blkcipher cra_u.blkcipher 296#define cra_cipher cra_u.cipher 297#define cra_digest cra_u.digest 298#define cra_hash cra_u.hash 299#define cra_ahash cra_u.ahash 300#define cra_compress cra_u.compress 301 302struct crypto_alg { 303 struct list_head cra_list; 304 struct list_head cra_users; 305 306 u32 cra_flags; 307 unsigned int cra_blocksize; 308 unsigned int cra_ctxsize; 309 unsigned int cra_alignmask; 310 311 int cra_priority; 312 atomic_t cra_refcnt; 313 314 char cra_name[CRYPTO_MAX_ALG_NAME]; 315 char cra_driver_name[CRYPTO_MAX_ALG_NAME]; 316 317 const struct crypto_type *cra_type; 318 319 union { 320 struct ablkcipher_alg ablkcipher; 321 struct aead_alg aead; 322 struct blkcipher_alg blkcipher; 323 struct cipher_alg cipher; 324 struct digest_alg digest; 325 struct hash_alg hash; 326 struct ahash_alg ahash; 327 struct compress_alg compress; 328 } cra_u; 329 330 int (*cra_init)(struct crypto_tfm *tfm); 331 void (*cra_exit)(struct crypto_tfm *tfm); 332 void (*cra_destroy)(struct crypto_alg *alg); 333 334 struct module *cra_module; 335}; 336 337/* 338 * Algorithm registration interface. 339 */ 340int crypto_register_alg(struct crypto_alg *alg); 341int crypto_unregister_alg(struct crypto_alg *alg); 342 343/* 344 * Algorithm query interface. 345 */ 346int crypto_has_alg(const char *name, u32 type, u32 mask); 347 348/* 349 * Transforms: user-instantiated objects which encapsulate algorithms 350 * and core processing logic. Managed via crypto_alloc_*() and 351 * crypto_free_*(), as well as the various helpers below. 352 */ 353 354struct ablkcipher_tfm { 355 int (*setkey)(struct crypto_ablkcipher *tfm, const u8 *key, 356 unsigned int keylen); 357 int (*encrypt)(struct ablkcipher_request *req); 358 int (*decrypt)(struct ablkcipher_request *req); 359 int (*givencrypt)(struct skcipher_givcrypt_request *req); 360 int (*givdecrypt)(struct skcipher_givcrypt_request *req); 361 362 struct crypto_ablkcipher *base; 363 364 unsigned int ivsize; 365 unsigned int reqsize; 366}; 367 368struct aead_tfm { 369 int (*setkey)(struct crypto_aead *tfm, const u8 *key, 370 unsigned int keylen); 371 int (*encrypt)(struct aead_request *req); 372 int (*decrypt)(struct aead_request *req); 373 int (*givencrypt)(struct aead_givcrypt_request *req); 374 int (*givdecrypt)(struct aead_givcrypt_request *req); 375 376 struct crypto_aead *base; 377 378 unsigned int ivsize; 379 unsigned int authsize; 380 unsigned int reqsize; 381}; 382 383struct blkcipher_tfm { 384 void *iv; 385 int (*setkey)(struct crypto_tfm *tfm, const u8 *key, 386 unsigned int keylen); 387 int (*encrypt)(struct blkcipher_desc *desc, struct scatterlist *dst, 388 struct scatterlist *src, unsigned int nbytes); 389 int (*decrypt)(struct blkcipher_desc *desc, struct scatterlist *dst, 390 struct scatterlist *src, unsigned int nbytes); 391}; 392 393struct cipher_tfm { 394 int (*cit_setkey)(struct crypto_tfm *tfm, 395 const u8 *key, unsigned int keylen); 396 void (*cit_encrypt_one)(struct crypto_tfm *tfm, u8 *dst, const u8 *src); 397 void (*cit_decrypt_one)(struct crypto_tfm *tfm, u8 *dst, const u8 *src); 398}; 399 400struct hash_tfm { 401 int (*init)(struct hash_desc *desc); 402 int (*update)(struct hash_desc *desc, 403 struct scatterlist *sg, unsigned int nsg); 404 int (*final)(struct hash_desc *desc, u8 *out); 405 int (*digest)(struct hash_desc *desc, struct scatterlist *sg, 406 unsigned int nsg, u8 *out); 407 int (*setkey)(struct crypto_hash *tfm, const u8 *key, 408 unsigned int keylen); 409 unsigned int digestsize; 410}; 411 412struct ahash_tfm { 413 int (*init)(struct ahash_request *req); 414 int (*update)(struct ahash_request *req); 415 int (*final)(struct ahash_request *req); 416 int (*digest)(struct ahash_request *req); 417 int (*setkey)(struct crypto_ahash *tfm, const u8 *key, 418 unsigned int keylen); 419 420 unsigned int digestsize; 421 unsigned int reqsize; 422}; 423 424struct compress_tfm { 425 int (*cot_compress)(struct crypto_tfm *tfm, 426 const u8 *src, unsigned int slen, 427 u8 *dst, unsigned int *dlen); 428 int (*cot_decompress)(struct crypto_tfm *tfm, 429 const u8 *src, unsigned int slen, 430 u8 *dst, unsigned int *dlen); 431}; 432 433#define crt_ablkcipher crt_u.ablkcipher 434#define crt_aead crt_u.aead 435#define crt_blkcipher crt_u.blkcipher 436#define crt_cipher crt_u.cipher 437#define crt_hash crt_u.hash 438#define crt_ahash crt_u.ahash 439#define crt_compress crt_u.compress 440 441struct crypto_tfm { 442 443 u32 crt_flags; 444 445 union { 446 struct ablkcipher_tfm ablkcipher; 447 struct aead_tfm aead; 448 struct blkcipher_tfm blkcipher; 449 struct cipher_tfm cipher; 450 struct hash_tfm hash; 451 struct ahash_tfm ahash; 452 struct compress_tfm compress; 453 } crt_u; 454 455 struct crypto_alg *__crt_alg; 456 457 void *__crt_ctx[] CRYPTO_MINALIGN_ATTR; 458}; 459 460struct crypto_ablkcipher { 461 struct crypto_tfm base; 462}; 463 464struct crypto_aead { 465 struct crypto_tfm base; 466}; 467 468struct crypto_blkcipher { 469 struct crypto_tfm base; 470}; 471 472struct crypto_cipher { 473 struct crypto_tfm base; 474}; 475 476struct crypto_comp { 477 struct crypto_tfm base; 478}; 479 480struct crypto_hash { 481 struct crypto_tfm base; 482}; 483 484enum { 485 CRYPTOA_UNSPEC, 486 CRYPTOA_ALG, 487 CRYPTOA_TYPE, 488 CRYPTOA_U32, 489 __CRYPTOA_MAX, 490}; 491 492#define CRYPTOA_MAX (__CRYPTOA_MAX - 1) 493 494/* Maximum number of (rtattr) parameters for each template. */ 495#define CRYPTO_MAX_ATTRS 32 496 497struct crypto_attr_alg { 498 char name[CRYPTO_MAX_ALG_NAME]; 499}; 500 501struct crypto_attr_type { 502 u32 type; 503 u32 mask; 504}; 505 506struct crypto_attr_u32 { 507 u32 num; 508}; 509 510/* 511 * Transform user interface. 512 */ 513 514struct crypto_tfm *crypto_alloc_tfm(const char *alg_name, u32 tfm_flags); 515struct crypto_tfm *crypto_alloc_base(const char *alg_name, u32 type, u32 mask); 516void crypto_free_tfm(struct crypto_tfm *tfm); 517 518/* 519 * Transform helpers which query the underlying algorithm. 520 */ 521static inline const char *crypto_tfm_alg_name(struct crypto_tfm *tfm) 522{ 523 return tfm->__crt_alg->cra_name; 524} 525 526static inline const char *crypto_tfm_alg_driver_name(struct crypto_tfm *tfm) 527{ 528 return tfm->__crt_alg->cra_driver_name; 529} 530 531static inline int crypto_tfm_alg_priority(struct crypto_tfm *tfm) 532{ 533 return tfm->__crt_alg->cra_priority; 534} 535 536static inline const char *crypto_tfm_alg_modname(struct crypto_tfm *tfm) 537{ 538 return module_name(tfm->__crt_alg->cra_module); 539} 540 541static inline u32 crypto_tfm_alg_type(struct crypto_tfm *tfm) 542{ 543 return tfm->__crt_alg->cra_flags & CRYPTO_ALG_TYPE_MASK; 544} 545 546static inline unsigned int crypto_tfm_alg_blocksize(struct crypto_tfm *tfm) 547{ 548 return tfm->__crt_alg->cra_blocksize; 549} 550 551static inline unsigned int crypto_tfm_alg_alignmask(struct crypto_tfm *tfm) 552{ 553 return tfm->__crt_alg->cra_alignmask; 554} 555 556static inline u32 crypto_tfm_get_flags(struct crypto_tfm *tfm) 557{ 558 return tfm->crt_flags; 559} 560 561static inline void crypto_tfm_set_flags(struct crypto_tfm *tfm, u32 flags) 562{ 563 tfm->crt_flags |= flags; 564} 565 566static inline void crypto_tfm_clear_flags(struct crypto_tfm *tfm, u32 flags) 567{ 568 tfm->crt_flags &= ~flags; 569} 570 571static inline void *crypto_tfm_ctx(struct crypto_tfm *tfm) 572{ 573 return tfm->__crt_ctx; 574} 575 576static inline unsigned int crypto_tfm_ctx_alignment(void) 577{ 578 struct crypto_tfm *tfm; 579 return __alignof__(tfm->__crt_ctx); 580} 581 582/* 583 * API wrappers. 584 */ 585static inline struct crypto_ablkcipher *__crypto_ablkcipher_cast( 586 struct crypto_tfm *tfm) 587{ 588 return (struct crypto_ablkcipher *)tfm; 589} 590 591static inline u32 crypto_skcipher_type(u32 type) 592{ 593 type &= ~(CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_GENIV); 594 type |= CRYPTO_ALG_TYPE_BLKCIPHER; 595 return type; 596} 597 598static inline u32 crypto_skcipher_mask(u32 mask) 599{ 600 mask &= ~(CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_GENIV); 601 mask |= CRYPTO_ALG_TYPE_BLKCIPHER_MASK; 602 return mask; 603} 604 605struct crypto_ablkcipher *crypto_alloc_ablkcipher(const char *alg_name, 606 u32 type, u32 mask); 607 608static inline struct crypto_tfm *crypto_ablkcipher_tfm( 609 struct crypto_ablkcipher *tfm) 610{ 611 return &tfm->base; 612} 613 614static inline void crypto_free_ablkcipher(struct crypto_ablkcipher *tfm) 615{ 616 crypto_free_tfm(crypto_ablkcipher_tfm(tfm)); 617} 618 619static inline int crypto_has_ablkcipher(const char *alg_name, u32 type, 620 u32 mask) 621{ 622 return crypto_has_alg(alg_name, crypto_skcipher_type(type), 623 crypto_skcipher_mask(mask)); 624} 625 626static inline struct ablkcipher_tfm *crypto_ablkcipher_crt( 627 struct crypto_ablkcipher *tfm) 628{ 629 return &crypto_ablkcipher_tfm(tfm)->crt_ablkcipher; 630} 631 632static inline unsigned int crypto_ablkcipher_ivsize( 633 struct crypto_ablkcipher *tfm) 634{ 635 return crypto_ablkcipher_crt(tfm)->ivsize; 636} 637 638static inline unsigned int crypto_ablkcipher_blocksize( 639 struct crypto_ablkcipher *tfm) 640{ 641 return crypto_tfm_alg_blocksize(crypto_ablkcipher_tfm(tfm)); 642} 643 644static inline unsigned int crypto_ablkcipher_alignmask( 645 struct crypto_ablkcipher *tfm) 646{ 647 return crypto_tfm_alg_alignmask(crypto_ablkcipher_tfm(tfm)); 648} 649 650static inline u32 crypto_ablkcipher_get_flags(struct crypto_ablkcipher *tfm) 651{ 652 return crypto_tfm_get_flags(crypto_ablkcipher_tfm(tfm)); 653} 654 655static inline void crypto_ablkcipher_set_flags(struct crypto_ablkcipher *tfm, 656 u32 flags) 657{ 658 crypto_tfm_set_flags(crypto_ablkcipher_tfm(tfm), flags); 659} 660 661static inline void crypto_ablkcipher_clear_flags(struct crypto_ablkcipher *tfm, 662 u32 flags) 663{ 664 crypto_tfm_clear_flags(crypto_ablkcipher_tfm(tfm), flags); 665} 666 667static inline int crypto_ablkcipher_setkey(struct crypto_ablkcipher *tfm, 668 const u8 *key, unsigned int keylen) 669{ 670 struct ablkcipher_tfm *crt = crypto_ablkcipher_crt(tfm); 671 672 return crt->setkey(crt->base, key, keylen); 673} 674 675static inline struct crypto_ablkcipher *crypto_ablkcipher_reqtfm( 676 struct ablkcipher_request *req) 677{ 678 return __crypto_ablkcipher_cast(req->base.tfm); 679} 680 681static inline int crypto_ablkcipher_encrypt(struct ablkcipher_request *req) 682{ 683 struct ablkcipher_tfm *crt = 684 crypto_ablkcipher_crt(crypto_ablkcipher_reqtfm(req)); 685 return crt->encrypt(req); 686} 687 688static inline int crypto_ablkcipher_decrypt(struct ablkcipher_request *req) 689{ 690 struct ablkcipher_tfm *crt = 691 crypto_ablkcipher_crt(crypto_ablkcipher_reqtfm(req)); 692 return crt->decrypt(req); 693} 694 695static inline unsigned int crypto_ablkcipher_reqsize( 696 struct crypto_ablkcipher *tfm) 697{ 698 return crypto_ablkcipher_crt(tfm)->reqsize; 699} 700 701static inline void ablkcipher_request_set_tfm( 702 struct ablkcipher_request *req, struct crypto_ablkcipher *tfm) 703{ 704 req->base.tfm = crypto_ablkcipher_tfm(crypto_ablkcipher_crt(tfm)->base); 705} 706 707static inline struct ablkcipher_request *ablkcipher_request_cast( 708 struct crypto_async_request *req) 709{ 710 return container_of(req, struct ablkcipher_request, base); 711} 712 713static inline struct ablkcipher_request *ablkcipher_request_alloc( 714 struct crypto_ablkcipher *tfm, gfp_t gfp) 715{ 716 struct ablkcipher_request *req; 717 718 req = kmalloc(sizeof(struct ablkcipher_request) + 719 crypto_ablkcipher_reqsize(tfm), gfp); 720 721 if (likely(req)) 722 ablkcipher_request_set_tfm(req, tfm); 723 724 return req; 725} 726 727static inline void ablkcipher_request_free(struct ablkcipher_request *req) 728{ 729 kfree(req); 730} 731 732static inline void ablkcipher_request_set_callback( 733 struct ablkcipher_request *req, 734 u32 flags, crypto_completion_t complete, void *data) 735{ 736 req->base.complete = complete; 737 req->base.data = data; 738 req->base.flags = flags; 739} 740 741static inline void ablkcipher_request_set_crypt( 742 struct ablkcipher_request *req, 743 struct scatterlist *src, struct scatterlist *dst, 744 unsigned int nbytes, void *iv) 745{ 746 req->src = src; 747 req->dst = dst; 748 req->nbytes = nbytes; 749 req->info = iv; 750} 751 752static inline struct crypto_aead *__crypto_aead_cast(struct crypto_tfm *tfm) 753{ 754 return (struct crypto_aead *)tfm; 755} 756 757struct crypto_aead *crypto_alloc_aead(const char *alg_name, u32 type, u32 mask); 758 759static inline struct crypto_tfm *crypto_aead_tfm(struct crypto_aead *tfm) 760{ 761 return &tfm->base; 762} 763 764static inline void crypto_free_aead(struct crypto_aead *tfm) 765{ 766 crypto_free_tfm(crypto_aead_tfm(tfm)); 767} 768 769static inline struct aead_tfm *crypto_aead_crt(struct crypto_aead *tfm) 770{ 771 return &crypto_aead_tfm(tfm)->crt_aead; 772} 773 774static inline unsigned int crypto_aead_ivsize(struct crypto_aead *tfm) 775{ 776 return crypto_aead_crt(tfm)->ivsize; 777} 778 779static inline unsigned int crypto_aead_authsize(struct crypto_aead *tfm) 780{ 781 return crypto_aead_crt(tfm)->authsize; 782} 783 784static inline unsigned int crypto_aead_blocksize(struct crypto_aead *tfm) 785{ 786 return crypto_tfm_alg_blocksize(crypto_aead_tfm(tfm)); 787} 788 789static inline unsigned int crypto_aead_alignmask(struct crypto_aead *tfm) 790{ 791 return crypto_tfm_alg_alignmask(crypto_aead_tfm(tfm)); 792} 793 794static inline u32 crypto_aead_get_flags(struct crypto_aead *tfm) 795{ 796 return crypto_tfm_get_flags(crypto_aead_tfm(tfm)); 797} 798 799static inline void crypto_aead_set_flags(struct crypto_aead *tfm, u32 flags) 800{ 801 crypto_tfm_set_flags(crypto_aead_tfm(tfm), flags); 802} 803 804static inline void crypto_aead_clear_flags(struct crypto_aead *tfm, u32 flags) 805{ 806 crypto_tfm_clear_flags(crypto_aead_tfm(tfm), flags); 807} 808 809static inline int crypto_aead_setkey(struct crypto_aead *tfm, const u8 *key, 810 unsigned int keylen) 811{ 812 struct aead_tfm *crt = crypto_aead_crt(tfm); 813 814 return crt->setkey(crt->base, key, keylen); 815} 816 817int crypto_aead_setauthsize(struct crypto_aead *tfm, unsigned int authsize); 818 819static inline struct crypto_aead *crypto_aead_reqtfm(struct aead_request *req) 820{ 821 return __crypto_aead_cast(req->base.tfm); 822} 823 824static inline int crypto_aead_encrypt(struct aead_request *req) 825{ 826 return crypto_aead_crt(crypto_aead_reqtfm(req))->encrypt(req); 827} 828 829static inline int crypto_aead_decrypt(struct aead_request *req) 830{ 831 return crypto_aead_crt(crypto_aead_reqtfm(req))->decrypt(req); 832} 833 834static inline unsigned int crypto_aead_reqsize(struct crypto_aead *tfm) 835{ 836 return crypto_aead_crt(tfm)->reqsize; 837} 838 839static inline void aead_request_set_tfm(struct aead_request *req, 840 struct crypto_aead *tfm) 841{ 842 req->base.tfm = crypto_aead_tfm(crypto_aead_crt(tfm)->base); 843} 844 845static inline struct aead_request *aead_request_alloc(struct crypto_aead *tfm, 846 gfp_t gfp) 847{ 848 struct aead_request *req; 849 850 req = kmalloc(sizeof(*req) + crypto_aead_reqsize(tfm), gfp); 851 852 if (likely(req)) 853 aead_request_set_tfm(req, tfm); 854 855 return req; 856} 857 858static inline void aead_request_free(struct aead_request *req) 859{ 860 kfree(req); 861} 862 863static inline void aead_request_set_callback(struct aead_request *req, 864 u32 flags, 865 crypto_completion_t complete, 866 void *data) 867{ 868 req->base.complete = complete; 869 req->base.data = data; 870 req->base.flags = flags; 871} 872 873static inline void aead_request_set_crypt(struct aead_request *req, 874 struct scatterlist *src, 875 struct scatterlist *dst, 876 unsigned int cryptlen, u8 *iv) 877{ 878 req->src = src; 879 req->dst = dst; 880 req->cryptlen = cryptlen; 881 req->iv = iv; 882} 883 884static inline void aead_request_set_assoc(struct aead_request *req, 885 struct scatterlist *assoc, 886 unsigned int assoclen) 887{ 888 req->assoc = assoc; 889 req->assoclen = assoclen; 890} 891 892static inline struct crypto_blkcipher *__crypto_blkcipher_cast( 893 struct crypto_tfm *tfm) 894{ 895 return (struct crypto_blkcipher *)tfm; 896} 897 898static inline struct crypto_blkcipher *crypto_blkcipher_cast( 899 struct crypto_tfm *tfm) 900{ 901 BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_BLKCIPHER); 902 return __crypto_blkcipher_cast(tfm); 903} 904 905static inline struct crypto_blkcipher *crypto_alloc_blkcipher( 906 const char *alg_name, u32 type, u32 mask) 907{ 908 type &= ~CRYPTO_ALG_TYPE_MASK; 909 type |= CRYPTO_ALG_TYPE_BLKCIPHER; 910 mask |= CRYPTO_ALG_TYPE_MASK; 911 912 return __crypto_blkcipher_cast(crypto_alloc_base(alg_name, type, mask)); 913} 914 915static inline struct crypto_tfm *crypto_blkcipher_tfm( 916 struct crypto_blkcipher *tfm) 917{ 918 return &tfm->base; 919} 920 921static inline void crypto_free_blkcipher(struct crypto_blkcipher *tfm) 922{ 923 crypto_free_tfm(crypto_blkcipher_tfm(tfm)); 924} 925 926static inline int crypto_has_blkcipher(const char *alg_name, u32 type, u32 mask) 927{ 928 type &= ~CRYPTO_ALG_TYPE_MASK; 929 type |= CRYPTO_ALG_TYPE_BLKCIPHER; 930 mask |= CRYPTO_ALG_TYPE_MASK; 931 932 return crypto_has_alg(alg_name, type, mask); 933} 934 935static inline const char *crypto_blkcipher_name(struct crypto_blkcipher *tfm) 936{ 937 return crypto_tfm_alg_name(crypto_blkcipher_tfm(tfm)); 938} 939 940static inline struct blkcipher_tfm *crypto_blkcipher_crt( 941 struct crypto_blkcipher *tfm) 942{ 943 return &crypto_blkcipher_tfm(tfm)->crt_blkcipher; 944} 945 946static inline struct blkcipher_alg *crypto_blkcipher_alg( 947 struct crypto_blkcipher *tfm) 948{ 949 return &crypto_blkcipher_tfm(tfm)->__crt_alg->cra_blkcipher; 950} 951 952static inline unsigned int crypto_blkcipher_ivsize(struct crypto_blkcipher *tfm) 953{ 954 return crypto_blkcipher_alg(tfm)->ivsize; 955} 956 957static inline unsigned int crypto_blkcipher_blocksize( 958 struct crypto_blkcipher *tfm) 959{ 960 return crypto_tfm_alg_blocksize(crypto_blkcipher_tfm(tfm)); 961} 962 963static inline unsigned int crypto_blkcipher_alignmask( 964 struct crypto_blkcipher *tfm) 965{ 966 return crypto_tfm_alg_alignmask(crypto_blkcipher_tfm(tfm)); 967} 968 969static inline u32 crypto_blkcipher_get_flags(struct crypto_blkcipher *tfm) 970{ 971 return crypto_tfm_get_flags(crypto_blkcipher_tfm(tfm)); 972} 973 974static inline void crypto_blkcipher_set_flags(struct crypto_blkcipher *tfm, 975 u32 flags) 976{ 977 crypto_tfm_set_flags(crypto_blkcipher_tfm(tfm), flags); 978} 979 980static inline void crypto_blkcipher_clear_flags(struct crypto_blkcipher *tfm, 981 u32 flags) 982{ 983 crypto_tfm_clear_flags(crypto_blkcipher_tfm(tfm), flags); 984} 985 986static inline int crypto_blkcipher_setkey(struct crypto_blkcipher *tfm, 987 const u8 *key, unsigned int keylen) 988{ 989 return crypto_blkcipher_crt(tfm)->setkey(crypto_blkcipher_tfm(tfm), 990 key, keylen); 991} 992 993static inline int crypto_blkcipher_encrypt(struct blkcipher_desc *desc, 994 struct scatterlist *dst, 995 struct scatterlist *src, 996 unsigned int nbytes) 997{ 998 desc->info = crypto_blkcipher_crt(desc->tfm)->iv; 999 return crypto_blkcipher_crt(desc->tfm)->encrypt(desc, dst, src, nbytes); 1000} 1001 1002static inline int crypto_blkcipher_encrypt_iv(struct blkcipher_desc *desc, 1003 struct scatterlist *dst, 1004 struct scatterlist *src, 1005 unsigned int nbytes) 1006{ 1007 return crypto_blkcipher_crt(desc->tfm)->encrypt(desc, dst, src, nbytes); 1008} 1009 1010static inline int crypto_blkcipher_decrypt(struct blkcipher_desc *desc, 1011 struct scatterlist *dst, 1012 struct scatterlist *src, 1013 unsigned int nbytes) 1014{ 1015 desc->info = crypto_blkcipher_crt(desc->tfm)->iv; 1016 return crypto_blkcipher_crt(desc->tfm)->decrypt(desc, dst, src, nbytes); 1017} 1018 1019static inline int crypto_blkcipher_decrypt_iv(struct blkcipher_desc *desc, 1020 struct scatterlist *dst, 1021 struct scatterlist *src, 1022 unsigned int nbytes) 1023{ 1024 return crypto_blkcipher_crt(desc->tfm)->decrypt(desc, dst, src, nbytes); 1025} 1026 1027static inline void crypto_blkcipher_set_iv(struct crypto_blkcipher *tfm, 1028 const u8 *src, unsigned int len) 1029{ 1030 memcpy(crypto_blkcipher_crt(tfm)->iv, src, len); 1031} 1032 1033static inline void crypto_blkcipher_get_iv(struct crypto_blkcipher *tfm, 1034 u8 *dst, unsigned int len) 1035{ 1036 memcpy(dst, crypto_blkcipher_crt(tfm)->iv, len); 1037} 1038 1039static inline struct crypto_cipher *__crypto_cipher_cast(struct crypto_tfm *tfm) 1040{ 1041 return (struct crypto_cipher *)tfm; 1042} 1043 1044static inline struct crypto_cipher *crypto_cipher_cast(struct crypto_tfm *tfm) 1045{ 1046 BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER); 1047 return __crypto_cipher_cast(tfm); 1048} 1049 1050static inline struct crypto_cipher *crypto_alloc_cipher(const char *alg_name, 1051 u32 type, u32 mask) 1052{ 1053 type &= ~CRYPTO_ALG_TYPE_MASK; 1054 type |= CRYPTO_ALG_TYPE_CIPHER; 1055 mask |= CRYPTO_ALG_TYPE_MASK; 1056 1057 return __crypto_cipher_cast(crypto_alloc_base(alg_name, type, mask)); 1058} 1059 1060static inline struct crypto_tfm *crypto_cipher_tfm(struct crypto_cipher *tfm) 1061{ 1062 return &tfm->base; 1063} 1064 1065static inline void crypto_free_cipher(struct crypto_cipher *tfm) 1066{ 1067 crypto_free_tfm(crypto_cipher_tfm(tfm)); 1068} 1069 1070static inline int crypto_has_cipher(const char *alg_name, u32 type, u32 mask) 1071{ 1072 type &= ~CRYPTO_ALG_TYPE_MASK; 1073 type |= CRYPTO_ALG_TYPE_CIPHER; 1074 mask |= CRYPTO_ALG_TYPE_MASK; 1075 1076 return crypto_has_alg(alg_name, type, mask); 1077} 1078 1079static inline struct cipher_tfm *crypto_cipher_crt(struct crypto_cipher *tfm) 1080{ 1081 return &crypto_cipher_tfm(tfm)->crt_cipher; 1082} 1083 1084static inline unsigned int crypto_cipher_blocksize(struct crypto_cipher *tfm) 1085{ 1086 return crypto_tfm_alg_blocksize(crypto_cipher_tfm(tfm)); 1087} 1088 1089static inline unsigned int crypto_cipher_alignmask(struct crypto_cipher *tfm) 1090{ 1091 return crypto_tfm_alg_alignmask(crypto_cipher_tfm(tfm)); 1092} 1093 1094static inline u32 crypto_cipher_get_flags(struct crypto_cipher *tfm) 1095{ 1096 return crypto_tfm_get_flags(crypto_cipher_tfm(tfm)); 1097} 1098 1099static inline void crypto_cipher_set_flags(struct crypto_cipher *tfm, 1100 u32 flags) 1101{ 1102 crypto_tfm_set_flags(crypto_cipher_tfm(tfm), flags); 1103} 1104 1105static inline void crypto_cipher_clear_flags(struct crypto_cipher *tfm, 1106 u32 flags) 1107{ 1108 crypto_tfm_clear_flags(crypto_cipher_tfm(tfm), flags); 1109} 1110 1111static inline int crypto_cipher_setkey(struct crypto_cipher *tfm, 1112 const u8 *key, unsigned int keylen) 1113{ 1114 return crypto_cipher_crt(tfm)->cit_setkey(crypto_cipher_tfm(tfm), 1115 key, keylen); 1116} 1117 1118static inline void crypto_cipher_encrypt_one(struct crypto_cipher *tfm, 1119 u8 *dst, const u8 *src) 1120{ 1121 crypto_cipher_crt(tfm)->cit_encrypt_one(crypto_cipher_tfm(tfm), 1122 dst, src); 1123} 1124 1125static inline void crypto_cipher_decrypt_one(struct crypto_cipher *tfm, 1126 u8 *dst, const u8 *src) 1127{ 1128 crypto_cipher_crt(tfm)->cit_decrypt_one(crypto_cipher_tfm(tfm), 1129 dst, src); 1130} 1131 1132static inline struct crypto_hash *__crypto_hash_cast(struct crypto_tfm *tfm) 1133{ 1134 return (struct crypto_hash *)tfm; 1135} 1136 1137static inline struct crypto_hash *crypto_hash_cast(struct crypto_tfm *tfm) 1138{ 1139 BUG_ON((crypto_tfm_alg_type(tfm) ^ CRYPTO_ALG_TYPE_HASH) & 1140 CRYPTO_ALG_TYPE_HASH_MASK); 1141 return __crypto_hash_cast(tfm); 1142} 1143 1144static inline struct crypto_hash *crypto_alloc_hash(const char *alg_name, 1145 u32 type, u32 mask) 1146{ 1147 type &= ~CRYPTO_ALG_TYPE_MASK; 1148 mask &= ~CRYPTO_ALG_TYPE_MASK; 1149 type |= CRYPTO_ALG_TYPE_HASH; 1150 mask |= CRYPTO_ALG_TYPE_HASH_MASK; 1151 1152 return __crypto_hash_cast(crypto_alloc_base(alg_name, type, mask)); 1153} 1154 1155static inline struct crypto_tfm *crypto_hash_tfm(struct crypto_hash *tfm) 1156{ 1157 return &tfm->base; 1158} 1159 1160static inline void crypto_free_hash(struct crypto_hash *tfm) 1161{ 1162 crypto_free_tfm(crypto_hash_tfm(tfm)); 1163} 1164 1165static inline int crypto_has_hash(const char *alg_name, u32 type, u32 mask) 1166{ 1167 type &= ~CRYPTO_ALG_TYPE_MASK; 1168 mask &= ~CRYPTO_ALG_TYPE_MASK; 1169 type |= CRYPTO_ALG_TYPE_HASH; 1170 mask |= CRYPTO_ALG_TYPE_HASH_MASK; 1171 1172 return crypto_has_alg(alg_name, type, mask); 1173} 1174 1175static inline struct hash_tfm *crypto_hash_crt(struct crypto_hash *tfm) 1176{ 1177 return &crypto_hash_tfm(tfm)->crt_hash; 1178} 1179 1180static inline unsigned int crypto_hash_blocksize(struct crypto_hash *tfm) 1181{ 1182 return crypto_tfm_alg_blocksize(crypto_hash_tfm(tfm)); 1183} 1184 1185static inline unsigned int crypto_hash_alignmask(struct crypto_hash *tfm) 1186{ 1187 return crypto_tfm_alg_alignmask(crypto_hash_tfm(tfm)); 1188} 1189 1190static inline unsigned int crypto_hash_digestsize(struct crypto_hash *tfm) 1191{ 1192 return crypto_hash_crt(tfm)->digestsize; 1193} 1194 1195static inline u32 crypto_hash_get_flags(struct crypto_hash *tfm) 1196{ 1197 return crypto_tfm_get_flags(crypto_hash_tfm(tfm)); 1198} 1199 1200static inline void crypto_hash_set_flags(struct crypto_hash *tfm, u32 flags) 1201{ 1202 crypto_tfm_set_flags(crypto_hash_tfm(tfm), flags); 1203} 1204 1205static inline void crypto_hash_clear_flags(struct crypto_hash *tfm, u32 flags) 1206{ 1207 crypto_tfm_clear_flags(crypto_hash_tfm(tfm), flags); 1208} 1209 1210static inline int crypto_hash_init(struct hash_desc *desc) 1211{ 1212 return crypto_hash_crt(desc->tfm)->init(desc); 1213} 1214 1215static inline int crypto_hash_update(struct hash_desc *desc, 1216 struct scatterlist *sg, 1217 unsigned int nbytes) 1218{ 1219 return crypto_hash_crt(desc->tfm)->update(desc, sg, nbytes); 1220} 1221 1222static inline int crypto_hash_final(struct hash_desc *desc, u8 *out) 1223{ 1224 return crypto_hash_crt(desc->tfm)->final(desc, out); 1225} 1226 1227static inline int crypto_hash_digest(struct hash_desc *desc, 1228 struct scatterlist *sg, 1229 unsigned int nbytes, u8 *out) 1230{ 1231 return crypto_hash_crt(desc->tfm)->digest(desc, sg, nbytes, out); 1232} 1233 1234static inline int crypto_hash_setkey(struct crypto_hash *hash, 1235 const u8 *key, unsigned int keylen) 1236{ 1237 return crypto_hash_crt(hash)->setkey(hash, key, keylen); 1238} 1239 1240static inline struct crypto_comp *__crypto_comp_cast(struct crypto_tfm *tfm) 1241{ 1242 return (struct crypto_comp *)tfm; 1243} 1244 1245static inline struct crypto_comp *crypto_comp_cast(struct crypto_tfm *tfm) 1246{ 1247 BUG_ON((crypto_tfm_alg_type(tfm) ^ CRYPTO_ALG_TYPE_COMPRESS) & 1248 CRYPTO_ALG_TYPE_MASK); 1249 return __crypto_comp_cast(tfm); 1250} 1251 1252static inline struct crypto_comp *crypto_alloc_comp(const char *alg_name, 1253 u32 type, u32 mask) 1254{ 1255 type &= ~CRYPTO_ALG_TYPE_MASK; 1256 type |= CRYPTO_ALG_TYPE_COMPRESS; 1257 mask |= CRYPTO_ALG_TYPE_MASK; 1258 1259 return __crypto_comp_cast(crypto_alloc_base(alg_name, type, mask)); 1260} 1261 1262static inline struct crypto_tfm *crypto_comp_tfm(struct crypto_comp *tfm) 1263{ 1264 return &tfm->base; 1265} 1266 1267static inline void crypto_free_comp(struct crypto_comp *tfm) 1268{ 1269 crypto_free_tfm(crypto_comp_tfm(tfm)); 1270} 1271 1272static inline int crypto_has_comp(const char *alg_name, u32 type, u32 mask) 1273{ 1274 type &= ~CRYPTO_ALG_TYPE_MASK; 1275 type |= CRYPTO_ALG_TYPE_COMPRESS; 1276 mask |= CRYPTO_ALG_TYPE_MASK; 1277 1278 return crypto_has_alg(alg_name, type, mask); 1279} 1280 1281static inline const char *crypto_comp_name(struct crypto_comp *tfm) 1282{ 1283 return crypto_tfm_alg_name(crypto_comp_tfm(tfm)); 1284} 1285 1286static inline struct compress_tfm *crypto_comp_crt(struct crypto_comp *tfm) 1287{ 1288 return &crypto_comp_tfm(tfm)->crt_compress; 1289} 1290 1291static inline int crypto_comp_compress(struct crypto_comp *tfm, 1292 const u8 *src, unsigned int slen, 1293 u8 *dst, unsigned int *dlen) 1294{ 1295 return crypto_comp_crt(tfm)->cot_compress(crypto_comp_tfm(tfm), 1296 src, slen, dst, dlen); 1297} 1298 1299static inline int crypto_comp_decompress(struct crypto_comp *tfm, 1300 const u8 *src, unsigned int slen, 1301 u8 *dst, unsigned int *dlen) 1302{ 1303 return crypto_comp_crt(tfm)->cot_decompress(crypto_comp_tfm(tfm), 1304 src, slen, dst, dlen); 1305} 1306 1307#endif /* _LINUX_CRYPTO_H */ 1308